Cross-chain bridge
All endpoints require
Authorization: Bearer <token>and thex-client-id: <Client_ID>header — your tenant id is the same value as your OAuthClient_ID(details); without it requests fail with400 MISSING_CLIENT_ID. ProductCRYPTO_BRIDGEmust be enabled for the account, otherwise403 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:
executereturns as soon as the transfer is initiated; arrival at the destination is confirmed later — poll the status.
Flow:
- Quote (
POST /v1/crypto/bridge/quote) — returns the amount to debit, the fee, the estimated destination amount and the quote validity (quoteId). - Execute (
POST /v1/crypto/bridge/execute) — initiates the transfer. ReturnsoperationId. - Track (
GET /v1/crypto/bridge/status/{operationId}) untilFILLED(orREFUNDED/FAILED).
Supported destination networks
| Network | destinationChainId |
|---|---|
| Ethereum | 1 |
| Optimism | 10 |
| BNB Smart Chain | 56 |
| Polygon | 137 |
| Base | 8453 |
| Arbitrum One | 42161 |
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:
| Header | Value |
|---|---|
Authorization | Bearer <token> |
Content-Type | application/json |
Request Body:
{
"fromAddress": "0x89f423567c2648BB828c3997f60c47b54f57Fa6e",
"amount": "100.0",
"asset": "USDT",
"originNetwork": "POLYGON",
"destinationChainId": 8453,
"destinationWallet": "0xabc0000000000000000000000000000000000123",
"userId": "user-123"
}| Field | Description |
|---|---|
fromAddress | Origin custodial wallet (tenant's). |
amount | Amount to transfer, in human units of the asset. |
asset | Asset to move (USDC or USDT). |
originNetwork | ETHEREUM | POLYGON | BSC. |
destinationChainId | Destination chainId (see table). |
destinationWallet | Destination wallet — must be on the tenant whitelist. |
Response 200:
{
"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:
{
"quoteId": "b1f2c3d4-...-q"
}Response 200:
{
"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.
{
"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
executewith the samequoteIddoes not duplicate the transfer. - Limits: each route has a minimum and maximum amount — values outside the range are rejected at quote time.