> ## Documentation Index
> Fetch the complete documentation index at: https://docs.daya.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a bridge

> Create a merchant-owned request to move USDT between chains

## Overview

Returns `201` with a direct `bridge` resource and assigned deposit address. Read [Bridges](/concepts/bridges) for amounts, timing, fees, and refunds.

## Authentication

**X-Api-Key** `string` *required*

An active merchant API key with `withdraw` scope. A `write` grant alone is insufficient. Reads require `read`.

**X-Idempotency-Key** `string` *required*

Use one key for this request and retain it for retries. `Idempotency-Key` is also accepted. Reuse the same header and body after a timeout.

## Request body

Only temporary bridges are supported. All fields below are required for this type. Amounts use major token units.

**type** `string` *required*

`TEMPORARY`. There is no default.

**asset** `string` *required*

Asset code. Currently only `USDT` is supported. There is no default. Daya pays the same asset.

**amount** `string` *required*

Required for `TEMPORARY`. Expected deposit from `1` to `100000`, inclusive, with at most six decimal places. Use a decimal string, with no exponent. Each actual deposit is processed separately.

**deposit\_chain** `string` *required*

`POLYGON`, `BSC`, `SOLANA`, or `APTOS`. The asset must support deposits and refunds on this chain.

**destination\_chain** `string` *required*

A different chain from the same list, with withdrawals enabled for the asset.

**destination\_address** `string` *required*

A valid recipient address on `destination_chain`.

**refund\_address** `string` *required*

A valid return address on `deposit_chain`. It is fixed when the request is created.

Send only the fields above. Unknown fields are rejected.

## Example

These addresses are illustrative test data. Replace them with addresses you control when integrating.

```bash theme={"dark"}
curl --request POST \
  --url https://api.daya.co/v1/bridges \
  --header 'X-Api-Key: YOUR_API_KEY' \
  --header 'X-Idempotency-Key: bridge-create-001' \
  --header 'Content-Type: application/json' \
  --data '{
  "type": "TEMPORARY",
  "asset": "USDT",
  "amount": "500",
  "deposit_chain": "POLYGON",
  "destination_chain": "BSC",
  "destination_address": "0x2222222222222222222222222222222222222222",
  "refund_address": "0x3333333333333333333333333333333333333333"
}'
```

```json 201 Created theme={"dark"}
{
  "object": "bridge",
  "id": "750e8400-e29b-41d4-a716-446655440000",
  "type": "TEMPORARY",
  "status": "ACTIVE",
  "asset": "USDT",
  "amount": "500.000000",
  "deposit_chain": "POLYGON",
  "destination_chain": "BSC",
  "destination_address": "0x2222222222222222222222222222222222222222",
  "refund_address": "0x3333333333333333333333333333333333333333",
  "deposit_address": "0x1111111111111111111111111111111111111111",
  "expires_at": "2026-10-11T12:30:00Z",
  "created_at": "2026-10-11T12:00:00Z"
}
```

The payment window is 30 minutes. Stop showing payment instructions at `expires_at`. See the [response fields](/api-reference/bridges/get-bridge#response).

## Idempotency and errors

Use the same key and body when retrying. Successful retries return the original response and do not extend the payment deadline. Use GET for current status. Keys are retained for 24 hours by default; retrying after that period can create another bridge. Changing the body under the same retained key returns `409`.

| HTTP status | Meaning |
| - | - |
| `400` | Missing or invalid fields, unsupported asset/chain, same chains, invalid address, or missing idempotency key. |
| `401` | Invalid or missing API key. |
| `403` | Missing `withdraw` scope or account access is restricted. |
| `409` | Conflicting or in-progress idempotency request. Restore the original body for a conflict; wait for the original to finish if it is still in progress. |
| `429` | `RATE_LIMITED`: an unfunded request quota is reached. The message identifies the limit; observe `Retry-After` when returned. |
| `502` | Address provisioning failed. |
| `503` | `BRIDGE_UNAVAILABLE`: bridging is temporarily unavailable. Retry with the same key. |
| `500` | Internal error. Keep the original key when retrying. |

After a `429` quota rejection, wait for `Retry-After`, then retry with the same idempotency key and body. If you do not know whether creation succeeded, keep the original key to avoid a duplicate bridge.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.