Skip to main content

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:
SourceDestinationWhat 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

POST /v1/transfers

Request Headers

HeaderRequiredDescription
X-API-KeyYesYour API key
Content-TypeYesapplication/json
Idempotency-KeyRecommendedUnique identifier for safe retries

Request Body

FieldTypeRequiredDescription
quote_idstringYesQuote ID from a prior /v1/quotes request. Locks in rates and fees.
sourceobjectYesWhere value comes from. See Source Object below.
destinationobjectYesWhere value goes. See Destination Object below.
amountstringYesAmount to transfer. Always a string — e.g., "1000.00" for 1000 USDC or "1000.00" for 1000 AED.
metadataobjectNoKey-value pairs for your reference.

Source Object

FieldTypeRequiredDescription
currencystringYesCurrency code: AED, USD, EUR, GBP, USDT, or USDC.
networkstringConditionalRequired when currency is a stablecoin. Blockchain network identifier.
addressstringConditionalRequired when currency is a stablecoin. Wallet address to debit from.
payment_railstringConditionalRequired when currency is fiat. Payment method: "bank_transfer", "instant".

Destination Object

FieldTypeRequiredDescription
currencystringYesCurrency code: AED, USD, EUR, GBP, USDT, or USDC.
networkstringConditionalRequired when currency is a stablecoin. Blockchain network identifier.
addressstringConditionalRequired when currency is a stablecoin. Wallet address to credit.
account_holderstringConditionalRequired when currency is fiat. Recipient name.
account_numberstringConditionalRequired when currency is fiat. Bank account number.
bank_codestringConditionalRequired when currency is fiat. SWIFT/BIC or local bank code.
countrystringConditionalRequired 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

FieldTypeDescription
idstringUnique transfer identifier.
quote_idstringAssociated quote.
statusstringCurrent status (see Transfer States below).
sourceobjectSource details including resolved amounts.
destinationobjectDestination details including resolved amounts.
feesobjectFee breakdown.
exchange_ratestringApplied conversion rate.
payment_instructionsobject or nullBank deposit instructions (fiat source only).
metadataobjectYour metadata.
created_atstringISO 8601 creation timestamp.
completed_atstring or nullISO 8601 completion timestamp.

Transfer States

StatusDescription
pendingTransfer created, awaiting processing or deposit.
awaiting_depositFiat source: waiting for bank deposit (use payment_instructions).
processingFunds received, conversion and routing in progress.
settlingOn-chain settlement or fiat delivery in progress.
completedTransfer complete — funds delivered to destination.
failedTransfer failed. Details available via webhooks or GET endpoint.

Amount Format

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.