Skip to main content

Overview

Retrieve the current status and full details of a payment charge. Use this endpoint to:
  • Check if a payment has been completed
  • Get payment provider details and references
  • View payment amount and currency
  • See status history and transitions
  • Retrieve metadata you attached during checkout
A charge represents a customer’s payment attempt. Each completed checkout creates a charge. When to use: Read a charge after a webhook has told you it changed, or when you are reconciling your own records against ours. Do not call it on a timer to watch for a change.
Do not poll this endpoint in a loop. Subscribe to webhook events instead. Webhooks tell you the moment a charge changes, so you learn about it sooner than any polling interval would, and you make one request instead of hundreds.Polling spends your rate limit on every request, whether or not anything changed, and a charge waiting on a customer can stay unchanged for a long time.

Authentication

Type: API Key (required)

Required Headers


Request

Method & Path

Path Parameters

string
required
The unique charge identifier (starts with ch_)

Example Request


Response

200 Success

Returns complete charge details including status history.

Response Fields

string
Unique charge identifier
string
Your organization ID
string
Customer identifier
string
Amount customer paid
string
Currency customer paid in
string
Currency you’ll receive settlement in
string
Amount you’ll receive (after fees)
string
Amount the customer has paid so far (relevant for underpaid charges)
string
Remaining balance (non-zero for underpaid charges)
string
Current charge status (see statuses below)
object
Your custom metadata from checkout
array
Chronological history of status changes
string
ISO 8601 timestamp of charge creation
string
ISO 8601 timestamp of last update

Charge Statuses

Charges go through various statuses during their lifecycle:

Final Statuses

Once a charge reaches a final status (succeeded, accepted, failed, cancelled, expired, refunded, partially_refunded, auto_refunded), it will not change again.

Automatic refunds

auto_refunded means we refunded the full payment automatically. This happens when a refund is required outside your control, such as an early fraud or dispute warning.

Error Responses

Charge doesn’t exist or doesn’t belong to your organization.
Causes:
  • Invalid charge_id
  • Charge belongs to a different organization
  • Charge exists in a different environment (test vs live)
You don’t have access to this charge.
Cause: The charge was created by a different organization.

Example Use Case

Scenario: Your order management system fulfils an order as soon as its payment succeeds. Subscribe to the charge events and act when one arrives. You do not ask us for the status. We tell you.
The events above are collection.succeeded, collection.underpaid, collection.failed and checkout.expired. Subscribe only to the ones you act on. Webhook Events lists every event we send. Handle the same event arriving twice. We retry delivery, and a retry can land after you have already processed the first copy. Key your fulfilment on charge_id so a repeat is ignored.

Recovering a missed event

A webhook can fail to reach you if your endpoint is down. Recover with a scheduled sweep, not a loop for each payment. Once every few minutes, list the charges you still believe are unfinished and read their current status in one request:
One request covers every pending charge you have. A loop for each payment makes one request per payment, per interval, and reaches the same answer more slowly.
A charge still created or processing after 15 minutes is unusual. Read Charge Statuses above, then contact support rather than continuing to retry.

Understanding Settlement Amounts

The settlement_amount is what you actually receive after fees are deducted:
Example:
  • Customer pays: NGN 75,000.00 (amount)
  • Fees: NGN 750.00
  • You receive: NGN 74,250.00 (settlement_amount)
The fees are calculated based on:
  • Payment method used
  • Your fee configuration
  • Charge amount

Using Status History

The status_history array shows every status change with timestamps:

Common Questions

How often should I check a charge?

You should not need to check it at all. Subscribe to webhook events and we notify you the moment the charge changes. If you run a reconciliation sweep to recover missed events, once every few minutes is enough. Most payments finish within 5 to 10 minutes.

What if status is stuck in created or processing?

  • Wait at least 10 minutes before assuming an issue
  • Check if customer completed the payment
  • Contact support if status doesn’t update after 15 minutes

Can a succeeded charge change to failed?

No. Once succeeded, the status is final. However, a completed charge can later be refunded.

How do I know the exact amount I’ll receive?

Use the settlement_amount field. This is your net amount after all fees.

Can I get charges for a specific checkout?

Yes, use List Payins and filter by checkout_id.

Next Steps

After retrieving charge status:
1

Handle completed payments

If status is succeeded, grant access and update the order.
2

Handle failed payments

If status is failed, notify the customer and offer retry options.
3

Handle non-final states

If the status is not final, wait for the webhook. Do not loop on this endpoint.
4

Enable production webhooks

Set up webhook delivery (see Webhook Documentation).