Across Docs

Migration guide

Moving from the legacy APIs to the Across API. What you called before, and what you call now.

The legacy APIs, including the Swap API, suggested fees and deposit status, are deprecated. This page maps each legacy call to its replacement in the Across API.

The basics

Legacy APIsNow
Hosthttps://across.to/apihttps://api.across.to. Every path starts with /v1
CredentialsAPI key plus integratorIdAPI key only, created in the integrator portal
TestnetAvailableNone. Test on mainnet with small amounts

Endpoints

What you were doingLegacy APIsNow
Find chains, tokens and routesGET /swap/chains, GET /swap/tokens, GET /available-routesGET /v1/capabilities
Check transfer limitsGET /limitsGET /v1/capabilities for one route, in capabilities.limits
Get a quote and its feesGET /swap/approval, GET /suggested-feesPOST /v1/quotes
Send the transferSend approvalTxns and swapTx from the user's walletFollow the quote's nextActions. If they end with submit_execution, call POST /v1/quotes/{orderId}/executions
Gasless transfersGET /swap/gasless, then POST /gasless/submitThe same quote and execution calls. When the token supports it, the quote asks for a signature instead of a transaction
Track a transferGET /deposit/status, GET /depositGET /v1/transfers/{orderId}
List transfersGET /depositsGET /v1/transfers
Get notified of updatesPOST /v1/webhooks/subscriptionsWebhooks, set up in the integrator portal
Run calls on the destination chainPOST /swap/approval with an actions bodyComing soon

To get limits, set all four of originChainId, originToken, destinationChainId and destinationToken. The legacy inputToken and outputToken are now originToken and destinationToken. Without all four, the response has no capabilities block and no limits.

Destination chain actions are coming soon. If you use embedded actions with POST /swap/approval today, keep that flow until they are available in the Across API.

Request fields

Legacy APIsNow
inputToken and originChainIdorigin.token: { chainId, address }
outputToken and destinationChainIddestination.token: { chainId, address }
amountorigin.amount, or destination.amount for exact_output and min_output
depositor, recipientorigin.depositor, destination.recipient
tradeType: exactInput, minOutput, exactOutputamountType: exact_input, min_output, exact_output
appFee (a decimal, 0.01 = 1%) and appFeeRecipientappFeeBps (basis points, 100 = 1%). No recipient: Across pays out your share monthly. See App fees
slippage (0.005 = 0.5%, or auto)maxFee: { bps, fixedUsd }, the most USD value the user can lose to fees, the app fee and slippage combined. It is not a slippage value, so don't copy yours across. Omit it, as you would auto, to use the default. See Fees
integratorIdNot needed. Your API key identifies you

The request body is strict: an unknown field returns 400 instead of being ignored.

Response fields

Legacy APIsNow
expectedOutputAmount, minOutputAmountdestination.amount, destination.minAmount
feesfee: totalFee, transferFee, appFee. See Fees
approvalTxns, swapTxnextActions: an ordered list of what to approve, sign or send
Deposit transaction hash, to track the transferorderId, returned by the quote. Track the transfer with it
status: pending, filled, expired, refunded, …status.state: pending, completed, refunded or failed, with status.reason for detail. Wait for status.finalized before acting on the outcome

Migrate in four steps

  1. Get an API key from the integrator portal.
  2. Replace route, token and limit lookups with GET /v1/capabilities.
  3. Replace /swap/approval with POST /v1/quotes and work through nextActions. If they end with submit_execution, submit the result to the executions endpoint.
  4. Track transfers by orderId with GET /v1/transfers/{orderId}, or with webhooks.

The Quickstart shows steps 2 to 4 as working code.

On this page