Skip to main content

Overview

The Utexo Mint API exposes a REST interface for cross-chain asset transfers between EVM-compatible networks (currently Arbitrum) and the RGB protocol on Bitcoin.
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. No authentication header is required for read operations. Write operations (POST) use an authentication signature embedded in the request body (see Authentication).

Transfer Flows

Understanding the transfer direction is essential before making any API calls. The API supports two directions:

EVM → RGB

Move assets from an EVM network (e.g., Arbitrum) to an RGB wallet.
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 mint 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 RGB invoice (optional)

GET /transfers/invoice/{tx-id}/{network-id} — fetch the RGB invoice string associated with the transfer.

RGB → EVM

Move assets from an RGB 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 an RGB invoice string in the signature field. This invoice is what the user sends assets to.
4

Send RGB assets

The user sends RGB assets to the invoice string returned in Step 3 using their RGB wallet.
5

Confirm the transfer

POST /transfers/verify-mint-in — notify the mint that the RGB send 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) require no authentication. The POST /transfers/verify-mint-in endpoint validates the caller’s identity using a cryptographic signature embedded in the request body:
FieldDescription
authenticationSignatureHex-encoded signature proving ownership of the sender address
publicKeyHex-encoded public key or address of the sender
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 or name. Query Parameters
ParameterTypeRequiredDescription
token-idintegerNoFilter results to networks that support this token ID
searchstringNoFilter results by network name (partial match)
Response 200 — Array of Network objects
[
  {
    "id": 1,
    "name": "arbitrum",
    "type": "EVM",
    "mintContract": "0x...",
    "gasLimit": 200000,
    "iconLink": "https://...",
    "active": true,
    "explorerBaseUrl": "https://arbiscan.io"
  }
]

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
ParameterTypeRequiredDescription
network-idintegerYesThe network ID
Query Parameters
ParameterTypeRequiredDescription
token-idintegerNoIf set, returns a single Token object instead of a paginated list
searchstringNoFilter tokens by name or symbol
limitintegerNoNumber of results per page
pageintegerNoPage number (1-indexed)
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.
{
  "Tokens": [...],
  "Limit": 20,
  "Offset": 0,
  "PageCount": 3,
  "CurrentPage": 1,
  "TotalCount": 45
}

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
ParameterTypeRequiredDescription
network-idintegerYesThe network ID
token-idintegerYesThe token ID
user-addressstringYesUser address. For EVM networks, provide a hex-encoded address (with or without 0x prefix).
Response 200string Balance as a human-readable decimal string in token units (e.g., "100.50").

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
ParameterTypeRequiredDescription
sender-networkstringYesSender network name (e.g., arbitrum, rgb)
recipient-networkstringYesRecipient network name
token-idintegerYesToken ID — the same token is bridged on both sides
amountstringYesHuman-readable amount (e.g., 100.5)
Query Parameters
ParameterTypeRequiredDescription
sender-addressstringYesSender’s address on the sender network
recipient-addressstringYesRecipient’s address on the recipient network
Response 200Estimation
{
  "fee": "0.50",
  "feePercentage": "0.5",
  "stableFee": "0.10",
  "estimatedConfirmationTime": "5 minutes",
  "resultAmount": "99.40",
  "nativeFee": "0.0002",
  "nativeStableFee": "0.0001",
  "totalNativeCommission": "0.0003",
  "nativeTokenSymbol": "ETH",
  "swapResultAmount": "99400000"
}
FieldDescription
feeGas fee denominated in the transfer token
stableFeeFixed protocol fee in transfer token units
feePercentageProtocol fee as a percentage string
resultAmountAmount the recipient will receive after fees
nativeFeeGas fee in the sender’s native token (multi-token transfers)
nativeStableFeeStable fee in the sender’s native token (multi-token transfers)
totalNativeCommissionSum of nativeFee + nativeStableFee
nativeTokenSymbolSymbol of the native token used for commissions
swapResultAmountResult amount in the recipient token’s smallest units

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: Returns transferId, fee estimation, and an empty signature field (0x). The user then calls fundsIn() on the EVM bridge contract.
  • RGB → EVM: Returns an RGB invoice string in the signature field. The user sends RGB assets to this invoice.
Request BodyBridgeInSignatureRequest
{
  "sender": {
    "networkId": 1,
    "networkName": "arbitrum",
    "address": "0xYourEvmAddress"
  },
  "tokenId": 42,
  "amount": "100.5",
  "destination": {
    "networkId": 2,
    "networkName": "rgb",
    "address": "your-rgb-address"
  },
  "additionalAddresses": []
}
FieldTypeRequiredDescription
senderAddressYesSender network, ID, and address
tokenIdintegerYesToken ID (same token on both chains)
amountstringYesHuman-readable amount (e.g., "100.5")
destinationAddressYesRecipient network, ID, and address
additionalAddressesstring[]NoAdditional addresses (use case: TBD — validation required)
Response 200BridgeInSignatureData
{
  "token": "0xTokenContractAddress",
  "amount": "100500000",
  "gasCommission": "50000",
  "destination": { ... },
  "deadline": "1719999999",
  "nonce": 7,
  "transferId": 1024,
  "signature": "0x",
  "transferType": "LP",
  "estimation": { ... },
  "totalCommission": "600000"
}
FieldDescription
tokenEVM token contract address
amountTransfer amount in smallest token units (not human-readable)
deadlineEVM: UNIX timestamp expiry. RGB: always "0"
nonceNonce for the EVM bridge contract call
transferIdInternal transfer ID — store this for use in verify-bridge-in
signatureEVM → RGB: "0x" (empty). RGB → EVM: RGB invoice string
transferTypeTransfer routing type — see Transfer Types
totalCommissionTotal commission in smallest token units

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), or
  • The RGB asset send to the invoice is complete (RGB → EVM)
Request BodyVerifyBridgeInRequest
{
  "transferId": 1024,
  "networkId": 1,
  "txHash": "abcdef1234...",
  "publicKey": "0xYourPublicKeyOrAddress",
  "authenticationSignature": "hex-encoded-signature"
}
FieldTypeRequiredDescription
transferIdintegerYesTransfer ID from bridge-in-signature response
networkIdintegerYesSender’s network ID
txHashstringYes (EVM)Hex-encoded tx hash without0x prefix. May be empty for RGB.
publicKeystringYesSender public key or address
authenticationSignaturestringYesHex-encoded signature proving address ownership
Response 200 — Empty body (null). Accepted. Error Responses
StatusMeaning
401Authentication signature is invalid
403Sender address derived from the signature does not match the pre-registered transfer
500Internal server error

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
ParameterTypeRequiredDescription
txstringYesTriggering tx hash, hex-encoded without0x prefix
Response 200 — Array of Transfer objects
[
  {
    "id": 1024,
    "senderAmount": "100.5",
    "recipientAmount": "99.9",
    "commission": "0.6",
    "status": "FINISHED",
    "createdAt": "2026-06-18T09:00:00Z",
    "sender": { "networkId": 1, "networkName": "arbitrum", "address": "0x..." },
    "recipient": { "networkId": 2, "networkName": "rgb", "address": "..." },
    "senderToken": { "id": 42, "shortName": "USDT", "longName": "Tether USD", "iconLink": "..." },
    "recipientToken": { ... },
    "triggeringTx": { "networkName": "arbitrum", "hash": "abc123..." },
    "outboundTx": { "networkName": "rgb", "hash": "def456..." }
  }
]
Transfer Status Values
StatusDescription
WAITINGTransfer registered, awaiting on-chain confirmation
CONFIRMINGOn-chain transaction detected, awaiting sufficient confirmations
ETCHINGRGB asset inscription in progress
FINISHEDTransfer completed successfully
CANCELINGCancellation in progress
CANCELLEDTransfer was cancelled
FAILEDTransfer failed — check outboundTx for details
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
ParameterTypeRequiredDescription
signature-hexstringYesHex-encoded signature proving address ownership
pub-key-hexstringYesHex-encoded public key or address
Query Parameters
ParameterTypeRequiredDescription
offsetintegerYesPagination offset (number of records to skip)
limitintegerYesNumber of records to return (must be > 0)
network-idintegerYesNetwork ID to filter history by
addressstringNoUser address — required for Bitcoin native addresses
Response 200Page
{
  "transfers": [...],
  "offset": 0,
  "limit": 20,
  "totalCount": 142
}

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

Returns the RGB invoice string associated with a completed or pending transfer. RGB-specific. Path Parameters
ParameterTypeRequiredDescription
tx-idintegerYesInternal transfer ID (from bridge-in-signature response)
network-idintegerYesRGB network ID
Response 200InvoiceResponse
{
  "invoice": "rgb:..."
}

Transfer Types

The transferType field in BridgeInSignatureData indicates the internal routing mechanism selected for the transfer. Known values:
ValueDescription
LPLiquidity pool route
WUWire-up route
CCTPCircle Cross-Chain Transfer Protocol
NTVNative token transfer
MLTMulti-leg transfer
BDXSBridge-DEX swap
LPNLightning-pegged native
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": "human-readable error message",
  "code": 1
}
Error Codes
CodeMeaning
1RGB protocol error
2User balance error (insufficient funds)
3System balance error (bridge liquidity issue)
65535Other / unclassified error

Data Models

Address

{
  "networkId": 1,
  "networkName": "arbitrum",
  "address": "0x..."
}

Network

{
  "id": 1,
  "name": "arbitrum",
  "type": "EVM",
  "bridgeContract": "0x...",
  "gasLimit": 200000,
  "iconLink": "https://...",
  "active": true,
  "explorerBaseUrl": "https://arbiscan.io"
}

Token

{
  "id": 42,
  "shortName": "USDT",
  "longName": "Tether USD",
  "smartContractAddress": "0x...",
  "decimals": 6,
  "iconLink": "https://...",
  "active": true,
  "native": false
}

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 MintInSignatureRequest 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

TermDefinition
RGBA client-side validated smart contract protocol built on Bitcoin. Assets are issued and transferred using Bitcoin UTXOs as state anchors.
RGB InvoiceA blinded payment request string used to receive RGB assets. Contains blinded UTXO data to preserve receiver privacy.
EVMEthereum Virtual Machine — the execution environment used by Arbitrum and other compatible chains.
Mint ContractThe EVM smart contract that locks or releases assets on the EVM side of a cross-chain transfer.
fundsIn()The method on the EVM mint contract the sender calls to deposit assets for minting.
transferIdThe mint’s internal identifier for a pre-registered transfer. Used in verify-mint-in and invoice retrieval.
Triggering TxThe on-chain transaction that initiates the mint — the EVM deposit tx (EVM → RGB) or the RGB send (RGB → EVM).
UTXOUnspent Transaction Output — the fundamental unit of Bitcoin accounting. RGB asset state is anchored to UTXOs.

Endpoint Reference

All endpoints are relative to the base URL (https://transfer.dev.utexo.com/api/v0).

GET /networks

Summary: List connected networks Returns all connected networks. If token-id is set, returns only networks supporting that token. If search is set, filters by network name. Query Parameters
ParameterTypeDescription
token-idintegerFilter by token ID
searchstringFilter by network name
Response 200 Returns an array of Network objects.
[
  {
    "id": 42161,
    "name": "Arbitrum One",
    "type": "EVM"
  }
]

GET /networks//supported-tokens

Summary: List supported tokens for a network Returns all tokens supported on the given network. Path Parameters
ParameterTypeDescription
idintegerNetwork ID
Query Parameters
ParameterTypeDescription
searchstringFilter by token name
Response 200 Returns a SupportedTokensResponse object. Note: response fields are PascalCase.
{
  "Tokens": [
    {
      "Id": 1,
      "Name": "USDT",
      "ContractAddress": "0x..."
    }
  ]
}

GET /transfers/estimate////

Summary: Estimate transfer fees Returns a fee and confirmation time estimate before committing to a transfer. Path Parameters
ParameterTypeDescription
sender-networkintegerSource network ID
recipient-networkintegerDestination network ID
token-idintegerToken ID to transfer
amountstringTransfer amount
Response 200 Returns a TransferEstimate object with fee and timing information.

POST /transfers/bridge-in-signature

Summary: Pre-register an EVM to RGB transfer Pre-registers the transfer on the mint. Returns a transferId, fee estimation, and an empty EVM signature (0x) that the caller must populate before calling fundsIn() on the EVM mint contract. Request Body (application/json)
FieldTypeRequiredDescription
authenticationSignaturestringYesAuthentication signature (see Authentication)
senderAddressstringYesEVM sender address
recipientInvoicestringYesRGB invoice from the recipient’s wallet
networkIdintegerYesSource EVM network ID
tokenIdintegerYesToken ID to transfer
amountstringYesTransfer amount
additionalAddressesarrayNoAdditional addresses (purpose TBD - contact Utexo team)
Response 200 Returns a MintInSignatureResponse with the transferId and EVM call data.
{
  "transferId": "abc123",
  "signature": "0x",
  "feeEstimate": "0.001"
}

POST /transfers/verify-bridge-in

Summary: Confirm an EVM to RGB transfer Notifies the mint with the on-chain EVM transaction hash after the user has called fundsIn(). The mint validates the transaction and initiates the RGB asset transfer. Request Body (application/json)
FieldTypeRequiredDescription
authenticationSignaturestringYesAuthentication signature
transferIdstringYesTransfer ID from POST /transfers/bridge-in-signature
txHashstringYesEVM transaction hash of the fundsIn() call
Response 200 Returns confirmation of receipt.

GET /transfers/

Summary: Poll transfer status Returns the current status of a transfer by its triggering transaction hash. Path Parameters
ParameterTypeDescription
txstringTriggering transaction hash
Response 200 Returns a TransferStatus object.
{
  "status": "pending",
  "transferId": "abc123"
}

GET /transfers/invoice//

Summary: Get RGB invoice for RGB to EVM transfer Generates an RGB invoice that the sender uses to initiate an RGB to EVM transfer. The invoice encodes the blinded UTXO and transfer parameters. Path Parameters
ParameterTypeDescription
tx-idstringTransfer ID
network-idintegerDestination EVM network ID
Response 200 Returns an InvoiceResponse containing the RGB invoice string.
{
  "invoice": "rgb:..."
}

POST /transfers/verify-bridge-in

Summary: Confirm an RGB to EVM transfer Confirms an RGB to EVM transfer after the sender has broadcast the RGB transaction. Provide the RGB send transaction details so the mint can verify and release EVM-side assets. Request Body (application/json)
FieldTypeRequiredDescription
authenticationSignaturestringYesAuthentication signature
transferIdstringYesTransfer ID
rgbTxDatastringYesSigned RGB transaction data
Response 200 Returns confirmation of receipt.