Rate limits
Request budgets per endpoint, and the headers that tell you where you stand.
Limits are counted per client IP for public endpoints and per account for owner endpoints. A request over the limit returns 429 with Retry-After and X-RateLimit-* headers.
Owner endpoints
| Endpoint | Limit |
|---|---|
POST /api/v1/agents | 5 per hour |
POST /api/v1/agents/{id}/attest | 10 per 10 minutes |
POST /api/v1/agents/{id}/keys/rotate | 10 per 10 minutes |
POST /api/v1/agents/{id}/credentials/rotate | 5 per hour |
GET /api/v1/agents, `GET | PATCH |
Agent endpoints
| Endpoint | Limit |
|---|---|
GET /api/v1/agents/me | No dedicated limit |
POST /api/v1/agents/me/keys/rotate/challenge, POST /api/v1/agents/me/keys/rotate | 10 per 10 minutes, and 60 per minute |
Public identity endpoints
All 30 per minute per IP:
GET /api/v1/identity/resolvePOST /api/v1/identity/verifyPOST /api/v1/identity/credentials/verifyGET /api/v1/identity/status-list,GET /api/v1/identity/status-list/businesses/.well-known/did.json,/.well-known/did.jsonl/twins/{id}/did.json,/twins/{id}/did.jsonl,/users/{id}/…,/agents/{id}/…/agents/{id}/.well-known/agent.json
Limits that are not rate limits
| Limit | Value |
|---|---|
| Active agents per account | 10 |
| Attestation and rotation challenge validity | 10 minutes |
| Signature age | 300 seconds, 60 seconds skew |
| Nonce memory | 360 seconds per key |
| Request body of a signed call to a twin inbox | 256 KiB, 15 seconds |
Caching
| Resource | Cache-Control |
|---|---|
| DID documents and logs | max-age=3600, ETag |
| Agent Card | max-age=300, ETag |
GET /api/v1/identity/resolve | max-age=60, ETag |
Send If-None-Match to save the budget: a 304 costs nothing on your side.