Skip to main content
POST
Create a charge

Authorizations

Authorization
string
header
required

Bearer token authentication. Pass your API key as Authorization: Bearer sk_.... See Authentication for keys, scopes, and sandbox vs production.

Body

application/json
customer
string
required

The customer to charge, by their cust_ id. They must already have a saved card, or the request is refused with NO_SAVED_PAYMENT_METHOD.

amount
string
required

The amount to collect, as a decimal string (for example "29.00"). Must be greater than zero. This is the amount before the processing fee: when your account passes the fee to the customer, the card is charged more than this and the response amount shows the total.

currency
string
required

The currency of amount, in ISO 4217 format (for example USD). Your account must be able to collect card payments in this currency, or the request is refused with PAYMENT_METHOD_NOT_ENABLED.

payment_method
string | null

The saved card to charge, by its pm_ id. Omit to charge the customer's default saved card, which is the first card they saved. A card belonging to a different customer is refused with SAVED_PAYMENT_METHOD_NOT_FOUND.

description
string | null

What the charge is for. Returned as narration on the payment, and shown on your dashboard.

Maximum string length: 255
reference
string | null

Your own identifier for this charge, returned unchanged on the payment so you can match it to your records.

Maximum string length: 128
metadata
object | null

Key-value pairs you attach to the charge and get back on the payment and its webhooks.

Response

Success - Charge created and submitted to the card

Detailed payment response for API integrations.

payment_id
string
required

Unique identifier for the payment.

Example:

"pay_1a2b3c4d5e"

status
enum<string>
required

Current status of the payment. created: the charge exists and no attempt has succeeded yet. processing: an attempt is in flight and is being verified. succeeded: the payment is confirmed and settled in full. accepted: an underpayment or overpayment was accepted as final settlement. failed: the payment failed and no funds were captured. expired: the payment window elapsed before any payment arrived. cancelled: cancelled before completion. refunded: the full amount was returned to the customer. partially_refunded: part of the amount was returned to the customer. auto_refunded: we automatically returned the full amount to the customer. underpaid: the customer paid less than the amount owed. overpaid: the customer paid more than the amount owed.

Available options:
created,
processing,
succeeded,
accepted,
failed,
expired,
cancelled,
refunded,
partially_refunded,
auto_refunded,
underpaid,
overpaid
Example:

"succeeded"

amount
string
required

Requested amount in currency.

Example:

"10.00"

currency
string
required

Payment currency code.

Example:

"USD"

created_at
string<date-time>
required

Creation timestamp.

Example:

"2026-04-27T12:00:00Z"

updated_at
string<date-time>
required

Last update timestamp.

Example:

"2026-04-27T12:00:05Z"

reference
string | null

Checkout reference when available.

Example:

"order_9876"

billing_reason
enum<string>

Why this payment exists. purchase: a one-time purchase. subscription_create: the first cycle of a new subscription. subscription_cycle: a subscription renewal. subscription_update: an off-cycle charge from a mid-cycle plan change (proration).

Available options:
purchase,
subscription_create,
subscription_cycle,
subscription_update
Example:

"purchase"

checkout_id
string | null

Checkout identifier, when linked.

Example:

"chk_8T9u0V1w2X3y4Z5a"

is_refundable
boolean | null

Whether this payment can currently be refunded.

Example:

true

amount_paid
string | null

Amount received so far.

Example:

"10.00"

amount_remaining
string | null

Remaining amount still expected.

Example:

"0.00"

fee_usd
string | null

Processing fee for this payment, converted to USD and expressed as a decimal string. null until the payment settles.

Example:

"0.59"

fees
object | null

The processing fee on this payment, in the currency it was charged in. Prefer this over fee_usd when the payment was not collected in USD: fee_usd is a conversion of the same fee, this is the amount actually taken. null on a payment that carries no processing fee. See Fees.

merchant_bears_cost
boolean | null

Whether merchant bears processing cost.

Example:

true

platform_fee
string | null

What the platform took out of this sale, beside the gross it was taken from, in the base currency of the sale. null when the charge carried no platform fee, and on a charge that split the sale with transfer_data.amount instead. See Platform fees.

Example:

null

destination_amount
string | null

The seller's contracted share of this sale, in the base currency of the sale. Null on a charge that carries no split, and on one that split the sale with platform_fee instead.

Example:

null

fee_paid_by
enum<string> | null

Who Bachs's processing fee actually came from on this charge, read back from the ledger posting rather than a flag decided in advance. merchant: the fee came out of the charge. platform: the platform's own balance covered it. On a destination charge this never reads platform; the fee always comes from the charge there. See Processing fees.

Available options:
merchant,
platform
Example:

"merchant"

payment_method
string | null

Payment method used for this payment. For every method except card, this is the exact corridor collected, such as NGN_BANK_TRANSFER, MOMO_GHS, or CRYPTO. Card charges report CARD rather than USD_CARD or NGN_CARD; read the currency to tell which card corridor collected it.

Example:

"NGN_BANK_TRANSFER"

channel
string | null

Origin channel (for example api).

Example:

"checkout"

narration
string | null

payment description/narration.

Example:

"Pro plan"

meta
object | null

Public metadata stored for this payment.

Example:
message
string | null

Human-readable payment message derived from status.

Example:

"Successful"

customer
object | null

Customer information when available.

line_items
object[] | null

The line items this payment covers.

subscription_id
string | null

The subscription this payment belongs to, or null for a one-time purchase.

Example:

null

invoice
object | null

The invoice this payment collected. Present only for subscription payments; null for one-time purchases.

refunds
string[] | null

IDs of any refunds issued for this payment. null if no refund has been created.

Example:
status_history
object[] | null

Chronological list of status changes for this payment.

completed_at
string<date-time> | null

Completion timestamp when available.

Example:

"2026-04-27T12:00:05Z"