Create Transfer
The Transfers API is the primary way to move value through Thiqwave. Specify a source and a destination — Thiqwave handles the conversion, routing, and settlement automatically.
A transfer can move value between any combination of fiat and stablecoin:
| Source | Destination | What happens |
|---|
| Fiat (bank deposit) | Stablecoin (wallet) | On-ramp |
| Stablecoin (wallet) | Fiat (bank account) | Off-ramp |
| Stablecoin (chain A) | Stablecoin (chain B) | Cross-chain bridge |
| Stablecoin (token A) | Stablecoin (token B) | Swap |
| Fiat (bank deposit) | Fiat (bank account) | Stablecoin-settled cross-border payment |
Endpoint
| Header | Required | Description |
|---|
X-API-Key | Yes | Your API key |
Content-Type | Yes | application/json |
Idempotency-Key | Recommended | Unique identifier for safe retries |
Request Body
| Field | Type | Required | Description |
|---|
quote_id | string | Yes | Quote ID from a prior /v1/quotes request. Locks in rates and fees. |
source | object | Yes | Where value comes from. See Source Object below. |
destination | object | Yes | Where value goes. See Destination Object below. |
amount | string | Yes | Amount to transfer. Always a string — e.g., "1000.00" for 1000 USDC or "1000.00" for 1000 AED. |
metadata | object | No | Key-value pairs for your reference. |
Source Object
| Field | Type | Required | Description |
|---|
currency | string | Yes | Currency code: AED, USD, EUR, GBP, USDT, or USDC. |
network | string | Conditional | Required when currency is a stablecoin. Blockchain network identifier. |
address | string | Conditional | Required when currency is a stablecoin. Wallet address to debit from. |
payment_rail | string | Conditional | Required when currency is fiat. Payment method: "bank_transfer", "instant". |
Destination Object
| Field | Type | Required | Description |
|---|
currency | string | Yes | Currency code: AED, USD, EUR, GBP, USDT, or USDC. |
network | string | Conditional | Required when currency is a stablecoin. Blockchain network identifier. |
address | string | Conditional | Required when currency is a stablecoin. Wallet address to credit. |
account_holder | string | Conditional | Required when currency is fiat. Recipient name. |
account_number | string | Conditional | Required when currency is fiat. Bank account number. |
bank_code | string | Conditional | Required when currency is fiat. SWIFT/BIC or local bank code. |
country | string | Conditional | Required when currency is fiat. ISO 3166-1 alpha-2 country code. |
Examples
On-ramp: AED to USDC on Sui
curl -X POST https://api.thiqwave.com/v1/transfers \
-H "X-API-Key: your_api_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: txn_001" \
-d '{
"quote_id": "quote_abc123",
"source": {
"currency": "AED",
"payment_rail": "bank_transfer"
},
"destination": {
"currency": "USDC",
"network": "sui",
"address": "0x8a4c5b9e1f3d7a2c6e0b4f8d9a1c3e5f7b2d4a6c8e0f1a3b5d7e9c2a4b6d8f"
},
"amount": "1000.00"
}'
Off-ramp: USDT on Ethereum to GBP
curl -X POST https://api.thiqwave.com/v1/transfers \
-H "X-API-Key: your_api_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: txn_002" \
-d '{
"quote_id": "quote_def456",
"source": {
"currency": "USDT",
"network": "ethereum",
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0"
},
"destination": {
"currency": "GBP",
"account_holder": "Acme Ltd",
"account_number": "12345678",
"bank_code": "401276",
"country": "GB"
},
"amount": "500.00"
}'
Cross-chain bridge: USDC on Solana to USDC on Ethereum
curl -X POST https://api.thiqwave.com/v1/transfers \
-H "X-API-Key: your_api_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: txn_003" \
-d '{
"quote_id": "quote_ghi789",
"source": {
"currency": "USDC",
"network": "solana",
"address": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU"
},
"destination": {
"currency": "USDC",
"network": "ethereum",
"address": "0x742d35Cc6634C0532925a3b844Bc123e5fA42f9c"
},
"amount": "1000.00"
}'
Swap: USDT on Ethereum to USDC on Sui
curl -X POST https://api.thiqwave.com/v1/transfers \
-H "X-API-Key: your_api_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: txn_004" \
-d '{
"quote_id": "quote_jkl012",
"source": {
"currency": "USDT",
"network": "ethereum",
"address": "0x123456789abcdef123456789abcdef1234567890"
},
"destination": {
"currency": "USDC",
"network": "sui",
"address": "0x8a4c5b9e1f3d7a2c6e0b4f8d9a1c3e5f7b2d4a6c8e0f1a3b5d7e9c2a4b6d8f"
},
"amount": "1000.00"
}'
Fiat-to-fiat (stablecoin sandwich): AED to EUR
curl -X POST https://api.thiqwave.com/v1/transfers \
-H "X-API-Key: your_api_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: txn_005" \
-d '{
"quote_id": "quote_mno345",
"source": {
"currency": "AED",
"payment_rail": "bank_transfer"
},
"destination": {
"currency": "EUR",
"account_holder": "Schmidt GmbH",
"account_number": "DE89370400440532013000",
"bank_code": "COBADEFFXXX",
"country": "DE"
},
"amount": "5000.00"
}'
Response
{
"id": "txn_01HZ5NM2XDQE8F1G7HKRWS4JV",
"quote_id": "quote_abc123",
"status": "pending",
"source": {
"currency": "AED",
"payment_rail": "bank_transfer",
"amount": "1000.00"
},
"destination": {
"currency": "USDC",
"network": "sui",
"address": "0x8a4c5b9e1f3d7a2c6e0b4f8d9a1c3e5f7b2d4a6c8e0f1a3b5d7e9c2a4b6d8f",
"amount": "271.50"
},
"fees": {
"platform_fee": "2.50",
"network_fee": "0.10"
},
"exchange_rate": "0.2715",
"payment_instructions": {
"beneficiary_name": "Thiqwave Limited",
"beneficiary_account": "1234567890",
"bank_code": "ABUAAE3D",
"reference": "txn_01HZ5NM2XDQE8F1G7HKRWS4JV",
"country": "AE"
},
"metadata": {},
"created_at": "2026-04-13T10:30:00Z",
"completed_at": null
}
payment_instructions is only present when the source is fiat and requires a bank deposit. Use these details to complete the transfer.
Response Fields
| Field | Type | Description |
|---|
id | string | Unique transfer identifier. |
quote_id | string | Associated quote. |
status | string | Current status (see Transfer States below). |
source | object | Source details including resolved amounts. |
destination | object | Destination details including resolved amounts. |
fees | object | Fee breakdown. |
exchange_rate | string | Applied conversion rate. |
payment_instructions | object or null | Bank deposit instructions (fiat source only). |
metadata | object | Your metadata. |
created_at | string | ISO 8601 creation timestamp. |
completed_at | string or null | ISO 8601 completion timestamp. |
Transfer States
| Status | Description |
|---|
pending | Transfer created, awaiting processing or deposit. |
awaiting_deposit | Fiat source: waiting for bank deposit (use payment_instructions). |
processing | Funds received, conversion and routing in progress. |
settling | On-chain settlement or fiat delivery in progress. |
completed | Transfer complete — funds delivered to destination. |
failed | Transfer failed. Details available via webhooks or GET endpoint. |
The Transfers API uses human-readable string amounts for simplicity (e.g., "1000.00" for 1000 AED). The granular endpoints (pay-ins, payouts) use smallest-unit integers (e.g., 50000 for 500 AED). Both formats are valid within their respective endpoints.
Payment Rails
"bank_transfer" — Standard bank transfer (wire, SWIFT). Available in all corridors.
"instant" — Instant payment networks where available (e.g., IPP in UAE). Faster settlement, may have different fee structure.
Notes
- All transfers require a valid, non-expired quote.
- For fiat sources, complete the bank deposit using the
payment_instructions in the response.
- Monitor transfer status via
GET /v1/transfers/{id} or webhooks.
- Use
Idempotency-Key to safely retry transfers without creating duplicates.