{
 "slug": "attio",
 "name": "Attio",
 "url": "https://attio.com",
 "domain": "attio.com",
 "category": "crm",
 "category_name": "CRM",
 "tested_at": "2026-10-02",
 "run": "20261002T134720Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261001T061224Z",
   "date": "2026-10-01",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": null,
    "driver": null,
    "signed": false,
    "inbox": [
     "matfy.com"
    ],
    "robots": "start"
   }
  },
  {
   "run": "20261001T191331Z",
   "date": "2026-10-01",
   "level": 4,
   "engine": {
    "runner": "omp",
    "model": null,
    "driver": null,
    "signed": true,
    "inbox": null,
    "robots": "start"
   },
   "why": "noise",
   "drives": 2
  },
  {
   "run": "20261002T134720Z",
   "date": "2026-10-02",
   "level": 4,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  }
 ],
 "level": 4,
 "level_name": "Runs on its own",
 "level_selfhost": null,
 "entry": "self-start",
 "door": {
  "passed": 3,
  "tries": 3,
  "self_start": true
 },
 "badges": [
  "agent-can-leave"
 ],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: sign-up in a browser"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "yes",
   "text": "Work done: 100% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Reaches the checkout: stopped at the card form",
   "value": "ready",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: cancels on its own, deletes its account",
   "left": "deleted"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "yes",
   "text": "Docs agents can read: llms.txt, an OpenAPI and an MCP server",
   "have": [
    "llms_txt",
    "openapi",
    "mcp"
   ]
  },
  {
   "key": "access",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: sign-up in a browser",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "yes",
   "text": "Work done: 100% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Reaches the checkout: stopped at the card form",
   "value": "ready",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: cancels on its own, deletes its account",
   "left": "deleted",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "browser_signup",
   "label": "Sign-up in a browser",
   "routes": [],
   "minutes": 0.3,
   "core": "8/8"
  }
 ],
 "minutes": 0.3,
 "next": {
  "to": 5,
  "text": "Next: pay without a person"
 },
 "stop": null,
 "core": "8/8",
 "scores": {
  "coverage": 85,
  "reliability": 100,
  "resilience": null,
  "setup": 100,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 100,
  "security": null,
  "standards": []
 },
 "reliability_method": "first-try",
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": 100,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 2,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": null,
  "prompt_sha": null,
  "kb_version": null,
  "identity": null
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 2,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "start"
 },
 "same_level_drives": 3,
 "drives": 4,
 "works_assisted": null,
 "freshness": "fresh",
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": null,
 "agent_pass": null,
 "who_gets_in": {
  "server": {
   "state": "in"
  },
  "signed": {
   "state": "page",
   "kind": "signup",
   "at": "2026-10-12"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "docs.attio.com/llms.txt and llms-full.txt (770 KB), OpenAPI 3.1 at api.attio.com/openapi/api (97 operations), MCP OAuth metadata with dynamic client registration."
  },
  "signup": {
   "status": "browser",
   "note": "Email form at app.attio.com/welcome/sign-in, no CAPTCHA. Onboarding is 7 short screens; no API or CLI sign-up."
  },
  "verify": {
   "status": "browser",
   "note": "Passwordless: an 8-character temporary password arrives by mail in under a minute and is typed into the web form. Our generated password was never needed."
  },
  "credentials": {
   "status": "browser",
   "note": "Workspace access token made in Settings > Developers > Access tokens (name + 13 scope selects). No API to mint tokens. MCP: dynamic client registration is headless, but the OAuth consent needs one click in a logged-in browser.",
   "via": ""
  },
  "first_call": {
   "status": "headless",
   "note": "GET /v2/self with the bearer token: active, workspace agent-drives."
  },
  "first_action": {
   "status": "headless",
   "note": "POST /v2/objects/companies/records created a company; read back by GET."
  },
  "pay": {
   "status": "browser",
   "grade": "P2",
   "rails": [],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "no-card trial",
   "note": "No x402/MPP/L402/UCP anywhere: x402./mpp./agents. subdomains do not resolve, unauthenticated API gives a plain 401, no x-payment-info in OpenAPI, nothing in llms-full.txt, not in x402 Bazaar or mpp.dev. Sign-up starts a 14-day Pro trial with no card. Upgrading is an in-app Stripe Elements card form (seats, address, VAT; Stripe's invisible hCaptcha) under Settings > Plans > Keep Pro; not submitted (no card). No billing API or MCP billing tool."
  },
  "cancel": {
   "status": "browser",
   "grade": "X3",
   "note": "Nothing recurring was started. Settings > Plans offers Downgrade in the web UI; no billing API. Deleting the workspace also ends the trial."
  },
  "delete": {
   "status": "browser",
   "note": "Settings > General > Delete workspace (pick a reason, type the slug) deleted the workspace and its data; the API token became inactive and MCP returned 403. The Attio user login itself stays: no self-serve user deletion was found.",
   "left": "deleted",
   "account": true
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-02",
  "source": "drive",
  "options": [],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": true,
   "card_required": null,
   "free_plan": null
  },
  "owner_fixes": [
   {
    "title": "Accept x402 or MPP on your API",
    "how": "Answer an unpaid call with 402 and a payment challenge, so an agent pays per call or buys credits without an account or a card."
   },
   {
    "title": "List your plans on Stripe Projects",
    "how": "Agents buy a plan with `stripe projects add`, paid with a token under a spend cap the owner sets (projects.dev)."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": true,
  "cli": true,
  "sdk": true,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": true,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST v2, 97 operations, bearer token, clear JSON errors",
  "openapi": "OpenAPI 3.1, public, matched reality on every call we made",
  "mcp": "official, remote at mcp.attio.com, OAuth 2.1 with dynamic client registration, 41 tools",
  "cli": "attio CLI only for App SDK development (npm create attio@latest), not for data",
  "sdk": "App SDK (TypeScript/React apps inside Attio); no official REST client used",
  "webhooks": "REST-managed, created and listed fine; delivery not tested"
 },
 "can_do": [
  "Create, upsert, update, read, search, filter, merge and delete companies and people",
  "Build a custom object with attributes and fill it with records",
  "Create a pipeline list with stages, add a record and move it between stages",
  "Add markdown notes, assign tasks with deadlines and post threaded comments on records",
  "Log a meeting on a company and attach a transcript-only call recording, then read the transcript",
  "Create folders and upload/download files on a record",
  "Set read-only/full-access permissions on a list",
  "Register and manage webhooks",
  "Run count and grouped reports through the MCP server",
  "Connect to the official MCP server via dynamic client registration and one consent click"
 ],
 "cannot_do": [
  {
   "what": "Sign up or mint an API token without a browser",
   "why": "Sign-up, the emailed code and token creation exist only in the web app"
  },
  {
   "what": "Create workflows or sequences headlessly",
   "why": "No REST or MCP route; workflows worked only in the browser editor"
  },
  {
   "what": "Send an email sequence",
   "why": "Needs a connected Gmail or Microsoft mailbox; we had only a receive-only inbox"
  },
  {
   "what": "Read synced emails",
   "why": "No mailbox connected and the token form offers no Emails scope (403)"
  },
  {
   "what": "Run SQL queries",
   "why": "Enterprise only (402 contact sales)"
  },
  {
   "what": "Buy or change the plan headlessly",
   "why": "Card form in the web app only; no billing API or agent payment rail"
  },
  {
   "what": "Delete the user login",
   "why": "Only workspace deletion is self-serve"
  }
 ],
 "blockers": [
  "Sign-up, verification and API token creation require the web app",
  "Workflows and sequences have no API",
  "Upgrades need a card in an in-app Stripe form"
 ],
 "tips_for_owner": [
  "Let agents mint scoped tokens via OAuth",
  "Add workflow and sequence APIs",
  "Expose plan changes through a billing API",
  "Offer an agent-native payment rail",
  "Allow deleting the user account self-serve"
 ],
 "tips_for_agents": [
  "Get through sign-up in a browser once (email + emailed 8-char code, no CAPTCHA), then make a workspace access token under Settings > Developers; after that everything core is REST.",
  "For MCP, register a client at app.attio.com/oauth/register, use a long random state (short 'xyz' is rejected), and one Confirm click gives a 24h token plus refresh token.",
  "Upsert with PUT /v2/objects/{object}/records?matching_attribute=domains|email_addresses to avoid duplicates.",
  "Merging returns a brand-new record ID; both old IDs 404 afterwards, references are re-pointed.",
  "New records take a few seconds to appear in search.",
  "MCP run-basic-report wants group_by path as an array of [object, attribute] pairs and returns status IDs, not titles.",
  "Workflows: the in-editor Ask Attio builds a working workflow from one sentence; publish it in the browser."
 ],
 "selfhost": null,
 "summary": "Once a token exists, an agent can run almost all of Attio's CRM core over a clean, well-documented REST API and an official 41-tool MCP server: every core capability was done and verified. Getting there takes a browser: sign-up with an emailed code, token creation in settings, and one OAuth consent click for MCP. Workflows, sequences and billing are browser-only, and SQL is Enterprise-only.",
 "wall": "Sign-up and API tokens are web-only",
 "plan_scope": "no-card trial (14-day Pro)",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "Attio is a CRM. An agent with a workspace token can do nearly all of the core CRM work itself through a clean API. Getting that token takes a browser: the agent signed up, verified by email and created the token in the web app itself.",
  "can_do": [
   "Create, update, search and merge company and contact records",
   "Build pipelines, custom fields, notes, tasks and comments",
   "Upload files, set permissions, and connect through an official AI assistant interface",
   "Log meetings and attach call transcripts"
  ],
  "cannot_do": [
   {
    "what": "Sign up or create an access token without a browser",
    "why": "Sign-up and token creation only exist in the web app"
   },
   {
    "what": "Build automated workflows or email sequences on its own",
    "why": "Those tools only work in the browser editor, with no API"
   },
   {
    "what": "Buy or change a paid plan on its own",
    "why": "Only a card form in the browser; no automated payment option"
   },
   {
    "what": "Run SQL-style queries or set up single sign-on",
    "why": "Restricted to the most expensive Enterprise plan"
   }
  ]
 },
 "plan_gated": [
  {
   "capability": "Query workspace data with read-only SQL",
   "plan": "Enterprise",
   "evidence": "POST /v2/sql on the Pro trial returned status_code 402 'This workspace does not have the required permissions enabled for this feature. Please contact sales'"
  },
  {
   "capability": "Configure SSO",
   "plan": "Enterprise",
   "evidence": "Plans page: Enterprise is 'Talk to sales'"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "records",
   "capability": "Create a company, person or deal record",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/objects/{object}/records",
    "mcp": "create-record",
    "cli": null,
    "ui": "Companies/People/Deals view > New record"
   },
   "check": "GET /v2/objects/{object}/records/{record_id} returns the new record, or the row appears in the object's table view",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/records/create-a-record; https://docs.attio.com/docs/standard-objects/standard-objects"
  },
  {
   "id": "cap-02",
   "group": "records",
   "capability": "Create or update a record by matching attribute (upsert)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PUT /v2/objects/{object}/records",
    "mcp": "upsert-record",
    "cli": null,
    "ui": null
   },
   "check": "GET the record by its matching attribute (e.g. domain or email) and confirm a single record exists with the submitted values",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/records/upsert-a-record"
  },
  {
   "id": "cap-03",
   "group": "records",
   "capability": "Update a record's attribute values",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /v2/objects/{object}/records/{record_id}",
    "mcp": "update-record",
    "cli": null,
    "ui": "Record page > edit field"
   },
   "check": "GET /v2/objects/{object}/records/{record_id} shows the updated attribute value",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/records/update-a-record-append-multiselect-values"
  },
  {
   "id": "cap-04",
   "group": "records",
   "capability": "View a record's full profile",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /v2/objects/{object}/records/{record_id}",
    "mcp": "get-records-by-ids",
    "cli": null,
    "ui": "Record detail page"
   },
   "check": "Response/page contains the record's current attribute values",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/records/get-a-record"
  },
  {
   "id": "cap-05",
   "group": "records",
   "capability": "Search and filter records across companies, people and deals",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/objects/records/search",
    "mcp": "search-records",
    "cli": null,
    "ui": "Global search bar / object table filters"
   },
   "check": "Response data array contains records matching the query string or filter condition",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/records/search-records; https://docs.attio.com/rest-api/endpoint-reference/records/list-records"
  },
  {
   "id": "cap-06",
   "group": "records",
   "capability": "Delete a record",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "DELETE /v2/objects/{object}/records/{record_id}",
    "mcp": null,
    "cli": null,
    "ui": "Record page > Delete"
   },
   "check": "Subsequent GET /v2/objects/{object}/records/{record_id} returns 404",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/records/delete-a-record"
  },
  {
   "id": "cap-07",
   "group": "records",
   "capability": "Merge two duplicate records",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/objects/{object}/records/merge",
    "mcp": "merge-records",
    "cli": null,
    "ui": "Record page > Merge records"
   },
   "check": "GET the surviving record shows combined attribute values; GET the merged-away record_id returns 404",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/records/merge-two-records"
  },
  {
   "id": "cap-08",
   "group": "pipeline",
   "capability": "Add a record to a list (pipeline) and move it between stages",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/lists/{list}/entries; PATCH /v2/lists/{list}/entries/{entry_id}",
    "mcp": "add-record-to-list; update-list-entry-by-record-id",
    "cli": null,
    "ui": "Pipeline board view > drag card between stage columns"
   },
   "check": "GET /v2/lists/{list}/entries/{entry_id} shows the record present with the updated stage/status attribute value",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/entries/create-an-entry-add-record-to-list; https://docs.attio.com/rest-api/endpoint-reference/entries/update-a-list-entry-overwrite-multiselect-values"
  },
  {
   "id": "cap-09",
   "group": "collaboration",
   "capability": "Add a note to a record",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/notes",
    "mcp": "create-note",
    "cli": null,
    "ui": "Record page > Notes tab > New note"
   },
   "check": "GET /v2/notes/{note_id} or list-notes for the record returns the created note content",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/notes/create-a-note"
  },
  {
   "id": "cap-10",
   "group": "collaboration",
   "capability": "Create and assign a task with a deadline",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/tasks",
    "mcp": "create-task",
    "cli": null,
    "ui": "Record page > Tasks tab > New task"
   },
   "check": "GET /v2/tasks/{task_id} shows the task with the assignee and deadline set, and is_completed toggles on update",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/tasks/create-a-task; https://docs.attio.com/rest-api/endpoint-reference/tasks/update-a-task"
  },
  {
   "id": "cap-11",
   "group": "collaboration",
   "capability": "Comment on a record or list entry (threaded discussion)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/comments",
    "mcp": "create-comment",
    "cli": null,
    "ui": "Record page > Comments panel"
   },
   "check": "GET /v2/threads/{thread_id} pages through the comment and any replies",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/comments/create-a-comment; https://docs.attio.com/rest-api/endpoint-reference/threads/get-a-thread-and-its-comments"
  },
  {
   "id": "cap-12",
   "group": "data-model",
   "capability": "Build a custom object or custom attribute (incl. relationship/formula attributes)",
   "weight": "secondary",
   "plan": "plus",
   "surfaces": {
    "api": "POST /v2/objects; POST /v2/attributes",
    "mcp": "list-attribute-definitions (read-only)",
    "cli": null,
    "ui": "Workspace settings > Objects > New object/attribute"
   },
   "check": "GET /v2/objects lists the new object, and GET /v2/attributes on it lists the new attribute with its configured type",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/objects/create-an-object; https://docs.attio.com/rest-api/endpoint-reference/attributes/create-an-attribute; https://attio.com/pricing"
  },
  {
   "id": "cap-13",
   "group": "lists",
   "capability": "Create a private or shared list with custom views",
   "weight": "secondary",
   "plan": "plus",
   "surfaces": {
    "api": "POST /v2/lists",
    "mcp": "create-list",
    "cli": null,
    "ui": "Sidebar > New list"
   },
   "check": "GET /v2/lists/{list} returns the list with the configured workspace_access/workspace_member_access permissions",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/lists/create-a-list; https://attio.com/pricing"
  },
  {
   "id": "cap-14",
   "group": "automation",
   "capability": "Build a workflow automation (trigger + steps on record changes)",
   "weight": "secondary",
   "plan": "pro",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Workflows tab > New workflow"
   },
   "check": "Trigger the configured event (e.g. record enters a list) and confirm the workflow's run history shows a completed execution with the expected side effect (e.g. field updated)",
   "source": "https://attio.com/platform/workflows; https://attio.com/pricing"
  },
  {
   "id": "cap-15",
   "group": "automation",
   "capability": "Enroll contacts in an outbound email sequence",
   "weight": "secondary",
   "plan": "pro",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Sequences tab > New sequence > Add recipients"
   },
   "check": "The sequence's enrollment list shows the recipient with step/status progression over time",
   "source": "https://attio.com/pricing"
  },
  {
   "id": "cap-16",
   "group": "automation",
   "capability": "Suppress email addresses from all sequences (unsubscribe list)",
   "weight": "secondary",
   "plan": "pro",
   "surfaces": {
    "api": "POST /v2/sequences/unsubscribe",
    "mcp": null,
    "cli": null,
    "ui": "Sequences settings > Unsubscribe list"
   },
   "check": "Re-attempting to enroll the suppressed address in any sequence fails/is skipped",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/sequences/add-emails-to-the-unsubscribe-list"
  },
  {
   "id": "cap-17",
   "group": "calls-and-meetings",
   "capability": "Sync a calendar meeting onto linked records",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/meetings",
    "mcp": "search-meetings",
    "cli": null,
    "ui": "Record page > Activity timeline (auto-synced from connected calendar)"
   },
   "check": "GET /v2/meetings/{meeting_id} shows the meeting linked to the expected record(s)",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/meetings/create-a-meeting"
  },
  {
   "id": "cap-18",
   "group": "calls-and-meetings",
   "capability": "Record and transcribe a call (Call Intelligence)",
   "weight": "secondary",
   "plan": "pro",
   "surfaces": {
    "api": "POST /v2/meetings/{meeting_id}/call-recordings",
    "mcp": "get-call-recording; semantic-search-call-recordings",
    "cli": null,
    "ui": "Meeting record > Call recording tab"
   },
   "check": "GET /v2/call-recordings/{id} returns transcript/speaker data for the meeting",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/call-recordings/create-call-recording; https://attio.com/pricing"
  },
  {
   "id": "cap-19",
   "group": "communications",
   "capability": "View synced email metadata from a connected mailbox",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /v2/emails",
    "mcp": "search-emails-by-metadata; semantic-search-emails",
    "cli": null,
    "ui": "Record page > Emails tab"
   },
   "check": "Listed emails correspond to messages sent/received with the record's known email address",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/emails/list-emails"
  },
  {
   "id": "cap-20",
   "group": "reporting",
   "capability": "Run an aggregate report on records or list entries (dashboards)",
   "weight": "secondary",
   "plan": "pro",
   "surfaces": {
    "api": null,
    "mcp": "run-basic-report",
    "cli": null,
    "ui": "Reports tab > New report"
   },
   "check": "The returned/rendered totals match a manual count or sum of the underlying filtered records",
   "source": "https://attio.com/pricing; https://docs.attio.com/mcp/overview"
  },
  {
   "id": "cap-21",
   "group": "reporting",
   "capability": "Query workspace data with read-only SQL across objects and lists",
   "weight": "secondary",
   "plan": "enterprise",
   "surfaces": {
    "api": "POST /v2/sql/query",
    "mcp": "query-particle-sql",
    "cli": null,
    "ui": null
   },
   "check": "Query result rows match the equivalent object/list data retrieved via the standard records API",
   "source": "https://docs.attio.com/sql/overview; https://docs.attio.com/rest-api/endpoint-reference/sql/query-sql"
  },
  {
   "id": "cap-22",
   "group": "automation",
   "capability": "Subscribe to a webhook for real-time record/list/note/task change events",
   "weight": "secondary",
   "plan": "plus",
   "surfaces": {
    "api": "POST /v2/webhooks",
    "mcp": null,
    "cli": null,
    "ui": "Workspace settings > Webhooks > New webhook"
   },
   "check": "Trigger the subscribed event (e.g. update a record) and confirm the target_url receives a signed POST payload describing it",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/webhooks/create-a-webhook; https://docs.attio.com/rest-api/guides/webhooks"
  },
  {
   "id": "cap-23",
   "group": "files",
   "capability": "Upload and organize files/folders on a record",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/files (multipart upload); POST /v2/files/folder",
    "mcp": null,
    "cli": null,
    "ui": "Record page > Files tab"
   },
   "check": "GET /v2/files?object=&record_id= lists the uploaded file/folder, and a signed download URL returns the original bytes",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/files/upload-a-file; https://docs.attio.com/rest-api/endpoint-reference/files/download-a-file"
  },
  {
   "id": "cap-24",
   "group": "workspace",
   "capability": "List workspace members and teams",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /v2/workspace_members",
    "mcp": "list-workspace-members; list-workspace-teams",
    "cli": null,
    "ui": "Workspace settings > Members"
   },
   "check": "Returned list matches the members shown in workspace settings",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/workspace-members/list-workspace-members"
  },
  {
   "id": "cap-25",
   "group": "workspace",
   "capability": "Set granular permission controls on lists and records (full-access vs read-only per member)",
   "weight": "secondary",
   "plan": "pro",
   "surfaces": {
    "api": "PATCH /v2/lists/{list} (workspace_access, workspace_member_access)",
    "mcp": "update-list",
    "cli": null,
    "ui": "List settings > Sharing & permissions"
   },
   "check": "A workspace member without full-access is unable to edit the list/record while a full-access member can",
   "source": "https://docs.attio.com/rest-api/endpoint-reference/lists/update-a-list; https://attio.com/pricing"
  },
  {
   "id": "cap-26",
   "group": "ai",
   "capability": "Ask an in-app AI agent to analyze records and write results back (e.g. lead scoring)",
   "weight": "secondary",
   "plan": "pro",
   "surfaces": {
    "api": null,
    "mcp": "search-notes-by-metadata; search-emails-by-metadata; update-record (chained by the agent)",
    "cli": null,
    "ui": "Ask Attio panel / AI agent chat"
   },
   "check": "The target record's attribute (e.g. a score field) is updated with a value and the agent's run log shows the commands it executed",
   "source": "https://attio.com; https://attio.com/pricing"
  },
  {
   "id": "cap-27",
   "group": "integrations",
   "capability": "Connect a third-party integration or build a custom app with the App SDK",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "attio (App SDK CLI: create, dev, migrate folder-structure)",
    "ui": "Workspace settings > Apps / Integrations marketplace"
   },
   "check": "The installed/built app appears in Workspace settings > Apps and its defined record action/widget renders on a record page",
   "source": "https://docs.attio.com/sdk/overview; https://docs.attio.com/sdk/guides/creating-an-app"
  },
  {
   "id": "cap-28",
   "group": "admin",
   "capability": "Change workspace branding (logo, name)",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Workspace settings > General"
   },
   "check": "The updated logo/name renders in the app header and shared views",
   "source": "https://attio.com/pricing"
  },
  {
   "id": "cap-29",
   "group": "admin",
   "capability": "Manage billing plan, seats and credits",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Workspace settings > Billing"
   },
   "check": "Workspace settings > Billing reflects the selected plan, seat count and credit balance",
   "source": "https://attio.com/pricing"
  },
  {
   "id": "cap-30",
   "group": "admin",
   "capability": "Configure SSO and workspace-wide security/admin controls",
   "weight": "peripheral",
   "plan": "enterprise",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Workspace settings > Security"
   },
   "check": "Users signing in are routed through the configured SSO identity provider and non-SSO sign-in is blocked",
   "source": "https://attio.com/pricing"
  },
  {
   "id": "cap-31",
   "group": "admin",
   "capability": "Browse and install an integration from the Attio marketplace",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Workspace settings > Apps > Browse marketplace"
   },
   "check": "The installed integration appears under Workspace settings > Apps as active",
   "source": "https://attio.com"
  }
 ],
 "attempts": [
  {
   "t": "00:01",
   "cap": "docs",
   "capability": "Find docs",
   "task": "Find API docs, OpenAPI, llms.txt, MCP, OAuth metadata",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "docs.attio.com/llms.txt 200; api.attio.com/openapi/api 200 JSON OpenAPI 3.1 (97 operations); mcp.attio.com/mcp 401 with WWW-Authenticate resource_metadata; mcp.attio.com/.well-known/oauth-authorization-server has registration_endpoint (DCR)",
   "notes": ""
  },
  {
   "t": "00:03",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Create account with test email",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "app.attio.com/welcome/sign-in email form -> temporary-password page; no CAPTCHA signals; no API/CLI signup route in docs",
   "notes": "Passwordless: Attio emails a one-hour temporary code. Onboarding: personal details, workspace (name, handle, billing country prefilled Germany from IP, left as is), how-did-you-hear (skipped), connect mailbox (declined), call recording (declined), use case (Other), invite team (skipped)."
  },
  {
   "t": "00:05",
   "cap": "verify",
   "capability": "Verify email",
   "task": "Read temporary password from inbox and enter it",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Mail 'Your Attio Temporary Password' arrived within ~40s at the agent's inbox with 8-char code; entering it moved to /welcome/personal-details",
   "notes": "Code entry is the login itself; no separate verification step."
  },
  {
   "t": "00:12",
   "cap": "login",
   "capability": "Log in / session",
   "task": "Reach workspace home",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "https://app.attio.com/agent-drives/home loaded, 'Good afternoon, AgentDrives.', '14 days left on trial! Keep Pro'",
   "notes": "Workspace started on a 14-day Pro trial with no card asked."
  },
  {
   "t": "00:16",
   "cap": "credentials",
   "capability": "Get API credentials",
   "task": "Create workspace access token with all scopes",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Settings > Developers > Access tokens > New access token (name + 13 scope selects) > Save; token listed 'AgentDrives drive'; GET /v2/self active:true token_level workspace",
   "notes": "No API to mint tokens; UI only. Token can be revealed again later (eye icon). OAuth with DCR exists for MCP (mcp.attio.com) but needs browser consent."
  },
  {
   "t": "00:17",
   "cap": "first_call",
   "capability": "First API call",
   "task": "GET /v2/self and GET /v2/objects",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "/v2/self 200 active:true workspace_slug agent-drives; /v2/objects 200 -> companies, people",
   "notes": "No deals object by default when use case 'Other' was chosen."
  },
  {
   "t": "00:09",
   "cap": "first_action",
   "capability": "First real action",
   "task": "Create a company record via API",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/objects/companies/records -> record 3cb8c796…; GET returns name 'AgentDrives Test Co', domain agentdrives.com",
   "notes": ""
  },
  {
   "t": "00:09",
   "cap": "cap-01",
   "capability": "Create a company, person or deal record",
   "task": "Create company AgentDrives Test Co and person AgentDrives Test",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/objects/companies/records and /people/records 200; GET /v2/objects/companies/records/3cb8c796… returns name+domain",
   "notes": "No 'deals' object in this workspace (use case 'Other' chosen at onboarding); created custom object instead."
  },
  {
   "t": "00:09",
   "cap": "cap-02",
   "capability": "Upsert by matching attribute",
   "task": "PUT company matching domains (existing) and person matching email (new)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "PUT /v2/objects/companies/records?matching_attribute=domains returned same record_id 3cb8c796… with new description; PUT people by email_addresses created 0387fb8d…",
   "notes": ""
  },
  {
   "t": "00:09",
   "cap": "cap-03",
   "capability": "Update a record's attribute values",
   "task": "Set job_title and company link on person",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "PATCH /v2/objects/people/records/7a7bfdd9…; GET back job_title 'Test driver', company target_record_id 3cb8c796…",
   "notes": ""
  },
  {
   "t": "00:09",
   "cap": "cap-04",
   "capability": "View a record's full profile",
   "task": "GET company and person records",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET /v2/objects/{object}/records/{id} returns all attribute values with actor/active_from history",
   "notes": ""
  },
  {
   "t": "00:09",
   "cap": "cap-05",
   "capability": "Search and filter records",
   "task": "Filter people by job_title; full-text search 'AgentDrives' across people+companies",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/objects/people/records/query filter job_title -> [7a7bfdd9…]; POST /v2/objects/records/search -> 3 hits (1 company, 2 people)",
   "notes": "search response record_id field read as null in my jq path; record_text matched."
  },
  {
   "t": "00:10",
   "cap": "cap-07",
   "capability": "Merge two duplicate records",
   "task": "Create duplicate company and merge into original",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/objects/companies/records/merge -> new_record_id c9785373…; both old IDs now 404; new record keeps primary name/description/domain; person's company link re-pointed to c9785373…",
   "notes": "Merge creates a new ID; docs say so."
  },
  {
   "t": "00:11",
   "cap": "cap-12",
   "capability": "Build a custom object or attribute",
   "task": "Create object ad_projects with number attribute 'score', create a record in it",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/objects 200 object_id 5a621146…; POST /v2/objects/ad_projects/attributes score:number; POST /v2/objects/ad_projects/records score 42 -> f4343fdd…",
   "notes": "Done on the 14-day Pro trial (no card); map says plan 'plus'."
  },
  {
   "t": "00:11",
   "cap": "cap-13",
   "capability": "Create a list",
   "task": "Create list 'AD Pipeline' on companies with status attribute Stage (Lead/Qualified/Won)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/lists -> 3f875554…; POST /v2/lists/ad_pipeline/attributes type status; 3x POST statuses 200",
   "notes": "Views cannot be created by API (only GET /views)."
  },
  {
   "t": "00:11",
   "cap": "cap-08",
   "capability": "Add a record to a list and move between stages",
   "task": "Add merged company to AD Pipeline at Lead, move to Qualified",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/lists/ad_pipeline/entries stage Lead -> entry 02de068a…; PATCH stage Qualified; POST entries/query shows stage Qualified",
   "notes": ""
  },
  {
   "t": "00:11",
   "cap": "cap-06",
   "capability": "Delete a record",
   "task": "Delete person AgentDrives Test Two",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "DELETE /v2/objects/people/records/0387fb8d… -> {}; GET -> 404 not_found",
   "notes": ""
  },
  {
   "t": "00:12",
   "cap": "cap-09",
   "capability": "Add a note to a record",
   "task": "Markdown note on company",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/notes -> f269bd3e…; GET /v2/notes?parent_object=companies&parent_record_id=c9785373… returns title + markdown",
   "notes": ""
  },
  {
   "t": "00:12",
   "cap": "cap-10",
   "capability": "Create and assign a task with a deadline",
   "task": "Task linked to person, assigned to self, deadline 2026-10-09; then complete it",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/tasks -> d199285b…; PATCH is_completed true returns deadline and assignee",
   "notes": ""
  },
  {
   "t": "00:12",
   "cap": "cap-11",
   "capability": "Comment on a record (threaded)",
   "task": "Comment on company, reply in thread",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/comments x2; GET /v2/threads/03badc70… returns ['First comment from drive','Threaded reply']",
   "notes": ""
  },
  {
   "t": "00:12",
   "cap": "cap-17",
   "capability": "Sync a calendar meeting onto linked records",
   "task": "Create meeting linked to company with address as participant",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/meetings -> 9276d744…; GET shows linked_records company c9785373…",
   "notes": "Meeting created in Attio only; no invite is sent."
  },
  {
   "t": "00:13",
   "cap": "cap-23",
   "capability": "Upload and organize files/folders on a record",
   "task": "Create folder on company, upload text file into it, download it",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/files folder fa546b99…; POST /v2/files/upload multipart -> 088ea7ea… parent folder fa546b99…; GET /v2/files lists both; /download 302 to signed GCS URL",
   "notes": "Beta endpoints."
  },
  {
   "t": "00:13",
   "cap": "cap-16",
   "capability": "Suppress emails from sequences",
   "task": "Add an inbox+unsub@agentdrives.com to unsubscribe list",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": false,
   "evidence": "POST /v2/sequences/unsubscribed_emails 200 data[0].email_address + created_at",
   "notes": "No documented GET of the unsubscribe list; only the write response confirms it. Map lists path /v2/sequences/unsubscribe, real path is /unsubscribed_emails."
  },
  {
   "t": "00:13",
   "cap": "cap-22",
   "capability": "Subscribe to a webhook",
   "task": "Webhook for record.created to agentdrives.com",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v2/webhooks -> 4800093b… status active; GET /v2/webhooks lists it",
   "notes": "Delivery not verified (no receiver at that URL)."
  },
  {
   "t": "00:13",
   "cap": "cap-21",
   "capability": "Read-only SQL",
   "task": "SELECT name FROM companies LIMIT 5",
   "route": "api",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "POST /v2/sql -> 402 'This workspace does not have the required permissions enabled for this feature. Please contact sales'",
   "notes": "Enterprise only per docs."
  },
  {
   "t": "00:13",
   "cap": "cap-19",
   "capability": "View synced email metadata",
   "task": "GET /v2/emails",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "403 auth_error: requires 'Read access to the Emails scope'; the token form offered no Emails scope; no mailbox connected (needs Google/Microsoft OAuth of a real mailbox we don't have)",
   "notes": "Even with scope there'd be no data: syncing requires connecting a Gmail/Outlook account."
  },
  {
   "t": "00:14",
   "cap": "cap-25",
   "capability": "Granular permissions on lists",
   "task": "Set AD Pipeline workspace read-only, self full-access",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "PATCH /v2/lists/ad_pipeline; GET shows workspace_access read-only, member 9c007781… full-access",
   "notes": "Pro feature, done on the no-card trial."
  },
  {
   "t": "00:14",
   "cap": "cap-24",
   "capability": "List workspace members and teams",
   "task": "GET /v2/workspace_members",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "returns 1 member the agent's inbox admin",
   "notes": "No teams endpoint in REST API."
  },
  {
   "t": "00:15",
   "cap": "cap-18",
   "capability": "Record and transcribe a call",
   "task": "Attach a transcript-only call recording to the meeting and read transcript back",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "POST /v2/meetings/9276d744…/call_recordings -> 355edfd8… status completed; GET …/transcript returns our text",
   "notes": "API ingests a recording/transcript you bring; recording a live call needs the Attio call recorder joining a real meeting, not testable."
  },
  {
   "t": "00:16",
   "cap": "mcp_auth",
   "capability": "Connect official MCP server",
   "task": "DCR register client, OAuth PKCE consent, tools/list",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST app.attio.com/oauth/register 200 client_id; /oidc/authorize -> consent page (browser click 'Confirm') -> code; /oidc/token 200 Bearer expires_in 86400 + refresh_token; mcp.attio.com initialize + tools/list = 41 tools",
   "notes": "First authorize attempt failed with 'Invalid value provided for: state' for state='xyz' (too short); 32-hex state worked. Consent needs a logged-in browser session."
  },
  {
   "t": "00:17",
   "cap": "cap-01",
   "capability": "Create a company, person or deal record",
   "task": "Create company via MCP create-record",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "tools/call create-record -> record_id 953bff20…; REST GET returns name 'AgentDrives MCP Co'; MCP search-records finds it",
   "notes": "MCP-created records are attributed to the workspace member, not a token."
  },
  {
   "t": "00:17",
   "cap": "cap-05",
   "capability": "Search and filter records",
   "task": "MCP search-records 'AgentDrives' and 'MCP Co'",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "returns c9785373… and later 953bff20…",
   "notes": "New record not in search results for a few seconds (index lag)."
  },
  {
   "t": "00:18",
   "cap": "cap-20",
   "capability": "Run an aggregate report",
   "task": "Count entries in AD Pipeline grouped by stage; count companies",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "run-basic-report companies count -> 12 (matches REST query of 12 names); ad_pipeline group by stage -> {'393f14f3…': 1}",
   "notes": "Two validation errors first: group_by path must be array of [object, attribute] pairs; errors were clear zod messages. Group keys come back as raw status IDs, not titles. No REST route; dashboards not buildable via API/MCP."
  },
  {
   "t": "00:18",
   "cap": "cap-24",
   "capability": "List workspace members and teams",
   "task": "MCP list-workspace-teams and whoami",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "whoami -> member 9c007781… admin; list-workspace-teams -> [] (no teams exist)",
   "notes": ""
  },
  {
   "t": "00:20",
   "cap": "pay",
   "capability": "Buy the product the agent way",
   "task": "Probe 402/x402/MPP/L402, well-known, registries, docs; find checkout",
   "route": "browser",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "x402./mpp./agents.attio.com do not resolve; unauthenticated api.attio.com -> 401 (no PAYMENT-REQUIRED/WWW-Authenticate Payment); /.well-known/ucp 404 HTML; OpenAPI has no x-payment-info; llms-full.txt (770 KB) has no x402/402/MPP/USDC; not in x402 Bazaar or mpp.dev/api/services; MCP tools/list has no billing tool. Settings > Plans 'Keep Pro' opens an in-app Stripe Elements card form (js.stripe.com frames incl. Stripe invisible hCaptcha) with seat count, address, VAT; Pro €74/user/mo annual.",
   "notes": "Not submitted: no card. 14-day Pro trial started with no card. POST /v2/sql on trial returns body status_code 402 'contact sales' - a plan gate, not a payment rail. No billing API."
  },
  {
   "t": "00:20",
   "cap": "cap-29",
   "capability": "Manage billing plan, seats and credits",
   "task": "Find plan/seat/credit controls",
   "route": "browser",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "Settings > Plans shows trial, Compare plans, Downgrade buttons, credits add-ons, seat count in Stripe form; Settings > Billing exists",
   "notes": "Viewed only; changing plan needs a card. No API/MCP route."
  },
  {
   "t": "00:20",
   "cap": "cap-30",
   "capability": "Configure SSO",
   "task": "Check SSO availability",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "Capability map: Enterprise plan; plan comparison on Settings > Plans lists Enterprise with 'Talk to sales'",
   "notes": "Not attempted beyond plan page."
  },
  {
   "t": "00:24",
   "cap": "cap-26",
   "capability": "In-app AI agent analyzes records and writes back",
   "task": "Ask Attio (home chat) to add a lead-score note to AgentDrives Test Co",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Ask Attio searched records, drafted a note card with Create/Discard; after clicking Create, GET /v2/notes for c9785373… shows note \"Lead score\" / \"Lead score 7/10, reviewed by Ask Attio.\" by workspace-member",
   "notes": "Write actions need an in-chat confirmation click. No API to drive Ask Attio; the MCP exposes the same tools to an outside agent instead."
  },
  {
   "t": "00:28",
   "cap": "cap-14",
   "capability": "Build a workflow automation",
   "task": "Workflow: on company created, create task Review new company due in 3 days",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Workflows > New workflow; Ask Attio in the editor built trigger Record created -> Create task from a prompt; Publish changes; then POST /v2/objects/companies/records dba2d44d…; ~25s later GET /v2/tasks shows \"Review new company\" linked to dba2d44d…, deadline 2026-10-05",
   "notes": "No API or MCP route to create workflows; browser only. Ran on Pro trial."
  },
  {
   "t": "00:30",
   "cap": "cap-15",
   "capability": "Enroll contacts in an outbound email sequence",
   "task": "Create sequence and enroll our own test person",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Sequences > New sequence opens editor (Untitled Sequence 28b47283…, Step 1 Automated email, Recipients 0, Publish sequence). Sending requires a connected Gmail or Microsoft mailbox (onboarding Connect mailbox; home Sync Google/Microsoft Account); we have only a receive-only inbox",
   "notes": "No API/MCP to create or enroll sequences (only POST /v2/sequences/unsubscribed_emails). Not published; no mail sent."
  },
  {
   "t": "00:32",
   "cap": "cap-28",
   "capability": "Change workspace branding",
   "task": "Rename workspace to AgentDrives Test",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Settings > General Name field set + reload shows AgentDrives Test; GET /v2/self workspace_name AgentDrives Test",
   "notes": "No API to change name/logo."
  },
  {
   "t": "00:34",
   "cap": "cap-27",
   "capability": "Connect an integration or build a custom app with the App SDK",
   "task": "Assess App SDK path",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "docs.attio.com quickstart: sign in at build.attio.com developer console, create developer account and app in the browser, then `npm create attio@latest <slug>`, `npm run dev` asks to choose a workspace and redirects to install the app",
   "notes": "Skipped for time: needs a second browser-based developer-console signup plus an interactive dev server."
  },
  {
   "t": "00:34",
   "cap": "cap-31",
   "capability": "Install an integration from the marketplace",
   "task": "Assess marketplace install",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Settings > Apps exists; integrations connect third-party accounts (Gmail/Outlook/Slack etc.) we do not have",
   "notes": "Not attempted."
  },
  {
   "t": "00:36",
   "cap": "cleanup",
   "capability": "Delete created data",
   "task": "Delete webhook, meeting, tasks, notes, files, records, custom object",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "DELETE endpoints returned {}; GET /v2/webhooks, /v2/tasks, /v2/notes all empty; companies query for 'AgentDrives' -> []",
   "notes": "No DELETE endpoint for lists in the REST API; list AD Pipeline went with the workspace."
  },
  {
   "t": "00:37",
   "cap": "cancel",
   "capability": "Cancel/downgrade plan",
   "task": "End the Pro trial",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "No paid plan was started; trial needed no card. Settings > Plans shows Downgrade buttons in the web UI; workspace deletion ended the trial",
   "notes": "No billing API."
  },
  {
   "t": "00:37",
   "cap": "delete",
   "capability": "Delete account and data",
   "task": "Delete the workspace",
   "route": "browser",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "Settings > General > Delete workspace: reason select + type slug 'agent-drives' + 'Delete workspace permanently' -> redirected to /workspaces 'No workspaces found'; GET /v2/self -> {active:false}; MCP call -> 403",
   "notes": "Workspace and all data deleted. The Attio user login (the agent's inbox) still exists: /workspaces shows only 'Add new workspace' and 'Sign out'; no self-serve user deletion found. No API for workspace deletion."
  }
 ],
 "stale": false,
 "icon": "/logos/attio.png",
 "monitored": false,
 "verdict": "Our agent gets in on its own: L4 · Runs on its own. Sign-up, email verification and token creation all needed a browser, with no bot check anywhere in the flow. Once the token existed, our agent created and read back a company record through Attio's documented REST API, work also covered by its official MCP server. Workflows, sequences and billing stayed browser-only. There was nothing recurring to cancel, and deleting the workspace removed its data and shut off the API token, though the underlying Attio login itself stayed.",
 "page": "https://agentdrives.com/tools/attio?via=api"
}