Execute a quote
Submits the results of a quote's actions. Call it only when the quote's nextActions ends with submit_execution, and send it before the quote's expiresAt. Which authorization arm to send follows from those actions -- see below. Not every quote needs this call. When the nextActions are only approvals and a send_transaction with id: prefunded-store, there is no submit_execution: once that transaction lands, Across picks the deposit up on chain and the transfer starts. Track it with GET /v1/transfers/{orderId}. Reporting its hash here with the txnRef arm is optional.
A 2xx means accepted, not arrived; follow it with GET /v1/transfers/{orderId}.
Authorization
bearerAuth API key for authentication.
In: header
Path Parameters
The orderId returned by POST /v1/quotes. Quotes expire about 15 minutes after issue, so replace the example below with one you just created.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
The results of the quote's actions, for a quote whose nextActions ends with submit_execution. Which arm to submit follows from those actions; submitting the wrong arm is rejected.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/quotes/0x625b3f050d78e03ac4da0cbd69aba447825481bb7e7b3b623bd0e350be628874/executions" \ -H "Content-Type: application/json" \ -d '{ "authorization": { "signatures": { "funding": "0x7a98bfcc7d5404a499069488911a16d2f8cb5b686cb835c75f7dff3f2cf10e8348df58d09f1afb850fc6fd835f647917fec8edffbf5ea08449e49e89a475ade71c" } } }'{
"orderId": "0x625b3f050d78e03ac4da0cbd69aba447825481bb7e7b3b623bd0e350be628874",
"acceptedAt": "2026-10-16T00:31:28.869Z",
"balanceCheck": {
"chainId": 8453,
"tokenAddress": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"requiredAmount": "2000000",
"observedBalance": "36522710",
"blockNumber": 52660670,
"observedAt": "2026-10-16T00:31:28.944Z"
}
}{
"error": {
"type": "request",
"code": "request.missing_field",
"message": "authorization.signatures is required",
"param": "authorization.signatures",
"requestId": "mps4hrl21eqmhpeqom9q79jjeg"
}
}{
"code": "unauthenticated",
"message": "the request does not have valid authentication credentials for the operation",
"details": null
}{
"code": "unauthenticated",
"message": "the request does not have valid authentication credentials for the operation",
"details": {}
}{
"error": {
"type": "request",
"code": "request.invalid_json",
"message": "string",
"param": "string",
"requestId": "string",
"details": {
"balanceCheck": {
"chainId": 0,
"tokenAddress": "string",
"requiredAmount": "string",
"observedBalance": "string",
"blockNumber": 0,
"observedAt": "2019-08-24T14:15:22Z"
},
"amountLimits": {
"side": "min",
"amount": "string",
"token": {
"chainId": 0,
"address": "string"
},
"rail": "string",
"observedAt": "2019-08-24T14:15:22Z"
},
"retryWithAllowedAuthorizationTypes": [
"approval"
]
}
}
}Price a transfer POST
Prices one transfer and returns everything needed to execute it: `destination.amount` (expected) alongside `destination.minAmount` (the guaranteed floor), an itemised fee breakdown, `expiresAt`, and every action to sign or send. A quote is an offer, not a commitment. Complete the returned `nextActions` in order. Only when they end with `submit_execution`, POST the results to `POST /v1/quotes/{orderId}/executions`. A quote funded by an approval and an on-chain `prefunded-store` transaction has no `submit_execution`: that transaction starts the transfer, so there is nothing to POST.
List transfers GET
Lists your transfers, newest first. Filters are repeatable and combine — values within one filter match any, separate filters must all match — and for reconciliation `externalId` matches your own id while `txnRef` matches any transaction in the transfer's lifecycle. The query is strict: an unknown parameter is rejected with `400 request.unsupported_param`, and an empty filter value is a `400`.