Published 2026-09-22 · Tested 2026-09-22
Vercel
B+Vercel received 6 PASS votes and passed 5 of five agent surface checks. The clearest finding came from the find the exact limits task.
Three AI models, GPT 5.6 Sol, Claude Opus 5, and DeepSeek v4 Flash, each read Vercel’s public documentation independently and attempted five first-hour developer jobs: deploy the first project, find the exact limits, recover from a 429, verify a webhook, use the TypeScript SDK.
No accounts, API calls, or code execution were used. Every verdict came from public pages and every published quotation passed a live verification check.
Freshness
How rechecks work- Category
- Cloud & developer platforms
- Tested
- Quotes verified
- Surface rechecked
- Not yet rechecked
88.8% · 71/80 · AI Agent Readiness Score · reading 30 pts · surface 50 pts
Agent surface checks · 50/50
The Reading Test
| Task | GPT 5.6 Sol | Opus 5 | DeepSeek v4F | Consensus |
|---|---|---|---|---|
| Deploy the first project | PARTIAL | PARTIAL | PASS | PARTIAL |
| Find the exact limits | PARTIAL | PARTIAL | PASS | PARTIAL |
| Recover from a 429 | PARTIAL | PARTIAL | PARTIAL | PARTIAL |
| Verify a webhook | PARTIAL | PASS | PASS | PASS |
| Use the TypeScript SDK | PASS | PARTIAL | PASS | PASS |
docs platform: Custom Next.js (unscored) · verified 2026-09-22
What to fix first
These 3 fixes could add up to 7 points to the AI Agent Readiness Score. The list ranks each fix by the points it would add. How the ranking works
- 1
Found: The REST API errors page names rate_limited but never states the 429 status or a retry step, and the dynamic-quota section calls the same code rate_limit_exceeded.
Fix: State the 429 status on the REST API errors page, name one error code in both it and the dynamic-quota section, and document the retry wait.
Evidence: vercel.com/
docs/ rest-api/ errors (opens in a new tab) - 2
Found: The getting-started page installs the CLI with npm i -g vercel in its agent prompt and npm i vercel in its numbered install step.
Fix: Use the same install command in the agent prompt and the numbered step on the getting-started page, and match it on the CLI overview.
Evidence: vercel.com/
docs/ getting-started-with-vercel (opens in a new tab) - 3
Found: The limits page lists Enterprise deployments per day as 24000 in one table and Custom in another, and gives Domains retrieval per minute as both 200 and 500.
Fix: Reconcile the two Enterprise deployments-per-day values on the limits page, and label each duplicated Domains retrieval row with the case it covers.
What the docs get right
- Verify a webhook: 2 PASS votes. The path runs end to end without guessing: create the webhook and capture the one-time secret, receive a typed event payload, read x-vercel-signature, and compare an HMAC-SHA1 of the raw body using crypto.timingSafeEqual.
- Use the TypeScript SDK: 2 PASS votes. The page installs @vercel/sdk, initializes Vercel with VERCEL_TOKEN, and maps GET /v10/projects?limit=1 to vercel.projects.getProjects({ limit: '1' }).
- 5 of 5 agent surface checks. Present: llms.txt, llms-full.txt, markdown mirrors, an MCP server, docs AI.
Deploy the first project
PARTIALPARTIAL consensus from 1 PASS, 2 PARTIAL.
The agent prompt gives a global npm path, but the page body and CLI overview instead show npm i vercel, so installation is not one consistent path. The step sequence is clear, but the same page tells the agent to run npm i -g vercel in its agent prompt and npm i vercel in its numbered install step, so the CLI lands globally or locally depending on which block is read. The main docs page and the getting-started page both present the identical three-command flow. The CLI detects the framework, builds, and deploys. Production promotion uses the --prod flag. No guessing required.
Find the exact limits
PARTIALPARTIAL consensus from 1 PASS, 2 PARTIAL.
The rate-limit table gives plan values and scopes, but the general table says Enterprise deployments per day are Custom rather than 24000. Every rate limit carries an explicit limit, duration and scope, but the table repeats several descriptions verbatim with different values, so Domains retrieval per minute reads 200 in one row and 500 in the next with no way to tell which applies. The REST API page names the three rate-limit response headers and links to the limits page, which lists per-endpoint rate limits (limit per window) and deployment quotas per plan (Free/Pro/Enterprise). All values and scopes are consistent across the table.
Recover from a 429
PARTIALPARTIAL consensus from 3 PARTIAL.
The error reference names rate_limited and returns reset timestamps, but the quickstart calls the 429 platform-wide and the dynamic-quota section names rate_limit_exceeded. The REST API error page names the rate_limited code and returns a reset epoch an agent can wait on, but it never states the HTTP status is 429, never mentions retry-after, and the 67 429 responses in the OpenAPI description carry empty description strings. The errors page names the 'Rate limited' condition and explains it is per-endpoint, and the REST API page documents the three response headers (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset). However, the docs never state the HTTP 429 status code explicitly, never mention a Retry-After header, and provide no retry or backoff guidance. An agent can detect the condition but cannot reach a complete correction from the docs alone.
Verify a webhook
PASSPASS consensus from 2 PASS, 1 PARTIAL.
The setup, payload schema, raw-body HMAC, and constant-time comparison are documented, but the linked App Router validator exports GET while delivery uses POST. The path runs end to end without guessing: create the webhook and capture the one-time secret, receive a typed event payload, read x-vercel-signature, and compare an HMAC-SHA1 of the raw body using crypto.timingSafeEqual. The process is complete: create a webhook via Settings > Webhooks, select events and scope, supply an endpoint URL, receive a secret key shown once, then verify every incoming request by computing HMAC-SHA1 of the raw body with the secret and comparing it to the x-vercel-signature header. Both the webhooks page and request-headers page document this end-to-end.
Use the TypeScript SDK
PASSPASS consensus from 2 PASS, 1 PARTIAL.
The page installs @vercel/sdk, initializes Vercel with VERCEL_TOKEN, and maps GET /v10/projects?limit=1 to vercel.projects.getProjects({ limit: '1' }). Every endpoint page carries a complete authenticated example using new Vercel({ bearerToken }) and the SDK method maps onto the same GET /v7/deployments route the REST reference lists, but the page's own install it link points at an anchor that does not exist and no install command appears anywhere on it. The SDK docs provide install (pnpm i @vercel/sdk) and a complete authentication example using a bearer token. This matches the REST API authentication form (Authorization: Bearer <TOKEN>). The SDK methods map one-to-one to REST API endpoints, and the grouping is consistent.
The receipt
| Deployments per day (Free). | 100 | 86400 | owner | | Deployments per day (Pro). | 6000 | 86400 | owner | | Deployments per day (Enterprise). | 24000 | 86400 | owner |
The rate-limit table gives plan values and scopes, but the general table says Enterprise deployments per day are Custom rather than 24000.
Agent surface notes
Initialize returned HTTP 401 with WWW-Authenticate Bearer and resource_metadata naming the resource Vercel MCP.
Clicking the docs Ask AI control opened an in-house chat panel with an "Ask a question..." input.
Show the score
Paste this into a readme:
[](https://docsforagents.com/reports/vercel-docs-ai-agent-readiness/) Method note
This is a reading test of public documentation, not an execution test. No accounts were created and no API calls were run. The AI Agent Readiness Score counts fifteen reading votes at PASS 2, PARTIAL 1, and FAIL 0, for 30 possible points. Five agent surface checks add 10 points each. The total is 80. Consensus chips show each row majority and do not affect scoring. The panel split on 4 of five tasks. Quotes shown here were re-fetched and confirmed verbatim on 2026-09-22.
Put another docs site through the battery.
Nominate a docs site