Home/Docs

Payouts

Move money out of a gift card. Pick one destination per request:

Only send fields for one payout type. Mixing merchant_id and bank_slug in the same request will fail.

Variables

Endpoint (all payout types)

POST https://api.chapa.link/card/payouts
Authorization: Bearer {{API_KEY}}
Content-Type: application/json

Payout to Business

Send funds from a gift card to another Chapa merchant. Optionally set who pays the service fee with charge_payer.

FieldRequiredDescription
card_numberYesSource gift card to debit
merchant_idYesDestination Chapa merchant ID
amountYesAmount to send (minor units)
charge_payerNoWho pays the service fee: business (default) or customer
{
  "card_number": "7878064900",
  "merchant_id": "912121313",
  "amount": 100,
  "charge_payer": "business"
}

Success Response

{
  "status": "success",
  "message": "Payout initiated successfully",
  "data": {
    "chapa_reference": "APh81527081a",
    "status": "SUCCESS",
    "updated_at": "2026-06-15T12:38:01.651814865Z",
    "created_at": "2026-06-15T12:38:01.651814865Z"
  }
}

Error Responses

StatusMessageWhen
400Validation errorMissing required fields or multiple destination types sent
400Invalid payout requestMore than one of merchant_id, destination_card_number, or bank fields provided
400Invalid charge payercharge_payer is not business or customer
400Amount is too small to cover the service feecharge_payer is business and amount does not cover the fee
404Gift card not foundSource card_number does not exist on your account
400Gift card disabledSource card is not active
400Insufficient balanceSource card does not have enough funds
{
  "status": "error",
  "message": "Invalid payout request. Provide exactly one of merchant_id (B2B), destination_card_number (card-to-card), or bank account details (bank withdrawal)",
  "error": "Provide exactly one of merchant_id (B2B), destination_card_number (card-to-card), or bank account details (bank withdrawal)"
}
{
  "status": "error",
  "message": "Insufficient balance",
  "error": "Insufficient balance"
}

Payout to Another Card

Instant transfer from your card to any active gift card with a matching currency. The destination card does not need to belong to your business.

Use charge_payer to choose whether the sender or receiver pays the service fee. Defaults to the sender card.

FieldRequiredDescription
card_numberYesSource (sender) gift card to debit
destination_card_numberYesDestination (receiver) gift card to credit
amountYesAmount to transfer (minor units)
charge_payerNoWho pays the service fee: sender (default) or receiver
{
  "card_number": "7878064900",
  "amount": 100,
  "destination_card_number": "8787064900",
  "charge_payer": "sender"
}

Success Response

{
  "status": "success",
  "message": "Payout initiated successfully",
  "data": {
    "initiator_reference": "GCy79131114X",
    "source_card_number": "7878064900",
    "destination_card_number": "8787064900",
    "amount": 100,
    "service_fee": 0,
    "charge_payer": "sender",
    "currency": "ETB"
  }
}

Error Responses

StatusMessageWhen
400Same cardSource and destination card_number are identical
400Invalid charge payercharge_payer is not sender or receiver
400Amount is too small to cover the service feecharge_payer is receiver and amount does not cover the fee
404Destination card not foundNo active gift card exists for destination_card_number
400Destination card disabledDestination card is not active
400Currency mismatchSource and destination cards use different currencies
400Insufficient balanceSource card does not have enough funds
{
  "status": "error",
  "message": "Currency mismatch. Source and destination cards must share the same currency",
  "error": "Source and destination cards must share the same currency"
}
{
  "status": "error",
  "message": "Invalid charge payer",
  "error": "charge_payer must be either sender or receiver for card-to-card payouts"
}

Payout to Bank

See the Chapa bank list for valid bank_slug values.

Optionally set who pays the service fee with charge_payer (same options as business payouts).

FieldRequiredDescription
card_numberYesSource gift card to debit
amountYesAmount to withdraw (minor units)
bank_slugYesDestination bank or wallet slug
account_numberYesDestination account number
account_nameYesDestination account holder name
charge_payerNoWho pays the service fee: business (default) or customer
{
  "card_number": "5610764625",
  "amount": 100,
  "bank_slug": "telebirr",
  "account_number": "0926760003",
  "account_name": "Abebe Bikila",
  "charge_payer": "business"
}

Success Response

{
  "status": "success",
  "message": "Payout initiated successfully",
  "data": {
    "chapa_reference": "CP17791313067814",
    "status": "PENDING"
  }
}

Bank payouts may start as PENDING while the transfer processes.

Error Responses

StatusMessageWhen
400Invalid payout requestbank_slug, account_number, and account_name must all be provided together
400Invalid charge payercharge_payer is not business or customer
400Amount is too small to cover the service feecharge_payer is business and amount does not cover the fee
400Gift card disabledSource card is not active
400Insufficient balanceSource card does not have enough funds
400502Payout request failedInvalid bank slug, account, or upstream payout error
{
  "status": "error",
  "message": "Invalid payout request. bank_slug, account_number, and account_name are all required for bank withdrawal",
  "error": "bank_slug, account_number, and account_name are all required for bank withdrawal"
}

List Payouts

Returns paginated payout records for your business. Use page and limit to page through results. Each item includes mode (live or test) matching your API key environment.

GET https://api.chapa.link/card/payouts?page=1&limit=15
Authorization: Bearer {{API_KEY}}
QueryDefaultMaxDescription
page1Page number (1-based)
limit15100Number of records per page
offsetOptional alternative to page (0-based skip)

Success Response

{
  "status": "success",
  "message": "Payouts fetched successfully",
  "data": {
    "items": [
      {
        "payout_type": "card_to_card",
        "status": "success",
        "currency": "ETB",
        "amount": 100,
        "service_fee": 0,
        "initiator_reference": "GCy79131114X",
        "source_card_number": "7878064900",
        "destination_card_number": "8787064900",
        "mode": "live",
        "created_at": "2026-06-21T12:00:00Z",
        "updated_at": "2026-06-21T12:00:00Z"
      },
      {
        "payout_type": "b2b",
        "status": "success",
        "currency": "ETB",
        "amount": 250,
        "service_fee": 0,
        "chapa_reference": "CP17815960544447",
        "source_card_number": "5610764625",
        "merchant_id": "912121313",
        "mode": "live",
        "created_at": "2026-06-21T11:45:00Z",
        "updated_at": "2026-06-21T11:45:00Z"
      },
      {
        "payout_type": "bank",
        "status": "pending",
        "currency": "ETB",
        "amount": 500,
        "service_fee": 0,
        "chapa_reference": "CP17815960544446",
        "source_card_number": "5610764625",
        "mode": "live",
        "created_at": "2026-06-21T11:30:00Z",
        "updated_at": "2026-06-21T11:30:00Z"
      }
    ],
    "total": 42,
    "page": 1,
    "limit": 15,
    "pages": 3
  }
}

Results are ordered by newest first.

List item fields

FieldWhen presentDescription
payout_typeAlwayscard_to_card, bank, or b2b
statusAlwayspending, success, or failed
currencyAlwaysCard currency
amountAlwaysAmount in minor units
service_feeAlwaysFee charged on the transaction
initiator_referenceCard-to-cardReference from POST /card/payouts
chapa_referenceBank or B2BReference from POST /card/payouts
source_card_numberAlwaysCard debited
destination_card_numberCard-to-cardCard credited
merchant_idB2BDestination Chapa merchant ID
modeAlwayslive or test
created_atAlwaysWhen the payout was created
updated_atAlwaysWhen the payout was last updated

Only the reference field that matches payout_type is included (initiator_reference or chapa_reference, not both).

Check Payout Status

GET https://api.chapa.link/card/payout/GCy79131114X/status
Authorization: Bearer {{API_KEY}}

Use initiator_reference (card-to-card), chapa_reference (bank/business), or the reference returned when you started the payout.

Success Response

{
  "status": "success",
  "message": "Payout status fetched successfully",
  "data": {
    "reference": "GCy79131114X",
    "chapa_ref": "CHFghskey123",
    "amount": 100,
    "service_fee": 0,
    "currency": "ETB",
    "status": "success",
    "created_at": "2026-06-21T12:00:00Z",
    "completed_at": "2026-06-21T12:00:00Z"
  }
}

Error Responses

StatusMessageWhen
400Invalid requestreference path parameter is missing
404Payout not foundReference does not exist or does not belong to your business
{
  "status": "error",
  "message": "Payout not found",
  "error": "Payout not found"
}

Gift Card - Ledger Payout

You can use the standard Chapa withdrawal flow to send funds from your Chapa business account to a Gift Card Ledger. This is effectively the same flow as a normal Chapa payout—refer to the Chapa payout documentation for more details.

To fund a gift card, simply use the "link" bank slug and set the account_number to the gift card number you wish to top up.

{
  "amount": 500, // amount to top up
  "bank_slug": "link", // must be "link" for gift card payout
  "account_number": "GCARD123456789", // target gift card number
  "account_name": "Gift Card Name" // can be reference name
}

Success Response

{
  "status": "success",
  "message": "Payout initiated successfully",
  "data": {
    "chapa_reference": "CP17815960544446",
    "status": "PENDING",
    "created_at": "2026-06-16T07:47:34.58741Z",
    "updated_at": "2026-06-16T07:47:34.587421Z"
  }
}

Error Response

{
  "status": "error",
  "message": "Invalid bank slug",
  "error": "Invalid bank slug"
}

This will start a withdrawal from your business balance to the specified gift card, following Chapa's normal payout status and flow. You can track the payout via status endpoints as usual.

Note: Make sure your Chapa business account has enough funds to perform the payout.

Tips