Skip to main content
Sell mobile airtime and data, gift cards, and utility bill payments to your customers through one API. You fund a prepaid balance with stablecoins, set your own margin, and keep everything you charge on top.
Base URL: https://api.rach.finance/api/v1/ · Auth: X-API-Key
One 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
Only USDT or USDC on Polygon or BSC will credit your balance. Any other asset, or any other chain, will not — those funds are not recoverable through this flow.A flat **1isdeductedperdeposit.Adepositthatcannotcoverthefeeisnotcreditedatall,sosendmorethan1** is deducted per deposit. A deposit that cannot cover the fee is not credited at all, so send more than 1.
Stablecoins credit 1:1 with USD, so there is no exchange-rate gap between what you send and what you can spend. The address is yours permanently — reuse it for every top-up. Nothing needs to be pre-registered, and no memo or tag is required.

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.
Fund on BSC if you want the balance quickly. Polygon’s threshold is deliberately deep because it has had deep reorganisations; BSC settles in well under a minute.
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_percent is a fraction, not a percent"0.03" means 3%. Sending "3" would mean 300%; values above 1 are rejected outright rather than silently overcharging your customers.
Use "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

Omit 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.
Check for promotions before you sell. Operators run bonuses — “recharge 1974 XAF or more and the receiver gets 100% extra” — which is free upside for your customer on the same spend.

Gift cards

The redeem code is attached to the order on success and returned here and at GET /vas/orders/{reference}.
Redeem codes are never sent in webhooks. A gift card code is a bearer secret — anyone holding it can spend it — so it is only ever returned over an authenticated request.

Utility bills

Browse billers, optionally filtered by category:
Then pay — quote first with POST /bills/quote if you want to show a price:
Check the meter or account number with your customer before paying. The provider does not validate subscriber accounts, so a payment to a mistyped meter number is delivered to whoever owns that meter and cannot be recalled.

reference is your idempotency key

Always send a unique reference, and reuse it on retries. Repeating a POST with the same reference returns the original order instead of buying a second time.This is enforced by a database constraint, not a best-effort check — so retrying after a timeout is always safe. Without it, a network blip means your customer gets charged once and topped up twice.

What happens when something fails

Orders run in a fixed sequence, so a failure is never ambiguous:
  1. The amount is validated against the operator’s real rules (fixed denominations, min/max).
  2. Your balance is debited — if it is too low the order stops here and nothing is spent.
  3. The provider is called.
  4. 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.
A client timeout is not a failure. Purchases complete and are recorded even if your HTTP client disconnects mid-flight. Never retry with a new reference after a timeout — look the order up by your original reference instead.

Webhooks

Terminal states fire vas.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.
Money figures count successful orders only — failed orders are refunded, so including them would overstate both your spend and your earnings.

More endpoints

Gift cards Utility bills Your account Full schemas are in the Payments API Reference under Value-Added Services.