Overview
Alongside bill payments, Hyparrow resells three value-added services. All three debit the same Hyparrow wallet, follow the same envelope, and use the same API keys.Base URL:
https://api.hyparrow.cloud/api/v1Auth: every request requires X-API-Key and X-API-Secret headers.Sandbox: point at https://sandbox.hyparrow.cloud/api/v1 with your pk_test_
key. Amounts ending in .01 force a failure and .99 force a pending result, so
you can exercise the refund paths without real money.Response envelope
Every endpoint on this page returns the standard Hyparrow shape. A request that reaches the provider and is declined returns HTTP 200 withsuccess: false, the
wallet is refunded automatically in that case.
Bulk SMS
How billing works
SMS is billed per unit, where one unit is one message part to one recipient. A single-part message to 500 recipients is 500 units; a two-part message to the same list is 1,000 units. Part length depends on the characters used:
A single non-GSM character switches the entire message to UCS-2. The usual
culprits are smart quotes pasted from a document (
' rather than '), emoji, and
the Naira sign ₦. A 90-character message costs one unit as plain text and two if
it contains one curly apostrophe.
Quote before you send
POST /sms/quote prices a campaign without sending it. Use it to show the real
cost in your UI before the merchant commits.
Quote a campaign
Response
encoding comes back as ucs2, the note field explains why and what to
change, surface it to the merchant rather than silently charging double.
Send
POST /sms/send charges the wallet and dispatches.
string
required
Sender header, 11 characters maximum. Longer values are rejected rather than
silently truncated by the carrier.
string
required
The message body.
string[]
Recipient phone numbers. Duplicates are removed before billing.
string
Comma-separated alternative to
recipients, for lists coming straight out of a
spreadsheet. You may send either or both.string
Your own reference. One is generated if you omit it.
Send a campaign
Response
USD virtual cards
Dollar-denominated Visa and Mastercard virtual cards, paid for from your USD wallet. Convert Naira into that wallet first (POST /usd-wallet/quote then
/usd-wallet/convert), then create and fund cards from the dollars you hold.
A card action that exceeds your USD balance is rejected before anything is
charged, with the exact shortfall in the response.
Hyparrow does not store cards. The provider owns the
cardId and the balance.
Persist the cardId from the creation response, if you lose it, the only way back
is your own transaction history.Fees
GET /usd-cards/fees returns the live schedule, so you never hardcode these.
Create a card
The issuer needs a full billing identity for the cardholder, not just a name and a KYC number. Every field below marked required is enforced before your USD wallet is touched, so an incomplete cardholder costs you a400, never a charge.
string
required
string
required
string
required
Cardholder phone number.
string
required
Cardholder contact email.
string
required
Date of birth,
YYYY-MM-DD. An ISO 8601 timestamp is accepted and truncated to the date.string
required
Street address.
string
required
State or region.
string
required
string
required
NIN or BVN.string
required
The ID document number.
number
required
First funding amount in USD. Minimum $5.
string
VISA (default) or MASTERCARD.Create and fund a card
Response
Your cards
GET /usd-cards lists every card you have been charged to create, newest first,
derived from your USD ledger. Topupmate cannot enumerate what it issued, so the
charge is the record; each creation writes its card id onto the debit that paid
for it. You do not need to keep a list of your own.
Balance and status are not included. They belong to the provider, are read live
per card, and a copy here would be a stale figure shown as spendable. A row under
unrecorded is a creation charged for before its id reached the ledger: a real
card you own whose id must come from the provider’s dashboard, matched by
reference.
When you lose the response
Issuance is not idempotent and Topupmate cannot list the cards it has issued, so a creation whose response you never received is the one failure you cannot retry your way out of: the card may be real and charged for, and a second attempt buys a second card. Do not retry. Ask what the reference bought:Resolve a creation you never got an answer for
Response
This is a read. It is safe to call as often as you like, and safe to call on any
timeout,
502, or dropped connection.
Card lifecycle
GET /usd-cards/{cardId}/transactions accepts startDate, endDate
(YYYY-MM-DD) and page. Omit the dates and it returns the trailing 30 days.
Funding and withdrawal both take { "amount": <usd>, "requestRef": "..." }.
Withdrawal deducts its 1% fee from the withdrawn amount and credits the remainder
to your NGN wallet at the credit-side rate.
Terminating a card credits any residual balance back to your wallet with no
withdrawal fee, since the closure forced the balance out rather than the merchant
choosing to withdraw it.
Gift cards
Purchasable gift cards across many countries and brands, delivered to a recipient by email.Two currencies per product
Every product has a sender currency (what you’re quoted and charged in, always USD) and a recipient currency (what the card is denominated in, EUR for an Italian product, GBP for a UK one). Quote from the sender side. Theamount you
send at purchase is the face value in the recipient currency.
Denomination rules
Products are eitherFIXED or RANGE:
FIXED, only the listeddenominationsare purchasable. Any other amount is rejected before your wallet is touched.RANGE, any amount betweenminAmountandmaxAmount.
Browse the catalog
GET /gift-cards requires at least one of countryCode or productName, the
unfiltered catalog runs to hundreds of products and is not returned.
Browse US gift cards
Response
priceUSD on each denomination is the final price, inclusive of the provider’s
sender fee and Hyparrow’s markup. It is what your wallet will be charged, converted
to NGN. Display that number, never compute your own.Purchase
Buy a gift card
FIXED product, or falls outside a RANGE product’s
limits, is rejected with a 400 and no charge, rather than failing upstream
after the debit.
The redeem code and instructions are emailed to email and echoed in
providerResponse on the success payload.
Gift card trading is unavailable
The sell-side endpoints (GET/POST /gift-cards/trades,
POST /gift-cards/trades/respond, GET /gift-cards/trades/{reference}) are
implemented and routed, but the upstream provider currently has the trade service
switched off. They return HTTP 503 with a clear message and charge nothing.
Do not surface a sell flow in your UI until this page says otherwise. Gift card
purchase is unaffected.
Route index
Every Topupmate-backed endpoint Hyparrow exposes, in one place. Dashboard equivalents exist under/dashboard/* with JWT auth instead of API keys.

