Base URL:
https://api.rach.finance/api/v1/ · Auth: X-API-KeyOne service, three products. Airtime, gift cards and bills share one order model, one
status vocabulary, one webhook family and one balance. Look any order up at
GET /vas/orders/{reference} regardless of what it was.How it works
1
Fund your balance
Send USDT or USDC on Polygon or BSC to your funding address. A flat $1 is deducted
and the rest becomes spendable.
2
Set your margin
Decide what you charge your customers on top. Rach never takes any part of it.
3
Quote, then sell
Price an order first to see exactly what you earn, then buy. Your balance is charged;
your customer pays you whatever you decided.
1. Fund your balance
Response
When the money becomes spendable
Your balance credits once the deposit reaches its confirmation threshold, not the moment it appears on-chain. We wait so that a chain reorganisation cannot take back funds you have already spent.
You also receive the usual
wallet.deposit.confirmed webhook, so you can credit your own
system the moment the balance is live rather than polling.
Check the balance any time:
Response
2. Set your margin
This is what you earn on every order. Rach bills you a price; you charge your customer that price plus your markup, and keep the difference."fee_mode": "flat" with flat_fee_usd for a fixed charge instead, and applies_to
(airtime, giftcard, bill) to set different margins per product.
3. Quote before you sell
A quote shows the whole economics of an order — including what you make — without buying anything or touching your balance.Response
4. Sell
Airtime, data and bundles
operator_id and we detect the network from the number, so your customer never has to
pick it (or pick it wrong). Set use_local_amount: true to send the amount in the
recipient’s own currency — usually what they expect to type.
Data plans and bundles use the same endpoint. Pick the data product from the operator
list and pass its operator_id:
type accepts airtime, data or bundle; omit it for everything. Each entry also
carries data and bundle booleans if you would rather group them yourself.
Gift cards
GET /vas/orders/{reference}.
Utility bills
Browse billers, optionally filtered by category:POST /bills/quote if you want to show a price:
reference is your idempotency key
What happens when something fails
Orders run in a fixed sequence, so a failure is never ambiguous:- The amount is validated against the operator’s real rules (fixed denominations, min/max).
- Your balance is debited — if it is too low the order stops here and nothing is spent.
- The provider is called.
- If the provider fails, your balance is refunded automatically.
A
processing order resolves on its own within a couple of minutes, and a webhook fires
when it does. If a customer is watching the screen, settle it immediately instead:
You may also see a 503 meaning the service is temporarily unavailable. That is the
platform topping up its own provider balance — you were not charged and nothing was
attempted. Retry shortly with the same reference.
A 502 means the provider failed, not that your request was wrong — your balance was
already returned. A 400 with an insufficient-balance message means nothing was
attempted at all; top up and retry with the same reference.
Webhooks
Terminal states firevas.order.successful, vas.order.failed or vas.order.refunded to
your configured webhook URL, carrying the order reference, status, amounts and what you were
charged. Verify them the same way as every other Rach webhook — see Webhooks.
Dashboard
One call for a merchant dashboard screen: balance, whether you can currently transact, order counts, spend versus earnings, and recent orders.More endpoints
Gift cards
Utility bills
Your account
Full schemas are in the Payments API Reference under
Value-Added Services.

