Home/Docs

Reference

Quick answers for things you'll see across all endpoints.

Response format

Success:

{
  "status": "success",
  "message": "Gift card created successfully",
  "data": { }
}

Error:

{
  "status": "error",
  "message": "Gift card not found. No gift card for this card number and business",
  "error": "No gift card for this card number and business"
}

The error field may be a string (as above) or an object for validation failures:

{
  "status": "error",
  "message": "Validation error",
  "error": {
    "amount": "Amount must be greater than or equal to 1"
  }
}

Some errors also include a request_id you can share with Chapa support when debugging.

Base URL

https://api.chapa.link

Amounts

Currencies

You can create gift cards in: ETB, USD, DJF, UGX.

Payments and payouts use the card's currency automatically.

Gift card status

statusMeaning
1Active — can receive payments and payouts
3Disabled by you (via the API)
Other valuesDisabled or not yet active

Payment / payout status

When you check status or list history, status is one of:

Live and test mode

Your API key determines the environment. Test keys read and write test data; live keys use production data. The same base URL is used for both.

List endpoints include mode on each item (live or test) so you can tell which environment a record belongs to when building dashboards or exports.

Pagination

GET /card/payments and GET /card/payouts return paginated history for your business.

QueryDefaultMaxDescription
page1Page number (1-based)
limit15100Records per page
offsetOptional alternative to page (0-based skip)

Use page and limit for most integrations. If you send offset in the query string, it is used instead of page.

Response shape:

{
  "items": [ ],
  "total": 42,
  "page": 1,
  "limit": 15,
  "pages": 3
}

Results are ordered newest first.

Service fee

service_fee appears on payment and payout list items and on payment/payout status checks. It is calculated from the transaction amount. Today this is typically 0 unless Chapa configures a fee for your account.

On B2B, bank, and card-to-card payouts you can choose who pays the fee with charge_payer:

Payout typeAllowed valuesDefaultMeaning
Business (merchant_id)business, customerbusinessbusiness: debit amount, merchant gets less; customer: debit amount + fee, merchant gets full amount
Bankbusiness, customerbusinessSame as business payout
Card-to-cardsender, receiversendersender: debit amount + fee, destination gets full amount; receiver: debit amount, destination gets less

When business (B2B/bank) or receiver (card-to-card) pays, the source is debited amount and the destination receives amount - service_fee. When customer (B2B/bank) or sender (card-to-card) pays, the source is debited amount + service_fee and the destination receives the full amount.

References worth saving

FieldWhere you get itUse it to
card_numberCreate gift cardPay in and pay out
link_referenceStart a paymentCheck payment status
merchant_referenceYou send it (optional)Match to your own order ID
chapa_referenceBank or business payoutCheck payout status
initiator_referenceCard-to-card payoutCheck payout status, list history

List response fields

Payments (GET /card/payments)

FieldDescription
link_referenceSame as link_reference from POST /card/payments
merchant_referenceYour order ID, if you sent one
chapa_referenceChapa processor reference, when available
statuspending, success, or failed
currencyCard currency
amountAmount in minor units
service_feeFee charged on the transaction
payment_methodWallet slug, e.g. telebirr (direct charge)
card_numberGift card that was credited
modelive or test
created_atISO 8601 timestamp
updated_atISO 8601 timestamp

Payouts (GET /card/payouts)

FieldDescription
payout_typecard_to_card, bank, or b2b
statuspending, success, or failed
currencyCard currency
amountAmount in minor units
service_feeFee charged on the transaction
initiator_referenceCard-to-card reference (when payout_type is card_to_card)
chapa_referenceBank or B2B reference (when payout_type is bank or b2b)
source_card_numberCard debited
destination_card_numberCard credited (card-to-card only)
merchant_idDestination merchant (B2B only)
modelive or test
created_atISO 8601 timestamp
updated_atISO 8601 timestamp

If you send merchant_reference on a payment, it must be unique. Sending the same one twice returns an error.

Common errors

StatusMessageWhat to do
400Validation errorCheck required fields and value formats in the request body
400Invalid phone numberUse international format, e.g. +251...
400Insufficient balanceTop up the card before paying out
400Invalid payout requestSend only one destination type per payout
400Invalid charge payerUse business/customer for B2B and bank, or sender/receiver for card-to-card
400Same cardUse different source and destination cards
400Currency mismatchCard-to-card payouts require the same currency
400Gift card disabledRe-enable the card or use an active card
401UnauthorizedCheck your API key
403Cannot enableOnly the actor that disabled the card can re-enable it
404Gift card not foundCheck the card_number and that it belongs to your account
404User not foundProvide first_name when creating a card for a new phone number
404Payment not foundCheck the link_reference and your business scope
404Payout not foundCheck the payout reference and your business scope
409Gift card already existsOne card per customer + currency — use the existing card
409Duplicate merchant referenceUse a new merchant_reference
409Already disabledCard is already in the requested disabled state
502Failed to initiate payoutUpstream payout provider error — retry or contact support