Skip to main content
QFEX exposes funding endpoints on a separate REST service: The API supports:
  • USDC deposits and withdrawals on Arbitrum One (ARBITRUM_ONE)
  • USDT deposits and withdrawals on TRON (TRON)
  • USD deposits by ACH push, wire, or FedNow
  • USD withdrawals by ACH or wire
Always send the asset returned by the address endpoint on the exact network returned by that endpoint. Funds sent with a different asset or network may be lost.

Before you start

Complete account verification and accept the QFEX terms before using the funding API. Then create an API key with:
  • All accounts access
  • Deposit and withdraw permission
Funding applies to the primary account. To fund a subaccount, fund the primary account first and then transfer funds to the subaccount.

Authenticate requests

Every request requires these headers:
For each request:
  1. Generate a cryptographically secure, hex-encoded nonce of at most 100 characters.
  2. Read the current Unix time in seconds.
  3. Sign the UTF-8 string ${nonce}:${timestamp} with HMAC-SHA256, using the secret API key as the key.
  4. Hex-encode the signature and send all four headers.
The timestamp must be within five minutes of QFEX server time. Never reuse a nonce. The HTTP method, path, query, and request body are not part of the signed string. The following helper creates a fresh signature for every request and returns the decoded JSON response:
Keep the secret key in a server-side secret store. Do not put it in browser code, a mobile application, logs, URLs, or source control.

Deposit crypto

Request the deposit address for the network you intend to use:
Example response:
For USDT on TRON, use network=TRON. The response will contain "asset": "USDT" and "network": "TRON". GET /address returns the account’s existing address or provisions one on the first call. After receiving it, submit the blockchain transfer from your wallet or custody provider. Address retrieval does not initiate a transfer.
Check the QFEX funding screen for the current minimum deposit and required confirmation count. A deposit is credited only after it has been detected and confirmed.

Withdraw crypto

Submit the gross amount to debit, the destination address, and the network:
On success, the endpoint returns 200 OK with an empty body. amount is the gross amount debited from the QFEX account. QFEX deducts the applicable withdrawal fees and sends the remainder; check Deposit / Withdraw in QFEX for the current fees before submitting the request. For a TRON withdrawal, send a valid TRON address and set network to TRON. Always specify the network explicitly even though the API currently defaults to ARBITRUM_ONE when it is omitted.
POST /withdraw is not idempotent. Retrying a request can create a second withdrawal and debit the account again. If the client times out after sending the request, reconcile account history before deciding whether to retry.
A successful response means QFEX accepted and debited the withdrawal request. It does not guarantee that the on-chain transfer is already complete; a request may still be queued for submission or manual review.

Deposit USD

Fetch the required transfer reference before initiating a bank transfer:
Valid deposit rails are ach_push, wire, and fednow.
Example response:
The endpoint returns the account-specific reference, not the complete beneficiary bank details. Obtain the current beneficiary details from Deposit / Withdraw in QFEX, initiate the transfer through your bank, and include deposit_message exactly in the transfer’s reference, message, or note field.

Withdraw USD

USD withdrawals require a linked destination bank account. Create it once and store the returned QFEX bank-account ID.
type must be checking or savings. country is an ISO 3166-1 alpha-3 code, and state is required for US addresses. The street address must include a street number.
The API returns 201 Created:

2. Request the withdrawal

amount must be at least 10. Use ach_push or wire as the withdrawal rail.
On success, the endpoint returns 200 OK with an empty body. As with crypto withdrawals, acceptance is not final settlement and the request may require manual review. Fiat fees are deducted from the requested amount before settlement. To remove a linked bank account, send DELETE /bank-account/{id} with a fresh set of authentication headers.

Handle errors safely

Most structured errors include title, status, and detail; validation and provider errors may also include an errors array. Log the HTTP status and response body, but never log API secrets or full bank-account details.