Skip to main content
POST
Creates an activity: one attempt to collect the ugwo through the medium you pick. Kwugwo routes it to one of your PSPs and returns what the customer has to do next in next_action. You only need this endpoint if you build your own payment UI. The embedded checkout calls it for you. For the full flow, see Accept a payment with the API.
You can open several attempts. The ugwo must be requires_ugwo or processing, so a customer can switch from a bank transfer to USSD without waiting for the first attempt to expire. The first attempt to succeed pays the ugwo; a later success is flagged as a double charge. Once the ugwo is paid or cancelled, this endpoint returns 409.

Path parameters

string
required
The ugwo to charge, ugw.XXXX.YYYY....

Body parameters

string
required
Always charge.
object
required
Medium parameters go inside data.medium_params, not directly in data. { "data": { "medium": "ussd", "provider": "gtb" } } is rejected with 422 (provider should not be blank); { "data": { "medium": "ussd", "medium_params": { "provider": "gtb" } } } is correct.

Medium parameters

The customer transfers to a one-off virtual account.
string
When the account stops accepting transfers, ISO-8601 with timezone (e.g. 2026-05-15T10:30:00+00:00). Must be in the future and at most 15 minutes ahead. Defaults to 15 minutes from now. Some PSPs don’t accept a custom expiry and set their own, so always show the customer next_action.expires_at, not the value you sent.
Next action: user_action with bank_name, account_number, account_name and expires_at.

Response

The new Activity object. Branch on status:

Errors