{
"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
Quote from a Commerce Grant
The OAuth counterpart of POST /api/v1/router/quote, for a credential minted from a
commerce authorization. Identical behaviour and identical response, with one difference:
you do not choose the delegation. The quote prices the options the delegation your grant
is pinned to would select, so it is what POST /api/v1/router/commerce/route would charge for
the same call. Sending a delegationId is refused, not ignored.
Nothing is signed, no credential is minted, no payment is recorded and no budget is reserved.
The Router still makes the unpaid request to the service, and the quote spends the same
per-key and per-service rate budgets as a payment. Compare fee.capChargedCents with what you
want to spend, then call /commerce/route with maxTotalCents set to that figure.
A plain (non-OAuth) API key cannot use this route: it has no grant to price. Use
POST /api/v1/router/quote and name your own delegationId instead.
POST
/
router
/
commerce
/
quote
Quote a Router call from your commerce grant, without paying (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\"}"
}
Rolling out. This route ships in the first API release after 1.49. Until your environment runs it, the route answers 404: bound the price with maxTotalCents on POST /router/commerce/route instead.
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: //, .., a backslash and an embedded absolute URL are rejected (400). An @ is allowed (e.g. an /inbox/foo@bar.com route) — it stays in the path and the composed origin is re-asserted against the resolved host. Ignored when url is used.
Query string for a slug-routed request, without the leading ?. It is attached to the resolved merchant URL without changing its host. Use this instead of embedding ? in path. With a raw url, include the query in url; sending search with url is refused.
Header the Router should carry the minted payment credential in on the paid hop. Send this only when the service needs its own auth AND a payment: the MPP rails carry their credential in Authorization, which is also where your merchant auth goes, and rather than silently replacing yours the Router refuses the call with BCK.ROUTER.0021. Naming the header the service documents for its credential (a separate Payment header is the common one) leaves your Authorization untouched. It is honoured on every rail, so do not set it by default: putting the credential somewhere the service does not read makes the paid hop fail.
Must NOT be sent. The quote prices the delegation your grant is pinned to — the one the user consented to and capped. Supplying one is refused rather than ignored; use POST /api/v1/router/quote with a plain API key to price a delegation of your choice.
Binding payment-rail pin (API v1.88.0+), unlike advisory protocol. Pay or quote only this rail, with no fallback. If unavailable, return 409 BCK.ROUTER.0045 before signing, reserving or charging. Omit to auto-select (MPP first). Quote and pay with the same pin; a quoteId bound to another rail is refused with BCK.ROUTER.0033. Never silently remove the pin.
Available options:
x402,
mpp
Response
The quote. paymentRequired: false means the upstream did not ask for payment; otherwise settlement and fee are what /commerce/route would pay and reserve against the grant.
Whether the upstream asked for payment (answered 402). false means the call is free, or the upstream answered with an error before any payment challenge: read upstreamStatus, and expect every priced field below to be absent.
Which set of payment options was priced. delegation: the options the supplied delegationId would select. deployment: no delegation was supplied, so the options a personal crypto (erc4337) delegation would select on this deployment. Present when paymentRequired is true.
What the payment would pay the merchant: the rail (scheme), network, asset, the merchant leg in atomic units (amount) and in cents (approxCents). The same descriptor /route returns as payment.settlement. Present when paymentRequired is true.
The Router fee and the fee-inclusive total the payment would reserve against the delegation cap — capChargedMicros exactly, capChargedCents rounded up to a whole cent, which is the figure maxTotalCents is compared against. The same object /route returns as payment.fee. Present when paymentRequired is true.
What the call would move into a deposit, when the merchant is paid over an MPP session (settlement.scheme is session): a one-way payment channel whose deposit leaves the wallet at the first call, however small the call, and pays for the calls out of it. Absent on every other rail.
Show child attributes
Was this page helpful?
{"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":""},"feedback":{"agentFeedback":true,"thumbs":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6af35aa112020d1694156058","clientVersion":"0.0.4102","searchFilterCounts":[{"language":"default","tag":"API","count":147},{"language":"default","tag":"Guides","count":132},{"language":"default","tag":"Organizations","count":96},{"language":"default","tag":"Nevermined Catalog","count":50},{"language":"default","tag":"SDK","count":35},{"language":"default","tag":"Connect from a host","count":29},{"language":"default","tag":"Integrations","count":21},{"language":"default","tag":"MCP","count":18},{"language":"default","tag":"Authentication","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":"custom-rbac-roles","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":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","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":"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":"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":"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":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","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":"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":"workos-sso-scim","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},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"custom.css","content":"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:transparent!important}a.nav-tabs-item:hover{color:#0f766e!important;background:transparent!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:0.9}.nvm-hero-content{position:relative;z-index:1;max-width:600px}.nvm-hero-label{color:white;font-size:12px;font-weight:600;letter-spacing:2px;text-transform:uppercase;margin-bottom:16px;opacity:0.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:white;display:block;margin-top:4px}.nvm-hero-description{color:rgba(255, 255, 255, 0.85);font-size:16px;line-height:1.6;margin-bottom:24px;max-width:500px}.nvm-hero-button{display:inline-block;background-color:white;color:#0d3f48!important;padding:12px 24px;border-radius:8px;font-size:14px;font-weight:600;text-decoration:none!important;transition:all 0.2s ease;border:none;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:0.7}.nvm-hero-title{font-size:28px}.nvm-hero-description{font-size:14px}}.prose,.prose p,.prose li,article p,article li{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 .mt-6,#sidebar .lg\\:mt-8{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,[tabindex]:not([tabindex=\"-1\"]),[role=\"button\"],[role=\"link\"],[role=\"tab\"],[role=\"menuitem\"],[role=\"option\"],[role=\"checkbox\"],[role=\"switch\"]):focus-visible{outline:2px solid #0f766e!important;outline-offset:2px!important}.dark :is(a,button,input,select,textarea,summary,[tabindex]:not([tabindex=\"-1\"]),[role=\"button\"],[role=\"link\"],[role=\"tab\"],[role=\"menuitem\"],[role=\"option\"],[role=\"checkbox\"],[role=\"switch\"]):focus-visible,[data-theme=\"dark\"] :is(a,button,input,select,textarea,summary,[tabindex]:not([tabindex=\"-1\"]),[role=\"button\"],[role=\"link\"],[role=\"tab\"],[role=\"menuitem\"],[role=\"option\"],[role=\"checkbox\"],[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}.dark #navbar,[data-theme=\"dark\"] #navbar{background-color:rgb(var(--background-dark, 11 14 15))!important;border-bottom-color:rgba(255, 255, 255, 0.08)!important}#navbar{--nvmbg-ink: #0d3f48}.dark #navbar,[data-theme=\"dark\"] #navbar{--nvmbg-ink: #4ac6bf}#navbar::after{content:\"\";position:absolute;inset:0;z-index:1;pointer-events:none;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{content:\"\";position:absolute;inset:0;z-index:1;pointer-events:none;opacity:0.06;background-image:repeating-linear-gradient(\n 45deg,\n var(--nvmbg-ink) 0,\n var(--nvmbg-ink) 0.5px,\n transparent 0.5px,\n transparent 5px\n );-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>span.absolute,#topbar-cta-button>a>div>svg{display:none}#topbar-cta-button>a::before,#topbar-cta-button>a::after{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)::before,#topbar-cta-button>a:is(:hover,:focus-visible)::after{animation:nvm-catalog-shimmer .8s ease-in-out infinite}#topbar-cta-button>a:is(:hover,:focus-visible)::after{animation-delay:.12s}}@keyframes nvm-catalog-shimmer{0%,100%{background-color:var(--catalog-accent)}50%{background-color:var(--catalog-lime)}}"}],"page":{"pagePath":"api-reference/router/commerce-quote","slug":"/api-reference/router/commerce-quote","pageMetadata":{"title":"Quote from a Commerce Grant","openapi":"POST /router/commerce/quote","description":"The OAuth counterpart of `POST /api/v1/router/quote`, for a credential minted from a\n`commerce` authorization. Identical behaviour and identical response, with one difference:\n**you do not choose the delegation.** The quote prices the options the delegation your grant\nis pinned to would select, so it is what `POST /api/v1/router/commerce/route` would charge for\nthe same call. Sending a `delegationId` is refused, not ignored.\n\nNothing is signed, no credential is minted, no payment is recorded and no budget is reserved.\nThe Router still makes the unpaid request to the service, and the quote spends the same\nper-key and per-service rate budgets as a payment. Compare `fee.capChargedCents` with what you\nwant to spend, then call `/commerce/route` with `maxTotalCents` set to that figure.\n\nA plain (non-OAuth) API key cannot use this route: it has no grant to price. Use\n`POST /api/v1/router/quote` and name your own `delegationId` instead.","href":"/api-reference/router/commerce-quote"},"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/quote\"\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 }), \" The quote prices the options the delegation your grant\\nis pinned to would select, so it is what \", _jsx(_components.code, {\n children: \"POST /api/v1/router/commerce/route\"\n }), \" would charge for\\nthe same call. Sending a \", _jsx(_components.code, {\n children: \"delegationId\"\n }), \" is refused, not ignored.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Nothing is signed, no credential is minted, no payment is recorded and no budget is reserved.\\nThe Router still makes the unpaid request to the service, and the quote spends the same\\nper-key and per-service rate budgets as a payment. Compare \", _jsx(_components.code, {\n children: \"fee.capChargedCents\"\n }), \" with what you\\nwant to spend, then call \", _jsx(_components.code, {\n children: \"/commerce/route\"\n }), \" with \", _jsx(_components.code, {\n children: \"maxTotalCents\"\n }), \" set to that figure.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A plain (non-OAuth) API key cannot use this route: it has no grant to price. Use\\n\", _jsx(_components.code, {\n children: \"POST /api/v1/router/quote\"\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{jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,strong:`strong`,..._provideComponents(),...props.components},{Note}=_components;if(!Note)_missingMdxReference(`Note`,true);return _jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Rolling out.`}),` This route ships in the first API release after 1.49. Until your environment runs it, the route answers `,_jsx(_components.code,{children:`404`}),`: bound the price with `,_jsx(_components.code,{children:`maxTotalCents`}),` on `,_jsx(_components.a,{href:`/api-reference/router/commerce-route`,children:_jsx(_components.code,{children:`POST /router/commerce/route`})}),` instead.`]})})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Quote from a Commerce Grant","openapi":"POST /router/commerce/quote","description":"The OAuth counterpart of `POST /api/v1/router/quote`, for a credential minted from a\n`commerce` authorization. Identical behaviour and identical response, with one difference:\n**you do not choose the delegation.** The quote prices the options the delegation your grant\nis pinned to would select, so it is what `POST /api/v1/router/commerce/route` would charge for\nthe same call. Sending a `delegationId` is refused, not ignored.\n\nNothing is signed, no credential is minted, no payment is recorded and no budget is reserved.\nThe Router still makes the unpaid request to the service, and the quote spends the same\nper-key and per-service rate budgets as a payment. Compare `fee.capChargedCents` with what you\nwant to spend, then call `/commerce/route` with `maxTotalCents` set to that figure.\n\nA plain (non-OAuth) API key cannot use this route: it has no grant to price. Use\n`POST /api/v1/router/quote` and name your own `delegationId` instead.","href":"/api-reference/router/commerce-quote"}}},"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/quote`, for a credential minted from a\n`commerce` authorization. Identical behaviour and identical response, with one difference:\n**you do not choose the delegation.** The quote prices the options the delegation your grant\nis pinned to would select, so it is what `POST /api/v1/router/commerce/route` would charge for\nthe same call. Sending a `delegationId` is refused, not ignored.\n\nNothing is signed, no credential is minted, no payment is recorded and no budget is reserved.\nThe Router still makes the unpaid request to the service, and the quote spends the same\nper-key and per-service rate budgets as a payment. Compare `fee.capChargedCents` with what you\nwant to spend, then call `/commerce/route` with `maxTotalCents` set to that figure.\n\nA plain (non-OAuth) API key cannot use this route: it has no grant to price. Use\n`POST /api/v1/router/quote` and name your own `delegationId` instead.","operationId":"quoteRouteRequestFromGrant","parameters":[],"requestBody":"045eeaa5-76c6-4b5f-b90a-dd0323a3922a","responses":{"200":"5ae3ec5f-8648-49ea-83f5-ae35a8375942","400":"be1258ea-b1fe-4dc6-805c-045509a99180","401":"2e7a5b9b-2557-42df-b12d-f0818820083b","403":"e097d6be-9dca-45a7-8a35-87eb64205aee","404":"c6c0cc54-bf96-4b40-85af-b663e22e80fe","409":"e32c7b3d-941d-48bf-adea-2b0b7a18e708","413":"6d29b872-8d69-499f-b819-c1df652d185a","429":"66a96133-3f20-4177-844b-7f462fe19cef","500":"63f4f9b9-eef8-4c9d-acfd-234ac5a1830c","503":"f5799ef9-c99e-4568-aa1d-de245a79100b"},"summary":"Quote a Router call from your commerce grant, without paying (OAuth)","tags":["Router"],"method":"post","type":"path","servers":["a338c4f6-e93f-435f-9132-796ec315dc0d","351139e6-8a52-4504-9361-1cf969ebf80b"],"security":["6dc937b9-c2e0-40e3-90e6-d7e93ba9d84d"],"path":"/router/commerce/quote","baseUrlOptions":["https://api.sandbox.nevermined.app/api/v1","https://api.live.nevermined.app/api/v1"],"title":"Quote a Router call from your commerce grant, without paying (OAuth)","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"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: `//`, `..`, a backslash and an embedded absolute URL are rejected (400). An `@` is allowed (e.g. an `/inbox/foo@bar.com` route) — it stays in the path and the composed origin is re-asserted against the resolved host. Ignored when `url` is used.","example":"scrape","uniqueKey":"path","typeLabel":"string"},"search":{"type":"string","description":"Query string for a slug-routed request, without the leading ?. It is attached to the resolved merchant URL without changing its host. Use this instead of embedding ? in path. With a raw url, include the query in url; sending search with url is refused.","example":"flight_iata=AA217\u0026limit=1","maxLength":2048,"uniqueKey":"search","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"},"credentialHeader":{"type":"string","description":"Header the Router should carry the minted payment credential in on the paid hop. Send this only when the service needs its own auth AND a payment: the MPP rails carry their credential in `Authorization`, which is also where your merchant auth goes, and rather than silently replacing yours the Router refuses the call with BCK.ROUTER.0021. Naming the header the service documents for its credential (a separate `Payment` header is the common one) leaves your `Authorization` untouched. It is honoured on every rail, so do not set it by default: putting the credential somewhere the service does not read makes the paid hop fail.","example":"Payment","maxLength":64,"uniqueKey":"credentialHeader","typeLabel":"string"},"delegationId":{"type":"string","description":"Must NOT be sent. The quote prices the delegation your grant is pinned to — the one the user consented to and capped. Supplying one is refused rather than ignored; use POST /api/v1/router/quote with a plain API key to price a delegation of your choice.","uniqueKey":"delegationId","typeLabel":"string"},"requireProtocol":{"type":"string","enum":["x402","mpp"],"description":"Binding payment-rail pin (API v1.88.0+), unlike advisory `protocol`. Pay or quote only this rail, with no fallback. If unavailable, return 409 BCK.ROUTER.0045 before signing, reserving or charging. Omit to auto-select (MPP first). Quote and pay with the same pin; a quoteId bound to another rail is refused with BCK.ROUTER.0033. Never silently remove the pin.","uniqueKey":"requireProtocol","typeLabel":"enum\u003cstring>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"quote-catalog-service":{"title":"quote-catalog-service","value":{"slug":"webscrape-pro","path":"scrape","method":"POST","body":{"url":"x"}}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"5ae3ec5f-8648-49ea-83f5-ae35a8375942":{"description":"The quote. `paymentRequired: false` means the upstream did not ask for payment; otherwise `settlement` and `fee` are what `/commerce/route` would pay and reserve against the grant.","content":{"application/json":{"schema":{"type":"object","properties":{"paymentRequired":{"type":"boolean","description":"Whether the upstream asked for payment (answered 402). `false` means the call is free, or the upstream answered with an error before any payment challenge: read `upstreamStatus`, and expect every priced field below to be absent.","example":true,"isRequired":true,"uniqueKey":"paymentRequired","typeLabel":"boolean"},"upstreamStatus":{"type":"number","description":"The status the upstream answered the unpaid probe with — 402 when `paymentRequired` is true. The upstream body and headers are never returned.","example":402,"isRequired":true,"uniqueKey":"upstreamStatus","typeLabel":"number"},"optionSet":{"type":"string","description":"Which set of payment options was priced. `delegation`: the options the supplied `delegationId` would select. `deployment`: no delegation was supplied, so the options a personal crypto (erc4337) delegation would select on this deployment. Present when `paymentRequired` is true.","enum":["delegation","deployment"],"example":"deployment","uniqueKey":"optionSet","typeLabel":"enum\u003cstring>"},"delegationId":{"oneOf":[{"type":"string","description":"The delegation whose options were priced, or null for the `deployment` option set. Present when `paymentRequired` is true.","example":null,"uniqueKey":"delegationId.oneOf.0","typeLabel":"string"},{"type":"null","description":"The delegation whose options were priced, or null for the `deployment` option set. Present when `paymentRequired` is true.","example":null,"uniqueKey":"delegationId.oneOf.1","typeLabel":"null"}],"uniqueKey":"delegationId","typeLabel":"string | null"},"protocol":{"type":"string","description":"The payment protocol the Router would pay with — the same auto-detection as `/route` (MPP first, then x402). Present when `paymentRequired` is true.","enum":["x402","mpp"],"example":"x402","uniqueKey":"protocol","typeLabel":"enum\u003cstring>"},"x402Version":{"type":"number","description":"The x402 version that would be used, on the x402 rail.","example":2,"uniqueKey":"x402Version","typeLabel":"number"},"settlement":{"type":"object","description":"What the payment would pay the merchant: the rail (`scheme`), `network`, `asset`, the merchant leg in atomic units (`amount`) and in cents (`approxCents`). The same descriptor `/route` returns as `payment.settlement`. Present when `paymentRequired` is true.","required":["recipient","amount","network","approxCents"],"properties":{"recipient":{"type":"string","description":"The on-chain recipient (the agent’s `payTo` address from its 402).","example":"0x209693Bc6afc0C5328bA36FaF03C514EF312287C","isRequired":true,"uniqueKey":"settlement.recipient","typeLabel":"string"},"amount":{"type":"string","description":"Amount in the asset’s smallest unit (USDC/EURC = 6 decimals).","example":"1000","isRequired":true,"uniqueKey":"settlement.amount","typeLabel":"string"},"network":{"type":"string","description":"Network the payment settles on (name or CAIP-2).","example":"base-sepolia","isRequired":true,"uniqueKey":"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":"settlement.approxCents","typeLabel":"string"},"asset":{"type":"string","description":"For x402 and an MPP `evm` charge the asset symbol (`USDC`/`EURC`); for MPP-tempo the payment token contract address (that rail carries no on-wire symbol); for MPP-stripe the ISO currency code.","example":"USDC","uniqueKey":"settlement.asset","typeLabel":"string"},"scheme":{"type":"string","description":"Ledger settlement scheme: `exact` for an EIP-3009 authorization — x402, and an MPP `evm` charge (protocol `mpp`, settled on Base exactly like x402) — `charge` for MPP-tempo (a native Tempo transaction), `session` for an MPP-tempo payment channel (a cumulative voucher; its money moves when the service settles or closes the channel, so the payment carries no transaction hash of its own), `spt` for MPP-stripe (a Shared Payment Token). Omitted (defaults to `exact`) on the x402 path.","enum":["exact","charge","session","spt"],"example":"exact","uniqueKey":"settlement.scheme","typeLabel":"enum\u003cstring>"}},"uniqueKey":"settlement","typeLabel":"object"},"fee":{"type":"object","description":"The Router fee and the fee-inclusive total the payment would reserve against the delegation cap — `capChargedMicros` exactly, `capChargedCents` rounded up to a whole cent, which is the figure `maxTotalCents` is compared against. The same object `/route` returns as `payment.fee`. Present when `paymentRequired` is true.","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":"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":"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":"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":"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":"fee.capChargedMicros","typeLabel":"string"}},"uniqueKey":"fee","typeLabel":"object"},"sessionDeposit":{"type":"object","description":"What the call would move into a deposit, when the merchant is paid over an MPP `session` (`settlement.scheme` is `session`): a one-way payment channel whose deposit leaves the wallet at the first call, however small the call, and pays for the calls out of it. Absent on every other rail.","required":["action","amount","approxCents","basis","idleCloseSeconds"],"properties":{"action":{"oneOf":[{"type":"string","enum":["open","top_up","none","closing"],"description":"What the call would do to your payment channel with this merchant. `open`: you hold none, so this call opens one and locks a deposit. `top_up`: yours cannot cover this call, so it locks more. `none`: yours covers it, so no new money leaves the wallet. `closing`: the call would be refused (409 BCK.ROUTER.0042) and nothing moves, because the channel is closing or already holds all it may; quote again once it has closed. `null`: what the call would do cannot be stated, because the channel could not be read, the wallet is an organization's, a top-up is already in flight, or the merchant reports a channel the Router has no record of; `amount` is then only a bound, and the last two the payment refuses.","example":"open","isRequired":true,"uniqueKey":"sessionDeposit.action.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["open","top_up","none","closing"],"description":"What the call would do to your payment channel with this merchant. `open`: you hold none, so this call opens one and locks a deposit. `top_up`: yours cannot cover this call, so it locks more. `none`: yours covers it, so no new money leaves the wallet. `closing`: the call would be refused (409 BCK.ROUTER.0042) and nothing moves, because the channel is closing or already holds all it may; quote again once it has closed. `null`: what the call would do cannot be stated, because the channel could not be read, the wallet is an organization's, a top-up is already in flight, or the merchant reports a channel the Router has no record of; `amount` is then only a bound, and the last two the payment refuses.","example":"open","isRequired":true,"uniqueKey":"sessionDeposit.action.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"sessionDeposit.action","typeLabel":"enum\u003cstring> | null"},"amount":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"How much of `settlement.asset` this call would move from the wallet into the channel, in atomic units. The price is paid out of this deposit, not beside it. It is locked, not spent, and it is not charged to the delegation cap; what the merchant does not take comes back when the channel closes. `0` when no new money leaves the wallet. Excludes the network fee, which the wallet pays unless the merchant sponsors it.","example":"980000","isRequired":true,"uniqueKey":"sessionDeposit.amount","typeLabel":"string"},"approxCents":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"`amount` in USD cents, rounded up. Tempo stablecoins are USD-pegged.","example":"98","isRequired":true,"uniqueKey":"sessionDeposit.approxCents","typeLabel":"string"},"basis":{"type":"string","enum":["sized","upper_bound"],"description":"How far to take `amount` at its word. `sized`: what the call would lock with the delegation cap and wallet balance as they stand now; a concurrent call or a balance change can still move it. `upper_bound`: the most it could lock, because the cap or the balance could not be applied: no `delegationId` was given, the wallet is an organization's, a read failed, or one of them cannot cover the call, which the payment then refuses.","example":"sized","isRequired":true,"uniqueKey":"sessionDeposit.basis","typeLabel":"enum\u003cstring>"},"idleCloseSeconds":{"type":"integer","description":"The channel closes after this many seconds without a call, and what the merchant has not taken is refunded to the wallet then. A merchant that does not cooperate adds the escrow's own grace period to that.","example":900,"isRequired":true,"uniqueKey":"sessionDeposit.idleCloseSeconds","typeLabel":"integer"}},"uniqueKey":"sessionDeposit","typeLabel":"object"}},"required":["paymentRequired","upstreamStatus"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"paymentRequired":true,"upstreamStatus":402,"optionSet":"deployment","delegationId":null,"protocol":"x402","x402Version":2,"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"},"sessionDeposit":{"action":"open","amount":"980000","approxCents":"98","basis":"sized","idleCloseSeconds":900}}}},"exampleType":"generated"}},"exampleType":"generated"},"be1258ea-b1fe-4dc6-805c-045509a99180":{"description":"A `delegationId` was supplied (BCK.OAUTH.0034 — it is derived from your grant); or the refusals `/quote` makes: invalid request, no fundable option, a pay-to outside the delegation’s allowed recipients, or an upstream/402 error (BCK.ROUTER.0001), or an EIP-712 domain its settlement token does not sign under (BCK.ROUTER.0012), or a payment credential that would overwrite a header you asked the Router to forward (BCK.ROUTER.0021). A request-body validation failure arrives as BCK.HTTP.400 instead.","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"},"2e7a5b9b-2557-42df-b12d-f0818820083b":{"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"},"e097d6be-9dca-45a7-8a35-87eb64205aee":{"description":"BCK.OAUTH.0033 — this credential is not a commerce grant, or its grant is not pinned to a usable delegation (re-run the authorization to mint a fresh mandate).","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"},"c6c0cc54-bf96-4b40-85af-b663e22e80fe":{"description":"BCK.DELEGATION.0002 — the delegation your grant is pinned to could not be resolved for this credential (re-run the authorization to mint a fresh mandate); or BCK.CATALOG.0001 — no listed catalog service has that `slug`.","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"},"e32c7b3d-941d-48bf-adea-2b0b7a18e708":{"description":"The target is a cataloged Nevermined service that must be addressed by its slug, not by raw URL (BCK.ROUTER.0014). Or the service does not offer the rail pinned by `requireProtocol` (BCK.ROUTER.0045; nothing signed, reserved or charged). `params.offered` can be empty when neither rail is offered: choose another service; never silently drop the pin.","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"},"6d29b872-8d69-499f-b819-c1df652d185a":{"description":"BCK.ROUTER.0024 — the Router JSON request body exceeds the global 5 MiB ceiling. BCK.ROUTER.0027 — a slug-addressed request body is larger than the catalog endpoint accepts (its `maxRequestBytes` on the catalog service detail). Refused before the service is contacted: nothing was paid by this request (a retry of an already-paid `requestId` gets the 409 BCK.ROUTER.0002 instead). `params` gives `bodyBytes` and `maxRequestBytes`; shrink the body or pick a service that takes it. On `/select` it means every otherwise-payable match is below the body, reported against the largest of their limits. Not retryable unchanged.","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"},"66a96133-3f20-4177-844b-7f462fe19cef":{"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`, plus `RateLimit-Remaining: 0` and `RateLimit-Reset` at the same expiry. A per-key 429 has bare `Retry-After` and no `RateLimit-*` triple. 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"},"63f4f9b9-eef8-4c9d-acfd-234ac5a1830c":{"description":"BCK.ROUTER.0013 — Nevermined holds no EIP-712 signing domain for the selected settlement token; report it rather than looping. Any other 500 is an unexpected server error.","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"},"f5799ef9-c99e-4568-aa1d-de245a79100b":{"description":"BCK.ROUTER.0028 — the quote could not be computed because a read it depends on failed. Nothing was signed or charged; retry with backoff.","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":{"6dc937b9-c2e0-40e3-90e6-d7e93ba9d84d":{"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":{"a338c4f6-e93f-435f-9132-796ec315dc0d":{"url":"https://api.sandbox.nevermined.app/api/v1","description":"Sandbox (Testing) - Base Sepolia"},"351139e6-8a52-4504-9361-1cf969ebf80b":{"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":"Quote from a Commerce Grant - Nevermined Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-26T20:27:01.370Z","originalFileLocation":"api-reference/router/commerce-quote.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/quote, for a credential minted from a commerce authorization. Identical behaviour and identical response, with one difference: you do not choose the delegation. The quote prices the options the delegation your grant is pinned to would select, so it is what POST /api/v1/router/commerce/route would charge for the same call. Sending a delegationId is refused, not ignored. Nothing is signed, no credential is minted, no payment is recorded and no budget is reserved. The Router still makes the unpaid request to the service, and the quote spends the same per-key and per-service rate budgets as a payment. Compare fee.capChargedCents with what you want to spend, then call /commerce/route with maxTotalCents set to that figure. A plain (non-OAuth) API key cannot use this route: it has no grant to price. Use POST /api/v1/router/quote 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=\"Quote from a Commerce Grant - Nevermined Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"The OAuth counterpart of POST /api/v1/router/quote, for a credential minted from a commerce authorization. Identical behaviour and identical response, with one difference: you do not choose the delegation. The quote prices the options the delegation your grant is pinned to would select, so it is what POST /api/v1/router/commerce/route would charge for the same call. Sending a delegationId is refused, not ignored. Nothing is signed, no credential is minted, no payment is recorded and no budget is reserved. The Router still makes the unpaid request to the service, and the quote spends the same per-key and per-service rate budgets as a payment. Compare fee.capChargedCents with what you want to spend, then call /commerce/route with maxTotalCents set to that figure. A plain (non-OAuth) API key cannot use this route: it has no grant to price. Use POST /api/v1/router/quote 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-quote\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://neverminedag.mintlify.site/docs/_mintlify/api/og/v2?division=Router\u0026amp;title=Quote+from+a+Commerce+Grant\u0026amp;description=The+OAuth+counterpart+of+%60POST+%2Fapi%2Fv1%2Frouter%2Fquote%60%2C+for+a+credential+minted+from+a%0A%60commerce%60+authorization.+Identical+behaviour+and+identical+response%2C+with+\u0026amp;theme=300627ebd0d2656e65dfe786\u0026amp;signature=b727c084867bf62bf1cadb597ff0d5506dc855156b698b41f6e35deaca40c7f8\">\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=\"Quote from a Commerce Grant - Nevermined Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"The OAuth counterpart of POST /api/v1/router/quote, for a credential minted from a commerce authorization. Identical behaviour and identical response, with one difference: you do not choose the delegation. The quote prices the options the delegation your grant is pinned to would select, so it is what POST /api/v1/router/commerce/route would charge for the same call. Sending a delegationId is refused, not ignored. Nothing is signed, no credential is minted, no payment is recorded and no budget is reserved. The Router still makes the unpaid request to the service, and the quote spends the same per-key and per-service rate budgets as a payment. Compare fee.capChargedCents with what you want to spend, then call /commerce/route with maxTotalCents set to that figure. A plain (non-OAuth) API key cannot use this route: it has no grant to price. Use POST /api/v1/router/quote and name your own delegationId instead.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://neverminedag.mintlify.site/docs/_mintlify/api/og/v2?division=Router\u0026amp;title=Quote+from+a+Commerce+Grant\u0026amp;description=The+OAuth+counterpart+of+%60POST+%2Fapi%2Fv1%2Frouter%2Fquote%60%2C+for+a+credential+minted+from+a%0A%60commerce%60+authorization.+Identical+behaviour+and+identical+response%2C+with+\u0026amp;theme=300627ebd0d2656e65dfe786\u0026amp;signature=b727c084867bf62bf1cadb597ff0d5506dc855156b698b41f6e35deaca40c7f8\">\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-quote\">\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-quote.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-quote#webpage\",\"url\":\"https://nevermined.ai/docs/api-reference/router/commerce-quote\",\"name\":\"Quote from a Commerce Grant\",\"description\":\"The OAuth counterpart of POST /api/v1/router/quote, for a credential minted from a commerce authorization. Identical behaviour and identical response, with one difference: you do not choose the delegation. The quote prices the options the delegation your grant is pinned to would select, so it is what POST /api/v1/router/commerce/route would charge for the same call. Sending a delegationId is refused, not ignored. Nothing is signed, no credential is minted, no payment is recorded and no budget is reserved. The Router still makes the unpaid request to the service, and the quote spends the same per-key and per-service rate budgets as a payment. Compare fee.capChargedCents with what you want to spend, then call /commerce/route with maxTotalCents set to that figure. A plain (non-OAuth) API key cannot use this route: it has no grant to price. Use POST /api/v1/router/quote and name your own delegationId instead.\",\"dateModified\":\"2026-09-26T20:27:01.370Z\",\"isPartOf\":{\"@id\":\"https://nevermined.ai/docs#website\"},\"breadcrumb\":{\"@id\":\"https://nevermined.ai/docs/api-reference/router/commerce-quote#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://nevermined.ai/docs/api-reference/router/commerce-quote#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Router\",\"item\":\"https://nevermined.ai/docs/api-reference/router/mint-payment-credential\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Quote from a Commerce Grant\",\"item\":\"https://nevermined.ai/docs/api-reference/router/commerce-quote\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://nevermined.ai/docs/api-reference/router/commerce-quote#apireference\",\"headline\":\"Quote from a Commerce Grant\",\"name\":\"Quote from a Commerce Grant\",\"description\":\"The OAuth counterpart of POST /api/v1/router/quote, for a credential minted from a commerce authorization. Identical behaviour and identical response, with one difference: you do not choose the delegation. The quote prices the options the delegation your grant is pinned to would select, so it is what POST /api/v1/router/commerce/route would charge for the same call. Sending a delegationId is refused, not ignored. Nothing is signed, no credential is minted, no payment is recorded and no budget is reserved. The Router still makes the unpaid request to the service, and the quote spends the same per-key and per-service rate budgets as a payment. Compare fee.capChargedCents with what you want to spend, then call /commerce/route with maxTotalCents set to that figure. A plain (non-OAuth) API key cannot use this route: it has no grant to price. Use POST /api/v1/router/quote and name your own delegationId instead.\",\"url\":\"https://nevermined.ai/docs/api-reference/router/commerce-quote\",\"mainEntityOfPage\":{\"@id\":\"https://nevermined.ai/docs/api-reference/router/commerce-quote#webpage\"},\"dateModified\":\"2026-09-26T20:27:01.370Z\",\"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\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Nevermined Documentation\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/docs/api-reference/router/commerce-quote.md","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","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. Either way it quotes only what the paying\nwallet can sign: an MPP `evm` charge is never quoted for a wallet that signs through an\nEIP-7702 smart account (a personal wallet wherever the deployment migrates personal wallets to\nEIP-7702, or an organization wallet upgraded to EIP-7702), so a service that also offers x402\nis quoted on x402 and its `quoteId` pays x402. 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","description":"Call a catalog service and pay it with your Nevermined credits (mode B) — free welcome credits, top-up credits or a Nevermined Subscription's allowance, subscribed or not. Like `POST /router/route`, but Nevermined pays the merchant from its treasury and your credits are charged this request's live price, with a 1-credit minimum. There is no Delegation, no wallet to fund and no routing fee.\n\n- **A slug, never a URL.** Address the service by `slug` (+ `path`, `search`, `method`, `headers`, `body`). A `url` or a `delegationId` is refused (`BCK.SUBSCRIPTION_ROUTER.0005`), not ignored.\n- **`requestId` is required** (idempotency): a retry with the same id is never paid twice.\n- **Only a merchant `2xx` keeps the credits.** They are reserved before the merchant is called and kept (`Committed`) only on a `2xx`; anything else marks them for refund and they are returned (`Refunded`). Every refusal below happens before anything is reserved, signed or charged — except a 502, which can follow a payment, and a `BCK.SUBSCRIPTION_ROUTER.0009` whose `params.topUps` is `bought` (or `pending`), or a `BCK.SUBSCRIPTION_ROUTER.0015` or `0016` whose `params.topUps` is `bought`, which follows a credit pack charged to your card (`params.purchaseId` names it).\n- **Credit top-ups.** With top-ups on, a call that runs out of credits charges one never-expiring credit pack to the saved card and goes ahead; the answer then carries `topUp`. Your card was charged: tell the person you are acting for.\n- **Rails:** only an EIP-3009 `exact` authorization (x402, or an MPP `evm` charge), an MPP `tempo` `charge`, and an MPP `tempo` `session` where this deployment has MPP sessions turned on.\n\nFor large or streamed responses, the streaming form is `ALL /api/v1/router/subscription/svc/{slug}/{path}` with an `X-Router-Request-Id` header; it answers with `X-Router-Credits-Charged` and `X-Router-Credits-Status` beside the `X-Router-Payment-*` headers (plus `X-Router-Topup-Credits` and `X-Router-Topup-Amount-Usd` when the call charged a credit pack), and refuses `X-Router-Target-Url`, `X-Router-Target-Slug` and `X-Router-Delegation-Id`.\n\nPersonal API keys only: Nevermined credits and the Nevermined Subscription belong to a personal account, so call with a key that carries no organization tag and without `X-Current-Org-Id`. Of OAuth-minted credentials, only a `commerce` connection the user allowed to spend their Nevermined credits is accepted: another `commerce` connection is refused with `BCK.OAUTH.0037`, one acting in an organization with `BCK.OAUTH.0038`, and any other OAuth credential with `BCK.OAUTH.0030`. Where the subscription is not available — on this deployment or to this account — it answers 404 `BCK.SUBSCRIPTION_ACCESS.0001`.","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":"Read Your Credits","openapi":"GET /credits/balance","href":"/api-reference/router/credits-balance"},{"title":"Read the Welcome Credits Offer","openapi":"GET /credits/welcome/offer","href":"/api-reference/router/welcome-credits-offer"},{"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":true,"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"}]}]},"basePath":"","title":"Quote from a Commerce Grant - Nevermined Documentation","buildId":"dpl_2AK98Hxhwu4fUXpx9atbv41cC328","deploymentId":"dpl_2AK98Hxhwu4fUXpx9atbv41cC328","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-EBSrFTg1.js","utils-Y_7TcRh4.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-D1wvvkPH.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-aT0ty6oN.js","snippetPresets-DoNRuyJc.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-CXRajFpn.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BAyOsINj.js","shallow-CIcHqV1v.js","getApiPlaygroundDisplay-C5igZwEf.js","CodeSnippet-BFWnQLNh.js","CodeSnippets-Cx2mFgZW.js","Page-DCFaZE46.js","getPastedJson-BOy09PZp.js","icon-BwmYtB6R.js","MethodPill-DAIhq-iu.js","DuplicateIcon-DFM8Q3ph.js","createIcon-0UdvzB4Z.js","DynamicMarkdown-DYYZTGpa.js","SectionHeading-BFCDRUuH.js","axios-vUo_bRtp.js","Markdown-C6TcKjiR.js","clsx-Y_UC780V.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-PCbBHBTv.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-D4q_oRML.js"]}