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, Tron, and Solana reach that hub through LayerZero. Arbitrum is currently the only live network in this environment. For now, the only tested and available route is Arbitrum (mainnet) to Bitcoin (Utexo signet). Bitcoin mainnet is not available yet.
Base URL (testnet / dev): https://transfer.dev.utexo.com/api/v0All paths in this reference are relative to the base URL. A mainnet base URL will be provided separately. Contact the Utexo team for production endpoint access.
The API is stateless and JSON-based. GET requests need no authentication. The POST /transfers/verify-bridge-in and POST /transfers/submit-transaction endpoints need a signature in the request body (see Authentication).

Transfer Flows

Understanding the transfer direction is essential before making any API calls. The API supports two directions:
RGB and Lightning destinations: The RGB-side destination is selected by networkId. Use 36 (mainnet) or 91 (testnet) for plain RGB, and 94 (mainnet) or 95 (testnet) for RGB Lightning. The destination accepts an RGB invoice (rgb:…) for plain RGB or a Lightning invoice string for RGB Lightning. Network ID 96 identifies Utexo and is not a Lightning network ID.

EVM → RGB or RGB Lightning

Move assets from an EVM network to a plain RGB or RGB Lightning destination.
1

Discover networks and tokens

GET /networks — list all connected networks.GET /networks/{network-id}/supported-tokens — list tokens supported on a given network.
2

Estimate fees

GET /transfers/estimate/{sender-network}/{recipient-network}/{token-id}/{amount} — get fee and confirmation time estimate before committing.
3

Pre-register the transfer

POST /transfers/bridge-in-signature — pre-register the transfer. Returns a transferId, fee estimation, and an empty signature (0x).
4

Call fundsIn() on the EVM contract

The user calls fundsIn() directly on the EVM bridge contract using the data returned in Step 3. This step happens client-side — the API does not broadcast this transaction.
5

Confirm the transaction

POST /transfers/verify-bridge-in — notify the mint with the on-chain tx hash to confirm the transfer.
6

Poll transfer status

GET /transfers/{tx} — poll using the triggering tx hash until the transfer reaches a terminal status (FINISHED, CANCELLED, or FAILED).
7

Retrieve destination invoice (optional)

GET /transfers/invoice/{tx-id}/{network-id} — fetch the RGB or Lightning invoice selected by network-id.

RGB or RGB Lightning → EVM

Move assets from a plain RGB or RGB Lightning wallet to an EVM network.
1

Discover networks and tokens

Same as EVM → RGB Step 1.
2

Estimate fees

Same as EVM → RGB Step 2.
3

Pre-register the transfer

POST /transfers/bridge-in-signature — returns the invoice for the selected RGB-side network in the signature field: an RGB invoice for plain RGB or a Lightning invoice for RGB Lightning.
4

Send RGB assets

The user pays the invoice string returned in Step 3 with the wallet appropriate for the selected RGB or RGB Lightning network.
5

Confirm the transfer

POST /transfers/verify-bridge-in — notify the mint that the RGB or Lightning invoice payment has been completed.
6

Poll transfer status

GET /transfers/{tx} — poll for status as in the EVM → RGB flow.

Authentication

Read-only endpoints (all GET requests) and POST /transfers/bridge-in-signature require no authentication header. The POST /transfers/verify-bridge-in and POST /transfers/submit-transaction endpoints validate the caller’s identity using a cryptographic signature embedded in the request body: A 401 response indicates an invalid authentication signature. A 403 response indicates the derived sender address does not match the pre-registered transfer.
The authentication scheme (signing algorithm, message format) is not formally specified in the current API spec. Validation required — contact the Utexo team for the canonical signing procedure before implementing.

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 200SupportedTokensResponse
The SupportedTokensResponse fields are PascalCase in the JSON response (e.g., Tokens, Limit, PageCount). This is a Go struct serialization artifact with no json tags. Deserialize accordingly.

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 200string Balance as a human-readable decimal string in token units (e.g., "100.50").

GET /networks/{network-id}/fetch-user-tokens/{user-address} — Fetch User Multitokens

Requests the gateway to fetch the user’s multitoken holdings for the specified network and address. Path Parameters Response 200 — Empty body. The current handler writes no JSON response on success. Error Responses

Transfers

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

Returns a fee and confirmation time estimate for a proposed transfer. Call this before pre-registering to give users a cost preview. Path Parameters Query Parameters Response 200Estimation

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 BodyBridgeInSignatureRequest
Response 200BridgeInSignatureData

GET /transfers/cancel-signature/{transfer-id}/{network-id}/{signature}/{public-key} — Request Cancellation Signature

The route is registered, but cancellation is currently unavailable. The handler returns 501 Not Implemented before parsing any path parameters or producing a cancellation signature. Path Parameters Response 501 — Standard error envelope with the message cancelling is unavailable.
Do not build a cancellation flow against this endpoint until the handler is enabled.

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 BodyVerifyBridgeInRequest
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/{tx} — Get Transfer Status

Returns the current state of a transfer identified by its triggering transaction hash. Poll this endpoint after calling verify-bridge-in until the transfer reaches a terminal status. Path Parameters Response 200 — Array of Transfer objects
Transfer Status Values
Poll GET /transfers/{tx} 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/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 200Page

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 200InvoiceResponse
For an RGB Lightning network ID, invoice contains the Lightning invoice string instead.

Transfer Types

The transferType field in BridgeInSignatureData indicates the internal routing mechanism selected for the transfer. Known values:
The semantic definitions of transferType values are not formally documented in the API spec. The descriptions above are inferred from naming conventions. Validation required — consult the Utexo engineering team before building routing-dependent logic on this field.

Error Responses

All endpoints return a consistent error envelope on failure.
Error Codes

Data Models

Address

Network

Token


Open Questions & Unresolved Issues

The following items require validation from the Utexo engineering or product team before this reference is considered complete:
  1. Authentication signing procedure — The message format and signing algorithm for authenticationSignature are not defined in the Swagger spec. Developers cannot implement verify-bridge-in or history without this information.
  2. transferType enum semantics — The values LP, WU, CCTP, NTV, MLT, BDXS, LPN appear in the spec enum but are not described. If transfer type affects the caller’s required behavior (e.g., approvals, contract calls), this must be documented.
  3. additionalAddresses field — Present in BridgeInSignatureRequest but its purpose and expected values are undocumented. Needs clarification.
  4. Mainnet base URL — The current spec host is empty; transfer.dev.utexo.com is the dev/testnet environment. The production base URL must be published before this reference goes external.
  5. SupportedTokensResponse PascalCase fields — Confirmed from the spec (NOTE: fields are PascalCase). This is an unusual JSON convention and should be explicitly called out in SDK wrappers or normalized in a future API version.

Glossary