Access Matrix

Every public route with the credential it needs, the plan that unlocks it, the rate bucket it is metered on, and the outcome per plan. Generated from the API route policy.

Generated by pnpm --filter @philidor/api access:matrix -- --mdx from packages/shared/src/route-policy.ts (re-exported as apps/api/src/lib/route-policy.ts), the same table that drives the OpenAPI security declarations and the cache invariant. Do not hand-edit; regenerate.

What each plan gets

PlanAPI key tierDefault rate limit (enforced)Fair use (not enforced)LicenceCapabilities
Free—none—internal, not redistributable—
Analystanalyst30/min25000/monthinternal, not redistributable, 1 seat—
Propro60/min150000/monthinternal, not redistributable, 3 seats—
Datadata100/min—contract, not redistributable—
Decisioningdecisioning600/min—contract, not redistributableoverhang, risk_graph_signed_decisions, webhooks
Embeddedembedded10000/min—contract, redistributableoverhang, risk_graph_signed_decisions, webhooks

A key is issued with its plan's default rate limit unless a different limit was agreed (recorded on the key as contracted_rpm); GET /v1/me reports the effective limit. A self-serve key's live rpm is the org plan's, so an upgrade applies without re-minting.

Only the per-minute rate limit is enforced. The Analyst (25000) and Pro (150000) monthly figures are fair-use guides from a conservative peer estimate: no monthly meter exists, so requests past them are not refused. SSE is Decisioning and Embedded only. Pro CSV export is capped at a provisional 100 MB/month (PROVISIONAL_PRO_CSV_EXPORT_CAP_BYTES); Analyst has no bulk or export. History and the other depth families stay closed for self-serve.

Routes

ok means the credential and plan pass the access gate for valid inputs, not a guarantee of success or coverage; 401 means a key is required; 403 means the plan is too low. Outcomes assume paid-tier enforcement is active. Family budgets allow the per-IP fallback when the key budget is exhausted; SSE uses concurrent connection limits. Validation, signatures, rollout configuration, coverage, and rate limiting can still reject a call.

MethodPathPlanAnonymousFreeAnalystProDataDecisioningEmbeddedRate bucket (anonymous)Keyed
GET/v1/access/families—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/address/:address/positions—okokokokokokokportfolio (10/60s per IP)max(key rpm, 10)/min per key; IP fallback
GET/v1/assets—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/assets/:chain_id/:address—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/assets/:symbol/collateral—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/assets/:symbol/history—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/assets/:symbol/peg-history—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/assets/by-network/:caip2/:address/assessment—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/assets/by-network/:caip2/:address/financials—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/assets/enrichedData403403403403okokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/assets/enriched/facetsData403403403403okokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/assets/machine-scores/:asset_id—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/basketsData403403403403okokokbasketsRead (60/60s per IP)max(key rpm, 60)/min per key; IP fallback
GET/v1/baskets/:idData403403403403okokokbasketsRead (60/60s per IP)max(key rpm, 60)/min per key; IP fallback
GET/v1/baskets/:id/changesData403403403403okokokbasketsRead (60/60s per IP)max(key rpm, 60)/min per key; IP fallback
GET/v1/baskets/:id/methodology/versionsData403403403403okokokbasketsRead (60/60s per IP)max(key rpm, 60)/min per key; IP fallback
GET/v1/baskets/:id/version/:versionIdData403403403403okokokbasketsRead (60/60s per IP)max(key rpm, 60)/min per key; IP fallback
GET/v1/baskets/:id/versionsData403403403403okokokbasketsRead (60/60s per IP)max(key rpm, 60)/min per key; IP fallback
GET/v1/baskets/:id/webhooksDecisioning403403403403403okokbasketsRead (60/60s per IP)max(key rpm, 60)/min per key; IP fallback
POST/v1/baskets/:id/webhooksDecisioning403403403403403okokbasketsWebhookWrite (30/60s per IP)family budget 30/min per key; IP fallback
DELETE/v1/baskets/:id/webhooks/:whIdDecisioning403403403403403okokbasketsWebhookWrite (30/60s per IP)family budget 30/min per key; IP fallback
POST/v1/baskets/:id/webhooks/:whId/enableDecisioning403403403403403okokbasketsWebhookWrite (30/60s per IP)family budget 30/min per key; IP fallback
POST/v1/baskets/:id/webhooks/:whId/replayDecisioning403403403403403okokbasketsWebhookWrite (30/60s per IP)family budget 30/min per key; IP fallback
GET/v1/baskets/webhooksDecisioning403403403403403okokbasketsRead (60/60s per IP)max(key rpm, 60)/min per key; IP fallback
GET/v1/chains—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
POST/v1/chat—okokokokokokokuserChat (2/60s per IP)2/60s per IP
GET/v1/curators—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/curators/:id—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/curators/:id/events—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/docs—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/events—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/events/:id—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/events/group/:groupKey—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/events/streamDecisioning401403403403403okoksse_connections (5 concurrent per IP (before enforcement only))200 concurrent per key; 5 per reported viewer
GET/v1/evidence/signers—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/graph/attestation/:id/verify—okokokokokokokgraph (600/60s per IP)max(key rpm, 600)/min per key; IP fallback
GET/v1/graph/breachDecisioning401403403403403okokgraph (600/60s per IP)max(key rpm, 600)/min per key; IP fallback
POST/v1/graph/checkDecisioning401403403403403okokgraphCheck (60/60s per IP)family budget 60/min per key; IP fallback
GET/v1/graph/curator-exposureDecisioning401403403403403okokgraph (600/60s per IP)max(key rpm, 600)/min per key; IP fallback
GET/v1/graph/decision/:id/verify—okokokokokokokgraph (600/60s per IP)max(key rpm, 600)/min per key; IP fallback
GET/v1/graph/expected-dependency-lossDecisioning401403403403403okokgraph (600/60s per IP)max(key rpm, 600)/min per key; IP fallback
GET/v1/graph/expected-dependency-loss/summaryDecisioning401403403403403okokgraph (600/60s per IP)max(key rpm, 600)/min per key; IP fallback
GET/v1/graph/incident-exposureDecisioning401403403403403okokgraph (600/60s per IP)max(key rpm, 600)/min per key; IP fallback
GET/v1/graph/incident-exposure/summaryDecisioning401403403403403okokgraph (600/60s per IP)max(key rpm, 600)/min per key; IP fallback
GET/v1/graph/look-throughDecisioning401403403403403okokgraph (600/60s per IP)max(key rpm, 600)/min per key; IP fallback
GET/v1/graph/snapshot/:id—okokokokokokokgraph (600/60s per IP)max(key rpm, 600)/min per key; IP fallback
GET/v1/health—okokokokokokokhealth (120/60s per IP)120/60s per IP
GET/v1/integrations/royco/markets/:slug—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/markets—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/markets/:id—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/markets/:id/events—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/me—401okokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/methodology—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/methodology/vault—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/newsletter/confirm—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
POST/v1/newsletter/subscribe—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/ondo/global-markets—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/ondo/global-markets/:symbol—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/ondo/global-markets/:symbol/data—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/ondo/global-markets/:symbol/stream—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/openapi.json—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/oracle-vector/freshnessData403403403403okokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/por—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/por/:issuer—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/por/:issuer/history—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
POST/v1/portfolio/overlapDecisioning401403403403403okokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/protocols—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/protocols/:id—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/research/backtests—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/research/claims—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/research/model-health—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/research/predictions—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/research/sources—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/research/validation-reports—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/reviewers—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/rwa—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/rwa/:asset_id—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/rwa/coverage—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/rwa/facets—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/rwa/stats/historyData403403403403okokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/security-events—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/security-events/losses—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/signals—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/signals/:id—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/stablecoins/allocators—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/stablecoins/backing—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/stats—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/stats/historyData403403403403okokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/stats/rating-dynamicsData403403403403okokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/status—okokokokokokokstatus (60/60s per IP (local))60/60s per IP (local)
GET/v1/users/:address/agents—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
PUT/v1/users/:address/agents—okokokokokokokuserWrite (10/60s per IP)10/60s per IP
GET/v1/users/:address/agents/auth-message—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/users/:address/terms—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
POST/v1/users/:address/terms—okokokokokokokuserWrite (10/60s per IP)10/60s per IP
GET/v1/users/:address/terms/auth-message—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/vault/:network/:address—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/vault/:network/:address/events—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/vault/:network/:address/holdersData403403403403okokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/vault/:network/:address/holders/historyData403403403403okokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/vault/:network/:address/marketsData403403403403okokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/vault/:network/:address/score-history—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/vault/:network/:address/snapshots—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/vault/:network/:address/strategiesData403403403403okokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/vault/:network/:address/strategyData403403403403okokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/vaults—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/vaults/:id—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
POST/v1/vaults/batch—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/vaults/changesPro403403403okokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/vaults/scoresPro403403403okokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/vaults/with-critical-incidents—okokokokokokokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
GET/v1/webhooksDecisioning401403403403403okokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
POST/v1/webhooksDecisioning401403403403403okokbasketsWebhookWrite (30/60s per IP)family budget 30/min per key; IP fallback
DELETE/v1/webhooks/:idDecisioning401403403403403okokbasketsWebhookWrite (30/60s per IP)family budget 30/min per key; IP fallback
GET/v1/webhooks/:idDecisioning401403403403403okokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
PATCH/v1/webhooks/:idDecisioning401403403403403okokbasketsWebhookWrite (30/60s per IP)family budget 30/min per key; IP fallback
GET/v1/webhooks/:id/deliveriesDecisioning401403403403403okokpublic (10/60s per IP)the key rpm (X-RateLimit-Limit)
POST/v1/webhooks/:id/enableDecisioning401403403403403okokbasketsWebhookWrite (30/60s per IP)family budget 30/min per key; IP fallback
POST/v1/webhooks/:id/replayDecisioning401403403403403okokbasketsWebhookWrite (30/60s per IP)family budget 30/min per key; IP fallback
POST/v1/webhooks/:id/testDecisioning401403403403403okokbasketsWebhookWrite (30/60s per IP)family budget 30/min per key; IP fallback

On this page

Raw