Skip to main content
PCX supports two crypto payout flows:
  1. Virtual account crypto withdrawal — withdraw the balance of a PCX fiat virtual account as USDC, USDT, or another supported asset to an external wallet.
  2. Off-ramp (crypto → fiat) — the customer sends crypto to a PCX-generated wallet address; PCX converts it and disburses fiat to a registered beneficiary.

1. Virtual account crypto withdrawal

Withdraw from a PCX virtual account balance to an external crypto wallet.
PCX debits amount from the virtual account’s available balance and initiates the on-chain transfer to wallet_address. A virtual_account.withdrawal webhook fires once the transfer is submitted.

Supported assets and networks

Choose Polygon or Tron for lower network fees on smaller USDC/USDT amounts. Ethereum offers the widest wallet compatibility but carries higher gas costs.

2. Off-ramp (crypto → fiat)

The customer sends crypto to a PCX-generated deposit address. Once the on-chain transfer confirms, PCX converts the crypto to fiat and disburses to the beneficiary’s bank or mobile money account.

Step 1 — Fetch the exchange rate

Fetch the rate in the off-ramp direction. The fromCurrency is the fiat equivalent of the crypto asset (USDC → USD):
Response:
Store both org_rate_id and rate (the value you will pass as client_rate).

Step 2 — Initiate the off-ramp

Step 3 — Handle the response

Display the wallet_address, crypto_amount, and crypto_network to the customer. Once they send the exact amount to that address on-chain, PCX initiates the NGN bank transfer to the beneficiary automatically.
The customer must send exactly crypto_amount of crypto_currency on crypto_network. Sending a different amount, wrong asset, or wrong network will delay or prevent the fiat payout to the beneficiary.

Rate validation

PCX validates client_rate against the current live rate. If the rate has drifted more than 0.5% since you fetched it, the request returns:
Re-fetch the rate, present the updated value to the customer, and resubmit with the new client_rate and org_rate_id. Do not reuse org_rate_id values across sessions. See Exchange Rates and Fees.

Track status

Terminal statuses: completed (fiat successfully paid to beneficiary), failed, canceled. Use webhooks to receive payment.completed in real time instead of polling.