{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
Router
Route and Pay from a Commerce Grant
The OAuth counterpart of POST /api/v1/router/route, for a credential minted from a
commerce authorization. Identical behaviour and identical response — with one difference:
you do not choose the delegation. It is derived from your grant: the capped, expiring
mandate the user approved when they connected you. Sending a delegationId is refused, not
ignored.
The cap, its expiry, and the user revoking the grant are the boundary on what you can spend.
The routing fee is drawn from that same cap, in addition to each merchant’s price.
A plain (non-OAuth) API key cannot use this route — it has no grant to derive from. Use
POST /api/v1/router/route and name your own delegationId instead.
POST
/
router
/
commerce
/
route
Route and pay using the delegation from your commerce grant (mode B, OAuth)
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
{
"code": "BCK.ROUTER.0003",
"httpStatus": 500,
"message": "delegation budget exceeded, expired, or inactive",
"details": "Hash JWT is not signed by the node account",
"error": "authorization_pending",
"hint": "Verify the wallet has sufficient balance and that the plan is active.",
"docsUrl": "https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008",
"category": "integration",
"retryable": true,
"correlationId": "a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9",
"uuid": "e-550e8400-e29b-41d4-a716-446655440000",
"date": "2026-05-09T12:34:56.789Z",
"params": "{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"
}
Idempotency key — REQUIRED for routed payments (mode B). The Router makes the upstream call and pays automatically, so a retry after a dropped connection must not double-spend. At most one payment is minted per (caller, requestId); a duplicate returns 409 (BCK.ROUTER.0002) carrying the original paymentId, rather than paying again.
Absolute upstream URL to route to (http/https only). Provide EXACTLY ONE of url or slug — both together is a 400. Use slug for a cataloged service (the opaque broker); url is for an off-catalog target you already hold the URL of.
Catalog slug to invoke via the opaque Router broker. The Router resolves the slug to the real upstream server-side, so the URL is never exposed. Mutually exclusive with url.
Optional subpath appended to the resolved upstream when slug is used (e.g. scrape → the merchant's /scrape). Path segments only — it may not change the host, so //, @, .. and an embedded absolute URL are rejected (400). Ignored when url is used.
Payment protocol. On the mode-B proxy (/route, /proxy) this is ADVISORY: the Router AUTO-DETECTS the protocol from the upstream 402 — WWW-Authenticate: Payment → mpp; accepts / PAYMENT-REQUIRED → x402 — and the DETECTED protocol is authoritative for the mint (a mismatching hint here does not change what gets paid).
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Nevermined Documentation","colors":{"primary":"#0f766e","light":"#5eead4","dark":"#0d3f48"},"logo":{"light":"https://mintcdn.com/neverminedag/pEEAPbhrOtjiJvrW/logo/light.svg?fit=max\u0026auto=format\u0026n=pEEAPbhrOtjiJvrW\u0026q=85\u0026s=adbff4ad34c53aed8ca307e9b12104e5","dark":"https://mintcdn.com/neverminedag/pEEAPbhrOtjiJvrW/logo/dark.svg?fit=max\u0026auto=format\u0026n=pEEAPbhrOtjiJvrW\u0026q=85\u0026s=519fb2296e47f72117a24e0787b6bd87"},"favicon":"https://mintcdn.com/neverminedag/816P0WhT1WcQ-Koj/favicon.ico?fit=max\u0026auto=format\u0026n=816P0WhT1WcQ-Koj\u0026q=85\u0026s=2ff33e631489dd6cca6be632af8aa16a","api":{"openapi":"api-reference/openapi.json"},"appearance":{"default":"light"},"navbar":{"links":[{"href":"https://nevermined.app","label":"App"}],"primary":{"type":"button","label":"AI Catalog","href":"https://nevermined.app/catalog/"}},"footer":{"socials":{"x":"https://x.com/nevermined_ai","github":"https://github.com/nevermined-io","linkedin":"https://linkedin.com/company/nevermined","discord":"https://discord.com/invite/GZju2qScKq"}},"seo":{"metatags":{"canonical":"https://nevermined.ai/docs"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"markdown":{"instructions":["If you are an agent buying services: start with these steps. Every page has a .md version.","1. Install the Catalog MCP (live server https://mcp.live.nevermined.app/mcp, sandbox server https://mcp.sandbox.nevermined.app/mcp; rehearse on sandbox with a sandbox API key before live, as keys work only in their own environment; Claude Code and Cursor commands, Codex config.toml entry): https://nevermined.ai/docs/products/catalog/mcp.md","2. Get an API key: https://nevermined.ai/docs/agents-guide/get-api-key.md","3. Enroll a card and create a delegation (a payment method plus a spend mandate: an amount, an expiry and a number of purchases): https://nevermined.ai/docs/agents-guide/enroll-card.md","4. Buy and call a paid agent over x402: https://nevermined.ai/docs/getting-started/ai-agent-purchase.md","SDK quickstart: https://nevermined.ai/docs/integrate/quickstart/typescript.md. Pricing: https://nevermined.ai/pricing/"]},"styling":{"latex":true},"navigation":{"global":{"anchors":[]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"neverminedag","hasAudioNarration":false,"actualSubdomain":"neverminedag","customDomains":["nevermined.ai"],"gitSource":{"type":"github","owner":"nevermined-io","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adf8381d13963272de93b36","collectionId":"e62949af-53ea-44ba-8b1a-7933eb9f63a5","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adf8381d13963272de93b36"},"feedback":{"agentFeedback":true,"thumbs":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6adf8381d13963272de93b36","clientVersion":"0.0.3969","searchFilterCounts":[{"language":"default","tag":"API","count":145},{"language":"default","tag":"Guides","count":130},{"language":"default","tag":"Organizations","count":96},{"language":"default","tag":"Nevermined Catalog","count":48},{"language":"default","tag":"SDK","count":35},{"language":"default","tag":"Connect from a host","count":28},{"language":"default","tag":"Integrations","count":21},{"language":"default","tag":"Authentication","count":17},{"language":"default","tag":"MCP","count":17},{"language":"default","tag":"Learn","count":16}]},"assistantConfig":{"deflection":{"enabled":true,"email":"support@nevermined.io","showHelpButton":true}},"basePath":"/docs","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"custom.css","content":"@keyframes nvm-catalog-shimmer{0%,to{background-color:var(--catalog-accent)}50%{background-color:var(--catalog-lime)}}img.nav-logo{max-height:20px!important;height:20px!important;width:auto!important}.nav-tabs{gap:0!important;padding:0!important}a.nav-tabs-item{padding:8px 16px!important;font-size:14px!important;font-weight:500!important;min-width:auto!important;border-radius:0!important;background:0 0!important}a.nav-tabs-item:hover{color:#0f766e!important;background:0 0!important}.dark a.nav-tabs-item,[data-theme=dark] a.nav-tabs-item{color:#d1d5db!important}.dark a.nav-tabs-item:hover,[data-theme=dark] a.nav-tabs-item:hover{color:#5eead4!important}@media (max-width:768px){a.nav-tabs-item{padding:6px 12px!important;font-size:13px!important}}.nvm-hero-banner{position:relative;background-color:#0d3f48;border-radius:24px;padding:48px 32px;margin-bottom:32px;overflow:hidden;min-height:320px;display:flex;flex-direction:column;justify-content:center}.nvm-hero-banner::before{content:'';position:absolute;top:0;left:0;right:0;bottom:0;background-image:url(/images/product_hero.jpg);background-size:cover;background-position:center right;opacity:.9}.nvm-hero-content{position:relative;z-index:1;max-width:600px}.nvm-hero-label{color:#fff;font-size:12px;font-weight:600;letter-spacing:2px;text-transform:uppercase;margin-bottom:16px;opacity:.9}.nvm-hero-title{font-size:clamp(28px,5vw,48px);font-weight:300;line-height:1.1;margin-bottom:20px}.nvm-gradient-text{background:linear-gradient(114.57deg,#bcdc4a 23%,#abe2dd 60%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;font-style:italic}.nvm-hero-title-white{color:#fff;display:block;margin-top:4px}.nvm-hero-description{color:rgba(255,255,255,.85);font-size:16px;line-height:1.6;margin-bottom:24px;max-width:500px}.nvm-hero-button{display:inline-block;background-color:#fff;color:#0d3f48!important;padding:12px 24px;border-radius:8px;font-size:14px;font-weight:600;text-decoration:none!important;transition:all .2s ease;border:0;cursor:pointer}.nvm-hero-button:hover{background-color:#f0f0f0;transform:translateY(-1px);text-decoration:none!important}@media (max-width:768px){.nvm-hero-banner{padding:32px 24px;min-height:280px}.nvm-hero-banner::before{background-position:center center;opacity:.7}.nvm-hero-title{font-size:28px}.nvm-hero-description{font-size:14px}}.prose,.prose li,.prose p,article li,article p{font-size:15px!important;line-height:1.6!important}.prose h1,article h1{font-size:27px!important}.prose h2,article h2{font-size:21px!important}.prose h3,article h3{font-size:17px!important}.prose h4,article h4{font-size:15px!important}#sidebar a.group{padding-top:4px!important;padding-bottom:4px!important}#sidebar li{margin:1px 0!important}.sidebar-group-header{gap:6px!important;margin-bottom:4px!important;padding-left:12px!important}#sidebar .lg\\:mt-8,#sidebar .mt-6{margin-top:20px!important}ul.sidebar-group{gap:0!important}#sidebar-content{padding-top:12px!important;padding-bottom:12px!important}#navigation-items{font-size:13px!important}:is(a, button, input, select, textarea, summary,\n [tabindex]:not([tabindex=\"-1\"]), [role=\"button\"], [role=\"link\"],\n [role=\"tab\"], [role=\"menuitem\"], [role=\"option\"], [role=\"checkbox\"],\n [role=\"switch\"]):focus-visible{outline:2px solid #0f766e!important;outline-offset:2px!important}.dark :is(a, button, input, select, textarea, summary,\n [tabindex]:not([tabindex=\"-1\"]), [role=\"button\"], [role=\"link\"],\n [role=\"tab\"], [role=\"menuitem\"], [role=\"option\"], [role=\"checkbox\"],\n [role=\"switch\"]):focus-visible,[data-theme=dark] :is(a, button, input, select, textarea, summary,\n [tabindex]:not([tabindex=\"-1\"]), [role=\"button\"], [role=\"link\"],\n [role=\"tab\"], [role=\"menuitem\"], [role=\"option\"], [role=\"checkbox\"],\n [role=\"switch\"]):focus-visible{outline-color:#5eead4!important}#navbar{background-color:rgb(var(--background-light, 255 255 255))!important;border-bottom:1px solid #e5e7eb!important;--nvmbg-ink:#0d3f48}.dark #navbar,[data-theme=dark] #navbar{background-color:rgb(var(--background-dark, 11 14 15))!important;border-bottom-color:rgba(255,255,255,.08)!important;--nvmbg-ink:#4ac6bf}#navbar::after,#navbar::before{content:\"\";position:absolute;inset:0;z-index:1;pointer-events:none}#navbar::after{background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22600%22%20height%3D%22130%22%20viewBox%3D%220%200%20600%20130%22%20fill%3D%22none%22%3E%3Cg%20stroke%3D%22%230d3f48%22%20stroke-opacity%3D%220.09%22%20stroke-width%3D%221%22%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%2240%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%2266%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%2292%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22118%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22144%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22170%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22196%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22222%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22248%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22274%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22300%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22326%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22352%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22378%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22404%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22430%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22456%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22482%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22508%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22534%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22560%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22586%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22612%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22638%22%2F%3E%3C%2Fg%3E%3Cg%20stroke%3D%22%230d3f48%22%20stroke-opacity%3D%220.04%22%20stroke-width%3D%221%22%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%2240%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%2266%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%2292%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22118%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22144%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22170%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22196%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22222%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22248%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22274%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22300%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22326%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22352%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22378%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22404%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22430%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22456%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22482%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22508%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22534%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22560%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22586%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22612%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22638%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E);background-repeat:no-repeat;background-position:top right;background-size:600px 130px}.dark #navbar::after,[data-theme=dark] #navbar::after{background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22600%22%20height%3D%22130%22%20viewBox%3D%220%200%20600%20130%22%20fill%3D%22none%22%3E%3Cg%20stroke%3D%22%234ac6bf%22%20stroke-opacity%3D%220.1%22%20stroke-width%3D%221%22%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%2240%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%2266%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%2292%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22118%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22144%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22170%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22196%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22222%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22248%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22274%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22300%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22326%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22352%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22378%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22404%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22430%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22456%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22482%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22508%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22534%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22560%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22586%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22612%22%2F%3E%3Ccircle%20cx%3D%22600%22%20cy%3D%220%22%20r%3D%22638%22%2F%3E%3C%2Fg%3E%3Cg%20stroke%3D%22%234ac6bf%22%20stroke-opacity%3D%220.045%22%20stroke-width%3D%221%22%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%2240%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%2266%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%2292%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22118%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22144%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22170%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22196%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22222%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22248%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22274%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22300%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22326%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22352%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22378%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22404%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22430%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22456%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22482%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22508%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22534%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22560%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22586%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22612%22%2F%3E%3Ccircle%20cx%3D%22618%22%20cy%3D%2214%22%20r%3D%22638%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E)}#navbar::before{opacity:.06;background-image:repeating-linear-gradient(45deg,var(--nvmbg-ink) 0,var(--nvmbg-ink) .5px,transparent .5px,transparent 5px);-webkit-mask-image:radial-gradient(120% 140% at 0 0,#000 0,transparent 55%);mask-image:radial-gradient(120% 140% at 0 0,#000 0,transparent 55%)}#navbar div:has(>nav #topbar-cta-button)>nav{order:1;margin-inline:1rem 0}#navbar div:has(>nav #topbar-cta-button)>div{margin-inline:0}#topbar-cta-button>a{--catalog-accent:#12a89e;--catalog-lime:#8fbf1f;position:relative;display:inline-flex;align-items:center;padding:13px 22px 13px 57px;border-radius:12px;background:#0d3f48;font-size:15px;font-weight:600;line-height:1}:is(.dark, [data-theme=\"dark\"]) #topbar-cta-button>a{--catalog-accent:#4ac6bf;--catalog-lime:#bcdc4a}#topbar-cta-button>a>div>svg,#topbar-cta-button>a>span.absolute{display:none}#topbar-cta-button>a::after,#topbar-cta-button>a::before{content:\"\";position:absolute;left:22px;top:50%;transform:translateY(-50%);width:24px;height:17px;background-color:var(--catalog-accent);mask:var(--catalog-ribbon) center/contain no-repeat;-webkit-mask:var(--catalog-ribbon) center/contain no-repeat;pointer-events:none}#topbar-cta-button>a::before{--catalog-ribbon:url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2031.06%2022%22%3E%3Cpath%20d%3D%22M0%2011.153L10.4179%2020.6426V11.0576L0%201.56805V11.153Z%22%2F%3E%3C%2Fsvg%3E\")}#topbar-cta-button>a::after{--catalog-ribbon:url(\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2031.06%2022%22%3E%3Cpath%20d%3D%22M10.4178%201.56805V11.153L20.8325%2020.6426L31.0596%2011.153V1.56805L20.8325%2011.0576L10.4178%201.56805Z%22%2F%3E%3C%2Fsvg%3E\")}@media (prefers-reduced-motion:no-preference){#topbar-cta-button>a:is(:hover, :focus-visible)::after,#topbar-cta-button>a:is(:hover, :focus-visible)::before{animation:nvm-catalog-shimmer .8s ease-in-out infinite}#topbar-cta-button>a:is(:hover, :focus-visible)::after{animation-delay:.12s}}"}],"page":{"pagePath":"api-reference/router/commerce-route","slug":"/api-reference/router/commerce-route","pageMetadata":{"title":"Route and Pay from a Commerce Grant","openapi":"POST /router/commerce/route","description":"The OAuth counterpart of `POST /api/v1/router/route`, for a credential minted from a\n`commerce` authorization. Identical behaviour and identical response — with one difference:\n**you do not choose the delegation.** It is derived from your grant: the capped, expiring\nmandate the user approved when they connected you. Sending a `delegationId` is refused, not\nignored.\n\nThe cap, its expiry, and the user revoking the grant are the boundary on what you can spend.\nThe routing fee is drawn from that same cap, in addition to each merchant’s price.\n\nA plain (non-OAuth) API key cannot use this route — it has no grant to derive from. Use\n`POST /api/v1/router/route` and name your own `delegationId` instead.","href":"/api-reference/router/commerce-route"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"The OAuth counterpart of \", _jsx(_components.code, {\n children: \"POST /api/v1/router/route\"\n }), \", for a credential minted from a\\n\", _jsx(_components.code, {\n children: \"commerce\"\n }), \" authorization. Identical behaviour and identical response — with one difference:\\n\", _jsx(_components.strong, {\n children: \"you do not choose the delegation.\"\n }), \" It is derived from your grant: the capped, expiring\\nmandate the user approved when they connected you. Sending a \", _jsx(_components.code, {\n children: \"delegationId\"\n }), \" is refused, not\\nignored.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"The cap, its expiry, and the user revoking the grant are the boundary on what you can spend.\\nThe routing fee is drawn from that same cap, in addition to each merchant’s price.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A plain (non-OAuth) API key cannot use this route — it has no grant to derive from. Use\\n\", _jsx(_components.code, {\n children: \"POST /api/v1/router/route\"\n }), \" and name your own \", _jsx(_components.code, {\n children: \"delegationId\"\n }), \" instead.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Route and Pay from a Commerce Grant","openapi":"POST /router/commerce/route","description":"The OAuth counterpart of `POST /api/v1/router/route`, for a credential minted from a\n`commerce` authorization. Identical behaviour and identical response — with one difference:\n**you do not choose the delegation.** It is derived from your grant: the capped, expiring\nmandate the user approved when they connected you. Sending a `delegationId` is refused, not\nignored.\n\nThe cap, its expiry, and the user revoking the grant are the boundary on what you can spend.\nThe routing fee is drawn from that same cap, in addition to each merchant’s price.\n\nA plain (non-OAuth) API key cannot use this route — it has no grant to derive from. Use\n`POST /api/v1/router/route` and name your own `delegationId` instead.","href":"/api-reference/router/commerce-route"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/docs/_mintlify/custom/neverminedag/13bbe6de0edf6c8b/docs-analytics.js"],"openApiReferenceData":{"operation":{"description":"The OAuth counterpart of `POST /api/v1/router/route`, for a credential minted from a\n`commerce` authorization. Identical behaviour and identical response — with one difference:\n**you do not choose the delegation.** It is derived from your grant: the capped, expiring\nmandate the user approved when they connected you. Sending a `delegationId` is refused, not\nignored.\n\nThe cap, its expiry, and the user revoking the grant are the boundary on what you can spend.\nThe routing fee is drawn from that same cap, in addition to each merchant’s price.\n\nA plain (non-OAuth) API key cannot use this route — it has no grant to derive from. Use\n`POST /api/v1/router/route` and name your own `delegationId` instead.","operationId":"routeAndPayRequestFromGrant","parameters":[],"requestBody":"0849ca43-c3e1-4a14-b043-13264431c7be","responses":{"201":"b6d7ed69-9cbb-4ab2-91b8-2d80bd1b61be","202":"c052efdd-f51e-4805-ae20-7beb929a850c","400":"1403e430-fc6e-44ba-9e04-42a4eb286550","401":"8ffd17b6-4522-4016-a870-3492b55c282f","402":"414e81f0-2481-4dd9-9f5b-ee454bf3fe6b","403":"223eab44-9fd7-4ac3-aba3-f6b3cc985b09","404":"114c1004-3b96-4db0-b5a9-e4b071cd895c","409":"9eba9ba8-3dcf-4079-aac9-9cfe86831ea8","422":"1a6eec5e-0464-426d-a10b-fba6c0588f3e","429":"fbd1a4a6-5d24-4a37-9db1-eb4e907708a4","500":"8736961d-66b7-47c9-9f47-2e8e46d96d34","503":"25cfe8a6-4002-4667-952d-5e50bcfd5b00"},"summary":"Route and pay using the delegation from your commerce grant (mode B, OAuth)","tags":["Router"],"method":"post","type":"path","servers":["0d5c4343-a09a-4b57-800b-6e475c3e1562","9d83c2d6-3623-4208-a4cc-b9603f906e2f"],"security":["3b868f3c-2afb-4f92-95c8-437d36ca46a1"],"path":"/router/commerce/route","baseUrlOptions":["https://api.sandbox.nevermined.app/api/v1","https://api.live.nevermined.app/api/v1"],"title":"Route and pay using the delegation from your commerce grant (mode B, OAuth)","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"requestId":{"type":"string","description":"Idempotency key — REQUIRED for routed payments (mode B). The Router makes the upstream call and pays automatically, so a retry after a dropped connection must not double-spend. At most one payment is minted per (caller, requestId); a duplicate returns 409 (BCK.ROUTER.0002) carrying the original paymentId, rather than paying again.","example":"order-1234","isRequired":true,"uniqueKey":"requestId","typeLabel":"string"},"url":{"type":"string","description":"Absolute upstream URL to route to (http/https only). Provide EXACTLY ONE of `url` or `slug` — both together is a 400. Use `slug` for a cataloged service (the opaque broker); `url` is for an off-catalog target you already hold the URL of.","example":"https://agent.example/api/resource","uniqueKey":"url","typeLabel":"string"},"slug":{"type":"string","description":"Catalog slug to invoke via the opaque Router broker. The Router resolves the slug to the real upstream server-side, so the URL is never exposed. Mutually exclusive with `url`.","example":"webscrape-pro","uniqueKey":"slug","typeLabel":"string"},"path":{"type":"string","description":"Optional subpath appended to the resolved upstream when `slug` is used (e.g. `scrape` → the merchant's `/scrape`). Path segments only — it may not change the host, so `//`, `@`, `..` and an embedded absolute URL are rejected (400). Ignored when `url` is used.","example":"scrape","uniqueKey":"path","typeLabel":"string"},"method":{"type":"string","description":"HTTP method to use for the upstream request.","enum":["GET","POST","PUT","PATCH","DELETE"],"default":"GET","uniqueKey":"method","typeLabel":"enum\u003cstring>"},"headers":{"type":"object","description":"Headers to forward to the upstream (e.g. the agent’s own auth). Optional.","uniqueKey":"headers","typeLabel":"object"},"body":{"description":"Request body to forward (JSON). Optional.","uniqueKey":"body","typeLabel":"any"},"protocol":{"type":"string","description":"Payment protocol. On the mode-B proxy (`/route`, `/proxy`) this is ADVISORY: the Router AUTO-DETECTS the protocol from the upstream 402 — `WWW-Authenticate: Payment` → `mpp`; `accepts` / `PAYMENT-REQUIRED` → `x402` — and the DETECTED protocol is authoritative for the mint (a mismatching hint here does not change what gets paid).","enum":["x402","mpp"],"default":"x402","uniqueKey":"protocol","typeLabel":"enum\u003cstring>"}},"required":["requestId"],"uniqueKey":"","typeLabel":"object"},"examples":{"invoke-cataloged-service":{"title":"invoke-cataloged-service","value":{"slug":"webscrape-pro","path":"scrape","method":"POST","body":{"url":"https://example.com"},"requestId":"order-1234"}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"b6d7ed69-9cbb-4ab2-91b8-2d80bd1b61be":{"description":"Upstream response, relayed.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"number","description":"The upstream HTTP status code that was relayed.","example":200,"isRequired":true,"uniqueKey":"status","typeLabel":"number"},"body":{"description":"The upstream response body (parsed JSON when the upstream returned JSON, else a string).","example":{"ok":true,"data":"the paid resource"},"isRequired":true,"uniqueKey":"body","typeLabel":"any"},"paid":{"type":"boolean","description":"Whether a payment was made (false = the upstream was free).","example":true,"isRequired":true,"uniqueKey":"paid","typeLabel":"boolean"},"payment":{"type":"object","description":"The payment made, when `paid` is true.","required":["paymentId","settlement","fee","status"],"properties":{"paymentId":{"type":"string","example":"b1f9c2e4-3d5a-4c7e-9f21-6a8b0c4d2e13","isRequired":true,"uniqueKey":"payment.paymentId","typeLabel":"string"},"settlement":{"type":"object","properties":{"recipient":{"type":"string","description":"The on-chain recipient (the agent’s `payTo` address from its 402).","example":"0x209693Bc6afc0C5328bA36FaF03C514EF312287C","isRequired":true,"uniqueKey":"payment.settlement.recipient","typeLabel":"string"},"amount":{"type":"string","description":"Amount in the asset’s smallest unit (USDC/EURC = 6 decimals).","example":"1000","isRequired":true,"uniqueKey":"payment.settlement.amount","typeLabel":"string"},"network":{"type":"string","description":"Network the payment settles on (name or CAIP-2).","example":"base-sepolia","isRequired":true,"uniqueKey":"payment.settlement.network","typeLabel":"string"},"approxCents":{"type":"string","description":"The MERCHANT leg in cents (rounded up) — what this credential pays the upstream agent. This is not necessarily the whole cap charge: Nevermined’s routing fee is reserved on top, so the whole-cent total debited from the delegation is `approxCents + fee.cents` (also reported directly as `fee.capChargedCents`; the exact sub-cent debit is `fee.capChargedMicros`). With no fee configured the two are equal.","example":"1","isRequired":true,"uniqueKey":"payment.settlement.approxCents","typeLabel":"string"},"asset":{"type":"string","description":"For x402 the asset symbol (`USDC`/`EURC`); for mpp the tempo payment token contract address (mpp carries no on-wire symbol).","example":"USDC","uniqueKey":"payment.settlement.asset","typeLabel":"string"},"scheme":{"type":"string","description":"Ledger settlement scheme: `exact` for x402 (EIP-3009), `charge` for MPP-tempo (a native Tempo transaction), `spt` for MPP-stripe (a Shared Payment Token). Omitted (defaults to `exact`) on the x402 path.","enum":["exact","charge","spt"],"example":"exact","uniqueKey":"payment.settlement.scheme","typeLabel":"enum\u003cstring>"}},"required":["recipient","amount","network","approxCents"],"isRequired":true,"uniqueKey":"payment.settlement","typeLabel":"object"},"fee":{"type":"object","description":"Nevermined’s routing fee for this payment. Mode B charges it exactly as mode A does, so it is disclosed here too — `settlement.approxCents` is only the merchant leg, and `fee.capChargedCents` is what the delegation cap was actually debited.","required":["bps","amount","cents","capChargedCents","capChargedMicros"],"properties":{"bps":{"type":"number","description":"Rate applied to this payment, in basis points over a 10,000 denominator (e.g. `200` = 2%). `0` means no routing fee was charged.","example":0,"isRequired":true,"uniqueKey":"payment.fee.bps","typeLabel":"number"},"amount":{"type":"string","description":"The fee in the settlement asset’s smallest unit — the same unit as `settlement.amount`. Reported atomically rather than in cents because cents are ceiling-rounded and cannot express a sub-cent fee.","example":"0","isRequired":true,"uniqueKey":"payment.fee.amount","typeLabel":"string"},"cents":{"type":"string","description":"Cents this fee added to the delegation-cap reserve, i.e. `capChargedCents - settlement.approxCents`.","example":"0","isRequired":true,"uniqueKey":"payment.fee.cents","typeLabel":"string"},"capChargedCents":{"type":"string","description":"The delegation-cap debit for this payment (merchant leg + routing fee), rounded UP to a whole cent. The cap itself accrues at sub-cent resolution, so the exact debit is `capChargedMicros`; this figure is the per-call price guard that `maxTotalCents` is compared against.","example":"1","isRequired":true,"uniqueKey":"payment.fee.capChargedCents","typeLabel":"string"},"capChargedMicros":{"type":"string","description":"The exact delegation-cap debit for this payment (merchant leg + routing fee), in micros — millionths of the currency unit, i.e. 1/10,000 of a cent. It is a ceiling of the true price at that resolution, never below it. It is the debit AT MINT: if the routing fee or the merchant leg is later found uncollected, that part is given back to the cap while this figure stays as minted.","example":"2040","isRequired":true,"uniqueKey":"payment.fee.capChargedMicros","typeLabel":"string"}},"isRequired":true,"uniqueKey":"payment.fee","typeLabel":"object"},"status":{"type":"string","enum":["Issued","Settled"],"example":"Settled","isRequired":true,"uniqueKey":"payment.status","typeLabel":"enum\u003cstring>"},"resultUrl":{"description":"Where this paid result stays readable by you for 24 hours (GET it with the same API key), in case the response is lost on the way back to you. Relative to the API host. API 1.48 and later.","type":"string","example":"/api/v1/router/payments/b1f9c2e4-3d5a-4c7e-9f21-6a8b0c4d2e13/result","uniqueKey":"payment.resultUrl","typeLabel":"string"},"txHash":{"oneOf":[{"type":"string","description":"On-chain settlement tx, if the upstream reported one.","uniqueKey":"payment.txHash.oneOf.0","typeLabel":"string"},{"type":"null","description":"On-chain settlement tx, if the upstream reported one.","uniqueKey":"payment.txHash.oneOf.1","typeLabel":"null"}],"uniqueKey":"payment.txHash","typeLabel":"string | null"}},"uniqueKey":"payment","typeLabel":"object"}},"required":["status","body","paid"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"status":200,"body":{"ok":true,"data":"the paid resource"},"paid":true,"payment":{"paymentId":"b1f9c2e4-3d5a-4c7e-9f21-6a8b0c4d2e13","settlement":{"recipient":"0x209693Bc6afc0C5328bA36FaF03C514EF312287C","amount":"1000","network":"base-sepolia","approxCents":"1","asset":"USDC","scheme":"exact"},"fee":{"bps":0,"amount":"0","cents":"0","capChargedCents":"1","capChargedMicros":"2040"},"status":"Settled","resultUrl":"/api/v1/router/payments/b1f9c2e4-3d5a-4c7e-9f21-6a8b0c4d2e13/result","txHash":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"c052efdd-f51e-4805-ae20-7beb929a850c":{"description":"API version 1.48 or later: the payment was made but the merchant had not answered within 45 s. The call keeps running on the Router (bounded at 120 s) and its result will be readable by you for 24 hours at `resultUrl` (also the `Location` header). Poll `GET /api/v1/router/payments/{id}/result`; do not repeat the call — a retry with the same `requestId` returns this same answer, then the result.","content":{"application/json":{"schema":{"type":"object","description":"`202` answer of the `/route` family when the paid call outlives the 45 s sync budget: the payment was made, the call is still running on the Router, and its result will be readable at `resultUrl`.","properties":{"paymentId":{"type":"string","example":"b1f9c2e4-3d5a-4c7e-9f21-6a8b0c4d2e13","isRequired":true,"uniqueKey":"paymentId","typeLabel":"string"},"resultUrl":{"type":"string","description":"Read the result here with the same API key. Relative to the API host.","example":"/api/v1/router/payments/b1f9c2e4-3d5a-4c7e-9f21-6a8b0c4d2e13/result","isRequired":true,"uniqueKey":"resultUrl","typeLabel":"string"},"status":{"type":"string","enum":["Pending"],"example":"Pending","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"}},"required":["paymentId","resultUrl","status"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"paymentId":"b1f9c2e4-3d5a-4c7e-9f21-6a8b0c4d2e13","resultUrl":"/api/v1/router/payments/b1f9c2e4-3d5a-4c7e-9f21-6a8b0c4d2e13/result","status":"Pending"}}},"exampleType":"generated"}},"exampleType":"generated"},"1403e430-fc6e-44ba-9e04-42a4eb286550":{"description":"Malformed request, a `delegationId` was supplied (BCK.OAUTH.0034 — it is derived from your grant), both `url` and `slug` were given (BCK.ROUTER.0001), or the payment credential would overwrite a header you asked the Router to forward and no `credentialHeader` named where the service wants it instead (BCK.ROUTER.0021 — refused before minting).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Router error code. `BCK.ROUTER.0001` invalid request / no fundable option / bad 402 (400); `BCK.ROUTER.0002` requestId already used — idempotency conflict (409); `BCK.ROUTER.0003` delegation budget exceeded, expired, or inactive (402); `BCK.ROUTER.0004` payment record not found (404); `BCK.ROUTER.0005` payment not in a settleable state (409). Framework-level `BCK.HTTP.*` codes (e.g. `BCK.HTTP.400` request validation, `BCK.HTTP.429` throttling) may also appear — see the base `code` field.","example":"BCK.ROUTER.0003","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"httpStatus":{"type":"number","description":"HTTP status code","example":500,"isRequired":true,"uniqueKey":"httpStatus","typeLabel":"number"},"message":{"type":"string","description":"Error message for Router operations.","example":"delegation budget exceeded, expired, or inactive","examples":["delegationId is required — create one via POST /api/v1/delegation/create","no fundable option; offered: [...]","upstream pay-to address is not in this delegation's allowed recipients","delegation budget exceeded, expired, or inactive","payment already settled with a different txHash"],"isRequired":true,"uniqueKey":"message","typeLabel":"string"},"details":{"type":"string","description":"Throw-site detail string supplementing the canonical message. Only set when the call site supplied an opts.message; absent otherwise.","example":"Hash JWT is not signed by the node account","uniqueKey":"details","typeLabel":"string"},"error":{"type":"string","description":"RFC 6749 §5.2 / RFC 8628 §3.5 top-level OAuth error string. Present only on the OAuth device-polling responses from `POST /oauth/token` (`authorization_pending`, `slow_down`, `expired_token`, `access_denied`), so a standards-compliant OAuth/device client can branch on it directly instead of on the Nevermined `code`. Absent on every other error.","example":"authorization_pending","uniqueKey":"error","typeLabel":"string"},"hint":{"type":"string","description":"Actionable remediation hint, sourced from the catalogue or supplied at the throw site. Tells the caller what to fix or where to look.","example":"Verify the wallet has sufficient balance and that the plan is active.","uniqueKey":"hint","typeLabel":"string"},"docsUrl":{"type":"string","description":"Permalink to the docs page describing this error code.","example":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","uniqueKey":"docsUrl","typeLabel":"string"},"category":{"type":"string","description":"Coarse classification of the failure, useful for client-side branching without parsing the message.","enum":["validation","auth","business","integration","internal"],"example":"integration","uniqueKey":"category","typeLabel":"enum\u003cstring>"},"retryable":{"type":"boolean","description":"Whether the failure is transient and the same call can be retried with identical inputs. Absent when the catalogue does not assert either way.","example":true,"uniqueKey":"retryable","typeLabel":"boolean"},"correlationId":{"type":"string","description":"Request-scoped correlation id stamped by the global filter. Echoed in the x-correlation-id response header. Quote this when reporting issues.","example":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uniqueKey":"correlationId","typeLabel":"string"},"uuid":{"type":"string","description":"Per-error UUID generated at construction. Useful for log correlation.","example":"e-550e8400-e29b-41d4-a716-446655440000","uniqueKey":"uuid","typeLabel":"string"},"date":{"type":"string","description":"ISO timestamp at which the error was constructed.","example":"2026-05-09T12:34:56.789Z","format":"date-time","uniqueKey":"date","typeLabel":"string\u003cdate-time>"},"params":{"type":"string","description":"JSON-stringified contextual parameters supplied at the throw site (e.g. IDs, state). Always a string in the wire format — parse with JSON.parse if needed.","example":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}","uniqueKey":"params","typeLabel":"string"}},"required":["code","httpStatus","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"BCK.ROUTER.0003","httpStatus":500,"message":"delegation budget exceeded, expired, or inactive","details":"Hash JWT is not signed by the node account","error":"authorization_pending","hint":"Verify the wallet has sufficient balance and that the plan is active.","docsUrl":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","category":"integration","retryable":true,"correlationId":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uuid":"e-550e8400-e29b-41d4-a716-446655440000","date":"2026-05-09T12:34:56.789Z","params":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"}}},"exampleType":"generated"}},"exampleType":"generated"},"8ffd17b6-4522-4016-a870-3492b55c282f":{"description":"Missing/invalid Nevermined API key — or the grant behind this credential has been revoked by the user, in which case every credential minted from it is invalid: restart the authorization to obtain a new one.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Router error code. `BCK.ROUTER.0001` invalid request / no fundable option / bad 402 (400); `BCK.ROUTER.0002` requestId already used — idempotency conflict (409); `BCK.ROUTER.0003` delegation budget exceeded, expired, or inactive (402); `BCK.ROUTER.0004` payment record not found (404); `BCK.ROUTER.0005` payment not in a settleable state (409). Framework-level `BCK.HTTP.*` codes (e.g. `BCK.HTTP.400` request validation, `BCK.HTTP.429` throttling) may also appear — see the base `code` field.","example":"BCK.ROUTER.0003","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"httpStatus":{"type":"number","description":"HTTP status code","example":500,"isRequired":true,"uniqueKey":"httpStatus","typeLabel":"number"},"message":{"type":"string","description":"Error message for Router operations.","example":"delegation budget exceeded, expired, or inactive","examples":["delegationId is required — create one via POST /api/v1/delegation/create","no fundable option; offered: [...]","upstream pay-to address is not in this delegation's allowed recipients","delegation budget exceeded, expired, or inactive","payment already settled with a different txHash"],"isRequired":true,"uniqueKey":"message","typeLabel":"string"},"details":{"type":"string","description":"Throw-site detail string supplementing the canonical message. Only set when the call site supplied an opts.message; absent otherwise.","example":"Hash JWT is not signed by the node account","uniqueKey":"details","typeLabel":"string"},"error":{"type":"string","description":"RFC 6749 §5.2 / RFC 8628 §3.5 top-level OAuth error string. Present only on the OAuth device-polling responses from `POST /oauth/token` (`authorization_pending`, `slow_down`, `expired_token`, `access_denied`), so a standards-compliant OAuth/device client can branch on it directly instead of on the Nevermined `code`. Absent on every other error.","example":"authorization_pending","uniqueKey":"error","typeLabel":"string"},"hint":{"type":"string","description":"Actionable remediation hint, sourced from the catalogue or supplied at the throw site. Tells the caller what to fix or where to look.","example":"Verify the wallet has sufficient balance and that the plan is active.","uniqueKey":"hint","typeLabel":"string"},"docsUrl":{"type":"string","description":"Permalink to the docs page describing this error code.","example":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","uniqueKey":"docsUrl","typeLabel":"string"},"category":{"type":"string","description":"Coarse classification of the failure, useful for client-side branching without parsing the message.","enum":["validation","auth","business","integration","internal"],"example":"integration","uniqueKey":"category","typeLabel":"enum\u003cstring>"},"retryable":{"type":"boolean","description":"Whether the failure is transient and the same call can be retried with identical inputs. Absent when the catalogue does not assert either way.","example":true,"uniqueKey":"retryable","typeLabel":"boolean"},"correlationId":{"type":"string","description":"Request-scoped correlation id stamped by the global filter. Echoed in the x-correlation-id response header. Quote this when reporting issues.","example":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uniqueKey":"correlationId","typeLabel":"string"},"uuid":{"type":"string","description":"Per-error UUID generated at construction. Useful for log correlation.","example":"e-550e8400-e29b-41d4-a716-446655440000","uniqueKey":"uuid","typeLabel":"string"},"date":{"type":"string","description":"ISO timestamp at which the error was constructed.","example":"2026-05-09T12:34:56.789Z","format":"date-time","uniqueKey":"date","typeLabel":"string\u003cdate-time>"},"params":{"type":"string","description":"JSON-stringified contextual parameters supplied at the throw site (e.g. IDs, state). Always a string in the wire format — parse with JSON.parse if needed.","example":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}","uniqueKey":"params","typeLabel":"string"}},"required":["code","httpStatus","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"BCK.ROUTER.0003","httpStatus":500,"message":"delegation budget exceeded, expired, or inactive","details":"Hash JWT is not signed by the node account","error":"authorization_pending","hint":"Verify the wallet has sufficient balance and that the plan is active.","docsUrl":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","category":"integration","retryable":true,"correlationId":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uuid":"e-550e8400-e29b-41d4-a716-446655440000","date":"2026-05-09T12:34:56.789Z","params":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"}}},"exampleType":"generated"}},"exampleType":"generated"},"414e81f0-2481-4dd9-9f5b-ee454bf3fe6b":{"description":"The spend could not be authorized or funded — no money moved. Three distinct causes: BCK.ROUTER.0003, the delegation cap is exceeded or the delegation is expired / exhausted / revoked; BCK.ROUTER.0009, the buyer wallet does not hold enough of the settlement asset on the target network (crypto rails) or the issuer declined the card (MPP-stripe); BCK.ROUTER.0011, the card needs 3-D Secure cardholder authentication, which an agent with no human at a browser cannot complete. None is safely auto-retryable — branch on `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Router error code. `BCK.ROUTER.0001` invalid request / no fundable option / bad 402 (400); `BCK.ROUTER.0002` requestId already used — idempotency conflict (409); `BCK.ROUTER.0003` delegation budget exceeded, expired, or inactive (402); `BCK.ROUTER.0004` payment record not found (404); `BCK.ROUTER.0005` payment not in a settleable state (409). Framework-level `BCK.HTTP.*` codes (e.g. `BCK.HTTP.400` request validation, `BCK.HTTP.429` throttling) may also appear — see the base `code` field.","example":"BCK.ROUTER.0003","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"httpStatus":{"type":"number","description":"HTTP status code","example":500,"isRequired":true,"uniqueKey":"httpStatus","typeLabel":"number"},"message":{"type":"string","description":"Error message for Router operations.","example":"delegation budget exceeded, expired, or inactive","examples":["delegationId is required — create one via POST /api/v1/delegation/create","no fundable option; offered: [...]","upstream pay-to address is not in this delegation's allowed recipients","delegation budget exceeded, expired, or inactive","payment already settled with a different txHash"],"isRequired":true,"uniqueKey":"message","typeLabel":"string"},"details":{"type":"string","description":"Throw-site detail string supplementing the canonical message. Only set when the call site supplied an opts.message; absent otherwise.","example":"Hash JWT is not signed by the node account","uniqueKey":"details","typeLabel":"string"},"error":{"type":"string","description":"RFC 6749 §5.2 / RFC 8628 §3.5 top-level OAuth error string. Present only on the OAuth device-polling responses from `POST /oauth/token` (`authorization_pending`, `slow_down`, `expired_token`, `access_denied`), so a standards-compliant OAuth/device client can branch on it directly instead of on the Nevermined `code`. Absent on every other error.","example":"authorization_pending","uniqueKey":"error","typeLabel":"string"},"hint":{"type":"string","description":"Actionable remediation hint, sourced from the catalogue or supplied at the throw site. Tells the caller what to fix or where to look.","example":"Verify the wallet has sufficient balance and that the plan is active.","uniqueKey":"hint","typeLabel":"string"},"docsUrl":{"type":"string","description":"Permalink to the docs page describing this error code.","example":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","uniqueKey":"docsUrl","typeLabel":"string"},"category":{"type":"string","description":"Coarse classification of the failure, useful for client-side branching without parsing the message.","enum":["validation","auth","business","integration","internal"],"example":"integration","uniqueKey":"category","typeLabel":"enum\u003cstring>"},"retryable":{"type":"boolean","description":"Whether the failure is transient and the same call can be retried with identical inputs. Absent when the catalogue does not assert either way.","example":true,"uniqueKey":"retryable","typeLabel":"boolean"},"correlationId":{"type":"string","description":"Request-scoped correlation id stamped by the global filter. Echoed in the x-correlation-id response header. Quote this when reporting issues.","example":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uniqueKey":"correlationId","typeLabel":"string"},"uuid":{"type":"string","description":"Per-error UUID generated at construction. Useful for log correlation.","example":"e-550e8400-e29b-41d4-a716-446655440000","uniqueKey":"uuid","typeLabel":"string"},"date":{"type":"string","description":"ISO timestamp at which the error was constructed.","example":"2026-05-09T12:34:56.789Z","format":"date-time","uniqueKey":"date","typeLabel":"string\u003cdate-time>"},"params":{"type":"string","description":"JSON-stringified contextual parameters supplied at the throw site (e.g. IDs, state). Always a string in the wire format — parse with JSON.parse if needed.","example":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}","uniqueKey":"params","typeLabel":"string"}},"required":["code","httpStatus","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"BCK.ROUTER.0003","httpStatus":500,"message":"delegation budget exceeded, expired, or inactive","details":"Hash JWT is not signed by the node account","error":"authorization_pending","hint":"Verify the wallet has sufficient balance and that the plan is active.","docsUrl":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","category":"integration","retryable":true,"correlationId":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uuid":"e-550e8400-e29b-41d4-a716-446655440000","date":"2026-05-09T12:34:56.789Z","params":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"}}},"exampleType":"generated"}},"exampleType":"generated"},"223eab44-9fd7-4ac3-aba3-f6b3cc985b09":{"description":"This credential is not a commerce grant (BCK.OAUTH.0033), or the EIP-7702 wallet gate refused the key (BCK.ROUTER.0008).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Router error code. `BCK.ROUTER.0001` invalid request / no fundable option / bad 402 (400); `BCK.ROUTER.0002` requestId already used — idempotency conflict (409); `BCK.ROUTER.0003` delegation budget exceeded, expired, or inactive (402); `BCK.ROUTER.0004` payment record not found (404); `BCK.ROUTER.0005` payment not in a settleable state (409). Framework-level `BCK.HTTP.*` codes (e.g. `BCK.HTTP.400` request validation, `BCK.HTTP.429` throttling) may also appear — see the base `code` field.","example":"BCK.ROUTER.0003","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"httpStatus":{"type":"number","description":"HTTP status code","example":500,"isRequired":true,"uniqueKey":"httpStatus","typeLabel":"number"},"message":{"type":"string","description":"Error message for Router operations.","example":"delegation budget exceeded, expired, or inactive","examples":["delegationId is required — create one via POST /api/v1/delegation/create","no fundable option; offered: [...]","upstream pay-to address is not in this delegation's allowed recipients","delegation budget exceeded, expired, or inactive","payment already settled with a different txHash"],"isRequired":true,"uniqueKey":"message","typeLabel":"string"},"details":{"type":"string","description":"Throw-site detail string supplementing the canonical message. Only set when the call site supplied an opts.message; absent otherwise.","example":"Hash JWT is not signed by the node account","uniqueKey":"details","typeLabel":"string"},"error":{"type":"string","description":"RFC 6749 §5.2 / RFC 8628 §3.5 top-level OAuth error string. Present only on the OAuth device-polling responses from `POST /oauth/token` (`authorization_pending`, `slow_down`, `expired_token`, `access_denied`), so a standards-compliant OAuth/device client can branch on it directly instead of on the Nevermined `code`. Absent on every other error.","example":"authorization_pending","uniqueKey":"error","typeLabel":"string"},"hint":{"type":"string","description":"Actionable remediation hint, sourced from the catalogue or supplied at the throw site. Tells the caller what to fix or where to look.","example":"Verify the wallet has sufficient balance and that the plan is active.","uniqueKey":"hint","typeLabel":"string"},"docsUrl":{"type":"string","description":"Permalink to the docs page describing this error code.","example":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","uniqueKey":"docsUrl","typeLabel":"string"},"category":{"type":"string","description":"Coarse classification of the failure, useful for client-side branching without parsing the message.","enum":["validation","auth","business","integration","internal"],"example":"integration","uniqueKey":"category","typeLabel":"enum\u003cstring>"},"retryable":{"type":"boolean","description":"Whether the failure is transient and the same call can be retried with identical inputs. Absent when the catalogue does not assert either way.","example":true,"uniqueKey":"retryable","typeLabel":"boolean"},"correlationId":{"type":"string","description":"Request-scoped correlation id stamped by the global filter. Echoed in the x-correlation-id response header. Quote this when reporting issues.","example":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uniqueKey":"correlationId","typeLabel":"string"},"uuid":{"type":"string","description":"Per-error UUID generated at construction. Useful for log correlation.","example":"e-550e8400-e29b-41d4-a716-446655440000","uniqueKey":"uuid","typeLabel":"string"},"date":{"type":"string","description":"ISO timestamp at which the error was constructed.","example":"2026-05-09T12:34:56.789Z","format":"date-time","uniqueKey":"date","typeLabel":"string\u003cdate-time>"},"params":{"type":"string","description":"JSON-stringified contextual parameters supplied at the throw site (e.g. IDs, state). Always a string in the wire format — parse with JSON.parse if needed.","example":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}","uniqueKey":"params","typeLabel":"string"}},"required":["code","httpStatus","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"BCK.ROUTER.0003","httpStatus":500,"message":"delegation budget exceeded, expired, or inactive","details":"Hash JWT is not signed by the node account","error":"authorization_pending","hint":"Verify the wallet has sufficient balance and that the plan is active.","docsUrl":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","category":"integration","retryable":true,"correlationId":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uuid":"e-550e8400-e29b-41d4-a716-446655440000","date":"2026-05-09T12:34:56.789Z","params":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"}}},"exampleType":"generated"}},"exampleType":"generated"},"114c1004-3b96-4db0-b5a9-e4b071cd895c":{"description":"Something the payment needs does not exist. BCK.DELEGATION.0002 — the delegation your grant is pinned to could not be resolved for this credential: it is not this account’s, or it is bound to a different grant than the one you hold. Re-run the authorization to mint a fresh mandate. You never send a delegation id on this route, so this is not a wrong-id error; an expired, exhausted or revoked delegation is a 402 (BCK.ROUTER.0003) instead. BCK.X402.0011 — the account has no Privy wallet, i.e. signup never completed. BCK.X402.0053 — the account’s embedded wallet has been deleted, so its smart account can no longer be reconstructed; Privy documents this as unrecoverable, so provision a new account. All three are permanent — retrying creates nothing.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Router error code. `BCK.ROUTER.0001` invalid request / no fundable option / bad 402 (400); `BCK.ROUTER.0002` requestId already used — idempotency conflict (409); `BCK.ROUTER.0003` delegation budget exceeded, expired, or inactive (402); `BCK.ROUTER.0004` payment record not found (404); `BCK.ROUTER.0005` payment not in a settleable state (409). Framework-level `BCK.HTTP.*` codes (e.g. `BCK.HTTP.400` request validation, `BCK.HTTP.429` throttling) may also appear — see the base `code` field.","example":"BCK.ROUTER.0003","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"httpStatus":{"type":"number","description":"HTTP status code","example":500,"isRequired":true,"uniqueKey":"httpStatus","typeLabel":"number"},"message":{"type":"string","description":"Error message for Router operations.","example":"delegation budget exceeded, expired, or inactive","examples":["delegationId is required — create one via POST /api/v1/delegation/create","no fundable option; offered: [...]","upstream pay-to address is not in this delegation's allowed recipients","delegation budget exceeded, expired, or inactive","payment already settled with a different txHash"],"isRequired":true,"uniqueKey":"message","typeLabel":"string"},"details":{"type":"string","description":"Throw-site detail string supplementing the canonical message. Only set when the call site supplied an opts.message; absent otherwise.","example":"Hash JWT is not signed by the node account","uniqueKey":"details","typeLabel":"string"},"error":{"type":"string","description":"RFC 6749 §5.2 / RFC 8628 §3.5 top-level OAuth error string. Present only on the OAuth device-polling responses from `POST /oauth/token` (`authorization_pending`, `slow_down`, `expired_token`, `access_denied`), so a standards-compliant OAuth/device client can branch on it directly instead of on the Nevermined `code`. Absent on every other error.","example":"authorization_pending","uniqueKey":"error","typeLabel":"string"},"hint":{"type":"string","description":"Actionable remediation hint, sourced from the catalogue or supplied at the throw site. Tells the caller what to fix or where to look.","example":"Verify the wallet has sufficient balance and that the plan is active.","uniqueKey":"hint","typeLabel":"string"},"docsUrl":{"type":"string","description":"Permalink to the docs page describing this error code.","example":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","uniqueKey":"docsUrl","typeLabel":"string"},"category":{"type":"string","description":"Coarse classification of the failure, useful for client-side branching without parsing the message.","enum":["validation","auth","business","integration","internal"],"example":"integration","uniqueKey":"category","typeLabel":"enum\u003cstring>"},"retryable":{"type":"boolean","description":"Whether the failure is transient and the same call can be retried with identical inputs. Absent when the catalogue does not assert either way.","example":true,"uniqueKey":"retryable","typeLabel":"boolean"},"correlationId":{"type":"string","description":"Request-scoped correlation id stamped by the global filter. Echoed in the x-correlation-id response header. Quote this when reporting issues.","example":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uniqueKey":"correlationId","typeLabel":"string"},"uuid":{"type":"string","description":"Per-error UUID generated at construction. Useful for log correlation.","example":"e-550e8400-e29b-41d4-a716-446655440000","uniqueKey":"uuid","typeLabel":"string"},"date":{"type":"string","description":"ISO timestamp at which the error was constructed.","example":"2026-05-09T12:34:56.789Z","format":"date-time","uniqueKey":"date","typeLabel":"string\u003cdate-time>"},"params":{"type":"string","description":"JSON-stringified contextual parameters supplied at the throw site (e.g. IDs, state). Always a string in the wire format — parse with JSON.parse if needed.","example":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}","uniqueKey":"params","typeLabel":"string"}},"required":["code","httpStatus","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"BCK.ROUTER.0003","httpStatus":500,"message":"delegation budget exceeded, expired, or inactive","details":"Hash JWT is not signed by the node account","error":"authorization_pending","hint":"Verify the wallet has sufficient balance and that the plan is active.","docsUrl":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","category":"integration","retryable":true,"correlationId":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uuid":"e-550e8400-e29b-41d4-a716-446655440000","date":"2026-05-09T12:34:56.789Z","params":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"}}},"exampleType":"generated"}},"exampleType":"generated"},"9eba9ba8-3dcf-4079-aac9-9cfe86831ea8":{"description":"The `requestId` was already used — idempotency conflict (BCK.ROUTER.0002) — or the raw `url` targets a cataloged service and must be invoked by `slug` (BCK.ROUTER.0014, not retryable).","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Router error code. `BCK.ROUTER.0001` invalid request / no fundable option / bad 402 (400); `BCK.ROUTER.0002` requestId already used — idempotency conflict (409); `BCK.ROUTER.0003` delegation budget exceeded, expired, or inactive (402); `BCK.ROUTER.0004` payment record not found (404); `BCK.ROUTER.0005` payment not in a settleable state (409). Framework-level `BCK.HTTP.*` codes (e.g. `BCK.HTTP.400` request validation, `BCK.HTTP.429` throttling) may also appear — see the base `code` field.","example":"BCK.ROUTER.0003","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"httpStatus":{"type":"number","description":"HTTP status code","example":500,"isRequired":true,"uniqueKey":"httpStatus","typeLabel":"number"},"message":{"type":"string","description":"Error message for Router operations.","example":"delegation budget exceeded, expired, or inactive","examples":["delegationId is required — create one via POST /api/v1/delegation/create","no fundable option; offered: [...]","upstream pay-to address is not in this delegation's allowed recipients","delegation budget exceeded, expired, or inactive","payment already settled with a different txHash"],"isRequired":true,"uniqueKey":"message","typeLabel":"string"},"details":{"type":"string","description":"Throw-site detail string supplementing the canonical message. Only set when the call site supplied an opts.message; absent otherwise.","example":"Hash JWT is not signed by the node account","uniqueKey":"details","typeLabel":"string"},"error":{"type":"string","description":"RFC 6749 §5.2 / RFC 8628 §3.5 top-level OAuth error string. Present only on the OAuth device-polling responses from `POST /oauth/token` (`authorization_pending`, `slow_down`, `expired_token`, `access_denied`), so a standards-compliant OAuth/device client can branch on it directly instead of on the Nevermined `code`. Absent on every other error.","example":"authorization_pending","uniqueKey":"error","typeLabel":"string"},"hint":{"type":"string","description":"Actionable remediation hint, sourced from the catalogue or supplied at the throw site. Tells the caller what to fix or where to look.","example":"Verify the wallet has sufficient balance and that the plan is active.","uniqueKey":"hint","typeLabel":"string"},"docsUrl":{"type":"string","description":"Permalink to the docs page describing this error code.","example":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","uniqueKey":"docsUrl","typeLabel":"string"},"category":{"type":"string","description":"Coarse classification of the failure, useful for client-side branching without parsing the message.","enum":["validation","auth","business","integration","internal"],"example":"integration","uniqueKey":"category","typeLabel":"enum\u003cstring>"},"retryable":{"type":"boolean","description":"Whether the failure is transient and the same call can be retried with identical inputs. Absent when the catalogue does not assert either way.","example":true,"uniqueKey":"retryable","typeLabel":"boolean"},"correlationId":{"type":"string","description":"Request-scoped correlation id stamped by the global filter. Echoed in the x-correlation-id response header. Quote this when reporting issues.","example":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uniqueKey":"correlationId","typeLabel":"string"},"uuid":{"type":"string","description":"Per-error UUID generated at construction. Useful for log correlation.","example":"e-550e8400-e29b-41d4-a716-446655440000","uniqueKey":"uuid","typeLabel":"string"},"date":{"type":"string","description":"ISO timestamp at which the error was constructed.","example":"2026-05-09T12:34:56.789Z","format":"date-time","uniqueKey":"date","typeLabel":"string\u003cdate-time>"},"params":{"type":"string","description":"JSON-stringified contextual parameters supplied at the throw site (e.g. IDs, state). Always a string in the wire format — parse with JSON.parse if needed.","example":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}","uniqueKey":"params","typeLabel":"string"}},"required":["code","httpStatus","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"BCK.ROUTER.0003","httpStatus":500,"message":"delegation budget exceeded, expired, or inactive","details":"Hash JWT is not signed by the node account","error":"authorization_pending","hint":"Verify the wallet has sufficient balance and that the plan is active.","docsUrl":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","category":"integration","retryable":true,"correlationId":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uuid":"e-550e8400-e29b-41d4-a716-446655440000","date":"2026-05-09T12:34:56.789Z","params":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"}}},"exampleType":"generated"}},"exampleType":"generated"},"1a6eec5e-0464-426d-a10b-fba6c0588f3e":{"description":"Organization-wallet spend refused by the group budget: the group has exhausted its budget for this period (BCK.BUDGETS.0003), or it has no budget in the settlement currency (BCK.BUDGETS.0006). Only reachable when the delegation is funded by an organization wallet — a personal delegation never returns 422.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Router error code. `BCK.ROUTER.0001` invalid request / no fundable option / bad 402 (400); `BCK.ROUTER.0002` requestId already used — idempotency conflict (409); `BCK.ROUTER.0003` delegation budget exceeded, expired, or inactive (402); `BCK.ROUTER.0004` payment record not found (404); `BCK.ROUTER.0005` payment not in a settleable state (409). Framework-level `BCK.HTTP.*` codes (e.g. `BCK.HTTP.400` request validation, `BCK.HTTP.429` throttling) may also appear — see the base `code` field.","example":"BCK.ROUTER.0003","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"httpStatus":{"type":"number","description":"HTTP status code","example":500,"isRequired":true,"uniqueKey":"httpStatus","typeLabel":"number"},"message":{"type":"string","description":"Error message for Router operations.","example":"delegation budget exceeded, expired, or inactive","examples":["delegationId is required — create one via POST /api/v1/delegation/create","no fundable option; offered: [...]","upstream pay-to address is not in this delegation's allowed recipients","delegation budget exceeded, expired, or inactive","payment already settled with a different txHash"],"isRequired":true,"uniqueKey":"message","typeLabel":"string"},"details":{"type":"string","description":"Throw-site detail string supplementing the canonical message. Only set when the call site supplied an opts.message; absent otherwise.","example":"Hash JWT is not signed by the node account","uniqueKey":"details","typeLabel":"string"},"error":{"type":"string","description":"RFC 6749 §5.2 / RFC 8628 §3.5 top-level OAuth error string. Present only on the OAuth device-polling responses from `POST /oauth/token` (`authorization_pending`, `slow_down`, `expired_token`, `access_denied`), so a standards-compliant OAuth/device client can branch on it directly instead of on the Nevermined `code`. Absent on every other error.","example":"authorization_pending","uniqueKey":"error","typeLabel":"string"},"hint":{"type":"string","description":"Actionable remediation hint, sourced from the catalogue or supplied at the throw site. Tells the caller what to fix or where to look.","example":"Verify the wallet has sufficient balance and that the plan is active.","uniqueKey":"hint","typeLabel":"string"},"docsUrl":{"type":"string","description":"Permalink to the docs page describing this error code.","example":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","uniqueKey":"docsUrl","typeLabel":"string"},"category":{"type":"string","description":"Coarse classification of the failure, useful for client-side branching without parsing the message.","enum":["validation","auth","business","integration","internal"],"example":"integration","uniqueKey":"category","typeLabel":"enum\u003cstring>"},"retryable":{"type":"boolean","description":"Whether the failure is transient and the same call can be retried with identical inputs. Absent when the catalogue does not assert either way.","example":true,"uniqueKey":"retryable","typeLabel":"boolean"},"correlationId":{"type":"string","description":"Request-scoped correlation id stamped by the global filter. Echoed in the x-correlation-id response header. Quote this when reporting issues.","example":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uniqueKey":"correlationId","typeLabel":"string"},"uuid":{"type":"string","description":"Per-error UUID generated at construction. Useful for log correlation.","example":"e-550e8400-e29b-41d4-a716-446655440000","uniqueKey":"uuid","typeLabel":"string"},"date":{"type":"string","description":"ISO timestamp at which the error was constructed.","example":"2026-05-09T12:34:56.789Z","format":"date-time","uniqueKey":"date","typeLabel":"string\u003cdate-time>"},"params":{"type":"string","description":"JSON-stringified contextual parameters supplied at the throw site (e.g. IDs, state). Always a string in the wire format — parse with JSON.parse if needed.","example":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}","uniqueKey":"params","typeLabel":"string"}},"required":["code","httpStatus","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"BCK.ROUTER.0003","httpStatus":500,"message":"delegation budget exceeded, expired, or inactive","details":"Hash JWT is not signed by the node account","error":"authorization_pending","hint":"Verify the wallet has sufficient balance and that the plan is active.","docsUrl":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","category":"integration","retryable":true,"correlationId":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uuid":"e-550e8400-e29b-41d4-a716-446655440000","date":"2026-05-09T12:34:56.789Z","params":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"}}},"exampleType":"generated"}},"exampleType":"generated"},"fbd1a4a6-5d24-4a37-9db1-eb4e907708a4":{"description":"BCK.ROUTER.0007 — too many mode-B relays in flight for this caller at once (each holds an upstream socket and a reserved budget). Retryable: let some relays finish, then try again. A slug-addressed call (using `slug`, not `url`) has a THIRD 429 source: a per-slug invoke rate limit (BCK.HTTP.429 with `Retry-After`). Two buckets again — the per-(key, slug) ceiling is yours, but the per-slug ceiling is SHARED by everyone invoking that slug, so heavy traffic to a popular slug can limit you even when your own rate is low. Retryable after the `Retry-After` backoff. Rate limit exceeded (BCK.HTTP.429). Two buckets can produce this. The per-API-key ceiling is genuinely yours and answers with `Retry-After` (seconds) — honour it. The global bucket is NOT: these routes authenticate after it runs, so it falls back to keying on the client IP, which is currently SHARED by all external callers — you can be limited by traffic that is not yours. That one answers with `Retry-After-short` / `Retry-After-long`. Retryable after a backoff either way.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Router error code. `BCK.ROUTER.0001` invalid request / no fundable option / bad 402 (400); `BCK.ROUTER.0002` requestId already used — idempotency conflict (409); `BCK.ROUTER.0003` delegation budget exceeded, expired, or inactive (402); `BCK.ROUTER.0004` payment record not found (404); `BCK.ROUTER.0005` payment not in a settleable state (409). Framework-level `BCK.HTTP.*` codes (e.g. `BCK.HTTP.400` request validation, `BCK.HTTP.429` throttling) may also appear — see the base `code` field.","example":"BCK.ROUTER.0003","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"httpStatus":{"type":"number","description":"HTTP status code","example":500,"isRequired":true,"uniqueKey":"httpStatus","typeLabel":"number"},"message":{"type":"string","description":"Error message for Router operations.","example":"delegation budget exceeded, expired, or inactive","examples":["delegationId is required — create one via POST /api/v1/delegation/create","no fundable option; offered: [...]","upstream pay-to address is not in this delegation's allowed recipients","delegation budget exceeded, expired, or inactive","payment already settled with a different txHash"],"isRequired":true,"uniqueKey":"message","typeLabel":"string"},"details":{"type":"string","description":"Throw-site detail string supplementing the canonical message. Only set when the call site supplied an opts.message; absent otherwise.","example":"Hash JWT is not signed by the node account","uniqueKey":"details","typeLabel":"string"},"error":{"type":"string","description":"RFC 6749 §5.2 / RFC 8628 §3.5 top-level OAuth error string. Present only on the OAuth device-polling responses from `POST /oauth/token` (`authorization_pending`, `slow_down`, `expired_token`, `access_denied`), so a standards-compliant OAuth/device client can branch on it directly instead of on the Nevermined `code`. Absent on every other error.","example":"authorization_pending","uniqueKey":"error","typeLabel":"string"},"hint":{"type":"string","description":"Actionable remediation hint, sourced from the catalogue or supplied at the throw site. Tells the caller what to fix or where to look.","example":"Verify the wallet has sufficient balance and that the plan is active.","uniqueKey":"hint","typeLabel":"string"},"docsUrl":{"type":"string","description":"Permalink to the docs page describing this error code.","example":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","uniqueKey":"docsUrl","typeLabel":"string"},"category":{"type":"string","description":"Coarse classification of the failure, useful for client-side branching without parsing the message.","enum":["validation","auth","business","integration","internal"],"example":"integration","uniqueKey":"category","typeLabel":"enum\u003cstring>"},"retryable":{"type":"boolean","description":"Whether the failure is transient and the same call can be retried with identical inputs. Absent when the catalogue does not assert either way.","example":true,"uniqueKey":"retryable","typeLabel":"boolean"},"correlationId":{"type":"string","description":"Request-scoped correlation id stamped by the global filter. Echoed in the x-correlation-id response header. Quote this when reporting issues.","example":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uniqueKey":"correlationId","typeLabel":"string"},"uuid":{"type":"string","description":"Per-error UUID generated at construction. Useful for log correlation.","example":"e-550e8400-e29b-41d4-a716-446655440000","uniqueKey":"uuid","typeLabel":"string"},"date":{"type":"string","description":"ISO timestamp at which the error was constructed.","example":"2026-05-09T12:34:56.789Z","format":"date-time","uniqueKey":"date","typeLabel":"string\u003cdate-time>"},"params":{"type":"string","description":"JSON-stringified contextual parameters supplied at the throw site (e.g. IDs, state). Always a string in the wire format — parse with JSON.parse if needed.","example":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}","uniqueKey":"params","typeLabel":"string"}},"required":["code","httpStatus","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"BCK.ROUTER.0003","httpStatus":500,"message":"delegation budget exceeded, expired, or inactive","details":"Hash JWT is not signed by the node account","error":"authorization_pending","hint":"Verify the wallet has sufficient balance and that the plan is active.","docsUrl":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","category":"integration","retryable":true,"correlationId":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uuid":"e-550e8400-e29b-41d4-a716-446655440000","date":"2026-05-09T12:34:56.789Z","params":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"}}},"exampleType":"generated"}},"exampleType":"generated"},"8736961d-66b7-47c9-9f47-2e8e46d96d34":{"description":"BCK.ROUTER.0010 — the payment handler reported a settlement amount the routing-fee arithmetic cannot use. For THAT code specifically: a credential may already have been minted while no payment record was written, so your `requestId` will NOT suppress a retry — do not blind-retry, report it. BCK.ROUTER.0013 — Nevermined holds no EIP-712 signing domain for the selected settlement token; nothing was signed, charged or reserved, and a retry fails identically until our token table is fixed, so report it rather than looping. Any other 500 is an unexpected server error, may carry no `code` at all, and the guidance above does not apply to it — treat it as unknown.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Router error code. `BCK.ROUTER.0001` invalid request / no fundable option / bad 402 (400); `BCK.ROUTER.0002` requestId already used — idempotency conflict (409); `BCK.ROUTER.0003` delegation budget exceeded, expired, or inactive (402); `BCK.ROUTER.0004` payment record not found (404); `BCK.ROUTER.0005` payment not in a settleable state (409). Framework-level `BCK.HTTP.*` codes (e.g. `BCK.HTTP.400` request validation, `BCK.HTTP.429` throttling) may also appear — see the base `code` field.","example":"BCK.ROUTER.0003","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"httpStatus":{"type":"number","description":"HTTP status code","example":500,"isRequired":true,"uniqueKey":"httpStatus","typeLabel":"number"},"message":{"type":"string","description":"Error message for Router operations.","example":"delegation budget exceeded, expired, or inactive","examples":["delegationId is required — create one via POST /api/v1/delegation/create","no fundable option; offered: [...]","upstream pay-to address is not in this delegation's allowed recipients","delegation budget exceeded, expired, or inactive","payment already settled with a different txHash"],"isRequired":true,"uniqueKey":"message","typeLabel":"string"},"details":{"type":"string","description":"Throw-site detail string supplementing the canonical message. Only set when the call site supplied an opts.message; absent otherwise.","example":"Hash JWT is not signed by the node account","uniqueKey":"details","typeLabel":"string"},"error":{"type":"string","description":"RFC 6749 §5.2 / RFC 8628 §3.5 top-level OAuth error string. Present only on the OAuth device-polling responses from `POST /oauth/token` (`authorization_pending`, `slow_down`, `expired_token`, `access_denied`), so a standards-compliant OAuth/device client can branch on it directly instead of on the Nevermined `code`. Absent on every other error.","example":"authorization_pending","uniqueKey":"error","typeLabel":"string"},"hint":{"type":"string","description":"Actionable remediation hint, sourced from the catalogue or supplied at the throw site. Tells the caller what to fix or where to look.","example":"Verify the wallet has sufficient balance and that the plan is active.","uniqueKey":"hint","typeLabel":"string"},"docsUrl":{"type":"string","description":"Permalink to the docs page describing this error code.","example":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","uniqueKey":"docsUrl","typeLabel":"string"},"category":{"type":"string","description":"Coarse classification of the failure, useful for client-side branching without parsing the message.","enum":["validation","auth","business","integration","internal"],"example":"integration","uniqueKey":"category","typeLabel":"enum\u003cstring>"},"retryable":{"type":"boolean","description":"Whether the failure is transient and the same call can be retried with identical inputs. Absent when the catalogue does not assert either way.","example":true,"uniqueKey":"retryable","typeLabel":"boolean"},"correlationId":{"type":"string","description":"Request-scoped correlation id stamped by the global filter. Echoed in the x-correlation-id response header. Quote this when reporting issues.","example":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uniqueKey":"correlationId","typeLabel":"string"},"uuid":{"type":"string","description":"Per-error UUID generated at construction. Useful for log correlation.","example":"e-550e8400-e29b-41d4-a716-446655440000","uniqueKey":"uuid","typeLabel":"string"},"date":{"type":"string","description":"ISO timestamp at which the error was constructed.","example":"2026-05-09T12:34:56.789Z","format":"date-time","uniqueKey":"date","typeLabel":"string\u003cdate-time>"},"params":{"type":"string","description":"JSON-stringified contextual parameters supplied at the throw site (e.g. IDs, state). Always a string in the wire format — parse with JSON.parse if needed.","example":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}","uniqueKey":"params","typeLabel":"string"}},"required":["code","httpStatus","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"BCK.ROUTER.0003","httpStatus":500,"message":"delegation budget exceeded, expired, or inactive","details":"Hash JWT is not signed by the node account","error":"authorization_pending","hint":"Verify the wallet has sufficient balance and that the plan is active.","docsUrl":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","category":"integration","retryable":true,"correlationId":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uuid":"e-550e8400-e29b-41d4-a716-446655440000","date":"2026-05-09T12:34:56.789Z","params":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"}}},"exampleType":"generated"}},"exampleType":"generated"},"25cfe8a6-4002-4667-952d-5e50bcfd5b00":{"description":"BCK.X402.0052 — the account’s EIP-7702 delegation designator could not be installed on the settlement network, and the Router refuses to pay from a wallet whose funds have not been swept to the signer. Reachable only where EIP-7702 is enabled. This is a transient infrastructure fault and the ONE failure on these routes an autonomous caller SHOULD retry — back off first.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Router error code. `BCK.ROUTER.0001` invalid request / no fundable option / bad 402 (400); `BCK.ROUTER.0002` requestId already used — idempotency conflict (409); `BCK.ROUTER.0003` delegation budget exceeded, expired, or inactive (402); `BCK.ROUTER.0004` payment record not found (404); `BCK.ROUTER.0005` payment not in a settleable state (409). Framework-level `BCK.HTTP.*` codes (e.g. `BCK.HTTP.400` request validation, `BCK.HTTP.429` throttling) may also appear — see the base `code` field.","example":"BCK.ROUTER.0003","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"httpStatus":{"type":"number","description":"HTTP status code","example":500,"isRequired":true,"uniqueKey":"httpStatus","typeLabel":"number"},"message":{"type":"string","description":"Error message for Router operations.","example":"delegation budget exceeded, expired, or inactive","examples":["delegationId is required — create one via POST /api/v1/delegation/create","no fundable option; offered: [...]","upstream pay-to address is not in this delegation's allowed recipients","delegation budget exceeded, expired, or inactive","payment already settled with a different txHash"],"isRequired":true,"uniqueKey":"message","typeLabel":"string"},"details":{"type":"string","description":"Throw-site detail string supplementing the canonical message. Only set when the call site supplied an opts.message; absent otherwise.","example":"Hash JWT is not signed by the node account","uniqueKey":"details","typeLabel":"string"},"error":{"type":"string","description":"RFC 6749 §5.2 / RFC 8628 §3.5 top-level OAuth error string. Present only on the OAuth device-polling responses from `POST /oauth/token` (`authorization_pending`, `slow_down`, `expired_token`, `access_denied`), so a standards-compliant OAuth/device client can branch on it directly instead of on the Nevermined `code`. Absent on every other error.","example":"authorization_pending","uniqueKey":"error","typeLabel":"string"},"hint":{"type":"string","description":"Actionable remediation hint, sourced from the catalogue or supplied at the throw site. Tells the caller what to fix or where to look.","example":"Verify the wallet has sufficient balance and that the plan is active.","uniqueKey":"hint","typeLabel":"string"},"docsUrl":{"type":"string","description":"Permalink to the docs page describing this error code.","example":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","uniqueKey":"docsUrl","typeLabel":"string"},"category":{"type":"string","description":"Coarse classification of the failure, useful for client-side branching without parsing the message.","enum":["validation","auth","business","integration","internal"],"example":"integration","uniqueKey":"category","typeLabel":"enum\u003cstring>"},"retryable":{"type":"boolean","description":"Whether the failure is transient and the same call can be retried with identical inputs. Absent when the catalogue does not assert either way.","example":true,"uniqueKey":"retryable","typeLabel":"boolean"},"correlationId":{"type":"string","description":"Request-scoped correlation id stamped by the global filter. Echoed in the x-correlation-id response header. Quote this when reporting issues.","example":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uniqueKey":"correlationId","typeLabel":"string"},"uuid":{"type":"string","description":"Per-error UUID generated at construction. Useful for log correlation.","example":"e-550e8400-e29b-41d4-a716-446655440000","uniqueKey":"uuid","typeLabel":"string"},"date":{"type":"string","description":"ISO timestamp at which the error was constructed.","example":"2026-05-09T12:34:56.789Z","format":"date-time","uniqueKey":"date","typeLabel":"string\u003cdate-time>"},"params":{"type":"string","description":"JSON-stringified contextual parameters supplied at the throw site (e.g. IDs, state). Always a string in the wire format — parse with JSON.parse if needed.","example":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}","uniqueKey":"params","typeLabel":"string"}},"required":["code","httpStatus","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"BCK.ROUTER.0003","httpStatus":500,"message":"delegation budget exceeded, expired, or inactive","details":"Hash JWT is not signed by the node account","error":"authorization_pending","hint":"Verify the wallet has sufficient balance and that the plan is active.","docsUrl":"https://nevermined.ai/docs/development-guide/api-errors/codes#bck-x402-0008","category":"integration","retryable":true,"correlationId":"a3f6b1c4-7d2e-4a9b-8e0c-12f4d8e6c5b9","uuid":"e-550e8400-e29b-41d4-a716-446655440000","date":"2026-05-09T12:34:56.789Z","params":"{\"planId\":\"43298432984329\",\"reason\":\"Invalid configuration\"}"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"3b868f3c-2afb-4f92-95c8-437d36ca46a1":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Your Nevermined API Key (starts with 'nvm:'). Get one at [nevermined.app](https://nevermined.app) under **Settings > API Keys**.","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"0d5c4343-a09a-4b57-800b-6e475c3e1562":{"url":"https://api.sandbox.nevermined.app/api/v1","description":"Sandbox (Testing) - Base Sepolia"},"9d83c2d6-3623-4208-a4cc-b9603f906e2f":{"url":"https://api.live.nevermined.app/api/v1","description":"Live (Production) - Base Mainnet"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Your Nevermined API Key (starts with 'nvm:'). Get one at [nevermined.app](https://nevermined.app) under **Settings > API Keys**.","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Your Nevermined API Key (starts with 'nvm:'). Get one at [nevermined.app](https://nevermined.app) under **Settings > API Keys**.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"neverminedag","siteName":"Nevermined Documentation","title":"Route and Pay from a Commerce Grant - Nevermined Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-11T15:35:51.743Z","originalFileLocation":"api-reference/router/commerce-route.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"The OAuth counterpart of POST /api/v1/router/route, for a credential minted from a commerce authorization. Identical behaviour and identical response — with one difference: you do not choose the delegation. It is derived from your grant: the capped, expiring mandate the user approved when they connected you. Sending a delegationId is refused, not ignored. The cap, its expiry, and the user revoking the grant are the boundary on what you can spend. The routing fee is drawn from that same cap, in addition to each merchant’s price. A plain (non-OAuth) API key cannot use this route — it has no grant to derive from. Use POST /api/v1/router/route and name your own delegationId instead.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Nevermined Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/neverminedag/kfri__UAQkYRE-Ph/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/neverminedag/kfri__UAQkYRE-Ph/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/neverminedag/kfri__UAQkYRE-Ph/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/neverminedag/kfri__UAQkYRE-Ph/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/neverminedag/kfri__UAQkYRE-Ph/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/neverminedag/kfri__UAQkYRE-Ph/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/neverminedag/kfri__UAQkYRE-Ph/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/neverminedag/kfri__UAQkYRE-Ph/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/neverminedag/kfri__UAQkYRE-Ph/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Route and Pay from a Commerce Grant - Nevermined Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"The OAuth counterpart of POST /api/v1/router/route, for a credential minted from a commerce authorization. Identical behaviour and identical response — with one difference: you do not choose the delegation. It is derived from your grant: the capped, expiring mandate the user approved when they connected you. Sending a delegationId is refused, not ignored. The cap, its expiry, and the user revoking the grant are the boundary on what you can spend. The routing fee is drawn from that same cap, in addition to each merchant’s price. A plain (non-OAuth) API key cannot use this route — it has no grant to derive from. Use POST /api/v1/router/route and name your own delegationId instead.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Nevermined Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://nevermined.ai/docs/api-reference/router/commerce-route\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://neverminedag.mintlify.app/_mintlify/api/og/v2?division=Router\u0026amp;title=Route+and+Pay+from+a+Commerce+Grant\u0026amp;description=The+OAuth+counterpart+of+%60POST+%2Fapi%2Fv1%2Frouter%2Froute%60%2C+for+a+credential+minted+from+a%0A%60commerce%60+authorization.+Identical+behaviour+and+identical+response+%E2%80%94+with\u0026amp;theme=c89a77452a99234468b325dc\u0026amp;signature=213a40fe65b8f186ede23a363b207ec99b20381b21d20eb7e496abc6f4dabad2\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Route and Pay from a Commerce Grant - Nevermined Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"The OAuth counterpart of POST /api/v1/router/route, for a credential minted from a commerce authorization. Identical behaviour and identical response — with one difference: you do not choose the delegation. It is derived from your grant: the capped, expiring mandate the user approved when they connected you. Sending a delegationId is refused, not ignored. The cap, its expiry, and the user revoking the grant are the boundary on what you can spend. The routing fee is drawn from that same cap, in addition to each merchant’s price. A plain (non-OAuth) API key cannot use this route — it has no grant to derive from. Use POST /api/v1/router/route and name your own delegationId instead.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://neverminedag.mintlify.app/_mintlify/api/og/v2?division=Router\u0026amp;title=Route+and+Pay+from+a+Commerce+Grant\u0026amp;description=The+OAuth+counterpart+of+%60POST+%2Fapi%2Fv1%2Frouter%2Froute%60%2C+for+a+credential+minted+from+a%0A%60commerce%60+authorization.+Identical+behaviour+and+identical+response+%E2%80%94+with\u0026amp;theme=c89a77452a99234468b325dc\u0026amp;signature=213a40fe65b8f186ede23a363b207ec99b20381b21d20eb7e496abc6f4dabad2\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/neverminedag/kfri__UAQkYRE-Ph/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Nevermined Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0f766e\">\u003clink data-mint-head rel=\"canonical\" href=\"https://nevermined.ai/docs/api-reference/router/commerce-route\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/api-reference/router/commerce-route.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://nevermined.ai/#organization\",\"name\":\"Nevermined Documentation\",\"url\":\"https://nevermined.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/neverminedag/pEEAPbhrOtjiJvrW/logo/light.svg?fit=max\u0026auto=format\u0026n=pEEAPbhrOtjiJvrW\u0026q=85\u0026s=adbff4ad34c53aed8ca307e9b12104e5\"}},{\"@type\":\"WebSite\",\"@id\":\"https://nevermined.ai/docs#website\",\"name\":\"Nevermined Documentation\",\"url\":\"https://nevermined.ai/docs\",\"publisher\":{\"@id\":\"https://nevermined.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://nevermined.ai/docs/api-reference/router/commerce-route#webpage\",\"url\":\"https://nevermined.ai/docs/api-reference/router/commerce-route\",\"name\":\"Route and Pay from a Commerce Grant\",\"description\":\"The OAuth counterpart of POST /api/v1/router/route, for a credential minted from a commerce authorization. Identical behaviour and identical response — with one difference: you do not choose the delegation. It is derived from your grant: the capped, expiring mandate the user approved when they connected you. Sending a delegationId is refused, not ignored. The cap, its expiry, and the user revoking the grant are the boundary on what you can spend. The routing fee is drawn from that same cap, in addition to each merchant’s price. A plain (non-OAuth) API key cannot use this route — it has no grant to derive from. Use POST /api/v1/router/route and name your own delegationId instead.\",\"dateModified\":\"2026-09-11T15:35:51.743Z\",\"isPartOf\":{\"@id\":\"https://nevermined.ai/docs#website\"},\"breadcrumb\":{\"@id\":\"https://nevermined.ai/docs/api-reference/router/commerce-route#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://nevermined.ai/docs/api-reference/router/commerce-route#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Router\",\"item\":\"https://nevermined.ai/docs/api-reference/router/mint-payment-credential\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Route and Pay from a Commerce Grant\",\"item\":\"https://nevermined.ai/docs/api-reference/router/commerce-route\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://nevermined.ai/docs/api-reference/router/commerce-route#apireference\",\"headline\":\"Route and Pay from a Commerce Grant\",\"name\":\"Route and Pay from a Commerce Grant\",\"description\":\"The OAuth counterpart of POST /api/v1/router/route, for a credential minted from a commerce authorization. Identical behaviour and identical response — with one difference: you do not choose the delegation. It is derived from your grant: the capped, expiring mandate the user approved when they connected you. Sending a delegationId is refused, not ignored. The cap, its expiry, and the user revoking the grant are the boundary on what you can spend. The routing fee is drawn from that same cap, in addition to each merchant’s price. A plain (non-OAuth) API key cannot use this route — it has no grant to derive from. Use POST /api/v1/router/route and name your own delegationId instead.\",\"url\":\"https://nevermined.ai/docs/api-reference/router/commerce-route\",\"mainEntityOfPage\":{\"@id\":\"https://nevermined.ai/docs/api-reference/router/commerce-route#webpage\"},\"dateModified\":\"2026-09-11T15:35:51.743Z\",\"publisher\":{\"@id\":\"https://nevermined.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://nevermined.ai/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Nevermined Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Nevermined Documentation","nav":{"global":{"anchors":[]},"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":"/getting-started/overview"}]},{"tab":"MCP","pages":[{"title":"MCP","href":"/mcp/catalog-mcp/overview"}]},{"tab":"API","groups":[{"group":"Overview","pages":[{"title":"Pre-requisites","icon":"key","href":"/api-reference/introduction"},{"title":"API Versioning","icon":"code-branch","href":"/development-guide/api-versioning"},{"title":"API error model","icon":"circle-exclamation","href":"/development-guide/api-errors/overview"},{"title":"API error codes","href":"/development-guide/api-errors/codes"}]},{"group":"Agents","pages":[{"title":"Register Agent","openapi":"POST /protocol/agents","href":"/api-reference/protocol/register-agent"},{"title":"List Agents","openapi":"GET /protocol/agents","href":"/api-reference/protocol/list-agents"},{"title":"Get Agent","openapi":"GET /protocol/agents/{agentId}","href":"/api-reference/protocol/get-agent"},{"title":"Update Agent","openapi":"PUT /protocol/agents/{agentId}","href":"/api-reference/protocol/update-agent"},{"title":"Register Agent and Plan","openapi":"POST /protocol/agents/plans","href":"/api-reference/protocol/register-agent-and-plan"},{"title":"Activate/Deactivate Agent","openapi":"PUT /protocol/agents/{agentId}/list/{activate}","href":"/api-reference/protocol/toggle-agent-listing"},{"title":"Add Plan to Agent","openapi":"POST /protocol/agents/{agentId}/plan/{planId}","href":"/api-reference/protocol/add-plan-to-agent"},{"title":"Remove Plan from Agent","openapi":"DELETE /protocol/agents/{agentId}/plan/{planId}","href":"/api-reference/protocol/remove-plan-from-agent"},{"title":"Get Agent Plans","openapi":"GET /protocol/agents/{agentId}/plans","href":"/api-reference/protocol/get-agent-plans"}]},{"group":"Plans","pages":[{"title":"Register Plan","openapi":"POST /protocol/plans","href":"/api-reference/protocol/register-plan"},{"title":"List Plans","openapi":"GET /protocol/plans","href":"/api-reference/protocol/list-plans"},{"title":"Get Plan","openapi":"GET /protocol/plans/{planId}","href":"/api-reference/protocol/get-plan"},{"title":"Update Plan","openapi":"PUT /protocol/plans/{planId}","href":"/api-reference/protocol/update-plan"},{"title":"Activate/Deactivate Plan","openapi":"PUT /protocol/plans/{planId}/list/{activate}","href":"/api-reference/protocol/toggle-plan-listing"},{"title":"Order Plan","openapi":"POST /protocol/plans/{planId}/order","href":"/api-reference/protocol/order-plan"},{"title":"Get Plan Balance","openapi":"GET /protocol/plans/{planId}/balance/{holderAddress}","href":"/api-reference/protocol/get-plan-balance"},{"title":"Get Plan Agents","openapi":"GET /protocol/plans/{planId}/agents","href":"/api-reference/protocol/get-plan-agents"}]},{"group":"Access","pages":[{"title":"Get Access Token","openapi":"GET /protocol/token/{planId}/{agentId}","href":"/api-reference/protocol/get-access-token"},{"title":"Initialize Agent Request","openapi":"POST /protocol/agents/initialize/{agentId}","href":"/api-reference/protocol/initialize-agent-request"},{"title":"Track Agent Sub Task","openapi":"POST /protocol/agent-sub-tasks","href":"/api-reference/protocol/track-agent-sub-task"}]},{"group":"x402","pages":[{"title":"Verify","openapi":"POST /x402/verify","href":"/api-reference/x402/verify-permission"},{"title":"Settle","openapi":"POST /x402/settle","href":"/api-reference/x402/settle-permission"},{"title":"Create Permission","openapi":"POST /x402/permissions","href":"/api-reference/x402/create-permission"},{"title":"List Permissions","openapi":"GET /x402/permissions","href":"/api-reference/x402/list-permissions"},{"title":"Get Permission","openapi":"GET /x402/permissions/{permissionHash}","href":"/api-reference/x402/get-permission"},{"title":"Revoke Permission","openapi":"DELETE /x402/permissions/{permissionHash}","href":"/api-reference/x402/revoke-permission"}]},{"group":"Credits","pages":[{"title":"Mint Credits","openapi":"POST /protocol/plans/mint","href":"/api-reference/protocol/mint-credits"},{"title":"Mint Expirable Credits","openapi":"POST /protocol/plans/mintExpirable","href":"/api-reference/protocol/mint-expirable-credits"},{"title":"Redeem Credits","openapi":"POST /protocol/plans/redeem","href":"/api-reference/protocol/redeem-credits"}]},{"group":"Delegation","pages":[{"title":"Create Delegation","openapi":"POST /delegation/create","href":"/api-reference/delegation/create-delegation"},{"title":"List Delegations","openapi":"GET /delegation","href":"/api-reference/delegation/list-delegations"},{"title":"Get Delegation","openapi":"GET /delegation/{delegationId}","href":"/api-reference/delegation/get-delegation"},{"title":"Revoke Delegation","openapi":"DELETE /delegation/{delegationId}","href":"/api-reference/delegation/revoke-delegation"},{"title":"List Delegation Transactions","openapi":"GET /delegation/{delegationId}/transactions","href":"/api-reference/delegation/list-delegation-transactions"}]},{"group":"Router","pages":[{"title":"Mint Payment Credential","openapi":"POST /router/payments","href":"/api-reference/router/mint-payment-credential"},{"title":"Route and Pay a Request","openapi":"POST /router/route","description":"Hand the Router the request you want made to an upstream x402 agent; it probes, pays any 402\nwith your Delegation (same engine as `POST /router/payments`), and relays the agent’s response in ONE\ncall — you never see the 402 or handle the credential yourself.\n\nPrerequisite: a Delegation `id` (`POST /api/v1/delegation/create`, provider `erc4337`).\n\nProvide the target `url` (+ optional `method`, `headers`, `body`). A free (non-402) upstream is\nrelayed unchanged with `paid=false` and no `payment`. `requestId` is REQUIRED (the Router pays automatically, so a retry must be idempotency-keyed); a duplicate returns 409 with the original paymentId (from API 1.48, the first purchase's retained result instead — see `GET /router/payments/{id}/result`).\n\nFor LARGE or STREAMED responses, a transparent streaming variant exists at `ALL /api/v1/router/proxy`:\npoint your HTTP client at it with headers `X-Router-Target-Url` and `X-Router-Delegation-Id`\n(optional `X-Router-Upstream-Authorization` for the agent’s own auth). Method/body/headers pass\nthrough and the response streams back, with payment metadata in `X-Router-Payment-Id`,\n`X-Router-Payment-Status`, and `X-Router-Tx-Hash` response headers. Use this JSON endpoint when\nyou want a single structured result instead.","href":"/api-reference/router/route-request"},{"title":"Route and Pay from a Commerce Grant","openapi":"POST /router/commerce/route","href":"/api-reference/router/commerce-route"},{"title":"Quote a Request Before Paying","openapi":"POST /router/quote","description":"Ask what `POST /route` would charge for this call, WITHOUT paying it. The Router makes the\nsame unpaid probe `/route` makes, reads the 402, selects the payment option exactly as a\npayment would (MPP first, then x402) and prices it with the Router fee — then stops. Nothing\nis signed, no credential is minted, no payment is recorded and no delegation budget is\nreserved, so no money moves. A quote is not free of consequence, though: the unpaid probe\nreaches the service (one that does not charge for the request performs it), and a quote\nspends the same per-key and per-service rate limit as a payment — so quote once per decision\nrather than repeating it.\n\nUse it to decide whether ONE call fits the allocation you planned for it: compare\n`fee.capChargedMicros` (exact) or `fee.capChargedCents` (rounded up, the figure\n`maxTotalCents` is compared against) with what you want to spend, then call `/route` with\n`maxTotalCents` set to that figure so a price change between quote and call is refused rather\nthan paid.\n\n`delegationId` is optional. With it, the quote prices the options that delegation would select\n(an organization-wallet delegation pays only in its own currency, a card delegation pays over\nMPP-stripe, a recipient allowlist is enforced); without it, the options a personal crypto\ndelegation would select. `optionSet` says which. A quote checks neither the remaining cap nor\nthe wallet balance — those are the payment’s checks (BCK.ROUTER.0003, BCK.ROUTER.0009).\n\nProvide the target `url` OR a catalog `slug` (+ optional `path`, `search`, `method`, `headers`,\n`body`), as on `/route`. A non-402 answer returns `paymentRequired: false` with the upstream\nstatus only — the upstream body and headers are never returned.","href":"/api-reference/router/quote"},{"title":"Quote from a Commerce Grant","openapi":"POST /router/commerce/quote","href":"/api-reference/router/commerce-quote"},{"title":"Call a Service with Subscription Credits","openapi":"POST /router/subscription/route","href":"/api-reference/router/subscription-route"},{"title":"Quote a Call in Subscription Credits","openapi":"POST /router/subscription/quote","href":"/api-reference/router/subscription-quote"},{"title":"Read Your Subscription Credits","openapi":"GET /router/subscription/balance","href":"/api-reference/router/subscription-balance"},{"title":"Report Settlement","openapi":"POST /router/payments/{id}/settled","href":"/api-reference/router/report-settlement"},{"title":"List Payments","openapi":"GET /router/payments","href":"/api-reference/router/list-payments"},{"title":"Payments Summary","openapi":"GET /router/payments/summary","href":"/api-reference/router/payments-summary"}]},{"group":"Payment Methods","pages":[{"title":"List Payment Methods","openapi":"GET /payment-methods","href":"/api-reference/payment-methods/list-payment-methods"},{"title":"Update Payment Method","openapi":"PATCH /payment-methods/{paymentMethodId}","href":"/api-reference/payment-methods/update-payment-method"},{"title":"Revoke Payment Method","openapi":"DELETE /payment-methods/{paymentMethodId}","href":"/api-reference/payment-methods/revoke-payment-method"}]},{"group":"Organizations","pages":[{"group":"General","pages":[{"title":"Provision an account for the organization (member or customer)","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/account","href":"/api-reference/organizations/provision-an-account-for-the-organization-member-or-customer"},{"title":"Update organization details","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json put /organizations","href":"/api-reference/organizations/update-organization-details"},{"title":"Get the organization info for a user","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/user-info/{userId}","href":"/api-reference/organizations/get-the-organization-info-for-a-user"},{"title":"Search the members of an organization","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/members","href":"/api-reference/organizations/search-the-members-of-an-organization"},{"title":"List the authenticated user's active org memberships","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/my-memberships","href":"/api-reference/organizations/list-the-authenticated-users-active-org-memberships"},{"title":"Validate that the user may use an org as their workspace context","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/validate","href":"/api-reference/organizations/validate-that-the-user-may-use-an-org-as-their-workspace-context"},{"title":"Remove an organization member","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json delete /organizations/{orgId}/members/{memberId}","href":"/api-reference/organizations/remove-an-organization-member"},{"title":"Change an organization member role","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json patch /organizations/{orgId}/members/{memberId}","href":"/api-reference/organizations/change-an-organization-member-role"},{"title":"Deactivate an organization member","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/members/{memberId}/deactivate","href":"/api-reference/organizations/deactivate-an-organization-member"},{"title":"Reactivate an organization member","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/members/{memberId}/reactivate","href":"/api-reference/organizations/reactivate-an-organization-member"}]},{"group":"Activity","pages":[{"title":"List organization activity events","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/activity","href":"/api-reference/organizations--activity/list-organization-activity-events"}]},{"group":"Analytics","pages":[{"title":"Get revenue breakdown by agent","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/analytics/revenue","href":"/api-reference/organizations--analytics/get-revenue-breakdown-by-agent"},{"title":"Get monthly recurring revenue","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/analytics/mrr","href":"/api-reference/organizations--analytics/get-monthly-recurring-revenue"},{"title":"Get plan consumption","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/analytics/usage","href":"/api-reference/organizations--analytics/get-plan-consumption"},{"title":"Get top customers by spend","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/analytics/customers","href":"/api-reference/organizations--analytics/get-top-customers-by-spend"},{"title":"Get conversion funnel metrics","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/analytics/conversion","href":"/api-reference/organizations--analytics/get-conversion-funnel-metrics"},{"title":"Get per-member credit-burn attribution","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/analytics/credits-by-member","href":"/api-reference/organizations--analytics/get-per-member-credit-burn-attribution"},{"title":"Get a group's Router-rail (crypto) spend","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/analytics/groups/{groupId}/router-spend","href":"/api-reference/organizations--analytics/get-a-groups-router-rail-crypto-spend"}]},{"group":"Billing","pages":[{"title":"Effective tier, caps and feature flags for this org","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/billing/entitlements","href":"/api-reference/organizations--billing/effective-tier-caps-and-feature-flags-for-this-org"},{"title":"Current tier subscription for this org (or null)","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/billing/subscription","href":"/api-reference/organizations--billing/current-tier-subscription-for-this-org-or-null"},{"title":"List Stripe invoices for the org tier subscription","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/billing/invoices","href":"/api-reference/organizations--billing/list-stripe-invoices-for-the-org-tier-subscription"},{"title":"Cancel the org tier subscription at period end","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/billing/cancel","href":"/api-reference/organizations--billing/cancel-the-org-tier-subscription-at-period-end"},{"title":"Downgrade an Enterprise org to Premium without resubscribing","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/billing/downgrade","href":"/api-reference/organizations--billing/downgrade-an-enterprise-org-to-premium-without-resubscribing"},{"title":"Upgrade a Premium org to Enterprise without resubscribing","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/billing/upgrade","href":"/api-reference/organizations--billing/upgrade-a-premium-org-to-enterprise-without-resubscribing"},{"title":"Create a tier-plan Stripe checkout","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/billing/checkout","href":"/api-reference/organizations--billing/create-a-tier-plan-stripe-checkout"},{"title":"List the active hybrid-tier catalog","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/billing/catalog","href":"/api-reference/organizations--billing/list-the-active-hybrid-tier-catalog"}]},{"group":"Customers","pages":[{"title":"List organization customers","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/customers","href":"/api-reference/organizations--customers/list-organization-customers"},{"title":"Org-wide customer aggregations","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/customers/aggregations","href":"/api-reference/organizations--customers/org-wide-customer-aggregations"},{"title":"Export organization customers as CSV","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/customers/export","href":"/api-reference/organizations--customers/export-organization-customers-as-csv"},{"title":"Get an organization customer","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/customers/{customerId}","href":"/api-reference/organizations--customers/get-an-organization-customer"},{"title":"Per-customer aggregations + drill-down series","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/customers/{customerId}/aggregations","href":"/api-reference/organizations--customers/per-customer-aggregations-+-drill-down-series"},{"title":"Per-customer purchase history","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/customers/{customerId}/purchases","href":"/api-reference/organizations--customers/per-customer-purchase-history"},{"title":"Block an organization customer","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/customers/{customerId}/block","href":"/api-reference/organizations--customers/block-an-organization-customer"},{"title":"Unblock an organization customer","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/customers/{customerId}/unblock","href":"/api-reference/organizations--customers/unblock-an-organization-customer"}]},{"group":"Groups \u0026 Budgets","pages":[{"title":"List a group's budgets (one per currency)","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/groups/{groupId}/budgets","href":"/api-reference/groups/list-a-groups-budgets-one-per-currency"},{"title":"Create a per-currency budget for a group","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/groups/{groupId}/budgets","href":"/api-reference/groups/create-a-per-currency-budget-for-a-group"},{"title":"Read a budget's usage for the current period","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/groups/{groupId}/budgets/{budgetId}/usage","href":"/api-reference/groups/read-a-budgets-usage-for-the-current-period"},{"title":"Read one budget by id","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/groups/{groupId}/budgets/{budgetId}","href":"/api-reference/groups/read-one-budget-by-id"},{"title":"Remove one budget by id","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json delete /organizations/{orgId}/groups/{groupId}/budgets/{budgetId}","href":"/api-reference/groups/remove-one-budget-by-id"},{"title":"Update a budget's limit / interval / alert threshold","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json patch /organizations/{orgId}/groups/{groupId}/budgets/{budgetId}","href":"/api-reference/groups/update-a-budgets-limit-interval-alert-threshold"},{"title":"List a group's shared payment methods","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/groups/{groupId}/payment-methods","href":"/api-reference/groups/list-a-groups-shared-payment-methods"},{"title":"Share an enrolled card with a group as a payment method","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/groups/{groupId}/payment-methods","href":"/api-reference/groups/share-an-enrolled-card-with-a-group-as-a-payment-method"},{"title":"Remove a payment method from a group (reverts it to personal)","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json delete /organizations/{orgId}/groups/{groupId}/payment-methods/{id}","href":"/api-reference/groups/remove-a-payment-method-from-a-group-reverts-it-to-personal"},{"title":"List the organization's groups","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/groups","href":"/api-reference/groups/list-the-organizations-groups"},{"title":"Create an organization group","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/groups","href":"/api-reference/groups/create-an-organization-group"},{"title":"Get a group and its members","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/groups/{groupId}","href":"/api-reference/groups/get-a-group-and-its-members"},{"title":"Deactivate a group (soft delete)","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json delete /organizations/{orgId}/groups/{groupId}","href":"/api-reference/groups/deactivate-a-group-soft-delete"},{"title":"Rename or re-describe a group","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json patch /organizations/{orgId}/groups/{groupId}","href":"/api-reference/groups/rename-or-re-describe-a-group"},{"title":"Add an organization member to a group","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/groups/{groupId}/members","href":"/api-reference/groups/add-an-organization-member-to-a-group"},{"title":"Remove a member from a group","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json delete /organizations/{orgId}/groups/{groupId}/members/{memberId}","href":"/api-reference/groups/remove-a-member-from-a-group"}]},{"group":"Agent Discovery","pages":[{"title":"Public llms.txt index for an organization","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/llms.txt","href":"/api-reference/organizations--integration/public-llmstxt-index-for-an-organization"},{"title":"Public agentic instructions for an organization","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/agentic-instructions.md","href":"/api-reference/organizations--integration/public-agentic-instructions-for-an-organization"},{"title":"Public ARD ai-catalog.json for an organization","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/ai-catalog.json","href":"/api-reference/organizations--integration/public-ard-ai-catalogjson-for-an-organization"}]},{"group":"Invitations","pages":[{"title":"List organization invitations","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/invitations","href":"/api-reference/invitations/list-organization-invitations"},{"title":"Invite a teammate by email","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/invitations","href":"/api-reference/invitations/invite-a-teammate-by-email"},{"title":"Revoke an invitation","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/invitations/{id}/revoke","href":"/api-reference/invitations/revoke-an-invitation"},{"title":"Get public info for a pending invitation by token","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/invitations/{token}","href":"/api-reference/invitations/get-public-info-for-a-pending-invitation-by-token"},{"title":"Accept an organization invitation","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/invitations/{token}/accept","href":"/api-reference/invitations/accept-an-organization-invitation"}]},{"group":"Realtime","pages":[{"title":"List the caller's own WebSocket secrets","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/realtime/secrets","href":"/api-reference/organizations--realtime/list-the-callers-own-websocket-secrets"},{"title":"Generate a WebSocket secret","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/realtime/secrets","href":"/api-reference/organizations--realtime/generate-a-websocket-secret"},{"title":"Rotate a WebSocket secret","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/realtime/secrets/{id}/rotate","href":"/api-reference/organizations--realtime/rotate-a-websocket-secret"},{"title":"Revoke a WebSocket secret","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json delete /organizations/{orgId}/realtime/secrets/{id}","href":"/api-reference/organizations--realtime/revoke-a-websocket-secret"}]},{"group":"Wallets","pages":[{"title":"List an org's active stablecoin wallets","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/wallets","href":"/api-reference/organizations--wallets/list-an-orgs-active-stablecoin-wallets"},{"title":"Create an organization stablecoin wallet","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/wallets","href":"/api-reference/organizations--wallets/create-an-organization-stablecoin-wallet"},{"title":"Read one organization wallet by id","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/wallets/{id}","href":"/api-reference/organizations--wallets/read-one-organization-wallet-by-id"},{"title":"Revoke (soft-delete) an organization wallet","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json delete /organizations/{orgId}/wallets/{id}","href":"/api-reference/organizations--wallets/revoke-soft-delete-an-organization-wallet"},{"title":"Rename an organization wallet","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json patch /organizations/{orgId}/wallets/{id}","href":"/api-reference/organizations--wallets/rename-an-organization-wallet"},{"title":"Read a wallet's USDC + EURC balances on the deployment's chain","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/wallets/{id}/balances","href":"/api-reference/organizations--wallets/read-a-wallets-usdc-+-eurc-balances-on-the-deployments-chain"},{"title":"Withdraw stablecoins from an org wallet to a nominated address","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/wallets/{id}/withdraw","href":"/api-reference/organizations--wallets/withdraw-stablecoins-from-an-org-wallet-to-a-nominated-address"},{"title":"Share an org wallet with a group (so it funds the group budget)","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/wallets/{id}/groups/{groupId}","href":"/api-reference/organizations--wallets/share-an-org-wallet-with-a-group-so-it-funds-the-group-budget"},{"title":"Stop a group from drawing on a wallet","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json delete /organizations/{orgId}/wallets/{id}/groups/{groupId}","href":"/api-reference/organizations--wallets/stop-a-group-from-drawing-on-a-wallet"},{"title":"List the org wallets shared with a group (fund its budgets)","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/groups/{groupId}/wallets","href":"/api-reference/organizations--wallets/list-the-org-wallets-shared-with-a-group-fund-its-budgets"},{"title":"List the groups a wallet is shared with","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/wallets/{id}/groups","href":"/api-reference/organizations--wallets/list-the-groups-a-wallet-is-shared-with"}]},{"group":"Webhooks","pages":[{"title":"List webhook subscriptions","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/webhooks","href":"/api-reference/organizations--webhooks/list-webhook-subscriptions"},{"title":"Create a webhook subscription","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/webhooks","href":"/api-reference/organizations--webhooks/create-a-webhook-subscription"},{"title":"Get a webhook subscription","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/webhooks/{id}","href":"/api-reference/organizations--webhooks/get-a-webhook-subscription"},{"title":"Delete a webhook subscription","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json delete /organizations/{orgId}/webhooks/{id}","href":"/api-reference/organizations--webhooks/delete-a-webhook-subscription"},{"title":"Update a webhook subscription","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json patch /organizations/{orgId}/webhooks/{id}","href":"/api-reference/organizations--webhooks/update-a-webhook-subscription"},{"title":"Rotate a webhook signing secret","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/webhooks/{id}/rotate-secret","href":"/api-reference/organizations--webhooks/rotate-a-webhook-signing-secret"},{"title":"List deliveries for a webhook subscription","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/webhooks/{subscriptionId}/deliveries","href":"/api-reference/organizations--webhooks/list-deliveries-for-a-webhook-subscription"},{"title":"Get a webhook delivery record","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json get /organizations/{orgId}/webhooks/deliveries/{deliveryId}","href":"/api-reference/organizations--webhooks/get-a-webhook-delivery-record"},{"title":"Retry a webhook delivery","deprecated":null,"version":null,"openapi":"/api-reference/organizations-openapi.json post /organizations/{orgId}/webhooks/deliveries/{deliveryId}/retry","href":"/api-reference/organizations--webhooks/retry-a-webhook-delivery"}]}]},{"group":"Authentication","pages":[{"group":"Ceremony","pages":[{"title":"Generate an OAuth 2.1 authorization code","deprecated":null,"version":null,"openapi":"/api-reference/oauth-openapi.json post /oauth/authorize","href":"/api-reference/authentication--ceremony/generate-an-oauth-21-authorization-code"},{"title":"Exchange a code, device_code, or refresh_token for a credential","deprecated":null,"version":null,"openapi":"/api-reference/oauth-openapi.json post /oauth/token","href":"/api-reference/authentication--ceremony/exchange-a-code-device_code-or-refresh_token-for-a-credential"},{"title":"RFC 8628 device authorization request","deprecated":null,"version":null,"openapi":"/api-reference/oauth-openapi.json post /oauth/device_authorization","href":"/api-reference/authentication--ceremony/rfc-8628-device-authorization-request"},{"title":"Approve or deny a device authorization","deprecated":null,"version":null,"openapi":"/api-reference/oauth-openapi.json post /oauth/device","href":"/api-reference/authentication--ceremony/approve-or-deny-a-device-authorization"},{"title":"Resolve a user_code to its verification-page details","deprecated":null,"version":null,"openapi":"/api-reference/oauth-openapi.json post /oauth/device/details","href":"/api-reference/authentication--ceremony/resolve-a-user_code-to-its-verification-page-details"},{"title":"Resolve a connect client_id to its display name + eligibility","deprecated":null,"version":null,"openapi":"/api-reference/oauth-openapi.json post /oauth/connect/details","href":"/api-reference/authentication--ceremony/resolve-a-connect-client_id-to-its-display-name-+-eligibility"}]},{"group":"Connections","pages":[{"title":"Revoke a credential (RFC 7009)","deprecated":null,"version":null,"openapi":"/api-reference/oauth-openapi.json post /oauth/revoke","href":"/api-reference/authentication--connections/revoke-a-credential-rfc-7009"},{"title":"List connected agents (AgentBindings) for the signed-in user","deprecated":null,"version":null,"openapi":"/api-reference/oauth-openapi.json get /oauth/bindings","href":"/api-reference/authentication--connections/list-connected-agents-agentbindings-for-the-signed-in-user"},{"title":"Revoke an AgentBinding by id","deprecated":null,"version":null,"openapi":"/api-reference/oauth-openapi.json post /oauth/bindings/{id}/revoke","href":"/api-reference/authentication--connections/revoke-an-agentbinding-by-id"}]},{"group":"Discovery","pages":[{"title":"Authorization Server Metadata (RFC 8414)","deprecated":null,"version":null,"openapi":"/api-reference/oauth-openapi.json get /.well-known/oauth-authorization-server","href":"/api-reference/authentication--discovery/authorization-server-metadata-rfc-8414"},{"title":"Protected Resource Metadata (RFC 9728)","deprecated":null,"version":null,"openapi":"/api-reference/oauth-openapi.json get /.well-known/oauth-protected-resource","href":"/api-reference/authentication--discovery/protected-resource-metadata-rfc-9728"},{"title":"JSON Web Key Set (ES256K / secp256k1)","deprecated":null,"version":null,"openapi":"/api-reference/oauth-openapi.json get /.well-known/jwks.json","href":"/api-reference/authentication--discovery/json-web-key-set-es256k-secp256k1"}]}]}]},{"tab":"SDK","pages":[{"title":"SDK","href":"/api-reference/typescript/installation"}]}]},"title":"Route and Pay from a Commerce Grant - Nevermined Documentation","buildId":"dpl_97FnoaXsHWBPVnhAXKbsJhyZPDAZ","deploymentId":"dpl_97FnoaXsHWBPVnhAXKbsJhyZPDAZ","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DYAwUFUq.js","utils-LI5rXc3r.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-GfppTbPm.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BPFLM8Mq.js","snippetPresets-Btc4xQeU.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-LC5xpRFB.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-CWFNX7Et.js","shallow-BHmlySwj.js","getApiPlaygroundDisplay-KMA-x8Y0.js","CodeSnippet-Du8lcnbV.js","CodeSnippets-BnivWBV8.js","Page-CfQRK9Qm.js","getPastedJson-L9Ydjksu.js","icon-RENl5Vc0.js","MethodPill-BayqM3da.js","DuplicateIcon-DUYKDB5b.js","createIcon-Cq6sFly2.js","DynamicMarkdown-9f3PaiTz.js","SectionHeading-C-tunuWF.js","axios-vUo_bRtp.js","Markdown-DPg72QEK.js","clsx-CnxmmBfL.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-0Q6cLfBv.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-Crds1y05.js"]}