{
 "slug": "vercel",
 "name": "Vercel",
 "url": "https://vercel.com",
 "domain": "vercel.com",
 "category": "hosting",
 "category_name": "Hosting and deploys",
 "tested_at": "2026-10-16",
 "run": "20261016T064917Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261006T045740Z",
   "date": "2026-10-06",
   "level": 2,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  },
  {
   "run": "20261016T064917Z",
   "date": "2026-10-16",
   "level": 2,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 4,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "skip"
   }
  }
 ],
 "level": 2,
 "level_name": "Gets in",
 "level_selfhost": null,
 "entry": "self-start",
 "door": {
  "passed": 2,
  "tries": 2,
  "self_start": true
 },
 "badges": [],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: no key needed",
   "way": "keyless"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "no",
   "text": "Work done: 0% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "no",
   "text": "A person has to buy: a phone number at checkout",
   "value": "person",
   "route": "billing_api",
   "why": "phone"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Nothing to cancel; can't delete what it made",
   "at": "delete",
   "how": "no-account",
   "left": "stuck"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "yes",
   "text": "Docs agents can read: llms.txt, an OpenAPI and an MCP server; a docs page for each core task",
   "have": [
    "llms_txt",
    "openapi",
    "mcp"
   ],
   "docs": "complete"
  },
  {
   "key": "access",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: no key needed",
   "way": "keyless",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "no",
   "text": "Work done: 0% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "no",
   "text": "A person has to buy: a phone number at checkout",
   "value": "person",
   "route": "billing_api",
   "why": "phone",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Nothing to cancel; can't delete what it made",
   "at": "delete",
   "how": "no-account",
   "left": "stuck",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "keyless",
   "label": "No key needed",
   "routes": [
    "keyless"
   ],
   "minutes": 2,
   "core": "0/10"
  }
 ],
 "minutes": 2,
 "next": {
  "to": 3,
  "text": "Next: do half of the core work (now 0%)"
 },
 "stop": "pay",
 "core": "0/10",
 "scores": {
  "coverage": 0,
  "reliability": null,
  "resilience": 62,
  "setup": 100,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 100,
  "security": null,
  "standards": [
   {
    "standard": "MCP client registration",
    "state": "behind",
    "behind": null,
    "value": "dcr"
   },
   {
    "standard": "OpenAPI",
    "state": "behind",
    "behind": 2,
    "value": "3.0.3"
   }
  ]
 },
 "reliability_method": null,
 "resilience": {
  "parts": {
   "error_legibility": 75,
   "recovery": 50
  },
  "summary": null
 },
 "stress": [
  {
   "capability": "discovery",
   "probe": "bad credential on REST API",
   "outcome": "403 application/json {\"error\":{\"code\":\"forbidden\",\"message\":\"Not authorized\",\"invalidToken\":true}}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  }
 ],
 "surface_audit": null,
 "coverage_core": 0,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 4,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": false,
  "prompt_sha": "365f93123295",
  "kb_version": "3+overlay-83f4487de6",
  "identity": "e8a92f24a9a8"
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 4,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "skip"
 },
 "same_level_drives": 2,
 "drives": 2,
 "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-16"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "llms.txt with agent guidance, Markdown docs (.md URLs and Accept: text/markdown with Vary: Accept), OpenAPI 3.0.3 with 454 operations, AI Catalog."
  },
  "signup": {
   "status": "n/a",
   "cause": "refused",
   "note": "No key needed: done.",
   "way": "keyless",
   "note_driver": "Continue with Email was refused with no reason ('unknown_error: Please try again later or use a different signup method.'), no visible challenge. Continue with GitHub created the account but then asked for a phone number (see verify).",
   "status_driver": "blocked"
  },
  "verify": {
   "status": "n/a",
   "cause": "phone",
   "note": "No key needed: done.",
   "note_driver": "After GitHub sign-up every login goes to /login/callback/verify/sms: 'Please enter your phone number to verify your login.' We have no phone number.",
   "status_driver": "blocked"
  },
  "credentials": {
   "status": "n/a",
   "cause": "phone",
   "note": "No key needed: done.",
   "note_driver": "Tokens (POST /v3/user/tokens, dashboard), `vercel login` device flow and MCP OAuth (DCR works, 201) all need a login, which demands the phone code.",
   "status_driver": "blocked"
  },
  "first_call": {
   "status": "headless",
   "cause": "phone",
   "route": "no_account",
   "note": "Keyless, documented calls succeeded with no account: GET ai-gateway.vercel.sh/v1/models and `vercel domains search` both work with no credentials (llms.txt: 'No API key required'). No core capability is reachable this way; the account route (tokens, CLI login, MCP OAuth) stays blocked by the phone wall.",
   "note_driver": "No token. Keyless calls (AI Gateway model list, domain search) work but reach no core capability.",
   "status_driver": "blocked"
  },
  "first_action": {
   "status": "n/a",
   "note": "No key needed: done.",
   "note_driver": "Behind the phone verification.",
   "status_driver": "blocked"
  },
  "pay": {
   "status": "blocked",
   "grade": "P3",
   "rails": [
    "billing API (POST /v1/billing/buy, purchase credits)",
    "Stripe Projects (catalog listing, not confirmed)"
   ],
   "rail_ids": [
    "stripe-projects",
    "other"
   ],
   "first_party": false,
   "rail_scope": "partial",
   "trial_path": "free tier",
   "route": "billing_api",
   "checkout": {
    "reached": "no",
    "processor": "none",
    "captcha": "none",
    "three_ds": "not_seen",
    "card_form": false,
    "phone_field": "none",
    "wallets": [],
    "rail_offer": "none",
    "price": "",
    "currency": "",
    "period": "",
    "plan": "",
    "last_button": ""
   },
   "person": "phone",
   "ours": null,
   "note": "No x402/MPP 402 anywhere. Free Hobby plan. openapi.json documents POST /v1/billing/buy (purchase credits) and GET /v1/billing/charges; Stripe Projects catalog lists vercel. The checkout walk could not start: the dashboard is behind the SMS phone check. is what the documented billing API would give, not proven.",
   "detected_grade": "P3",
   "exercised": false
  },
  "cancel": {
   "status": "n/a",
   "note": "Nothing to cancel: our agent used the free plan.",
   "docs_note": "Nothing to cancel: the drive started no plan or trial. Docs (https://vercel.com/docs/plans/pro-plan.md, 'Downgrading to Hobby'): Dashboard > Settings > Plan > Downgrade Plan, a web UI step.",
   "docs_grade": "",
   "nothing": "free_plan"
  },
  "delete": {
   "status": "blocked",
   "note": "DELETE /v1/user (Delete User Account) is documented, but it needs a token and every login demands a phone code, so the account the GitHub sign-up created stays. GitHub grant revoked.",
   "left": "stuck",
   "after_hours": null,
   "account": false
  }
 },
 "routes": [
  {
   "route": "keyless",
   "offered": "documented",
   "tried": true,
   "not_tried": null,
   "result": "in",
   "wall": null,
   "person": "none",
   "brings": "nothing",
   "fresh": true,
   "minutes": 2
  },
  {
   "route": "email_code",
   "offered": "seen",
   "tried": true,
   "not_tried": null,
   "result": "refused",
   "wall": {
    "type": "manual_review",
    "owner": "product"
   },
   "person": "none",
   "brings": "inbox",
   "fresh": true,
   "minutes": 2
  },
  {
   "route": "sso_github",
   "offered": "seen",
   "tried": true,
   "not_tried": null,
   "result": "walled",
   "wall": {
    "type": "phone",
    "owner": "product"
   },
   "person": "once",
   "brings": "github_account",
   "fresh": true,
   "minutes": 3
  },
  {
   "route": "sso_google",
   "offered": "seen",
   "tried": false,
   "not_tried": "no_kit",
   "result": null,
   "wall": null,
   "person": null,
   "brings": null,
   "fresh": null,
   "minutes": null
  },
  {
   "route": "device_login",
   "offered": "seen",
   "tried": true,
   "not_tried": null,
   "result": "walled",
   "wall": {
    "type": "phone",
    "owner": "product"
   },
   "person": "none",
   "brings": "github_account",
   "fresh": false,
   "minutes": 2
  },
  {
   "route": "oauth_consent",
   "offered": "seen",
   "tried": true,
   "not_tried": null,
   "result": "walled",
   "wall": {
    "type": "consent_needs_account",
    "owner": "product"
   },
   "person": "none",
   "brings": "nothing",
   "fresh": false,
   "minutes": 2
  },
  {
   "route": "sso_apple",
   "offered": "seen",
   "tried": false,
   "not_tried": "no_kit",
   "result": null,
   "wall": null,
   "person": null,
   "brings": null,
   "fresh": null,
   "minutes": null
  },
  {
   "route": "sso_ai",
   "offered": "seen",
   "tried": false,
   "not_tried": "no_kit",
   "result": null,
   "wall": null,
   "person": null,
   "brings": null,
   "fresh": null,
   "minutes": null
  }
 ],
 "checkout": {
  "reached": "no",
  "processor": "none",
  "captcha": "none",
  "three_ds": "not_seen",
  "phone_field": "none",
  "rail_offer": "none",
  "card_form": false
 },
 "docs": {
  "at": "2026-10-16",
  "read": 598,
  "listed": 2401,
  "sampled": true,
  "overall": "complete",
  "getting_started": "found",
  "auth": "found",
  "errors": "found",
  "examples": "some",
  "freshness": "fresh",
  "newest": "2026-10-16",
  "core_pages": "10 of 10",
  "capabilities": "covered"
 },
 "claims": null,
 "pay_options": {
  "checked": "2026-10-16",
  "source": "probe",
  "options": [
   {
    "id": "stripe-projects",
    "name": "Stripe Projects",
    "kind": "agent-rail",
    "first_party": true,
    "lead": false,
    "networks": [],
    "testnet": false
   }
  ],
  "agentic": [
   "stripe-projects"
  ],
  "paid": null,
  "exercised": false,
  "detected_grade": "P3",
  "trial": {
   "no_card": null,
   "card_required": null,
   "free_plan": true
  },
  "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": "Let a verified agent finish your checkout",
    "how": "Show signed agents no visible CAPTCHA at checkout, accept virtual and prepaid cards, and don't ask for a phone number to pay."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": true,
  "cli": true,
  "mcp": "official",
  "llms_txt": true,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST, 454 operations in openapi.json",
  "openapi": "3.0.3 (behind 3.2.1)",
  "mcp": "official, OAuth (DCR), tools not seen",
  "cli": "vercel 64.3.1; domains search works without login"
 },
 "can_do": [
  "Read the docs as Markdown and the OpenAPI spec without an account",
  "List AI Gateway models and prices without a key",
  "Search domain availability and prices with the CLI without logging in"
 ],
 "cannot_do": [
  {
   "what": "Create an account by email",
   "why": "Refused with 'unknown_error ... use a different signup method', no reason given"
  },
  {
   "what": "Get past sign-in after GitHub sign-up",
   "why": "An SMS code to a phone number is required on every login"
  },
  {
   "what": "Get an API token, log in the CLI or connect MCP",
   "why": "All need a login, which needs the phone code"
  },
  {
   "what": "Delete the account it created",
   "why": "DELETE /v1/user needs a token; login needs a phone"
  }
 ],
 "blockers": [
  "Phone number (SMS code) required to log in after sign-up",
  "Email sign-up refused without a reason"
 ],
 "tips_for_owner": [
  "Let agents finish sign-up without a phone",
  "Say why an email sign-up is refused",
  "Offer an agent sign-up or claimable path",
  "Advertise CIMD for MCP clients",
  "Accept x402 or MPP for paid usage"
 ],
 "tips_for_agents": [
  "Docs: fetch any docs page with .md or Accept: text/markdown; openapi.json has 454 operations",
  "Without an account you can list AI Gateway models and search domains (`vercel domains search <kw> --format=json`)",
  "New accounts are asked for a phone SMS code at login: plan for a human with a phone, or have the human create the token",
  "api.vercel.com robots.txt disallows all user agents: only call it as your own account's steps"
 ],
 "selfhost": null,
 "summary": "Vercel's docs are very agent-ready (llms.txt, Markdown pages, OpenAPI, AI Catalog, official MCP with OAuth and a CLI device login), but an agent cannot get in: the email sign-up was refused with no reason, and the GitHub sign-up created the account and then asked for a phone number for an SMS code on every login. Only keyless reads (AI Gateway model list, domain search) worked; the account it made could not be deleted.",
 "wall": "SMS phone verification on every login",
 "plan_scope": "none (no free access)",
 "robots_stop": null,
 "robots": {
  "rule": "star",
  "step": null,
  "seen": "2026-10-16",
  "held": false
 },
 "plain": {
  "summary": "Vercel is a cloud hosting platform with very agent-friendly documentation, but an agent could not actually use it on its own: creating an account by email was refused for no stated reason, and signing up with GitHub worked but then demanded a phone number for a text-message code on every login.",
  "can_do": [
   "Read all the documentation in a machine-friendly format without any account",
   "Look up available AI models and their prices without logging in",
   "Check whether a domain name is available and its price without logging in"
  ],
  "cannot_do": [
   {
    "what": "Make an account by email",
    "why": "The signup form rejected it with no explanation"
   },
   {
    "what": "Finish making an account with GitHub",
    "why": "Every login then asks for a phone number to text a code to"
   },
   {
    "what": "Deploy a site, use a database, or do anything requiring login",
    "why": "All need an account, which is stuck behind the phone check"
   },
   {
    "what": "Delete the half-made account",
    "why": "Deleting needs a login, which needs the phone code"
   }
  ]
 },
 "plan_gated": [],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Deploy",
   "capability": "Create a deployment from Git push or CLI",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v13/deployments",
    "mcp": null,
    "cli": "vercel",
    "ui": "New Project / Git integration"
   },
   "check": "GET /v13/deployments/{idOrUrl} shows READY state with a live URL",
   "source": "https://vercel.com/docs/rest-api/deployments/create-a-new-deployment.md; https://vercel.com/docs/git; https://vercel.com/docs/cli"
  },
  {
   "id": "cap-02",
   "group": "Deploy",
   "capability": "Get a preview URL for every branch/PR",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /v13/deployments/{idOrUrl}",
    "mcp": "get_deployment",
    "cli": null,
    "ui": "Deployments tab / PR comment"
   },
   "check": "Deployment target is 'preview' and alias responds with branch content",
   "source": "https://vercel.com/docs (Deploy from Git); https://vercel.com/docs/agent-resources/vercel-mcp/tools/deployments/get_deployment"
  },
  {
   "id": "cap-03",
   "group": "Deploy",
   "capability": "Roll back production to a previous deployment instantly",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /v12/deployments/{id}/cancel (for in-flight); promote via alias API",
    "mcp": null,
    "cli": "vercel rollback",
    "ui": "Deployments > Instant Rollback"
   },
   "check": "GET /v13/deployments/{idOrUrl} for production alias shows the prior deployment id",
   "source": "https://vercel.com/docs/instant-rollback"
  },
  {
   "id": "cap-04",
   "group": "Deploy",
   "capability": "Run serverless/edge Functions behind the deployment",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "vercel dev",
    "ui": "Project > Functions"
   },
   "check": "Invoking the function route returns a response and appears in runtime logs",
   "source": "https://vercel.com/docs/functions"
  },
  {
   "id": "cap-05",
   "group": "Deploy",
   "capability": "Add a custom domain and get automatic SSL",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v7/domains",
    "mcp": "add domain tool (Domains and DNS)",
    "cli": "vercel domains add",
    "ui": "Project > Domains"
   },
   "check": "GET /v6/domains/{domain}/config shows verified, and HTTPS cert is issued",
   "source": "https://vercel.com/docs/rest-api/domains/add-an-existing-domain-to-the-vercel-platform.md; https://vercel.com/docs/domains"
  },
  {
   "id": "cap-06",
   "group": "Deploy",
   "capability": "Manage environment variables per environment",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET/POST/PATCH/DELETE /v1/env",
    "mcp": "Environment Variables tools",
    "cli": "vercel env add",
    "ui": "Project > Settings > Environment Variables"
   },
   "check": "GET /v1/env/{id} returns the stored (decrypted) value for the target environment",
   "source": "https://vercel.com/docs/rest-api (Environment); https://vercel.com/docs/deployments/environments"
  },
  {
   "id": "cap-07",
   "group": "Deploy",
   "capability": "Restrict preview/production access (deployment protection)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project > Settings > Deployment Protection"
   },
   "check": "Unauthenticated request to the deployment URL is challenged for Vercel Authentication/password",
   "source": "https://vercel.com/docs/deployment-protection"
  },
  {
   "id": "cap-08",
   "group": "Deploy",
   "capability": "Split production traffic across deployments (rolling releases)",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": "Rolling Releases tools",
    "cli": null,
    "ui": "Project > Rolling Release"
   },
   "check": "Traffic split config shows percentage weights across two deployment ids",
   "source": "https://vercel.com/docs/rolling-releases; https://vercel.com/docs/agent-resources/vercel-mcp/tools"
  },
  {
   "id": "cap-09",
   "group": "Routing",
   "capability": "Configure rewrites, redirects and routing middleware",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "Routing tools (15 tools)",
    "cli": null,
    "ui": "vercel.json / middleware.ts"
   },
   "check": "Requesting the source path returns the rewritten/redirected response",
   "source": "https://vercel.com/pricing (Configurable Routing); https://vercel.com/docs/routing-middleware"
  },
  {
   "id": "cap-10",
   "group": "Routing",
   "capability": "Stage and promote bulk redirects for a project",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "PUT /v1/bulk-redirects, POST /v1/bulk-redirects/restore",
    "mcp": null,
    "cli": null,
    "ui": "Project > Redirects"
   },
   "check": "GET /v1/bulk-redirects/versions shows the promoted version as production",
   "source": "https://vercel.com/docs/rest-api/bulk-redirects/stages-new-redirects-for-a-project.md"
  },
  {
   "id": "cap-11",
   "group": "Caching",
   "capability": "Revalidate/cache pages with ISR on schedule or on demand",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "Caching tools",
    "cli": null,
    "ui": "framework config (revalidate)"
   },
   "check": "Repeated request after TTL shows a regenerated response timestamp",
   "source": "https://vercel.com/docs/incremental-static-regeneration"
  },
  {
   "id": "cap-12",
   "group": "Caching",
   "capability": "Purge/invalidate CDN cache by tag",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/edge-cache/invalidate-by-tags",
    "mcp": "Caching tools",
    "cli": "vercel cache purge",
    "ui": "Project > Cache"
   },
   "check": "Subsequent response for the tagged path has a cache-status indicating a miss then fresh fill",
   "source": "https://vercel.com/docs/rest-api/edge-cache/invalidate-by-tag.md"
  },
  {
   "id": "cap-13",
   "group": "Storage",
   "capability": "Resize/convert images on demand (Image Optimization)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "next/image / Image Optimization settings"
   },
   "check": "Requesting /_vercel/image?url=...&w=... returns a resized image with cache headers",
   "source": "https://vercel.com/docs/image-optimization"
  },
  {
   "id": "cap-14",
   "group": "Storage",
   "capability": "Store and retrieve files in Blob object storage",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "Storage tools",
    "cli": "vercel blob put/get/list/del",
    "ui": "Storage > Blob"
   },
   "check": "vercel blob list shows the uploaded pathname after put",
   "source": "https://vercel.com/docs/cli (blob command)"
  },
  {
   "id": "cap-15",
   "group": "Storage",
   "capability": "Read/write fast key-value config (Global/Edge Config) without redeploy",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET/PATCH /v1/global-config/{id}/items",
    "mcp": "Global Config tools",
    "cli": null,
    "ui": "Storage > Edge Config"
   },
   "check": "GET /v1/global-config/{id}/item/{key} reflects the updated value immediately",
   "source": "https://vercel.com/docs/rest-api (Global Config); https://vercel.com/pricing (Global Config)"
  },
  {
   "id": "cap-16",
   "group": "AI",
   "capability": "Call any LLM through one gateway endpoint",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST https://ai-gateway.vercel.sh/v1/chat/completions",
    "mcp": "AI Gateway tools",
    "cli": "vercel ai-gateway setup",
    "ui": "AI Gateway dashboard"
   },
   "check": "Response contains a completion and the request appears in AI Gateway observability/spend",
   "source": "https://vercel.com/docs (Call a model); https://vercel.com/docs/ai-gateway"
  },
  {
   "id": "cap-17",
   "group": "AI",
   "capability": "Set budgets and routing rules for model spend",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "PUT /ai-gateway/budgets, POST /ai-gateway/rules",
    "mcp": "AI Gateway tools",
    "cli": null,
    "ui": "AI Gateway > Budgets"
   },
   "check": "GET /ai-gateway/budgets/list shows the configured limit and enforcement on overage",
   "source": "https://vercel.com/docs/rest-api/ai-gateway/upsert-ai-gateway-budget.md"
  },
  {
   "id": "cap-18",
   "group": "AI",
   "capability": "Run untrusted/agent-generated code in an isolated Sandbox",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "Sandboxes tools (23 tools)",
    "cli": null,
    "ui": null
   },
   "check": "Sandbox creation returns a running instance id and command output is returned",
   "source": "https://vercel.com/docs/sandbox; https://vercel.com/pricing (Vercel Sandbox)"
  },
  {
   "id": "cap-19",
   "group": "AI",
   "capability": "Build durable multi-step agent/background workflows",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Workflow run shows step-by-step event history reaching a completed state",
   "source": "https://vercel.com/docs/workflows"
  },
  {
   "id": "cap-20",
   "group": "AI",
   "capability": "Generate/iterate full-stack app code with v0",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": "v0 MCP",
    "cli": null,
    "ui": "v0.app"
   },
   "check": "v0 chat produces a generated project that can be deployed from its own UI",
   "source": "https://vercel.com/pricing (v0 add-on)"
  },
  {
   "id": "cap-21",
   "group": "Security",
   "capability": "Create custom Web Application Firewall rules and IP blocks",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "Firewall and Security tools",
    "cli": null,
    "ui": "Project > Firewall"
   },
   "check": "A request matching the blocked IP/rule is rejected (403) and shows in Firewall activity",
   "source": "https://vercel.com/docs/vercel-firewall/vercel-waf; https://vercel.com/pricing (Web Application Firewall)"
  },
  {
   "id": "cap-22",
   "group": "Security",
   "capability": "Protect a route from bots with BotID invisible check",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project > Firewall > BotID"
   },
   "check": "Automated request to the protected route is flagged/blocked while a normal browser request passes",
   "source": "https://vercel.com/docs/botid"
  },
  {
   "id": "cap-23",
   "group": "Monitoring",
   "capability": "View runtime logs and errors for deployments",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /v3/deployments/{idOrUrl}/events",
    "mcp": "get_runtime_logs, get_runtime_errors",
    "cli": "vercel logs",
    "ui": "Project > Logs"
   },
   "check": "Triggering an error in the function surfaces in get_runtime_errors grouped by route",
   "source": "https://vercel.com/docs/agent-resources/vercel-mcp/tools/observability/get_runtime_logs; https://vercel.com/docs/cli (logs)"
  },
  {
   "id": "cap-24",
   "group": "Monitoring",
   "capability": "View visitor/page-view analytics (Web Analytics)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /web/insights/toggle",
    "mcp": "Web Analytics tools (4 tools)",
    "cli": null,
    "ui": "Project > Analytics"
   },
   "check": "Analytics dashboard/MCP query returns page-view counts for the enabled project",
   "source": "https://vercel.com/docs/rest-api/untagged/createwebinsightstoggle.md"
  },
  {
   "id": "cap-25",
   "group": "Monitoring",
   "capability": "Query custom observability metrics",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /v2/observability/query",
    "mcp": "Observability tools",
    "cli": null,
    "ui": "Project > Observability"
   },
   "check": "Query response returns a metric series matching the requested schema id",
   "source": "https://vercel.com/docs/rest-api/untagged/createobservabilityquery.md"
  },
  {
   "id": "cap-26",
   "group": "Monitoring",
   "capability": "Set up Checks to gate deployments on custom tests",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/projects/{project}/checks",
    "mcp": "Checks tools (10 tools)",
    "cli": null,
    "ui": "Deployment > Checks"
   },
   "check": "GET check run shows a completed status (passed/failed) tied to the deployment",
   "source": "https://vercel.com/docs/rest-api/checks-v2/create-a-check.md"
  },
  {
   "id": "cap-27",
   "group": "Monitoring",
   "capability": "Stream events to a third-party log/observability sink (Drains)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /v1/drains",
    "mcp": "Drains tools",
    "cli": null,
    "ui": "Project/Team > Log Drains"
   },
   "check": "POST /v1/drains/test confirms successful delivery to the configured endpoint",
   "source": "https://vercel.com/docs/rest-api/drains/create-a-new-drain.md"
  },
  {
   "id": "cap-28",
   "group": "Collaboration",
   "capability": "Leave and manage comments on a deployment (Toolbar)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "Toolbar tools (6 tools)",
    "cli": "vercel comments",
    "ui": "Vercel Toolbar on preview URL"
   },
   "check": "vercel comments ls lists the newly posted comment thread",
   "source": "https://vercel.com/docs/comments; https://vercel.com/docs/cli (comments)"
  },
  {
   "id": "cap-29",
   "group": "Collaboration",
   "capability": "Toggle feature flags and route traffic by flag",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "PUT /v1/projects/{project}/feature-flags/flags",
    "mcp": "Feature Flags tools (11 tools)",
    "cli": null,
    "ui": "Project > Flags"
   },
   "check": "GET flags list shows the new flag value and affected responses change accordingly",
   "source": "https://vercel.com/docs/rest-api/feature-flags/create-a-flag.md"
  },
  {
   "id": "cap-30",
   "group": "Collaboration",
   "capability": "Search for, buy, and transfer a domain (registrar)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /v1/registrar/domains/{domain}/buy",
    "mcp": "Domains and DNS tools",
    "cli": "vercel buy domain",
    "ui": "Domains > Buy"
   },
   "check": "GET /v1/registrar/orders/{orderId} shows the completed purchase order",
   "source": "https://vercel.com/docs/rest-api/domains-registrar/buy-a-domain.md; https://vercel.com/docs/cli (buy)"
  },
  {
   "id": "cap-31",
   "group": "Collaboration",
   "capability": "Manage DNS records for a domain",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v2/domains/{domain}/records",
    "mcp": "Domains and DNS tools",
    "cli": "vercel dns add",
    "ui": "Domains > DNS Records"
   },
   "check": "GET /v5/domains/{domain}/records includes the newly created record",
   "source": "https://vercel.com/docs/rest-api/dns/create-a-dns-record.md"
  },
  {
   "id": "cap-32",
   "group": "Collaboration",
   "capability": "Deploy an app for a user, then transfer it to their own account (claim deployments)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "claim URL flow"
   },
   "check": "Visiting the claim URL and completing it moves the deployment/project into the claimer's account",
   "source": "https://vercel.com/docs/deployments/claim-deployments"
  },
  {
   "id": "cap-33",
   "group": "Collaboration",
   "capability": "Connect an agent to third-party services via short-lived tokens (Vercel Connect)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/connect/token/{connector}",
    "mcp": "Connect tools",
    "cli": null,
    "ui": "Project > Connect"
   },
   "check": "POST /v1/connect/authorize/{connector} issues a token usable against the connector's API",
   "source": "https://vercel.com/docs/connect; https://vercel.com/docs/rest-api/connect/get-a-connect-token.md"
  },
  {
   "id": "cap-34",
   "group": "Admin",
   "capability": "Manage team members and access groups",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/access-groups",
    "mcp": "Access Groups, Teams and Users tools",
    "cli": null,
    "ui": "Team > Members / Access Groups"
   },
   "check": "GET /v1/access-groups/{idOrName}/members lists the added member",
   "source": "https://vercel.com/docs/rest-api/access-groups/creates-an-access-group.md"
  },
  {
   "id": "cap-35",
   "group": "Admin",
   "capability": "View billing charges and purchase credits",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "GET /v1/billing/charges, POST /v1/billing/buy",
    "mcp": "Billing and Purchases tools (9 tools)",
    "cli": "vercel buy credits",
    "ui": "Team > Billing"
   },
   "check": "GET /v1/billing/charges shows the new charge/credit entry",
   "source": "https://vercel.com/docs/rest-api/billing/list-focus-billing-charges.md"
  },
  {
   "id": "cap-36",
   "group": "Admin",
   "capability": "Install third-party integrations from the Marketplace",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "Integrations tools",
    "cli": null,
    "ui": "Integrations Marketplace"
   },
   "check": "Project > Integrations shows the installed integration as connected",
   "source": "https://vercel.com/docs/integrations/install-an-integration/agent-tools"
  },
  {
   "id": "cap-37",
   "group": "Admin",
   "capability": "Create and manage API tokens/keys",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "POST /api-keys",
    "mcp": "Key Management tools (9 tools)",
    "cli": "vercel ai-gateway api-keys create",
    "ui": "Account > Tokens"
   },
   "check": "A request authenticated with the new token succeeds against the REST API",
   "source": "https://vercel.com/docs/rest-api/untagged/createapikeys.md; https://vercel.com/docs/cli (ai-gateway)"
  },
  {
   "id": "cap-38",
   "group": "Admin",
   "capability": "Set up a private network / PrivateLink to internal resources (Secure Compute)",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": "POST /v1/connect/networks",
    "mcp": "Networking tools",
    "cli": null,
    "ui": "Team > Secure Compute"
   },
   "check": "GET /v1/connect/networks/{networkId} shows the network as provisioned and attached to a project",
   "source": "https://vercel.com/docs/rest-api/networking/create-a-secure-compute-network.md"
  }
 ],
 "attempts": [
  {
   "t": "01:36",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "task": "robots.txt",
   "result": "done",
   "verified": true,
   "evidence": "https://vercel.com/robots.txt: User-Agent: * ... Content-Signal: search=yes, ai-input=yes, ai-train=no (Cloudflare Content Signals scheme, parses). api.vercel.com/robots.txt: User-agent: * Disallow: / (account steps use --account).",
   "capability": "Docs"
  },
  {
   "t": "01:36",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "task": "llms.txt",
   "result": "done",
   "verified": true,
   "evidence": "https://vercel.com/llms.txt 200 text/plain, 67 lines, H1 \"# Vercel\", agent guidance, links to .md docs, openapi.json, MCP docs",
   "capability": "Docs"
  },
  {
   "t": "01:36",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "task": "MCP server/discover 2026-07-28",
   "result": "done",
   "verified": true,
   "evidence": "POST https://mcp.vercel.com/ server/discover -> 401 application/json {\"error\":\"invalid_token\",\"error_description\":\"No authorization provided\"}, WWW-Authenticate Bearer resource_metadata=https://mcp.vercel.com/.well-known/oauth-protected-resource",
   "notes": "auth required before discover; retry with credentials once in",
   "capability": "Docs"
  },
  {
   "t": "01:36",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "task": "PRM and AS metadata",
   "result": "done",
   "verified": true,
   "evidence": "PRM 200 JSON (authorization_servers https://vercel.com). AS metadata: registration_endpoint (DCR), no client_id_metadata_document_supported, device_authorization_endpoint https://api.vercel.com/login/oauth/device-authorization, grant device_code, PKCE S256",
   "capability": "Docs"
  },
  {
   "t": "01:36",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "task": "cards",
   "result": "done",
   "verified": true,
   "evidence": "/.well-known/ai-catalog.json 200 application/ai-catalog+json (specVersion 1.0, entries MCP OAuth metadata, REST openapi); mcp.vercel.com/server-card 404; /.well-known/mcp/server-card.json 404; agent-card.json 404; agent.json 404; /.well-known/ucp 404; /auth.md and /SKILL.md 200 text/html (SPA pages, not JSON/md)",
   "capability": "Docs"
  },
  {
   "t": "01:36",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "task": "markdown docs",
   "result": "done",
   "verified": true,
   "evidence": "GET /docs/deployments Accept: text/markdown -> content-type text/markdown, vary: Accept; /docs/deployments.md 200 text/markdown",
   "capability": "Docs"
  },
  {
   "t": "01:36",
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "task": "OpenAPI",
   "result": "done",
   "verified": true,
   "evidence": "https://vercel.com/openapi.json 200 application/json, openapi 3.0.3, 454 operations",
   "capability": "Docs"
  },
  {
   "t": "01:36",
   "cap": "discovery",
   "way": "keyless",
   "route": "api",
   "documented": true,
   "task": "keyless model list",
   "result": "done",
   "verified": true,
   "evidence": "GET https://ai-gateway.vercel.sh/v1/models 200 application/json 530KB, documented in llms.txt \"No API key required.\"; POST /v1/chat/completions without key -> 401",
   "notes": "keyless reaches only the model list and domain search; no core capability",
   "capability": "Docs"
  },
  {
   "t": "03:04",
   "cap": "signup",
   "way": "email_code",
   "route": "browser",
   "documented": true,
   "task": "Sign up with Continue with Email (the agent's inbox)",
   "result": "failed",
   "verified": true,
   "evidence": "vercel.com/signup > Show other options > Continue with Email; server action POST /signup answered 200 {\"code\":\"unknown_error\",\"message\":\"Please try again later or use a different signup method.\"}; page: \"Please try again or try a different sign up method. If you continue to have issues, please complete the account recovery form\". No visible challenge. Two tries (one retry to capture the response), same answer.",
   "notes": "Invisible rejection with no reason; message does not name the email or its domain, so no fallback address (rule: fallback only when the address itself is refused). Not retried further.",
   "quality": {
    "error_legibility": "vague",
    "recoverable": "no"
   },
   "capability": "Sign up"
  },
  {
   "t": "03:04",
   "cap": "signup",
   "way": "pay_per_call",
   "route": "none",
   "result": "skipped",
   "not_tried": "policy",
   "notes": "not offered: pay_probe.json challenges [] and pay_tx.json \"no 402 on the product's own endpoint ... asks for USDC\"",
   "capability": "Sign up",
   "evidence": "not offered: pay_probe.json challenges [] and pay_tx.json \"no 402 on the product's own endpoint ... asks for USDC\""
  },
  {
   "t": "03:04",
   "cap": "pay",
   "step": "probe",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "task": "public pay probes",
   "evidence": "pay_probe.json: no 402 challenges, mpp registry [], bazaar [], Stripe Projects catalog lists vercel (first_party), free Hobby plan \"$0 /mo\", trial: true; no /.well-known/ucp (404 this run); MCP needs auth so payment tools unknown until in",
   "capability": "Pay"
  },
  {
   "t": "05:34",
   "cap": "signup",
   "way": "sso_github",
   "route": "browser",
   "documented": true,
   "task": "Continue with GitHub (agent GitHub account AgentDrives-agent)",
   "result": "blocked",
   "verified": true,
   "evidence": "GitHub consent asked read:user,user:email only (approved). Vercel redirected to /login/callback/verify/sms?...&mode=signup&accountCreated=1&loginType=github: \"Please enter your phone number to verify your login. You will receive a single use code to submit.\" We have no phone number.",
   "notes": "Account record created (accountCreated=1, email agent@agentdrives.com from GitHub) but every login demands SMS verification; stopped (phone).",
   "cause": "phone",
   "capability": "Sign up"
  },
  {
   "t": "05:34",
   "cap": "signup",
   "way": "sso_google",
   "route": "none",
   "result": "skipped",
   "not_tried": "no_kit",
   "notes": "Continue with Google is on /signup; we has no Google account on this drive",
   "capability": "Sign up",
   "evidence": "Continue with Google is on /signup; we has no Google account on this drive"
  },
  {
   "t": "05:34",
   "cap": "signup",
   "way": "sso_apple",
   "route": "none",
   "result": "skipped",
   "not_tried": "no_kit",
   "notes": "Continue with Apple on /signup; no Apple account",
   "capability": "Sign up",
   "evidence": "Continue with Apple on /signup; no Apple account"
  },
  {
   "t": "05:34",
   "cap": "signup",
   "way": "sso_ai",
   "route": "none",
   "result": "skipped",
   "not_tried": "no_kit",
   "notes": "Continue with ChatGPT on /signup; no ChatGPT account",
   "capability": "Sign up",
   "evidence": "Continue with ChatGPT on /signup; no ChatGPT account"
  },
  {
   "t": "05:34",
   "cap": "signup",
   "way": "stripe_projects",
   "route": "none",
   "result": "skipped",
   "not_tried": "no_kit",
   "notes": "Listed in Stripe Projects catalog (projects.dev/providers); our agent has no Stripe Projects account",
   "capability": "Sign up",
   "evidence": "Listed in Stripe Projects catalog (projects.dev/providers); our agent has no Stripe Projects account"
  },
  {
   "t": "05:35",
   "cap": "signup",
   "way": "api_signup",
   "route": "none",
   "result": "skipped",
   "not_tried": "same_as",
   "notes": "not offered: no sign-up API in docs, llms.txt or openapi.json; offered=no",
   "capability": "Sign up",
   "evidence": "not offered: no sign-up API in docs, llms.txt or openapi.json; offered=no"
  },
  {
   "t": "05:35",
   "cap": "signup",
   "way": "authmd",
   "route": "none",
   "result": "skipped",
   "not_tried": "same_as",
   "notes": "not offered: /auth.md is an HTML page, AS metadata has no agent_auth block",
   "capability": "Sign up",
   "evidence": "not offered: /auth.md is an HTML page, AS metadata has no agent_auth block"
  },
  {
   "t": "05:35",
   "cap": "credentials",
   "way": "device_login",
   "route": "cli",
   "documented": true,
   "task": "vercel login (CLI 64.3.1) device flow",
   "result": "blocked",
   "verified": true,
   "evidence": "vercel login printed https://vercel.com/oauth/device?user_code=••••; the page asks to sign in; Continue with GitHub -> /login/callback/verify/sms?...next=/oauth/device: phone number required",
   "notes": "device flow exists (RFC 8628 device_authorization_endpoint) but the login it needs demands a phone",
   "cause": "phone",
   "capability": "Key"
  },
  {
   "t": "05:35",
   "cap": "credentials",
   "way": "oauth_consent",
   "route": "mcp",
   "documented": true,
   "task": "MCP OAuth: DCR + authorize",
   "result": "blocked",
   "verified": true,
   "evidence": "POST https://api.vercel.com/login/oauth/register -> 201 client_id cl_… (DCR works headless, no CIMD advertised). /oauth/authorize?...resource=https://mcp.vercel.com/ -> \"Use your Vercel account to sign in to An MCP client\" login page; the same GitHub login ends at the SMS phone page (seen twice), not retried.",
   "cause": "phone",
   "capability": "Key"
  },
  {
   "t": "06:00",
   "cap": "cap-30",
   "way": "keyless",
   "capability": "Search for, buy, and transfer a domain (registrar)",
   "task": "Search domain availability and price for a keyword",
   "route": "cli",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "vercel domains search agentdrivesprobe --format=json (CLI 64.3.1, no login) -> results with available/purchasePrice/renewalPrice, e.g. agentdrivesprobe.com available 11.25/11.25 1y",
   "notes": "search is keyless as https://vercel.com/domains/get-started.md says; buy needs an account (phone wall) and money (not allowed)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://vercel.com/domains/get-started.md",
    "verify_route": "no"
   }
  },
  {
   "t": "07:17",
   "cap": "verify",
   "way": "sso_github",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "cause": "phone",
   "evidence": "/login/callback/verify/sms: \"Please enter your phone number to verify your login. You will receive a single use code to submit.\"",
   "notes": "verification is by SMS code to a phone number; we have none",
   "capability": "Verify"
  },
  {
   "t": "07:17",
   "cap": "first_call",
   "route": "none",
   "result": "blocked",
   "verified": false,
   "cause": "phone",
   "notes": "no token: tokens (POST /v3/user/tokens, dashboard) and CLI/MCP logins all need a signed-in account, and sign-in demands a phone. Keyless calls (AI Gateway model list, domain search) work but reach no core capability.",
   "capability": "First call",
   "evidence": "no token: tokens (POST /v3/user/tokens, dashboard) and CLI/MCP logins all need a signed-in account, and sign-in demands a phone. Keyless calls (AI Gateway model list, domain search) work but reach no core capability."
  },
  {
   "t": "07:17",
   "cap": "first_action",
   "route": "none",
   "result": "blocked",
   "verified": false,
   "cause": "phone",
   "notes": "behind the phone verification",
   "capability": "First action",
   "evidence": "behind the phone verification"
  },
  {
   "t": "07:17",
   "cap": "credentials",
   "key": "create",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "notes": "POST /v3/user/tokens (Create an Auth Token, openapi.json) and `vercel login` need an authenticated session; login demands a phone",
   "capability": "Key",
   "evidence": "POST /v3/user/tokens (Create an Auth Token, openapi.json) and `vercel login` need an authenticated session; login demands a phone"
  },
  {
   "t": "07:17",
   "cap": "pay",
   "step": "checkout",
   "route": "browser",
   "result": "blocked",
   "verified": false,
   "notes": "walk to the last click not possible: the dashboard (Upgrade to Pro) sits behind the SMS phone verification. Documented billing API: POST /v1/billing/buy (Purchase credits), GET /v1/billing/charges; Stripe Projects catalog lists vercel (not tried, no_kit).",
   "capability": "Pay",
   "evidence": "walk to the last click not possible: the dashboard (Upgrade to Pro) sits behind the SMS phone verification. Documented billing API: POST /v1/billing/buy (Purchase credits), GET /v1/billing/charges; Stripe Projects catalog lists vercel (not tried, no_kit)."
  },
  {
   "t": "07:17",
   "cap": "cancel",
   "route": "none",
   "result": "skipped",
   "verified": false,
   "notes": "nothing started that renews (no plan, no trial); n/a",
   "capability": "Cancel",
   "evidence": "nothing started that renews (no plan, no trial); n/a"
  },
  {
   "t": "07:17",
   "cap": "delete",
   "way": "sso_github",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "cause": "phone",
   "evidence": "DELETE /v1/user (Delete User Account) is documented in openapi.json but needs a token; every login (signup, device page) ended at the SMS phone page, so the half-made account (accountCreated=1, GitHub identity agent@agentdrives.com) cannot be reached to delete.",
   "notes": "left: stuck",
   "capability": "Delete"
  },
  {
   "t": "07:18",
   "cap": "revoke",
   "way": "sso_github",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "github.com/settings/apps/authorizations: Revoke Vercel; after reload \"You have granted 2 applications\" and Vercel is gone",
   "capability": "revoke"
  },
  {
   "t": "07:18",
   "cap": "cap-01",
   "capability": "Create a deployment from Git push or CLI",
   "route": "none",
   "result": "blocked",
   "verified": false,
   "notes": "not reached: no account (sign-in demands a phone number for SMS verification)"
  },
  {
   "t": "07:18",
   "cap": "cap-02",
   "capability": "Get a preview URL for every branch/PR",
   "route": "none",
   "result": "blocked",
   "verified": false,
   "notes": "not reached: no account (sign-in demands a phone number for SMS verification)"
  },
  {
   "t": "07:18",
   "cap": "cap-03",
   "capability": "Roll back production to a previous deployment instantly",
   "route": "none",
   "result": "blocked",
   "verified": false,
   "notes": "not reached: no account (sign-in demands a phone number for SMS verification)"
  },
  {
   "t": "07:18",
   "cap": "cap-04",
   "capability": "Run serverless/edge Functions behind the deployment",
   "route": "none",
   "result": "blocked",
   "verified": false,
   "notes": "not reached: no account (sign-in demands a phone number for SMS verification)"
  },
  {
   "t": "07:18",
   "cap": "cap-05",
   "capability": "Add a custom domain and get automatic SSL",
   "route": "none",
   "result": "blocked",
   "verified": false,
   "notes": "not reached: no account (sign-in demands a phone number for SMS verification)"
  },
  {
   "t": "07:18",
   "cap": "cap-06",
   "capability": "Manage environment variables per environment",
   "route": "none",
   "result": "blocked",
   "verified": false,
   "notes": "not reached: no account (sign-in demands a phone number for SMS verification)"
  },
  {
   "t": "07:18",
   "cap": "cap-07",
   "capability": "Restrict preview/production access (deployment protection)",
   "route": "none",
   "result": "blocked",
   "verified": false,
   "notes": "not reached: no account (sign-in demands a phone number for SMS verification)"
  },
  {
   "t": "07:18",
   "cap": "cap-08",
   "capability": "Split production traffic across deployments (rolling releases)",
   "route": "none",
   "result": "blocked",
   "verified": false,
   "notes": "not reached: no account (sign-in demands a phone number for SMS verification)"
  },
  {
   "t": "07:18",
   "cap": "cap-16",
   "capability": "Call any LLM through one gateway endpoint",
   "route": "none",
   "result": "blocked",
   "verified": false,
   "notes": "not reached: no account (sign-in demands a phone number for SMS verification)"
  },
  {
   "t": "07:18",
   "cap": "cap-23",
   "capability": "View runtime logs and errors for deployments",
   "route": "none",
   "result": "blocked",
   "verified": false,
   "notes": "not reached: no account (sign-in demands a phone number for SMS verification)"
  }
 ],
 "stale": false,
 "icon": "/logos/vercel.png",
 "monitored": false,
 "verdict": null,
 "page": "https://agentdrives.com/tools/vercel?via=api"
}