Skip to main content

Overview

The Utexo Mint API is a network-agnostic REST interface for cross-network asset transfers. Clients must discover the networks currently connected to an environment with GET /networks instead of hardcoding network availability. USDT0 settles natively on Arbitrum, which acts as the hub; Ethereum, Polygon PoS, Plasma and Tron reach that hub through USDT0 / LayerZero and the Utexo entrypoint contracts.
Base URL (staging): https://transfer.gateway.stage.utexo.com/api/v0All paths in this reference are relative to the base URL. Contact the Utexo team for production endpoint access and for an operator API key.Interactive API docs: https://transfer.gateway.stage.utexo.com/api/v0/docs/
The API is stateless and JSON-based. The network, token, estimate and unlock-capacity endpoints are public. The mint and burn endpoints (/mint/op-id, /lock/{opId}/status and /unlock) need an operator API key (see Authentication).

Transfer Flows

The Mint moves USDT in two directions: lock and mint (USDT0 on EVM → USDT on Bitcoin) and burn and unlock (USDT on Bitcoin → USDT0 on EVM).
RGB network ID: take the RGB-side network from GET /networks. On the current environment it is the UTEXO network (ID 96). The RGB wallet must use an rgb-lib version that supports the BFA asset schema, for example RGB Lightning Node v0.15.0-beta.3 or later.
RGB Lightning is work in progress. RGB Lightning network IDs (94 mainnet, 95 testnet) appear in the API, but Lightning destinations are not available yet. This section will be updated once they go live.

Lock and mint: EVM → RGB

1

Discover networks and tokens

GET /networks — list the connected networks and take the id of the source network and of the RGB network.GET /networks/{network-id}/supported-tokens — take the token id on each side. USDT is the only token bridged today.
2

Estimate the transfer

GET /transfers/estimate/{sender-network}/{recipient-network}/{sender-token-id}/{recipient-token-id}/{amount} — preview fees and the amount the recipient receives.
3

Create an RGB invoice

The recipient’s RGB wallet creates an invoice for the USDT asset.
4

Prepare the mint

POST /mint/op-id (operator key) — submit the invoice, the amount and the source network. The response contains the opId, the settlementData to pass to the deposit, and ttlSeconds. If the source network uses an entrypoint contract, the response also contains an entrypoint object.
5

Lock USDT0

Before ttlSeconds runs out, the user calls fundsIn() on the Arbitrum bridge contract and passes settlementData verbatim as the settlementData argument. On a network that uses an entrypoint contract, the user calls that contract with the returned depositParams instead. This step happens client-side; the API does not broadcast the transaction.
6

Track the mint

GET /lock/{opId}/status (operator key) — poll until the status is completed or expired.

Burn and unlock: RGB → EVM

1

Check the release capacity

GET /unlock/capacity/{srcNetworkId}/{networkId}/{tokenId} — read available. A burn cannot be undone, so do not burn more than available.
2

Burn USDT on Bitcoin

Burn the amount in the RGB wallet and name the EVM recipient. The burn recipient is 32 bytes: 12 zero bytes followed by the 20-byte EVM address. With RGB Lightning Node, call POST /burn with burn_recipient, then get the burn consignment with POST /getconsignment (asset ID and the burn txid). It returns the consignment as hex; convert it to base64 for the next step.
3

Submit the burn consignment

POST /unlock (operator key) — send the base64-encoded consignment. You can submit it before the burn has its Bitcoin confirmations: until it does, the API returns 409 with code 6, 7 or 8, and you retry the same request later.
4

Confirm the release

The response contains the evmTxHash of the submitted release and the recipient read from the burn. The release confirms on the EVM network asynchronously.

Authentication

Operator API key

POST /mint/op-id, GET /lock/{opId}/status and POST /unlock need the operator API key in the X-API-Key header. A missing or invalid key returns 401. Keep the key on a trusted backend: do not embed it in a browser app or an untrusted wallet. Contact the Utexo team to get a key.

Signature authentication

The other endpoints need no API key. Three of them authenticate the caller with a signature, differing only in where the signature travels — in the path for GET /transfers/history/{signature-hex}/{pub-key-hex}, in the request body for POST /transfers/verify-bridge-in and POST /transfers/submit-transaction: Signing procedure. The signed message is the constant string Bridge Authentication Proof. Verification depends on the network type:
  • EVM and Tron — the public key is recovered from the signature, converted to an address, and compared against publicKey.
  • RGB and RGB Lightning — authentication is handled inside those networks; no signature check happens at this layer.
A 401 response indicates an invalid authentication signature. A 403 response indicates the derived sender address does not match the pre-registered transfer.

Endpoints

Networks

GET /networks — List Connected Networks

Returns all connected networks. Optionally filter by token, source network, or name. Query Parameters Response 200 — Array of Network objects

GET /networks/{network-id}/supported-tokens — List Supported Tokens

Returns a paginated list of tokens supported on a given network. If token-id is provided as a query parameter, returns a single Token object instead of a paginated response. Path Parameters Query Parameters Response 200 — SupportedTokensResponse

GET /networks/{network-id}/balance/{token-id}/{user-address} — Get User Token Balance

Returns the token balance for a specific user address on a given network. Path Parameters Response 200 — string Balance as a human-readable decimal string in token units (e.g., "100.50").

Mint and burn

POST /mint/op-id — Prepare a Mint

Prepares the RGB side of a lock-and-mint transfer and returns the data the deposit must carry. It does not move tokens or submit the EVM transaction. Requires the operator API key. Request Body
Response 200

GET /lock/{opId}/status — Get Mint Status

Returns the state of a prepared mint. Poll it after the deposit is submitted. Requires the operator API key. Response 200
evmTxHash is the detected deposit transaction on the EVM network. It is omitted until the deposit is detected.

GET /unlock/capacity/{srcNetworkId}/{networkId}/{tokenId} — Get Release Capacity

Returns how much can be released right now for a burn. Call it before you burn. No authentication. Path Parameters Response 200

POST /unlock — Release After a Burn

Validates a burn consignment, gets the release signatures and submits the EVM release. The amount and the recipient are read from the burn itself; the request cannot change them. Requires the operator API key. Request Body
Response 200
Error Responses

Transfers

The pre-registration endpoints in this group (bridge-in-signature, verify-bridge-in, submit-transaction and invoice) belong to the earlier transfer flow. Transfers between USDT0 and USDT on Bitcoin use the mint and burn endpoints.

GET /transfers/estimate/{sender-network}/{recipient-network}/{sender-token-id}/{recipient-token-id}/{amount} — Estimate Transfer Fees

Returns a fee and confirmation time estimate for a proposed transfer. Call it before you prepare the mint to show the user a cost preview. Path Parameters Query Parameters Response 200 — Estimation

POST /transfers/bridge-in-signature — Pre-Register Transfer

Pre-registers a transfer and returns the data needed for the user to initiate the on-chain action.
  • EVM → RGB or RGB Lightning: Returns transferId, fee estimation, and an empty signature field (0x). The user then calls fundsIn() on the EVM bridge contract.
  • RGB or RGB Lightning → EVM: Returns the invoice string for the selected RGB-side network in the signature field. The user pays that RGB or Lightning invoice.
Request Body — BridgeInSignatureRequest
Response 200 — BridgeInSignatureData

POST /transfers/verify-bridge-in — Confirm Bridge-In Transaction

Notifies the bridge that the user has completed the on-chain or off-chain send action. Must be called after:
  • The EVM fundsIn() transaction is broadcast (EVM → RGB/RGB Lightning), or
  • The RGB or Lightning invoice payment is complete (RGB/RGB Lightning → EVM)
Request Body — VerifyBridgeInRequest
Response 200 — Empty body (null). Accepted. Error Responses

POST /transfers/submit-transaction — Submit Signed Transaction

Submits signed transaction data for a pre-registered transfer and returns the resulting transaction hash. Request Body Response 200
Error Responses

GET /transfers/history/{signature-hex}/{pub-key-hex} — Get Transfer History

Returns a paginated list of transfers associated with a user’s address. Identity is proven by providing a signature. Path Parameters Query Parameters Response 200 — Page
Transfer Status Values
Poll history at a reasonable interval (e.g., every 5–10 seconds). Avoid aggressive polling — the bridge requires Bitcoin confirmations for RGB-leg completions, which may take several minutes.

GET /transfers/invoice/{tx-id}/{network-id} — Get RGB or Lightning Invoice

Returns the invoice associated with a completed or pending transfer. The network-id selects plain RGB (36 mainnet, 91 testnet) or RGB Lightning (94 mainnet, 95 testnet). Path Parameters Response 200 — InvoiceResponse
For an RGB Lightning network ID, invoice contains the Lightning invoice string instead.

Transfer Types

The transferType field in BridgeInSignatureData names the transfer model the bridge uses. The Mint uses a single model, returned as WU: Clients can treat this field as informational.

Error Responses

All endpoints return a consistent error envelope on failure.
Error Codes Codes 6, 7 and 8 come with HTTP 409 from POST /unlock, and a details object with the numbers behind the wait (for example confirmations and requiredConfirmations for code 7). Nothing is sent to the EVM network, and the burn stays redeemable.

Data Models

Address

Network

Token


Glossary