Skip to content
Integra Agentic Terms

Rails

What each rail needs from the buyer — the account form, the signing request, and the inputs the build reads.

Most pairings need nothing from you beyond the seller's document and your signer. Where a build needs a value only the buyer can supply (a recent blockhash, an account sequence, a deposit), you pass it in inputs. This page lists, rail by rail, the account form each pairing accepts, the kind of request your signer receives, and every input the build reads.

A missing or malformed input declines with no-payable-option and a detail ending in /input-missing, before any fetch of the ATR. Input values are JSON: a decimal is a string of digits ("1000000"), an integer is a JSON number, hex is 0x followed by hex digits.

The pairings reference gives each pairing's binding export, its Python constant, and what its payment proves. The signers guide gives the answer each request kind takes.

Accounts

The signer's account is CAIP-10. Its namespace selects the pairings it can pay:

NamespaceRailsExample
eip155EVM chains, Tempo, and MPP's EVM, Tempo and usdc/evm pairingseip155:84532:0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
solanaSolanasolana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp:<base58 address>
stellar, xrpl, hedera, algorand, aptos, sui, near, starknet, polkadot, tron, tvm, cardano, casper, ccd, stacksThe chain of that name (tvm is TON, ccd is Concordium)<namespace>:<network>:<address>
lnbtcLightninglnbtc:000000000019d6689c085ae165831e93:<node id>
cloudflarex402/batch-settlement/cloudflare, where the account names your agentcloudflare:402:agent.example
anyCard, AP2, UCP, ACP and ACK pairings, where the account names the buyer; MPP's card and Stripe pairings, which do not read it; mpp/charge/nearintents, on the challenge's origin network; mpp/charge/usdc/gateway, on a network the challenge accepts as a Gateway source

EVM

PairingRequestInputs
x402/exact/eip155/eip3009eip712none
x402/exact/eip155/permit2eip712none
x402/exact/eip155/erc7710erc7710none
x402/exact/eip155/erc7710-salterc7710none
x402/upto/eip155/permit2eip712none
x402/auth-capture/eip155/eip3009eip712none
x402/auth-capture/eip155/permit2eip712none
x402/batch-settlement/eip155batch of two eip712: the opening's token authorization, then the first voucherpayerAuthorizer (address, required); deposit (decimal, required unless the option's extra.minDeposit sets it); authSalt (32-byte hex, optional: drawn at random otherwise)
mpp/charge/evm/authorizationeip712tokenDomain (object, required: the token's EIP-712 name and version)
mpp/charge/evm/permit2eip712spender (string, required: the seller server's submitting address)
mpp/charge/evm/transactionevm-callnone
mpp/charge/evm/hashevm-call, broadcast by the signernone
mpp/charge/usdc/evmeip712tokenDomain (object, required)
mpp/charge/usdc/gatewaygateway-burn-intentnone
mpp/session/evmtwo steps: the funding (eip712, or evm-calls broadcast by the signer), then the first voucher (eip712)deposit (decimal, required); authorizedSigner (address, optional); credentialType (authorization, permit2 or hash, optional); tokenDomain (object, optional)

Tempo

PairingRequestInputs
mpp/charge/tempo/memotempo-call, or tempo-calls for a charge with splitsclientId (string, optional)
mpp/charge/tempo/pushtempo-call or tempo-calls, broadcast by the signerclientId (string, optional)
mpp/session/tempotwo steps: the signed open transaction (tempo-call), then the first voucher (eip712)deposit (decimal, required); authorizedSigner, credentialType, tokenDomain (optional)
mpp/subscription/tempotempo-key-authorizationnone

Solana

PairingRequestInputs
x402/exact/solanasolana-messagedecimals (integer) and tokenProgram (string): the mint's; recentBlockhash (string, required unless the option's extra.recentBlockhash is a base58 key of 32 bytes); computeUnitLimit (integer, optional); computeUnitPrice (decimal, optional)
x402/upto/solanasolana-messageopenSlot (decimal), tokenProgram (string), recentBlockhash (string); nonce (decimal, optional: a random u64 otherwise); computeUnitLimit, computeUnitPrice (optional)
x402/batch-settlement/solanabatch: the opening's solana-message, then the first voucher's ed25519-rawpayerAuthorizer (string), openSlot (decimal), tokenProgram (string); recentBlockhash (unless the option names one); deposit (unless extra.minDeposit sets it); salt, computeUnitLimit, computeUnitPrice (optional)
mpp/charge/solanasolana-messagedecimals, tokenProgram, recentBlockhash, each required only where the request's methodDetails leaves it out (none for native SOL besides the blockhash); computeUnitLimit, computeUnitPrice (optional)
mpp/charge/usdc/solanasolana-messageas mpp/charge/solana, read from methodDetails.solana
mpp/session/solanasolana-session-open; with an operator voucher signer, then ed25519-raw for the session proofdeposit (decimal, optional)

Stellar

PairingRequestInputs
x402/exact/stellarstellar-authsimulatedXdr (string: your simulated transfer transaction), currentLedger (integer)
mpp/charge/stellarstellar-authsimulatedXdr, currentLedger

The gate passes your account's address to the build as the payer. Before anything reaches your signer, the build compares the transfer your simulated transaction carries with what the seller asked for, and declines offer-unreadable when they differ:

DetailThe simulated transfer
stellar/asset-mismatchcalls a token contract other than the option's asset (x402) or the request's currency (MPP).
stellar/amount-mismatchmoves an amount other than the option's or the request's amount exactly. x402's Stellar scheme: argument 2, the amount, "MUST equal requirements.amount exactly".
stellar/payer-mismatchis from an account other than yours.

XRP Ledger

PairingRequestInputs
x402/exact/xrplxrpl-txfee (decimal), lastLedgerSequence (integer), and sequence (integer) or, where the option's extra.assetTransferMethod is ticketSequence, ticketSequence (integer)
mpp/charge/xrplxrpl-txfee (decimal), sequence (integer), lastLedgerSequence (integer)
mpp/session/xrplxrpl-session-opendeposit (decimal) and xrpl (object): publicKey (hex), settleDelay (integer), fee (decimal), sequence (integer), lastLedgerSequence (integer), cancelAfter (integer, optional)

An mpp/session/xrpl challenge's amount is the first claim's cumulative total in drops, which the claim signs as a 64-bit unsigned integer. A challenge whose amount is anything but such a number written as a decimal string, with no sign, point or leading zero, does not offer the pairing (mpp/request-malformed): the gate declines no-payable-option, and nothing is signed.

Hedera

PairingRequestInputs
x402/exact/hederahedera-bodynode (string), validStart (object: seconds decimal, nanos integer), maxFee (decimal); decimals (integer, optional)
x402/exact/hedera/transfer-executorhedera-executornone
mpp/charge/hederahedera-body, broadcast by the signer unless credentialType is "transaction"node, validStart, maxFee; clientId (string, optional); credentialType (hash, the default, or transaction; optional)
mpp/session/hederahedera-session-open, broadcast by the signerdeposit (decimal)

Other chains

PairingRequestInputs
x402/exact/algorandalgorand-txnparams (object: algod's firstValid and minFee and feePerByte as decimals, genesisHash, genesisId)
x402/exact/aptosaptos-transaction: the wallet builds and signs the scheme's payment. An answer that is not an object whose transaction is a string is declined signed-not-bound (x402/signature-malformed). The transaction is read as the seller's reference reads it, and declined signed-not-bound with reference's code for each fault: text that is not base64 of a transaction prefix that reads to the end of its fields, or that names a module, function or struct with a name that is not a Move identifier, aptos/tx-malformed; a transaction over 64 KiB decoded, aptos/tx-too-large; a payload that is not an entry function call, aptos/not-entry-function; a call that is not the framework primary_fungible_store::transfer or fungible_asset::transfer with one struct type argument and three arguments, aptos/not-an-x402-transfer; and a transaction for a chain other than the option's network, aptos/chain-mismatchnone
x402/exact/suisui-transaction: the wallet builds the payment and adds the request's pureInputnone
x402/exact/nearnear-delegatepublicKey (string), accessKeyNonce (decimal), finalHeight (decimal): from your RPC
mpp/charge/nearintentsnone: the comparison is the buyer's whole stepnone
x402/exact/starknetstarknet-snip12none
x402/exact/polkadot/lcp-assets-remarksubstrate-callnone
x402/exact/tron/lcp-trc20-memotron-txidrefBlock (object: { number, id } of a recent block), feeLimit (decimal)
x402/exact/tvmton-w5walletId (integer), seqno (integer), jettonWallet (string), attachNanotons (decimal); stateInit (base64 BoC, for a wallet not yet deployed)
x402/exact/cardanocardano-transactionnone
x402/exact/caspercasper-eip712none
x402/exact/ccdccd-transfernone
mpp/charge/usdc/stacksstacks-contract-callnone

Lightning

PairingRequestInputs
x402/exact/lnbtcbolt11-payrequest (object, required): your own request, from which the gate recomputes x402's request hash. For HTTP, { method, url, body?, headers? }; for MCP, { server, name, arguments?, meta? }.
x402/exact/lnbtc/invoice-namedbolt11-payrequest, as above
mpp/charge/lightningbolt11-paynone
mpp/session/lightningbolt11-pay for the deposit invoicereturnInvoice (string, required)

Your node moves the payment when it pays the invoice. A decline after that carries moved.

On x402/exact/lnbtc/invoice-named the ATR itself names the invoice. The gate pays only when the ATR's bytes are one JSON object whose first members are atrVersion, id and x402, in that order, with no member name repeated, and whose x402 slot holds the option's invoice; otherwise it declines offer-unreadable with ln/invoice-not-named before your node is asked to pay. Every JSON reader then finds the same x402 slot, since RFC 8259 leaves a repeated name to each reader.

Cloudflare

PairingRequestInputs
x402/batch-settlement/cloudflarenone: the build is the payment, and your agent's HTTP message signature signs the request that carries itnone

Cards and Stripe

PairingRequestInputs
card/visa-taptap-fieldnone
card/mastercard-vi/immediatevi-checkout-mandate (the user's L2)none
card/mastercard-vi/autonomousvi-checkout-mandate (the agent's L3b)none
card/seller-referencenone: the comparison is the buyer's whole stepnone
mpp/charge/cardnonenone
mpp/charge/stripenonenone
mpp/subscription/stripenonenone

Mandates and checkouts

PairingRequestInputs
ap2/checkout-mandateap2-checkout-mandatenone
ucp/checkout/ap2-mandateucp-checkoutnone
ucp/booking/ap2-mandateucp-checkoutnone
ucp/checkout/unsignednonenone
ucp/booking/unsignednonenone
acp/checkout/delegatedacp-allowancemax_amount (integer, minor units), currency (string), merchant_id (string), expires_at (string)
acp/checkout/undelegatednonenone
ack/payment-requestnonenone

Where the request is "none", confirm returns request: null. For x402/batch-settlement/cloudflare, whose build is itself the payment, finish with a null signature completes it, and transact returns it as signed. For every other such pairing, transact returns signed: null once the comparison and, where the pairing needs one, the agreement payment are done, and the protocol's own flow completes the payment.

Pairings that pay an agreement first

With transact, every pairing whose payment is not itself a public proof of H pays the seller's agreement URL first, once the buyer's agent has approved that payment. confirm and finish neither pay nor check the agreement; only transact and agree do (see driving the steps yourself). The pairings reference marks these pairings, and the agreement payments guide describes the exchange. The agreement payment's build reads the same inputs as the payment's own: a Solana agreement option reads the Solana inputs above. Pass agreementSigner to transact when a different wallet pays the agreement, for example an EVM wallet beside a card.

Edit on GitHub

Last updated on

On this page