Persistent Deposit Addresses

One POST returns a permanent deposit address — send funds from any supported origin chain and they are swept to your recipient on the destination.

POST /deposit-addresses returns a persistent, never-expiring deposit address that delivers a token to a recipient on the destination you specify. The same request parameters always resolve to the same address, so you can request it once and reuse it — the amount is not part of the request. Send any amount, any time, and it's swept to the destination automatically; no wallet signing or per-transfer quote is required.

API key with the deposit-address permission required (Bearer auth). Get an API key + Integrator ID.

Supported routes

Support is route-specific — it depends on the origin/destination pair and the tokens on each side, not on the chain alone. There is no single "is this chain supported" flag.

Chains
Origin (deposit from)Ethereum, Optimism, BNB Smart Chain, Polygon, Unichain, Monad, World Chain, HyperEVM, MegaETH, Base, Plasma, Arbitrum, Avalanche, Ink, Linea, Tempo, Tron
Destination (deliver to)The 17 origin chains above, plus HyperCore (1337)
  • Tron is the only non-EVM chain in the set. Its addresses use the tron namespace (base58, T…) and arrive as their own entry in depositInstructions[] — iterate that array instead of assuming a single EVM address.
  • zkSync and Solana are not supported on either side.

Don't hardcode origins. The response's supportedInputs[] lists every origin chain the address accepts, the token to send on each, that route's min/max limits, and its indicative fees and fill time — read them from there. The list stays current as chains and tokens are added. Unsupported destinations and recipients return 400.

Integrate

Request an address

Send the destination (token + recipient) and a refundAddresses entry to refund to if a deposit can't be completed. The example below requests USDC-SPOT on HyperCore; swap in any supported destination token.

curl -X POST https://across.to/api/deposit-addresses \
  -H "Authorization: Bearer $ACROSS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "destination": {
      "token": { "chainId": 1337, "address": "0x2000000000000000000000000000000000000000" },
      "recipient": "0x1111111111111111111111111111111111111111"
    },
    "refundAddresses": [
      { "namespace": "evm", "address": "0x2222222222222222222222222222222222222222" }
    ]
  }'

Read the deposit instruction

The response returns depositInstructions[]. Each has a depositAddress (an Account{ namespace, address }) and the supportedInputs it accepts: origin chain, input token, that route's min/max limits, plus an indicative fee breakdown and fill time. expiresAt is always null.

{
  "destination": {
    "token": { "chainId": 1337, "address": "0x2000…0000", "symbol": "USDC-SPOT", "name": "USDC", "decimals": 8 },
    "recipient": { "namespace": "evm", "address": "0x1111…1111" }
  },
  "refundAddresses": [
    { "namespace": "evm", "address": "0x2222…2222" }
  ],
  "expiresAt": null,
  "depositInstructions": [
    {
      "depositAddress": { "namespace": "evm", "address": "0xAcc0…BD6E" },
      "supportedInputs": [
        {
          "originChainId": 1,
          "inputToken": { "chainId": 1, "address": "0xA0b8…eB48", "symbol": "USDC", "name": "USD Coin", "decimals": 6 },
          "limits": { "minInputAmount": "5000000", "maxInputAmount": "10000000000000" },
          "indicativeFees": { "proportionalPct": "100000000000000", "fixedFeeUsd": 0.246894 },
          "indicativeFillTime": 30
        }
        // …one entry per supported origin chain
      ]
    }
  ],
  "id": "75795-1781095882239-8e49a5353db9"
}

Send funds

Send one of the tokens listed in supportedInputs[], on the origin chain that entry names, to the depositAddress. It's swept to the destination token and recipient you requested. The address is amount-agnostic and permanent — reuse it for future transfers; re-POSTing the same parameters returns the same address.

Track your deposit

Two calls: list the deposits made through your deposit address, then fetch full details for the latest one.

List deposits for the address

Call GET /deposits with the depositAddress query param. It returns the transfers sent to that address, newest first, each enriched with the bridge deposit created for it. depositTxnRef is the hash of the transfer you sent to the deposit address. A transfer that hasn't been swept yet reports status deposit-pending; once the sweep is picked up, the item carries the bridge deposit's fill status (pendingfilled).

curl "https://across.to/api/deposits?depositAddress=0xAcc0dDdb8169FD06a34AADd52a39A4166a15BD6E" \
  -H "Authorization: Bearer $ACROSS_API_KEY"
[
  {
    "status": "filled",
    "depositTxnRef": "0x92ffc5d69d00e14e79254f68adab030dd38119996501a88cac0da76557703d11"
    // …other deposit fields
  }
]

Fetch the latest deposit

Pick the latest transfer — the first item in the response — and pass its depositTxnRef to GET /deposit for the full deposit record, including fill status.

curl "https://across.to/api/deposit?depositTxnRef=0x92ffc5d69d00e14e79254f68adab030dd38119996501a88cac0da76557703d11" \
  -H "Authorization: Bearer $ACROSS_API_KEY"

See the full schema, fields, and error responses in the POST /deposit-addresses API reference.

On this page