Documentation Index Fetch the complete documentation index at: https://docs.paycrest.io/llms.txt
Use this file to discover all available pages before exploring further.
This guide walks through creating a payment order using the Sender API, the recommended path for all new integrations. You’ll have a working offramp in under 10 minutes. You do not need to call the public rates API first—POST /v2/sender/orders resolves an acceptable rate unless you pass a locked rate on create (see the Sender API integration guide ).
Prerequisites
A Paycrest Sender account (sign up at app.paycrest.io )
KYB verification completed (typically 1–3 business days)
Your API Key from the dashboard
Optional: Prefetch a quote for the UI
If you want to show an exchange rate in checkout before create, call the public GET /v2/rates/{network}/{from}/{amount}/{to} endpoint (no API key). For when to pass rate on create and full examples, see Optional: prefetch quotes and account names . Endpoint reference: Get Token Rate (v2) .
Step 1: Create a Payment Order
Use POST /v2/sender/orders. Set source.type and destination.type to choose the direction.
curl -X POST "https://api.paycrest.io/v2/sender/orders" \
-H "API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": "100",
"source": {
"type": "crypto",
"currency": "USDT",
"network": "base",
"refundAddress": "0xYourWalletAddress"
},
"destination": {
"type": "fiat",
"currency": "NGN",
"recipient": {
"institution": "GTBINGLA",
"accountIdentifier": "1234567890",
"accountName": "John Doe",
"memo": "Payment"
}
},
"reference": "my-order-001"
}'
curl -X POST "https://api.paycrest.io/v2/sender/orders" \
-H "API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": "50000",
"amountIn": "fiat",
"source": {
"type": "fiat",
"currency": "NGN",
"refundAccount": {
"institution": "GTBINGLA",
"accountIdentifier": "1234567890",
"accountName": "John Doe"
}
},
"destination": {
"type": "crypto",
"currency": "USDT",
"recipient": {
"address": "0xRecipientWalletAddress",
"network": "base"
}
},
"reference": "my-order-002"
}'
const res = await fetch ( "https://api.paycrest.io/v2/sender/orders" , {
method: "POST" ,
headers: {
"API-Key" : "YOUR_API_KEY" ,
"Content-Type" : "application/json"
},
body: JSON . stringify ({
amount: "100" ,
source: {
type: "crypto" ,
currency: "USDT" ,
network: "base" ,
refundAddress: "0xYourWalletAddress"
},
destination: {
type: "fiat" ,
currency: "NGN" ,
recipient: {
institution: "GTBINGLA" ,
accountIdentifier: "1234567890" ,
accountName: "John Doe" ,
memo: "Payment"
}
},
reference: "my-order-001"
})
});
const { data : order } = await res . json ();
console . log ( order . id , order . providerAccount );
import requests
res = requests.post(
"https://api.paycrest.io/v2/sender/orders" ,
headers = { "API-Key" : "YOUR_API_KEY" , "Content-Type" : "application/json" },
json = {
"amount" : "100" ,
"source" : {
"type" : "crypto" ,
"currency" : "USDT" ,
"network" : "base" ,
"refundAddress" : "0xYourWalletAddress"
},
"destination" : {
"type" : "fiat" ,
"currency" : "NGN" ,
"recipient" : {
"institution" : "GTBINGLA" ,
"accountIdentifier" : "1234567890" ,
"accountName" : "John Doe" ,
"memo" : "Payment"
}
},
"reference" : "my-order-001"
}
)
order = res.json()[ "data" ]
print (order[ "id" ], order[ "providerAccount" ])
package main
import (
" bytes "
" encoding/json "
" fmt "
" io "
" net/http "
)
func main () {
payload := map [ string ] interface {}{
"amount" : "100" ,
"source" : map [ string ] interface {}{
"type" : "crypto" ,
"currency" : "USDT" ,
"network" : "base" ,
"refundAddress" : "0xYourWalletAddress" ,
},
"destination" : map [ string ] interface {}{
"type" : "fiat" ,
"currency" : "NGN" ,
"recipient" : map [ string ] interface {}{
"institution" : "GTBINGLA" ,
"accountIdentifier" : "1234567890" ,
"accountName" : "John Doe" ,
"memo" : "Payment" ,
},
},
"reference" : "my-order-001" ,
}
body , _ := json . Marshal ( payload )
req , _ := http . NewRequest ( "POST" , "https://api.paycrest.io/v2/sender/orders" , bytes . NewBuffer ( body ))
req . Header . Set ( "API-Key" , "YOUR_API_KEY" )
req . Header . Set ( "Content-Type" , "application/json" )
resp , _ := http . DefaultClient . Do ( req )
defer resp . Body . Close ()
out , _ := io . ReadAll ( resp . Body )
fmt . Println ( string ( out ))
}
Step 2: Complete the Payment
The response includes a providerAccount that tells you (or your user) where to send funds.
Offramp Send tokens to providerAccount.receiveAddress before validUntil.
The total to send is amount + senderFee + transactionFee (all returned in the response).
Onramp Show providerAccount details to the user.
They transfer exactly amountToTransfer in currency to accountIdentifier before validUntil.
Step 3: Track Order Status
Poll GET /v2/sender/orders/:id or listen for webhooks configured in your dashboard.
cURL
JavaScript
Python
Go
curl "https://api.paycrest.io/v2/sender/orders/ORDER_ID" \
-H "API-Key: YOUR_API_KEY"
const { data : order } = await fetch (
`https://api.paycrest.io/v2/sender/orders/ ${ orderId } ` ,
{ headers: { "API-Key" : "YOUR_API_KEY" } }
). then ( r => r . json ());
console . log ( order . status ); // e.g. "settled"
res = requests.get(
f "https://api.paycrest.io/v2/sender/orders/ { order_id } " ,
headers = { "API-Key" : "YOUR_API_KEY" }
)
print (res.json()[ "data" ][ "status" ])
req , _ := http . NewRequest ( "GET" , "https://api.paycrest.io/v2/sender/orders/" + orderID , nil )
req . Header . Set ( "API-Key" , "YOUR_API_KEY" )
resp , _ := http . DefaultClient . Do ( req )
defer resp . Body . Close ()
body , _ := io . ReadAll ( resp . Body )
fmt . Println ( string ( body ))
Order Statuses initiated — order created, awaiting depositdeposited — deposit confirmed (offramp)pending — assigned to providerfulfilling — fiat/crypto disbursement in progressvalidated — payout confirmed by providersettling — onchain release in progresssettled — order completeexpired — no deposit received before deadlinerefunding — refund in progressrefunded — deposit returned to sender
Timing Typical completion : under 30 seconds for the majority of ordersexpired : receive address or virtual account never fundedrefunded : deposit received but order couldn’t completeMinimum order : $0.50 on any supported chain
Next Steps
Full Integration Guide Webhooks, signature verification, token transfers, v1 legacy API, and more
API Reference Interactive endpoint docs with full request/response schemas
Supported Stablecoins Tokens, networks, contract addresses, and decimals
Supported Currencies Active fiat corridors and delivery channels