Overview
The crypto rail enables blockchain-based transfers of stablecoins across multiple chains. Unlike traditional payment rails that route through banking networks, crypto payments settle directly on-chain, offering global reach without geographic restrictions. OpenFX supports 7 blockchain networks and 4 stablecoin assets.
Crypto payments on OpenFX are created through the POST /payments/crypto endpoint with a crypto_wallet payment method.
Crypto payments on OpenFX are stablecoin-only. The platform does not support volatile cryptocurrency transfers (BTC, ETH, etc.). All supported assets are fiat-pegged stablecoins designed for payments and settlement.
Supported chains and assets
Blockchain networks
| Chain | Description | Typical confirmation time | Network fees |
|---|
ethereum | Ethereum mainnet | 2-5 minutes | Higher (gas fees) |
solana | Solana mainnet | Seconds | Very low |
tron | TRON mainnet | 1-3 minutes | Low |
base | Base L2 (Coinbase) | Seconds | Very low |
polygon | Polygon PoS | 2-5 minutes | Low |
ink | Ink L2 | Seconds | Very low |
sui | Sui mainnet | Seconds | Very low |
Supported assets
| Asset | Name | Description |
|---|
USDC | USD Coin | USD-pegged stablecoin by Circle. Available on all 7 chains. |
USDT | Tether USD | USD-pegged stablecoin by Tether. Available on Ethereum, Tron, Solana, Polygon. |
EURC | Euro Coin | EUR-pegged stablecoin by Circle. Available on Ethereum, Base, Solana. |
PYUSD | PayPal USD | USD-pegged stablecoin by PayPal/Paxos. Available on Ethereum, Solana. |
For the lowest fees and fastest settlement, use Solana or Base chains. Ethereum mainnet has the highest network fees but the broadest ecosystem support. TRON is widely used for USDT transfers in Asia.
Prerequisites
Before creating a crypto payment, you need:
- An active customer (KYB approved) with a funded crypto account (
wallet type) holding the target asset on the target chain
- A counterparty with a
crypto_wallet payment method containing:
chain — The blockchain network (ethereum, solana, tron, base, polygon, ink, sui)
walletAddress — The destination wallet address on the specified chain
Creating a crypto payment
curl -X POST https://sandbox.api.openfx.com/v1/payments/crypto \
-H "Authorization: Bearer $API_KEY" \
-H "X-Signature: $SIGNATURE" \
-H "X-Timestamp: $TIMESTAMP" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"sourceAccountId": "acc_01953e1a5f4b7070",
"counterpartyId": "cpt_01953e1a5f4b7035",
"paymentMethodId": "pm_01953e1a5f4b7360",
"amount": {
"asset": "USDC", "value": "10000000000", "chain": "solana"
},
"network": "solana",
"reference": "Settlement payment - March 2026"
}'
Request fields
| Field | Required | Description |
|---|
sourceAccountId | Yes | The funded crypto account (wallet type) to debit |
paymentMethodId | Yes | The crypto_wallet payment method with chain and wallet address |
counterpartyId | No | The counterparty (can be inferred from payment method) |
amount | Yes | CryptoMoney object with asset, amount, and chain |
network | No | Target blockchain network. Should match the payment method chain. |
travelRule | Conditional | FATF Travel Rule data. Required above jurisdictional thresholds. See below. |
reference | No | Internal reference for the transfer |
metadata | No | Up to 50 key-value pairs for internal tracking |
Travel rule compliance
FATF Recommendation 16 (the “Travel Rule”) requires Virtual Asset Service Providers (VASPs) to exchange originator and beneficiary information for crypto transfers. The requirements vary by jurisdiction:
| Jurisdiction | Threshold | Requirement |
|---|
| EU / UK | All transfers | Full originator and beneficiary data required for every transfer, regardless of amount |
| US | $3,000 | Travel rule data required for transfers of $3,000 or more |
| FATF standard | $1,000 | Travel rule data required for transfers of $1,000 or more |
For EU and UK originated or received crypto transfers, travel rule data is required for all transfers regardless of amount. Omitting travel rule data when required will cause the payment to fail.
Creating a crypto payment with travel rule data
curl -X POST https://sandbox.api.openfx.com/v1/payments/crypto \
-H "Authorization: Bearer $API_KEY" \
-H "X-Signature: $SIGNATURE" \
-H "X-Timestamp: $TIMESTAMP" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"sourceAccountId": "acc_01953e1a5f4b7070",
"counterpartyId": "cpt_01953e1a5f4b7035",
"paymentMethodId": "pm_01953e1a5f4b7360",
"amount": {
"asset": "USDC", "value": "50000000000", "chain": "ethereum"
},
"network": "ethereum",
"travelRule": {
"originator": {
"name": "Horizon Payments Ltd",
"accountNumber": "acc_01953e1a5f4b7070",
"entityType": "business",
"address": {
"line1": "100 Financial Drive",
"city": "San Francisco",
"state": "CA",
"postalCode": "94105",
"country": "US"
}
},
"beneficiary": {
"name": "Global Trading Co",
"accountNumber": "0x742d35Cc6634C0532925a3b844Bc9e7595f2bD68",
"entityType": "business",
"address": {
"line1": "10 Finsbury Square",
"city": "London",
"postalCode": "EC2A 1AF",
"country": "GB"
}
},
"beneficiaryVasp": {
"name": "Receiving Exchange Ltd",
"lei": "5493001KJTIIGC8Y1R17",
"jurisdiction": "GB"
}
},
"reference": "Cross-border settlement Q1-2026"
}'
Travel rule data structure
The travelRule object contains:
| Field | Description |
|---|
originator | TravelRuleParty — The sending party. Auto-populated from the customer entity when omitted. |
beneficiary | TravelRuleParty — The receiving party. Required for above-threshold transfers. |
originatorVasp | TravelRuleVasp — The sending VASP (OpenFX). Auto-populated. |
beneficiaryVasp | TravelRuleVasp — The receiving VASP. Name, LEI, and jurisdiction. |
Each TravelRuleParty contains:
| Field | Required | Description |
|---|
name | Yes | Full legal name |
accountNumber | Yes | Account or wallet address |
address | Conditional | Required for above-threshold transfers |
dateOfBirth | Conditional | Required for above-threshold individual transfers (when nationalIdentification is not provided) |
nationalIdentification | Conditional | Required for above-threshold transfers (when dateOfBirth is not provided) |
entityType | No | individual or business |
The originator field is auto-populated from the customer’s entity record when omitted. You only need to provide originator data if it differs from the entity on file or if specific fields are missing from the entity record.
Payment lifecycle
Crypto payments have an additional confirmation step compared to traditional rails:
created -> processing -> completed
-> failed
The CryptoTransferStatus on the payment detail tracks the on-chain confirmation:
| Status | Description |
|---|
pending_confirmation | Transaction broadcast to the blockchain, waiting for confirmations |
confirmed | Transaction confirmed on-chain. Funds delivered. |
failed | Transaction failed on-chain (e.g., insufficient gas, contract error) |
API reference