Accept USDT and USDC
Take stablecoin payments on the hosted checkout or with a permanent deposit address per customer, and credit your customer once per payment.
What you will do
Buyers pay 1 USDT or 1 USDC per US dollar. The coin lands in your USDT or USDC balance (each is separate), net of your stablecoin fee, which you pay — the buyer sees no fee. Pick the hosted checkout for orders, or a deposit address for top-ups.
- USDT (and USDC, separately) enabled on your account by VEXPay.
- A webhook endpoint subscribed to
payment.completedandpayment.canceled.
Steps: hosted checkout
- Create a session
POST /v1/checkout/sessionswithamountUsdandmethodscontainingusdtand/orusdc(or nomethodsto offer everything). - The buyer picks coin and network
The checkout shows the networks enabled for that coin. TON payments need the tag/memo shown.
- The buyer sends the coin
A payment page shows the address and exact amount. The status page moves from started to network confirmation to completed; the buyer may close it.
- Fulfil from the webhook
payment.completedcarriescurrency,amount,fee,network,txHashesand yourcheckoutSessionreference.
Steps: deposit address per customer
- List the networks
GET /v1/crypto/networks?currency=USDT(orUSDC) shows the networks enabled for you. - Get the address
POST /v1/crypto/deposit-addresseswithcustomerRef(your customer id: 1–128 characters of letters, digits and_ . : @ -),networkand optionallycurrency. Calling it again for the same customer, coin and network returns the same address. - Show it to your customer
Show the
address, and thetagwhenevertagRequiredis true. The customer can send any amount, any time. - Credit your customer
Each deposit fires
payment.completedwithcustomerRef. Creditamount − feeonce perpaymentId.
curl --request POST "${API_URL}/v1/crypto/deposit-addresses" \
--header "content-type: application/json" \
--header "x-api-key: ${VEXPAY_API_KEY}" \
--data '{ "customerRef": "user_123", "network": "TRC20", "currency": "USDT" }'Check that it worked
- In Test, use the test buttons on the payment page to confirm, cancel or send short; each outcome sends its webhook with
livemode: false. - A Test deposit address cannot receive a simulated deposit yet. Test your crediting code with the hosted checkout, which sends the same
payment.completed. GET /v1/crypto/balancesshows the credit ashelduntilnextReleaseAton Live, thenavailable.
If something goes wrong
| Symptom | Likely cause | What to do |
|---|---|---|
403 method_not_allowed | USDT or USDC not enabled on your account | Ask VEXPay to enable it. |
400 unsupported_network | That network is not enabled for that coin | Pick one from GET /v1/crypto/networks. |
payment.completed with underpaid: true | The buyer sent less than the amount | What arrived is credited, net of the fee; the checkout is not marked paid. Settle the difference with the buyer. |
| TON deposit not matched to the customer | Tag/memo missing | Always show tag when tagRequired is true. Contact VEXPay support with the transaction hash. |
payment.completed for more than the amount | The buyer sent too much | Everything that arrived is credited, net of the fee, and the checkout is marked paid. To give the extra back, ask the buyer for an address and send it with POST /v1/crypto/payouts (the payout fee applies). Never send it back to the address it came from: that is often an exchange that will not credit it. |
| A deposit arrived but no webhook | A coin or network that is not enabled for you | Contact VEXPay support with the transaction hash. |
502/503 processor_unavailable | Temporary outage | Retry later; other currencies still work at checkout. |
Fees: Pricing. Getting coins out: Withdraw your balance. Related: USDT & USDC