Skip to main content
REST reference for Gateway deposit addresses — using Eco orchestration to route Gateway deposits through fast-finality chains like Polygon. A complete integration uses three endpoints in order:
1

Register the deposit address

POST /api/v1/depositAddresses/gateway/polygon — returns a deterministic evmDepositAddress.
2

Fund it

POST /api/v1/gasless/transferWithAuthorization (recommended) or POST /api/v1/gasless/permit — returns a jobId.
3

Confirm delivery

GET /api/v1/gasless/jobs/{id} for the relayer job, and optionally POST /api/v1/intents/intentStatus for the Gateway-side fulfillment.

Environments

EnvironmentBase URL
Mainnethttps://deposit-addresses.eco.com
Preproduction (testnet)https://deposit-addresses-preproduction.eco.com
All responses are wrapped as { "data": ... } unless otherwise noted.

Endpoint summary

MethodPathPurpose
POST/api/v1/depositAddresses/gateway/polygonGenerate a Gateway deposit address (source chain → Polygon)
GET/api/v1/depositAddresses/evmAddress/{evmAddress}Get deposit address record
GET/api/v1/depositAddresses/queryQuery deposit addresses
POST/api/v1/gasless/transferWithAuthorizationQueue a gasless ERC-3009 transfer
POST/api/v1/gasless/permitQueue a gasless EIP-2612 Permit transfer
GET/api/v1/gasless/jobs/{id}Poll gasless transfer job status
POST/api/v1/intents/intentStatusGet status of the underlying Routes intents
GET/api/v1/intents/queryQuery intents with filters
GET/api/v1/intents/intentExistsRace-safe existence check for an intent

1. Register a deposit address

Generate Gateway deposit address (source chain → Polygon)

Routes USDC from the source chain through CCTP to Circle Gateway on Polygon. Same inputs always return the same evmDepositAddress.
POST /api/v1/depositAddresses/gateway/polygon
{
  "chainId": 8453,
  "depositor": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
  "evmDestinationAddress": "0x1234567890123456789012345678901234567890"
}
FieldTypeDescription
chainIdnumberSource chain ID
depositorstringEVM address authorized for refunds if the intent expires
evmDestinationAddressstringRecipient credited on Gateway (Polygon)
Supported source chains: Base (8453), Optimism (10), Arbitrum (42161) on mainnet; Base Sepolia (84532), OP Sepolia (11155420), Arb Sepolia (421614) on preproduction. Response (201 Created):
{
  "data": {
    "evmDepositAddress": "0x...",
    "isDeployed": false,
    "createdAt": "..."
  }
}

Get deposit address

GET /api/v1/depositAddresses/evmAddress/{evmAddress}
Returns the deposit address record including isDeployed, lastCheckedBalance, lastBlockNumber, and deploymentTxHash once the contract has been deployed.

Query deposit addresses

GET /api/v1/depositAddresses/query
Optional filters: chainId, factoryAddress, depositor, evmDepositAddress, isDeployed.

2. Fund the deposit address (gasless)

Two signature-based flows. Both queue the transfer via RabbitMQ (prefetch=1, serialized to prevent operator-wallet nonce collisions), the operator wallet broadcasts, and clients poll /gasless/jobs/{id}.
StandardUser txsNotes
ERC-3009 transferWithAuthorization0Recommended. Single on-chain tx, USDC-native
EIP-2612 Permit0Fallback for tokens that support permit() but not ERC-3009
Preconditions: deposit address must already exist on chainId, signer must hold sufficient USDC, and validBefore / deadline must be in the future. See Deposit methods for EIP-712 signing code.

Queue ERC-3009 transferWithAuthorization

POST /api/v1/gasless/transferWithAuthorization
Returns 202 Accepted.
{
  "chainId": 8453,
  "from": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
  "to": "0x1234567890123456789012345678901234567890",
  "value": "1000000",
  "validAfter": "0",
  "validBefore": "1717200000",
  "nonce": "0x<64-hex-chars>",
  "signature": "0x<130-hex-chars>"
}
FieldTypeDescription
chainIdnumberChain where the transfer executes
fromstringToken owner (signer)
tostringDeposit address receiving the tokens
valuestringRaw token units (e.g. "1000000" = 1 USDC)
validAfterstringEarliest unix second the auth is valid
validBeforestringLatest unix second the auth is valid
noncehexRandom bytes32 (replay protection)
signaturehex65-byte ERC-3009 signature (130 hex chars, 0x-prefixed)
Server flow: single transferWithAuthorization() on USDC moves tokens directly from from to to; the deposit address’s balance monitor then deploys the contract (first time) and publishes the Routes intents.

Queue EIP-2612 Permit transfer

POST /api/v1/gasless/permit
Returns 202 Accepted.
{
  "chainId": 8453,
  "owner": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
  "depositAddress": "0x1234567890123456789012345678901234567890",
  "value": "1000000",
  "deadline": "1717200000",
  "signature": "0x<130-hex-chars>"
}
FieldTypeDescription
chainIdnumberChain where the transfer executes
ownerstringToken owner (signer of the permit)
depositAddressstringSpender; the deposit address contract
valuestringRaw token units
deadlinestringPermit deadline (unix seconds)
signaturehex65-byte EIP-2612 signature
Server flow: permit() on USDC, then createIntentWithApproval(funder) on the deposit contract — atomically pulls tokens via transferFrom and publishes the intents.

3. Confirm delivery

Poll gasless job status

GET /api/v1/gasless/jobs/{id}
{
  "data": {
    "id": "<uuid>",
    "status": "PENDING",
    "permitTxHash": "0x...",
    "transferTxHash": "0x...",
    "intentHash": "0x...",
    "amount": "1000000",
    "error": null
  }
}
Status values: PENDINGPERMIT_SENT (Permit flow only) → COMPLETED | FAILED. 404 if the job ID is unknown. FAILED means the service couldn’t initiate the transfer — tokens never left the user’s wallet; the signature just expires.

Get intent status

Once the relayer tx is on-chain, use the intent hash from the job (or from the deposit record) to track fulfillment on Polygon.
POST /api/v1/intents/intentStatus
Proxied to the Routes quotes service. Returns an array of intent statuses (ordered by log index) for intents created in the same transaction. Provide one of intentHash, intentCreatedHash, or fulfillmentHash. Limited to 100 results.
{
  "intentHash": "0x...",
  "intentCreatedHash": "0x...",
  "fulfillmentHash": "0x..."
}
Response (abridged):
{
  "data": [
    {
      "intentHash": "0x...",
      "status": { "status": "fulfilled", "subStatus": "settled" },
      "intentData": { "...": "..." },
      "sendingTxs": [],
      "receivingTxs": []
    }
  ]
}

Query intents

GET /api/v1/intents/query
Optional filters: chainId, depositAddress, intentHash, txHash, fulfilledTxHash, status.

Intent exists

GET /api/v1/intents/intentExists?intentHash=0x...&txHash=0x...
Returns true/false. Supplying txHash enables a race-safe lookup.

Validation rules

  • EVM addresses: must pass isEthereumAddress (EIP-55 / lowercase hex)
  • chainId: integer >= 1
  • value / deadline / validAfter / validBefore: non-negative integer strings
  • nonce: 0x-prefixed 32-byte hex (64 hex chars)
  • signature: 0x-prefixed 65-byte hex (130 hex chars)