curl --request POST \
--url https://api.sandbox.nevermined.app/api/v1/router/quote \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"slug": "webscrape-pro",
"path": "scrape",
"method": "POST",
"body": {
"url": "x"
}
}
'import requests
url = "https://api.sandbox.nevermined.app/api/v1/router/quote"
payload = {
"slug": "webscrape-pro",
"path": "scrape",
"method": "POST",
"body": { "url": "x" }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
slug: 'webscrape-pro',
path: 'scrape',
method: 'POST',
body: JSON.stringify({url: 'x'})
})
};
fetch('https://api.sandbox.nevermined.app/api/v1/router/quote', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.nevermined.app/api/v1/router/quote",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'slug' => 'webscrape-pro',
'path' => 'scrape',
'method' => 'POST',
'body' => [
'url' => 'x'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.sandbox.nevermined.app/api/v1/router/quote"
payload := strings.NewReader("{\n \"slug\": \"webscrape-pro\",\n \"path\": \"scrape\",\n \"method\": \"POST\",\n \"body\": {\n \"url\": \"x\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.sandbox.nevermined.app/api/v1/router/quote")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"slug\": \"webscrape-pro\",\n \"path\": \"scrape\",\n \"method\": \"POST\",\n \"body\": {\n \"url\": \"x\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.nevermined.app/api/v1/router/quote")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"slug\": \"webscrape-pro\",\n \"path\": \"scrape\",\n \"method\": \"POST\",\n \"body\": {\n \"url\": \"x\"\n }\n}"
response = http.request(request)
puts response.read_body{
"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"
}
}{
"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\"}"
}Quote a Request Before Paying
Ask what POST /route would charge for this call, WITHOUT paying it. The Router makes the
same unpaid probe /route makes, reads the 402, selects the payment option exactly as a
payment would (MPP first, then x402) and prices it with the Router fee — then stops. Nothing
is signed, no credential is minted, no payment is recorded and no delegation budget is
reserved, so a quote is free and can be repeated.
Use it to decide whether ONE call fits the allocation you planned for it: compare
fee.capChargedMicros (exact) or fee.capChargedCents (rounded up, the figure
maxTotalCents is compared against) with what you want to spend, then call /route with
maxTotalCents set to that figure so a price change between quote and call is refused rather
than paid.
delegationId is optional. With it, the quote prices the options that delegation would select
(an organization-wallet delegation pays only in its own currency, a card delegation pays over
MPP-stripe, a recipient allowlist is enforced); without it, the options a personal crypto
delegation would select. optionSet says which. A quote checks neither the remaining cap nor
the wallet balance — those are the payment’s checks (BCK.ROUTER.0003, BCK.ROUTER.0009).
Provide the target url OR a catalog slug (+ optional path, search, method, headers,
body), as on /route. A non-402 answer returns paymentRequired: false with the upstream
status only — the upstream body and headers are never returned.
curl --request POST \
--url https://api.sandbox.nevermined.app/api/v1/router/quote \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"slug": "webscrape-pro",
"path": "scrape",
"method": "POST",
"body": {
"url": "x"
}
}
'import requests
url = "https://api.sandbox.nevermined.app/api/v1/router/quote"
payload = {
"slug": "webscrape-pro",
"path": "scrape",
"method": "POST",
"body": { "url": "x" }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
slug: 'webscrape-pro',
path: 'scrape',
method: 'POST',
body: JSON.stringify({url: 'x'})
})
};
fetch('https://api.sandbox.nevermined.app/api/v1/router/quote', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.nevermined.app/api/v1/router/quote",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'slug' => 'webscrape-pro',
'path' => 'scrape',
'method' => 'POST',
'body' => [
'url' => 'x'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.sandbox.nevermined.app/api/v1/router/quote"
payload := strings.NewReader("{\n \"slug\": \"webscrape-pro\",\n \"path\": \"scrape\",\n \"method\": \"POST\",\n \"body\": {\n \"url\": \"x\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.sandbox.nevermined.app/api/v1/router/quote")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"slug\": \"webscrape-pro\",\n \"path\": \"scrape\",\n \"method\": \"POST\",\n \"body\": {\n \"url\": \"x\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.nevermined.app/api/v1/router/quote")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"slug\": \"webscrape-pro\",\n \"path\": \"scrape\",\n \"method\": \"POST\",\n \"body\": {\n \"url\": \"x\"\n }\n}"
response = http.request(request)
puts response.read_body{
"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"
}
}{
"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\"}"
}Authorizations
Your Nevermined API Key (starts with 'nvm:'). Get one at nevermined.app under Settings > API Keys.
Body
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.
"https://agent.example/api/resource"
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.
"webscrape-pro"
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.
"scrape"
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.
2048"flight_iata=AA217&limit=1"
HTTP method to use for the upstream request.
GET, POST, PUT, PATCH, DELETE Headers to forward to the upstream (e.g. the agent’s own auth). Optional.
Request body to forward (JSON). Optional.
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.
64"Payment"
The delegation you would pay with. Optional. When given, the quote prices the options that delegation would select: an organization-wallet delegation pays only in its own currency, a card delegation pays over the MPP-stripe rail, and a recipient allowlist refuses a pay-to address it would refuse. Without it, the quote prices what a personal crypto (erc4337) delegation would select. optionSet in the response says which was used. Either way the quote checks neither the remaining cap nor the wallet balance.
"5e7481c3-e972-45bd-bdc5-a0b99c4de4a1"
Response
The quote. paymentRequired: false means the upstream did not ask for payment; otherwise settlement and fee are what /route would pay and reserve.
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.
true
The status the upstream answered the unpaid probe with — 402 when paymentRequired is true. The upstream body and headers are never returned.
402
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.
delegation, deployment "deployment"
The delegation whose options were priced, or null for the deployment option set. Present when paymentRequired is true.
null
The payment protocol the Router would pay with — the same auto-detection as /route (MPP first, then x402). Present when paymentRequired is true.
x402, mpp "x402"
The x402 version that would be used, on the x402 rail.
2
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.
Show child attributes
Show child attributes
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.
Show child attributes
Show child attributes
Was this page helpful?