{"name":"Skerry","description":"Stablecoin and fiat infrastructure: verification, custody, accounts, payouts and standing conversion.","docs":"https://skerry.xyz/docs","openapi":"https://api.skerry.xyz/openapi.json","authentication":"Every call but `/` sends `Authorization: Bearer sk_test_…` or `sk_live_…`. The environment is in the key, not in a header, so the same code runs against sandbox and live by swapping one value. Where the deployment is configured with an authorisation server, a short-lived access token issued for this API is accepted in place of a key; `/.well-known/oauth-protected-resource` says whether and from whom.","environments":["sandbox","live"],"resources":{"getting_started":["GET /","GET /openapi.json","GET /whoami","GET /llms.txt","GET /agents.md","GET /developer.json","GET /guides/{name}","GET /capabilities","POST /terms"],"customers":["POST /customers","GET /customers","GET /customers/{id}","PATCH /customers/{id}","POST /customers/{id}/verification","GET /customers/{id}/verification","POST /customers/{id}/onboarding-link","GET /onboard/{token}","GET /customers/{id}/payment-methods","GET /customers/{id}/people","POST /customers/{id}/people","DELETE /customers/{id}/people/{person_id}","GET /eligibility"],"custody":["POST /customers/{id}/wallets","GET /customers/{id}/wallets","GET /customers/{id}/wallets/{wallet_id}/history","POST /customers/{id}/accounts","GET /customers/{id}/accounts","POST /customers/{id}/accounts/{account_id}/deactivate","POST /customers/{id}/accounts/{account_id}/reactivate","POST /customers/{id}/bank-link","POST /customers/{id}/bank-link/exchange","POST /customers/{id}/cards","GET /customers/{id}/cards","POST /customers/{id}/memos","GET /customers/{id}/memos"],"paying_out":["POST /customers/{id}/payees","GET /customers/{id}/payees","GET /customers/{id}/payees/{payee_id}","DELETE /customers/{id}/payees/{payee_id}","POST /customers/{id}/payees/{payee_id}/pause","POST /customers/{id}/payees/{payee_id}/resume","POST /customers/{id}/payees/{payee_id}/check","POST /payouts/quote","POST /payouts","POST /payouts/batches","GET /payouts/batches","GET /payouts/batches/{id}","GET /customers/{id}/payout-fees","PATCH /customers/{id}/payout-fees","POST /customers/{id}/batch-settlement-schedules","GET /payouts","GET /payouts/{id}","PATCH /payouts/{id}","DELETE /payouts/{id}","GET /rates"],"standing_conversion":["POST /customers/{id}/standing-orders","GET /customers/{id}/standing-orders","GET /customers/{id}/standing-orders/{standing_order_id}/conversions"],"events_and_webhooks":["GET /events","POST /events/{id}/replay","GET /events/types","POST /webhooks","GET /webhooks","PATCH /webhooks/{id}","DELETE /webhooks/{id}","POST /webhooks/{id}/roll-secret"],"accepting_payments":["POST /checkout-sessions","GET /checkout-sessions","GET /checkout-sessions/{id}","POST /checkout-sessions/{id}/expire","POST /payment-links","GET /payment-links","GET /payment-links/{id}","PATCH /payment-links/{id}","GET /payments","GET /payments/{id}","POST /payments","POST /payments/{id}/capture","POST /payments/{id}/cancel","POST /payments/{id}/refunds","GET /payments/{id}/refunds","GET /disputes","GET /disputes/{id}","POST /disputes/{id}/evidence","POST /disputes/{id}/files","GET /disputes/{id}/files","GET /disputes/{id}/suggested-evidence","GET /customers/{id}/unmatched-deposits","POST /customers/{id}/unmatched-deposits/{deposit_id}/assign","POST /customers/{id}/unmatched-deposits/{deposit_id}/refund","GET /settlements","GET /settlements/{id}","POST /settlements","GET /customers/{id}/balances"],"payers_saved_methods_and_subscriptions":["POST /payers","GET /payers","GET /payers/{id}","GET /payers/{id}/payment-methods","DELETE /payers/{id}/payment-methods/{method_id}","POST /customers/{id}/payment-method-setups","POST /subscriptions","GET /subscriptions","GET /subscriptions/{id}","POST /subscriptions/{id}/cancel","POST /meters","GET /meters","POST /meters/{id}/events","GET /meters/{id}/summary"],"limits_agents_and_approvals":["POST /spend-policies","GET /spend-policies","GET /spend-policies/{id}","PATCH /spend-policies/{id}","POST /spend-policies/{id}/revoke","POST /spend-policies/{id}/consent","GET /spend-policies/{id}/consent","GET /spend-policies/{id}/usage","GET /mandates","GET /approvals","GET /approvals/{id}","POST /approvals/{id}/approve","POST /approvals/{id}/deny","POST /approvals/{id}/links","GET /approve/{token}","POST /approve/{token}","GET /customers/{id}/limits"],"agents_and_credentials":["POST /agents","GET /agents","GET /agents/{id}","PATCH /agents/{id}","POST /agents/{id}/suspend","POST /agents/{id}/resume","POST /agents/{id}/revoke","POST /agents/{id}/keys","POST /agents/{id}/public-keys","GET /agents/{id}/public-keys","DELETE /agents/{id}/public-keys/{kid}","POST /agents/{id}/oauth-clients","GET /agents/{id}/oauth-clients","DELETE /agents/{id}/oauth-clients","POST /agents/{id}/delegations","GET /keys","GET /keys/{id}","POST /keys/{id}/roll","POST /keys/{id}/revoke","GET /.well-known/http-message-signatures-directory","GET /.well-known/oauth-protected-resource"],"controls_and_audit":["POST /customers/{id}/freeze","GET /customers/{id}/freeze","POST /customers/{id}/unfreeze","POST /controls/freeze","POST /controls/unfreeze","GET /controls","GET /audit","GET /audit/verify"],"conversion_and_ledger":["POST /conversions/quote","POST /conversions","GET /conversions","GET /conversions/{id}","GET /customers/{id}/ledger"],"books_and_receipts":["POST /customers/{id}/books","GET /customers/{id}/books","DELETE /customers/{id}/books","POST /customers/{id}/books/backfill","GET /customers/{id}/books/deliveries","GET /customers/{id}/books/links","POST /books/connections","GET /receipts/{id}","GET /.well-known/skerry-receipt-keys"],"budgets":["POST /customers/{id}/budgets","GET /customers/{id}/budgets","GET /customers/{id}/budgets/{budget_id}","POST /customers/{id}/budgets/{budget_id}/top-up","POST /customers/{id}/budgets/{budget_id}/release"],"customer_controls":["GET /customers/{id}/payee-controls","PUT /customers/{id}/payee-controls","POST /customers/{id}/trusted-payees","GET /customers/{id}/trusted-payees","GET /customers/{id}/risk-rules","PUT /customers/{id}/risk-rules","GET /customers/{id}/withdrawal-allow-list","PUT /customers/{id}/withdrawal-allow-list","POST /customers/{id}/approvers","GET /customers/{id}/approvers","DELETE /customers/{id}/approvers"],"wallet_controls":["GET /customers/{id}/wallets/{wallet_id}","PATCH /customers/{id}/wallets/{wallet_id}","POST /customers/{id}/sweep-rules","GET /customers/{id}/sweep-rules","GET /customers/{id}/sweep-rules/{rule_id}","DELETE /customers/{id}/sweep-rules/{rule_id}"],"scheduled_payouts_and_waiting":["GET /payouts/scheduled","GET /payouts/scheduled/{id}","DELETE /payouts/scheduled/{id}","POST /payouts/{id}/release"],"authorisation_evidence":["GET /payments/{id}/authorisation","GET /payouts/{id}/authorisation","GET /refunds/{id}/authorisation","GET /conversions/{id}/authorisation"],"sandbox":["POST /sandbox/checkout-sessions/{id}/complete","POST /sandbox/approvals/{id}/decide","POST /sandbox/payouts/scheduled/{id}/advance","POST /sandbox/events","POST /sandbox/customers/{id}/risk-rules/trip","POST /sandbox/budgets/{id}/exhaust","POST /sandbox/checkout-sessions/{id}/deposit"],"agentic_checkout_what_a_customer_sets":["POST /customers/{id}/agentic/credentials","GET /customers/{id}/agentic/credentials","DELETE /customers/{id}/agentic/credentials/{credential_id}","POST /customers/{id}/agentic/pricing-callback","GET /customers/{id}/agentic/settings","POST /customers/{id}/agentic/settings","GET /customers/{id}/agentic/refund-requests","POST /customers/{id}/agentic/refund-requests/{request_id}","POST /customers/{id}/agentic/orders/{session_id}","GET /customers/{id}/agentic/orders/{session_id}"],"agentic_commerce_protocol":["POST /agentic/{customer_id}/checkout_sessions","GET /agentic/{customer_id}/checkout_sessions/{checkout_session_id}","POST /agentic/{customer_id}/checkout_sessions/{checkout_session_id}","POST /agentic/{customer_id}/checkout_sessions/{checkout_session_id}/complete","POST /agentic/{customer_id}/checkout_sessions/{checkout_session_id}/cancel","POST /agentic/{customer_id}/checkout_sessions/{checkout_session_id}/refunds"],"universal_commerce_protocol_what_a_customer_sets":["GET /customers/{id}/ucp/settings","PUT /customers/{id}/ucp/settings"],"universal_commerce_protocol":["GET /ucp/{customer_id}/.well-known/ucp","POST /ucp/{customer_id}/checkout-sessions","GET /ucp/{customer_id}/checkout-sessions/{id}","PUT /ucp/{customer_id}/checkout-sessions/{id}","POST /ucp/{customer_id}/checkout-sessions/{id}/complete","POST /ucp/{customer_id}/checkout-sessions/{id}/cancel","GET /ucp/{customer_id}/orders/{id}"],"paying_by_the_call":["POST /customers/{id}/priced-resources","GET /customers/{id}/priced-resources","DELETE /customers/{id}/priced-resources/{resource_id}","POST /machine-payments/challenge","POST /machine-payments/verify","POST /machine-payments/credits","GET /machine-payments/credits","GET /machine-payments/credits/{id}","POST /machine-payments/credits/{id}/refund"],"hosted_addresses_and_the_pay_by_the_call_proxy":["GET /checkout/{id}","GET /pay-link/{id}","GET /pay/{resource_id}","POST /pay/{resource_id}"],"agents_paying":["POST /agents/{id}/wallets","GET /agents/{id}/wallets","GET /agents/{id}/wallets/{wallet_id}","DELETE /agents/{id}/wallets/{wallet_id}","POST /agent-payments","GET /agent-payments","GET /agent-payments/{id}"],"rewards_and_reporting":["GET /coins","POST /coins","GET /coins/{currency}/rewards","GET /customers/{id}/rewards/{currency}","GET /usage","GET /compliance-requests","GET /compliance-requests/{id}"]},"conventions":{"authentication":"Every call but `/` sends `Authorization: Bearer sk_test_…` or `sk_live_…`. The environment is in the key, not in a header, so the same code runs against sandbox and live by swapping one value. Where the deployment is configured with an authorisation server, a short-lived access token issued for this API is accepted in place of a key; `/.well-known/oauth-protected-resource` says whether and from whom.","idempotency":"Send `Idempotency-Key` on every POST. A repeat returns the first response rather than acting twice; a repeat with a different body is refused. This is how a retry after a timeout stays safe. Calls that move money require it, `POST /payouts` included.","errors":"Failures are `{ error: { code, message, detail, request_id } }`. Branch on `code`, never on `message` — messages are written for people and will change.","request_id":"Every response carries `x-request-id`. Keep it on anything you log: it is what lets us find one call out of millions.","pagination":"List endpoints return newest first and take `?limit=` and `?cursor=`. A response carrying `next_cursor` has more.","amounts":"Every amount is one of two forms, and the reference says which. Integer minor units: a whole number of the currency's smallest unit (cents for USD and EUR, six places for a stablecoin) beside a lowercase `currency`. Payments, refunds, settlements, conversions, ledger entries, budgets and every field named `*_minor` use this. Decimal strings: `\"12.50\"`, used by `amount` and `fee` on payouts and by wallet balances, which predate the rule. Wherever a decimal string is returned, the same amount is returned beside it as `amount_minor` (or `fee_minor`) with `currency`; `POST /payouts` and `POST /payouts/quote` accept `amount_minor` in place of `amount`. A rate is a ratio, not an amount, and stays a decimal string. Limits on a spend policy are integer minor units of the unit its `scope` names.","spend_limits":"`scope` is required when a policy is created: nothing reads an amount in a unit the caller did not name. A spend policy's limits bound a unit family when it says `scope: \"family\"`: USD together with USDC, USDT, USDB, OUSD and PYUSD; EUR together with EURC. Amounts are converted to the family's fiat minor unit, rounded up, before they are compared or counted, so `daily_max: 5000` is 50.00 USD however it is spent. `scope: \"currency\"` keeps each currency apart, with limits in that currency's own smallest unit. Policies created before family scope existed keep `scope: \"currency\"`. A reservation against a limit is released when the operation fails, and also later, when a payout is returned, cancelled, undeliverable or fails to return, or a refund or conversion fails.","mandates":"A spend policy with its purpose, limits and consent is a mandate; `mandate_id` on any object is the policy id. `summary` states the rule in sentences generated from it. Consent evidence (`evidence` on create, or `POST /spend-policies/{id}/consent`) is stored with the SHA-256 of the mandate's canonical text (its rule as JSON, keys sorted, no whitespace). Every transaction row records the mandate, the consent attached to it at the time, the approval that released it, and the key and agent that asked, and returns them as `authorisation`.","approvals":"A held operation answers 202 with `approval_id`, `reason` and `reason_code` (amount, operation, new_payee or risk). It can be decided by another key, by a person through a link from `POST /approvals/{id}/links`, or by a signed-in member in the console. An agent can never approve. A mandate may ask for two approvers, who must be different keys, members or approver references, and for passkey evidence. When approver emails are set for the customer and outbound mail is configured, each approver is emailed their own links.","dry_run":"Send `Skerry-Dry-Run: true` (or `dry_run: true` in the body) on a money-moving call to check it without doing it: payouts, batches, conversions, refunds, off-session charges, settlements, subscriptions, checkout sessions and payment links. Validation, ownership, the freeze, policies, budgets, the customer's risk rules and payee rules are evaluated, and for payouts and conversions the provider's own dry run is asked. The answer is 200 with `dry_run: true`, `next` (run, hold or refuse), `checks` (each check and its result), `object` (what would be created, where the operation can state it) and, for hold or refuse, why. Nothing is reserved, sent or created. With the header, no Idempotency-Key is needed and no idempotency record is kept.","environments":"A `sk_test_` key reaches only sandbox data and test money; a `sk_live_` key only live. Nothing is shared between them, ids from one are not found in the other, and sandbox-only helpers refuse a live key.","rate_limits":"Reads are limited to 600 and writes to 120 per minute per key. Past that, 429 `rate_limited` with `Retry-After`. Every response carries `RateLimit-Limit` and `RateLimit-Remaining`.","agents":"Register agents with `POST /agents` and give each its own key with `POST /agents/{id}/keys`: that key is the agent, and it can only move money under a spend policy. On a shared key, send `Skerry-Agent: <agent id>` so the agent's policies apply and the audit trail names it; where a policy is bound to an agent, a money-moving call that names no agent is refused with `agent_required`. Once any agent is registered the header must name a registered, active one.","references":"Send `external_ref` (up to 200 characters) with `external_kind` (invoice, bill, order, booking or other) on a checkout session, payment link, payment, refund, payout, conversion or subscription to name the document it belongs to in your own system. Skerry stores it, returns it on the object, on every event about it and on the ledger entry, and lists by it (`?external_ref=`). On a bank payout it is also what the payee's bank shows, cut to what the rail carries.","receipts":"Every movement has a receipt at `GET /receipts/{id}`, and the `movement.pending`, `movement.posted` and `movement.reversed` events carry it. A receipt is signed with Ed25519 over its canonical JSON (keys sorted, no whitespace) without the `signature` field; verify it with the key named by `signature.key_id` at `/.well-known/skerry-receipt-keys`.","signed_requests":"An agent may sign requests with a registered Ed25519 key using HTTP Message Signatures (RFC 9421): `Signature-Input` and `Signature`, covering `@method`, `@target-uri` and, when there is a body, `content-digest` (RFC 9530), with `created`, `expires` (at most 300 seconds later), `keyid` (the key's JWK thumbprint) and `tag=\"skerry-agent\"`. The API key still identifies the account; a valid signature proves which agent sent the request.","waiting":"To wait for an outcome inside a request, add `?wait=<seconds>` (up to 30) to `GET /payouts/{id}`, `GET /payments/{id}`, `GET /conversions/{id}` or `GET /approvals/{id}`. The request returns when the object reaches a final state, or the state named with `?until=` (for a payout: paid, returned or canceled), or when the wait ends, with the object as it stands; check its status. `GET /events?after=<event id>&wait=<seconds>` does the same for new events. Waiting re-reads on an interval inside the request. A key may have 5 requests waiting at once; beyond that the answer is 429 `too_many_waiters`.","payout_rails":"A payout to a bank account leaves on a rail: ach, ach_same_day, wire or fednow for USD, sepa for EUR, faster_payments for GBP, spei for MXN, pix for BRL, bre_b or co_bank_transfer for COP. Name one with `rail`, or say what matters with `speed`. With neither, the currency fixes the family of rails, the customer must be enabled for the rail (USD and EUR for every verified customer; the others customer by customer; fednow only when the payee's bank can receive it), and for USD the amount decides: ach up to 1,000,000.00, wire above. `fastest` prefers fednow, then wire, then ach_same_day, then ach; `cheapest` prefers ach. A named rail is used or refused, never swapped. The payout and the quote carry `rail` and `rail_reason`. rtp is reported on money arriving and is not offered for payouts.","payout_statuses":"A payout is `awaiting_funds`, `processing`, `on_hold`, `paid`, `undeliverable`, `returning`, `returned`, `return_failed` or `canceled`. `on_hold` comes with `hold: { reason_code, reason, deadline }`; when the hold is a request for information, `hold.compliance_request_id` names it. A status of `unknown` means the provider reported a state this API has not been taught; treat it as still in progress.","payment_methods":"`payment_methods` on `GET /capabilities`, and `GET /customers/{id}/payment-methods` for one customer, list every way money moves: cards, wallets, buy now pay later and local methods as the card processor reports them, bank debit, bank transfer in and out by rail, each stablecoin by chain, conversion, issued cards, paying by the call and agent tokens. Each method has a cell per direction (`pay_in`, `pay_out`, `hold_and_capture`, `recurring`, `refund`, `dispute`) with one `status` (`available`, `per_customer`, `preview`, `coming_soon`, `not_offered`), a `reason_code`, and the provider by role (`banking_partner`, `card_processor`). Methods that are not served (push to card, cash, cheque, mobile money, crypto other than stablecoins) are listed as `not_offered`. `settles` says whether a method's outcome is known at once or arrives later: a `delayed` method moves a payment through `processing` to `succeeded` or `failed`, each announced as an event.","payment_instructions":"A checkout session created with `payment_instructions` carries `payment_instructions[]`: for stablecoin, an address (and memo where the chain uses one) for a named coin on a named chain; for bank transfer, the account's details and a `reference` the payer must quote. They are bound to the session and expire with it. The session completes when the deposit arrives, as one payment with `method`, `rail`, `amount_received`, `fee` and the usual events. Too little leaves the session open with `amount_remaining` until it expires; the payment then fails with `underpaid` and what arrived is refundable. Too much completes it, with the excess as `amount_overpaid`, refundable. A deposit reported twice is credited once. A deposit in the wrong coin, on the wrong chain, without a known reference, or after the expiry is never credited: it becomes an unmatched deposit (`deposit.unmatched`) for a person to assign or send back. A refund of such a payment is a payout back to the sender where the banking partner reports one, otherwise to `destination`; a bank deposit on ACH or FedNow goes back whole.","agentic_checkout":"A customer's agentic checkout endpoint is `/agentic/{customer_id}`, following the Agentic Commerce Protocol (2026-04-17). The agent platform authenticates with the bearer token the customer issued, sends `API-Version`, and sends `Idempotency-Key` on every POST: the same key with the same body returns the first answer with `Idempotent-Replayed: true`, with a different body 422 `idempotency_conflict`, and while the first is running 409 `idempotency_in_flight`. A credential made with `require_signature` also needs `Timestamp` (RFC 3339, within five minutes) and `Signature`: base64url of HMAC-SHA256, with the signing secret, over `<Timestamp>.<canonical JSON of the body>` (keys sorted, no whitespace; nothing after the dot when there is no body). Prices come from the customer's pricing callback: Skerry POSTs `{ type: \"checkout_session.price\", customer_id, checkout_session_id, currency, items, buyer, fulfillment_details, selected_fulfillment_options, discounts, api_version }` signed with `Skerry-Signature`, and expects `{ currency?, line_items: [{ id, quantity?, name?, unit_amount, totals? }], fulfillment_options?, totals: [{ type, display_text, amount }], messages?, links?, ready? }` within a few seconds. Order events (`order_create`, `order_update`) go to the credential's `webhook_url` signed with `Merchant-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of '<t>.<raw body>'>`. A session an agent opened is an ordinary checkout session with `source: \"agentic\"`. Error codes on these routes: `unauthorized`, `invalid_signature`, `agent_not_verified`, `missing_api_version`, `unsupported_api_version`, `idempotency_key_required`, `idempotency_conflict`, `idempotency_in_flight`, `missing`, `invalid`, `not_found`, `unsupported`, `requires_3ds`, `pricing_unavailable`, `capability_coming_soon`, `rate_limited`, and on the refunds extension `refunds_not_enabled`, `not_paid`, `outside_window`, `over_limit` and `nothing_to_refund`.","ucp_checkout":"A customer's Universal Commerce Protocol profile is served at `/ucp/{customer_id}/.well-known/ucp` and its operations under `/ucp/{customer_id}`, following the protocol's 2026-08-25 version (read from the specification's repository, branch release/2026-08-25, on 14 Nov 2026); the business serves or redirects its own `/.well-known/ucp` to the profile. It is a second set of shapes over agentic checkout: the same sessions (`source: \"agentic\"`), pricing callback, charge and refunds. The platform sends `UCP-Agent: profile=\"https://...\"`; that profile must be in the customer's `trusted_profiles` (else 403 `profile_not_trusted`), is fetched and kept for a minute, must state `ucp.version` 2026-08-25 (else 422 `version_unsupported`; no older version is published) and must declare `dev.ucp.shopping.checkout` at that version (else 200 with `ucp.status: \"error\"` and the message `capabilities_incompatible`), and the request must be signed per RFC 9421 with a P-256 key the profile publishes, covering `@method`, `@authority`, `@path`, `@query` when there is a query, `ucp-agent`, `idempotency-key` when sent, and `content-digest` and `content-type` when there is a body. The signature is ES256 as raw r||s. In sandbox only, `allow_unsigned` takes requests with no signature. Statuses are `incomplete`, `ready_for_complete`, `complete_in_progress`, `completed` and `canceled`; `requires_escalation` is never answered and `continue_url` never sent, because these sessions have no page to hand a buyer to: what would need the buyer is an `unrecoverable` message. Totals hold one `subtotal` and one `total` and sum. An `Idempotency-Key` is honoured on every POST and PUT (the same key and the same raw body returns the first answer, another body 409 `idempotency_conflict`) and required on complete. Complete takes the `stripe_payments` handler with a `card` and a `stripe_payment_token` only. A checkout or an order that is not there is answered 200 with `{ ucp: { version, status: \"error\" }, messages: [{ type: \"error\", code: \"not_found\", severity: \"unrecoverable\" }] }`. The full order is POSTed to the `config.webhook_url` of the platform's order capability, when the platform declares that capability at this version, when the order is made and when a refund changes it (a refund is an adjustment whose total is negative), signed with the customer's key with `Webhook-Id`, `Webhook-Timestamp` and `Content-Digest`, and retried on the webhook backoff with the same id and timestamp. With `ap2_enabled` and a platform that declares the extension, every checkout carries `ap2.merchant_authorization` and complete needs `ap2.checkout_mandate`; the mandate's own signature is not verified, which the payment's authorisation evidence records. Protocol error codes: `capability_coming_soon`, `not_found`, `invalid_profile_url`, `profile_not_trusted`, `profile_unreachable`, `profile_malformed`, `version_unsupported`, `signature_missing`, `signature_invalid`, `key_not_found`, `digest_mismatch`, `algorithm_unsupported`, `idempotency_key_required`, `idempotency_conflict`, `idempotency_in_flight`, `cart_not_supported`, `missing`, `invalid`, `conflict`, `pricing_unavailable`, `rate_limited`, `mandate_required`, `mandate_expired`, `merchant_authorization_missing`, `merchant_authorization_invalid` and `mandate_scope_mismatch`.","agent_identity":"On the routes agents call, a request signed the Web Bot Auth way (draft-ietf-webbotauth-httpsig-protocol-01: HTTP Message Signatures with `tag=\"web-bot-auth\"` and a `Signature-Agent` header whose member is the HTTPS address of the JWK Set that holds the key) is verified against that key set, fetched as sent from a public address only; Ed25519 keys are verified. Older forms are still read: the bare string, an origin alone (its well-known key directory is read), and the earlier draft's `;type=directory` and `;type=jwks_uri`. A signature in Visa's Trusted Agent Protocol form is recorded and not verified, because its keys are not published where they can be read. The result is stored on the session and the payment as `agent_identity: { verified, method, key_id, operator, signature_agent }`: `signature_agent` is the agent's identifier, the address of its key set without any query, and `operator` is the host only when that address is the host's well-known key directory. A request is never refused for lacking a signature unless the customer has set `require_verified_agent`.","machine_payments":"A priced resource is paid by the call in either of two protocols, offered together. x402 (version 2): the 402 carries `PAYMENT-REQUIRED`, the client retries with `PAYMENT-SIGNATURE`, and the paid answer carries `PAYMENT-RESPONSE`. Machine Payments Protocol: the 402 carries one `WWW-Authenticate: Payment` challenge per method, the client retries with `Authorization: Payment <credential>`, and the paid answer carries `Payment-Receipt`. The smallest single payment is 0.01 USD in stablecoin and 0.50 USD with a delegated card token, in whole cents; a smaller price is paid from prepaid credit bought with one payment and drawn down per call (`Skerry-Credit` on the proxy, `credit_token` on verify). The protocol's own session intent is not offered. Each payment is a payment with `method: \"machine\"`, its `protocol`, `resource_id` and the payer's address or token reference in `payer_ref`. Older form, kept: a version 1 x402 client's `X-PAYMENT` header is still read.","hosted_addresses":"Every checkout session and payment link carries `share_url`, an address at this API. A browser is redirected to the hosted page. A client that sends `Accept: application/json`, or asks for the address with `.json` appended, gets a description: amount, currency, status, methods, payment instructions, `agentic_endpoint` when the business has one, and `how_to_pay_without_a_browser`. The address is public and shows what the hosted page shows.","requirements":"`requirements` on a customer is one list across both providers. Each entry is `{ capability, provider, status, items[], due_by }`: `provider` is `banking_partner` or `card_processor`; `status` is `satisfied`, `pending_review`, `action_required`, `past_due`, `blocked`, `revoked` or `upcoming`; `items` are `{ id, state }` with state `missing`, `pending` or `issue`; `due_by` is set where a date is known, and always on `upcoming`. For a business, an owner must be named from 25 percent of ownership unless a lower `ownership_threshold` (5 to 25) was given."}}