Skip to content

Cross-chain bridge ​

All endpoints require Authorization: Bearer <token> and the x-client-id: <Client_ID> header — your tenant id is the same value as your OAuth Client_ID (details); without it requests fail with 400 MISSING_CLIENT_ID. Product CRYPTO_BRIDGE must be enabled for the account, otherwise 403 PRODUCT_NOT_ENABLED.

Overview ​

The Bridge API moves an asset from a tenant custodial wallet (EVM origin network) to a destination wallet on another EVM network.

  • Accepted origin networks: ETHEREUM, POLYGON, BSC.
  • Destination networks: see the table below (pass the destinationChainId).
  • Asynchronous: execute returns as soon as the transfer is initiated; arrival at the destination is confirmed later — poll the status.

Flow:

  1. Quote (POST /v1/crypto/bridge/quote) — returns the amount to debit, the fee, the estimated destination amount and the quote validity (quoteId).
  2. Execute (POST /v1/crypto/bridge/execute) — initiates the transfer. Returns operationId.
  3. Track (GET /v1/crypto/bridge/status/{operationId}) until FILLED (or REFUNDED/FAILED).

Supported destination networks ​

NetworkdestinationChainId
Ethereum1
Optimism10
BNB Smart Chain56
Polygon137
Base8453
Arbitrum One42161

The route (origin → destination, for the chosen asset) is validated at quote time. Supported assets: USDC, USDT.


POST /v1/crypto/bridge/quote ​

Quotes the transfer without moving funds. The origin wallet (fromAddress) must belong to the tenant.

Headers:

HeaderValue
AuthorizationBearer <token>
Content-Typeapplication/json

Request Body:

json
{
  "fromAddress": "0x89f423567c2648BB828c3997f60c47b54f57Fa6e",
  "amount": "100.0",
  "asset": "USDT",
  "originNetwork": "POLYGON",
  "destinationChainId": 8453,
  "destinationWallet": "0xabc0000000000000000000000000000000000123",
  "userId": "user-123"
}
FieldDescription
fromAddressOrigin custodial wallet (tenant's).
amountAmount to transfer, in human units of the asset.
assetAsset to move (USDC or USDT).
originNetworkETHEREUM | POLYGON | BSC.
destinationChainIdDestination chainId (see table).
destinationWalletDestination wallet — must be on the tenant whitelist.

Response 200:

json
{
  "quoteId": "b1f2c3d4-...-q",
  "amountDebited": "100.0",
  "fee": "0.512206",
  "estimatedOutput": "99.487794",
  "estimatedFillTimeSec": 2,
  "expiresAt": "2026-07-01T12:34:56.000Z"
}

POST /v1/crypto/bridge/execute ​

Executes a valid quote (the quote has a short validity). Debits the tenant and initiates the transfer to the destination.

Request Body:

json
{
  "quoteId": "b1f2c3d4-...-q"
}

Response 200:

json
{
  "operationId": "a1b2c3d4-...-op",
  "status": "DEPOSITED",
  "depositId": "998877"
}

Possible states: PENDING → SWEPT → APPROVED → DEPOSITED → FILLED. Exception terminals: EXPIRED, REFUNDED, FAILED.


GET /v1/crypto/bridge/status/{operationId} ​

Returns the current operation state and, when available, the destination receipt hash.

json
{
  "operationId": "a1b2c3d4-...-op",
  "status": "FILLED",
  "depositId": "998877",
  "depositTxHash": "0x...",
  "fillTxHash": "0x...",
  "destinationChainId": 8453,
  "outputAmount": "99.487794"
}

GET /v1/crypto/bridge/operations ​

Lists the tenant's bridge operations. Query params: status (optional), limit, offset.


Notes ​

  • Refund: if the transfer is not completed on the destination network, the funds are automatically returned to the origin wallet.
  • Idempotency: resending execute with the same quoteId does not duplicate the transfer.
  • Limits: each route has a minimum and maximum amount — values outside the range are rejected at quote time.