Skip to main content

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.
USD cards are a separate product from virtual cards. The /virtual-cards endpoints issue NGN cards through a different provider and keep local records. The /usd-cards endpoints below issue USD cards held entirely by the upstream provider. The two share no state, and a cardId from one is meaningless to the other.

Response envelope

Every endpoint on this page returns the standard Hyparrow shape. A request that reaches the provider and is declined returns HTTP 200 with success: false, the wallet is refunded automatically in that case.

Bulk SMS

Promotional use only. This channel uses a shared sender ID with no registration step, which is what makes it cheap. Three consequences you must design around:
  • Messages deliver only between 08:00 and 20:00.
  • Numbers on the DND register may never receive.
  • The sender header shown to the recipient is not guaranteed to be the one you requested.
Do not route OTPs, password resets, or transaction alerts through it.

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
When 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.
The cross-border fee is charged after the fact, not at funding time. The card settles in USD. When the cardholder buys from a merchant priced in another currency, a UK site charging GBP, a Nigerian merchant charging NGN, the card network converts and charges for it. That fee is deducted from the card balance once the purchase settles.If the balance can’t cover it, the attempt fails and the $1 insufficient-balance fee applies instead. Fund cards with headroom above the intended spend, and warn merchants that a card funded to exactly the purchase price will often decline.

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 a 400, 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
Card creation and funding both move money and are not idempotent upstream. Send an Idempotency-Key header so a retried request cannot issue or fund twice.

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. The amount you send at purchase is the face value in the recipient currency.

Denomination rules

Products are either FIXED or RANGE:
  • FIXED, only the listed denominations are purchasable. Any other amount is rejected before your wallet is touched.
  • RANGE, any amount between minAmount and maxAmount.

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

Echo the filter you browsed with. The upstream catalog is paginated, 2,383 products at 200 per page, so a product can only be located inside the slice it was listed in. Send back the same countryCode (or productName) you used on GET /gift-cards. Omit it and only products on the first page of the global catalog can be resolved, which is under 10% of them.
Buy a gift card
The product is re-fetched and validated before your wallet is touched. A face value that isn’t valid for a 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.

Bills, see Bill Payments

Bulk SMS

USD virtual cards

Gift cards