Amounts are strings
Every amount the API returns is a decimal string —"150.00", "85000", "8.888289". Never parseFloat for arithmetic; use a decimal library. Amounts you send may be numbers or numeric strings; they’re validated as positive decimals.
Currencies
Zero-decimal currencies reject fractional amounts. Crypto amounts carry up to six decimals and are always rounded up when we quote what a payer must send, so the payment covers the fiat amount.
Balances
Your organization holds one account per currency, created automatically the first time that currency is touched.GET /v1/accounts shows each with:
available— what you can spend nowtotal— including money that’s been received but is still settlingpending=total − available
available; collections, virtual-account deposits, and crypto deposits credit it; conversions move between two of your own accounts.
FX
Any cross-currency operation — a USD balance paying a GHS payout, a USDC deposit landing in an NGN balance, a conversion — is priced at Chipper’s live rate with your organization’s spread already applied.GET /v1/rates/{origin}/{destination} returns that all-in rate; the same number is used at execution.
Rates are expressed as destination units per one origin unit: GET /v1/rates/USDC/GHS → 11.31 means 1 USDC buys GH₵ 11.31.
Rate locks. Quotes and checkout sessions lock a rate for their lifetime — 15 minutes for volatile assets, 90 minutes for stablecoin checkout sessions — so the payer sends a known amount. If the window passes, the session expires and a fresh rate is quoted.
Fees
Fees are set per organization and per rail; the applied fee is returned on each payout asfee: { amount, currency }. For your organization’s schedule, see the dashboard or contact api-support@chippercash.com.