List transfers
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.
Authorization
bearerAuth API key for authentication.
In: header
Query Parameters
Page size. An integer from 1 to 100; anything else is a 400, not clamped.
Opaque cursor from the previous page's pagination.nextCursor. A malformed cursor is a 400.
Inclusive lower bound on submittedAt. A full RFC 3339 timestamp with a Z or an offset such as +02:00; a bare date or a timestamp without a zone is a 400.
Inclusive upper bound on submittedAt. Same format as fromSubmittedAt.
Coarse lifecycle state. Repeatable; matches any of the supplied values.
Granular reason. Repeatable; matches any of the supplied values. Each reason belongs to exactly one state, so combining a reason with a conflicting statusState returns nothing. A completed transfer with destination actions reports filled_destination_action_successful or filled_destination_action_failed, not filled. source_transfer_failed is still accepted as a deprecated alias of origin_transfer_failed.
Order identifier. Repeatable -- supply it more than once to match any of the values (?orderId=a&orderId=b). Maximum 100 entries.
The integrator-supplied id echoed from the quote request. Repeatable -- supply it more than once to match any of the values (?externalId=a&externalId=b). Maximum 100 entries.
Account that paid the input, in any case. Matches either the deposit-side depositor or, for a transfer that began on a chain the indexer does not observe, the origin account. Repeatable -- supply it more than once to match any of the values (?depositor=a&depositor=b). Maximum 100 entries; an invalid address is a 400.
Account that receives the output, in any case. Repeatable -- supply it more than once to match any of the values (?recipient=a&recipient=b). Maximum 100 entries; an invalid address is a 400.
Matches any transaction in the lifecycle ledger -- origin entry, settlement fill, destination delivery or refund. A hash can be pasted without knowing which role it played; a match on any other hop is echoed back as an intermediate ledger entry. EVM hashes match case-insensitively, other shapes (Solana signatures) case-sensitively. Repeatable -- supply it more than once to match any of the values (?txnRef=a&txnRef=b). Maximum 100 entries.
Token address on the origin side, in any case. Matches either the deposit-side input token or, for a transfer that began on a chain the indexer does not observe, the origin token. Repeatable -- supply it more than once to match any of the values (?originTokenAddress=a&originTokenAddress=b). Maximum 100 entries. Replaces inputTokenAddress, which is now rejected.
Output token address on the destination chain, in any case. Repeatable -- supply it more than once to match any of the values (?destinationTokenAddress=a&destinationTokenAddress=b). Maximum 100 entries. Replaces outputTokenAddress, which is now rejected.
Chain id on the origin side. Matches either the deposit chain or, for a transfer that began on a chain the indexer does not observe, the origin chain. Repeatable -- supply it more than once to match any of the values (?originChainId=a&originChainId=b). Maximum 100 entries; a non-integer is a 400. Replaces inputChainId, which is now rejected.
Chain id the order asked to be credited on -- it also matches pending, failed and refunded transfers that have no destination yet. Repeatable -- supply it more than once to match any of the values (?destinationChainId=a&destinationChainId=b). Maximum 100 entries; a non-integer is a 400. Replaces outputChainId, which is now rejected.
Response Body
application/json
application/json
application/json
curl -X GET "https://example.com/v1/transfers?limit=5"{
"transfers": [
{
"orderId": "0xe3d6f2babb58d4e583a1ec616cc695d51e77ce01184a67b8fe479df08afcb5d2",
"externalId": "order-8f2c1a",
"status": {
"state": "completed",
"reason": "filled_destination_action_successful",
"description": "The transfer is complete, the funds were delivered to the recipient, and the requested destination actions completed.",
"isTerminal": true,
"finalized": true
},
"origin": {
"chain": {
"chainId": 42161,
"name": "arbitrum-one",
"displayName": "Arbitrum One",
"logoUrl": "https://alexandria-blond.vercel.app/assets/chains/arbitrum.svg"
},
"input": {
"token": {
"kind": "token",
"address": "0xaf88d065e77c8cc2239327c5edb3a432268e5831",
"symbol": "USDC",
"name": "USD Coin",
"decimals": 6,
"chainId": 42161,
"logoUrl": "https://alexandria-blond.vercel.app/assets/tokens/usdc.svg",
"priceUsd": 0.9996656809977668,
"priceUsdAt": "2026-10-15T12:45:00.000Z"
},
"amount": "3000000",
"amountUsd": "2.998997042993300400"
},
"depositor": {
"address": "0x9A8f92a830A5cB89a3816e3D267CB7791c16b04D",
"chainId": 42161
}
},
"destination": {
"chain": {
"chainId": 137,
"name": "polygon",
"displayName": "Polygon",
"logoUrl": "https://alexandria-blond.vercel.app/assets/chains/polygon.svg"
},
"output": {
"token": {
"kind": "token",
"address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
"symbol": "USDC.e",
"name": "USD Coin (bridged)",
"decimals": 6,
"chainId": 137,
"logoUrl": "https://alexandria-blond.vercel.app/assets/tokens/usdc.svg",
"priceUsd": 0.9996727054482215,
"priceUsdAt": "2026-10-15T12:45:00.000Z"
},
"amount": "2963015",
"amountUsd": "2.962045221333662028"
},
"recipient": {
"address": "0x9A8f92a830A5cB89a3816e3D267CB7791c16b04D",
"chainId": 137
}
},
"submittedAt": "2026-10-15T12:45:50.743Z",
"filledAt": "2026-10-15T12:46:01.000Z",
"fillTimeMs": 10257,
"fundingMethod": "approval",
"transactions": [
{
"type": "deposit",
"transaction": {
"txnRef": "0x17207bfaa5358b3e0109e9fc4a8c39c0cf1ab97e0175852fc2c7f7a5bed6a77d",
"chainId": 42161,
"blockRef": 515062780,
"blockTimestamp": null,
"explorerUrl": "https://arbiscan.io/tx/0x17207bfaa5358b3e0109e9fc4a8c39c0cf1ab97e0175852fc2c7f7a5bed6a77d"
}
},
{
"type": "fill",
"transaction": {
"txnRef": "0xdc1fd195d7947ef11c81c61f2dc17de88b50e7c2341c740ea4767e04c885dde1",
"chainId": 137,
"blockRef": 95575357,
"blockTimestamp": "2026-10-15T12:46:01.000Z",
"explorerUrl": "https://polygonscan.com/tx/0xdc1fd195d7947ef11c81c61f2dc17de88b50e7c2341c740ea4767e04c885dde1"
}
}
],
"subsidy": {
"appliedUsd": "0.000499",
"policyId": "8a2e4b6c-1d3f-4a5b-8c7d-9e0f1a2b3c4d",
"policyVersion": 5,
"apiKeyId": "3f1c2a9e-7b4d-4e8a-9c21-5d6f7a8b9c0d",
"billingState": "charged"
},
"appFee": {
"feeUsd": "0.002999",
"integratorEarningUsd": "0.002999",
"riskLabsShareUsd": "0",
"apiKeyId": "3f1c2a9e-7b4d-4e8a-9c21-5d6f7a8b9c0d",
"billingState": "charged"
},
"quoted": {
"amountType": "exact_input",
"origin": {
"input": {
"token": {
"kind": "token",
"chainId": 42161,
"address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"symbol": "USDC",
"decimals": 6
},
"amount": "3000000",
"maxAmount": "3000000"
},
"depositor": {
"address": "0x9A8f92a830A5cB89a3816e3D267CB7791c16b04D",
"chainId": 42161
}
},
"destination": {
"output": {
"token": {
"kind": "token",
"chainId": 137,
"address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
"symbol": "USDC.e",
"decimals": 6
},
"amount": "2946651",
"minAmount": "2858923"
},
"recipient": {
"address": "0x9A8f92a830A5cB89a3816e3D267CB7791c16b04D",
"chainId": 137
}
},
"expectedFillTimeMs": 1000
}
}
],
"pagination": {
"nextCursor": "eyJzdWJtaXR0ZWRBdCI6MTc5MjA2ODM1MDc0Mywib3JkZXJJZCI6IjB4ZTNkNmYyYmFiYjU4ZDRlNTgzYTFlYzYxNmNjNjk1ZDUxZTc3Y2UwMTE4NGE2N2I4ZmU0NzlkZjA4YWZjYjVkMiJ9"
}
}{
"error": {
"type": "request",
"code": "request.invalid_param",
"message": "Request validation failed on query parameters",
"param": "statusState",
"requestId": "f6f0250f-8516-461b-8200-5855e5cb7d1f",
"details": {
"issues": [
{
"code": "invalid_value",
"values": [
"pending",
"completed",
"refunded",
"failed"
],
"path": [
"statusState",
0
],
"message": "Invalid option: expected one of \"pending\"|\"completed\"|\"refunded\"|\"failed\""
}
]
}
}
}{
"error": {
"type": "request",
"code": "string",
"message": "string",
"param": "string",
"requestId": "string",
"details": {}
}
}Execute a quote POST
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}`.
Get a transfer GET
Returns the current state of one transfer. `orderId` is the id you saved when you executed the quote. Stop polling when `status.isTerminal` is true; see that field for the guarantees it does and does not give you. The endpoint takes no query parameters -- any is rejected with `400 request.unsupported_param`.