curl https://api.kwugwo.africa/v1/ugwo/ugw.VCvr.7K2qPmRtV9xLnQ8sD1cYwHfE/activities \
-H "Authorization: Bearer $KWUGWO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "charge",
"data": {
"medium": "ussd",
"medium_params": { "provider": "gtb" }
}
}'
const activity = await fetch(
`https://api.kwugwo.africa/v1/ugwo/${ugwoUid}/activities`,
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KWUGWO_SECRET_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
type: "charge",
data: { medium: "ussd", medium_params: { provider: "gtb" } },
}),
}
).then(r => r.json());
import os, requests
activity = requests.post(
f"https://api.kwugwo.africa/v1/ugwo/{ugwo_uid}/activities",
headers={"Authorization": f"Bearer {os.environ['KWUGWO_SECRET_KEY']}"},
json={
"type": "charge",
"data": {"medium": "ussd", "medium_params": {"provider": "gtb"}},
},
).json()
<?php
$ch = curl_init("https://api.kwugwo.africa/v1/ugwo/{$ugwoUid}/activities");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('KWUGWO_SECRET_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'type' => 'charge',
'data' => [
'medium' => 'ussd',
'medium_params' => ['provider' => 'gtb'],
],
]),
]);
$activity = json_decode(curl_exec($ch), true);
curl_close($ch);
body, _ := json.Marshal(map[string]any{
"type": "charge",
"data": map[string]any{
"medium": "ussd",
"medium_params": map[string]any{"provider": "gtb"},
},
})
url := fmt.Sprintf("https://api.kwugwo.africa/v1/ugwo/%s/activities", ugwoUid)
req, _ := http.NewRequest("POST", url, bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("KWUGWO_SECRET_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
{
"uid": "act.VCvr.w9qTsfJMQkBIaITiGRDucv1u",
"activity_type": "charge",
"checkout": {
"uid": "chk.VCvr.vBtGwathtd99FpQGIGwIAATX",
"currency": "NGN",
"mediums": [{ "medium": "bank_transfer" }, { "medium": "ussd" }]
},
"ugwo_medium": null,
"psp": "paystack_ng",
"psp_external_id": "s09v485jla6ckt1",
"status": "requires_action",
"created_at": "2026-05-15T16:10:18+00:00",
"error": null,
"updated_at": "2026-05-15T16:10:18+00:00",
"amount": 500000,
"nzube_subscription_charge": 2500,
"refunded_amount": 0,
"charged_amount": 500000,
"next_action": {
"uid": "uac.VCvr.Rk4mZpQ7wLsD2vT8xNbHyCeU",
"action": {
"type": "user_action",
"instruction": "Please dial *737*33*4*92811# on your mobile phone to complete the transaction",
"headers": { "ussd": "*737*33*4*92811#" }
},
"status": "pending",
"last_error": null,
"expires_at": "2026-05-15T22:10:18+00:00",
"created_at": "2026-05-15T16:10:18+00:00",
"updated_at": "2026-05-15T16:10:18+00:00"
},
"is_double_charge": false
}
{
"uid": "act.VCvr.qnbBJaElzSTHOcaTzxbuDlIs",
"activity_type": "charge",
"checkout": {
"uid": "chk.VCvr.vBtGwathtd99FpQGIGwIAATX",
"currency": "NGN",
"mediums": [{ "medium": "bank_transfer" }, { "medium": "ussd" }]
},
"ugwo_medium": null,
"psp": "paystack_ng",
"psp_external_id": "5kfxw34ugz",
"status": "requires_action",
"created_at": "2026-05-14T19:55:50+00:00",
"error": null,
"updated_at": "2026-05-14T19:55:51+00:00",
"amount": 500000,
"nzube_subscription_charge": 2500,
"refunded_amount": 0,
"charged_amount": 500000,
"next_action": {
"uid": "uac.VCvr.Pz7nKq2WvLs9TdXr4BmHyCeU",
"action": {
"type": "user_action",
"instruction": "Transfer to bank",
"headers": {
"bank_name": "Test Bank",
"account_number": "1260881821",
"account_name": "PAYSTACK CHECKOUT",
"expires_at": "2026-05-14T20:10:50+00:00"
}
},
"status": "pending",
"last_error": null,
"expires_at": "2026-05-14T20:10:50+00:00",
"created_at": "2026-05-14T19:55:51+00:00",
"updated_at": "2026-05-14T19:55:51+00:00"
},
"is_double_charge": false
}
{
"uid": "act.VCvr.Ld8pWmXr3TfKq6NvZyBhCsEt",
"activity_type": "charge",
"checkout": {
"uid": "chk.VCvr.vBtGwathtd99FpQGIGwIAATX",
"currency": "NGN",
"mediums": [{ "medium": "bank_transfer" }, { "medium": "pay_with_bank" }]
},
"ugwo_medium": null,
"psp": "paystack_ng",
"psp_external_id": "kzp7bxu1lfhy3s2",
"status": "requires_action",
"created_at": "2026-08-12T10:04:11+00:00",
"error": null,
"updated_at": "2026-08-12T10:04:11+00:00",
"amount": 500000,
"nzube_subscription_charge": 2500,
"refunded_amount": 0,
"charged_amount": 500000,
"next_action": {
"uid": "uac.VCvr.Mw5rTq8NcXz2LpVb7KdHyFeJ",
"action": {
"type": "open_url",
"url": "https://checkout.paystack.com/kzp7bxu1lfhy3s2",
"headers": {
"account_name": "ADA OKONKWO",
"account_number": "8012345678"
},
"iframe": true,
"expires_at": "2026-08-12T10:34:11+00:00"
},
"status": "pending",
"last_error": null,
"expires_at": "2026-08-12T10:34:11+00:00",
"created_at": "2026-08-12T10:04:11+00:00",
"updated_at": "2026-08-12T10:04:11+00:00"
},
"is_double_charge": false
}
{
"message": "nzube.ugwo.error.routing_failed",
"code": "payment_routing_error",
"params": []
}
{
"message": "Bank transfers are unavailable right now. Please try USSD.",
"code": "payment_routing_error",
"params": []
}
{
"message": "nzube.ugwo.error.already_processed",
"code": "already_exists",
"params": []
}
{
"type": "validation.error",
"title": "An error occurred",
"status": 422,
"detail": "This value should not be blank.\nussd provider \"\" is not available for the checkout \"chk.VCvr.vBtGwathtd99FpQGIGwIAATX\" of this ugwo",
"message": "Validation failed",
"errors": [
{ "field": "provider", "message": "This value should not be blank." },
{ "field": "provider", "message": "ussd provider \"\" is not available for the checkout \"chk.VCvr.vBtGwathtd99FpQGIGwIAATX\" of this ugwo" }
]
}
Activities
Charge an ugwo
Start a payment attempt through a medium of your choice.
POST
/
v1
/
ugwo
/
{ugwoUid}
/
activities
curl https://api.kwugwo.africa/v1/ugwo/ugw.VCvr.7K2qPmRtV9xLnQ8sD1cYwHfE/activities \
-H "Authorization: Bearer $KWUGWO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "charge",
"data": {
"medium": "ussd",
"medium_params": { "provider": "gtb" }
}
}'
const activity = await fetch(
`https://api.kwugwo.africa/v1/ugwo/${ugwoUid}/activities`,
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KWUGWO_SECRET_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
type: "charge",
data: { medium: "ussd", medium_params: { provider: "gtb" } },
}),
}
).then(r => r.json());
import os, requests
activity = requests.post(
f"https://api.kwugwo.africa/v1/ugwo/{ugwo_uid}/activities",
headers={"Authorization": f"Bearer {os.environ['KWUGWO_SECRET_KEY']}"},
json={
"type": "charge",
"data": {"medium": "ussd", "medium_params": {"provider": "gtb"}},
},
).json()
<?php
$ch = curl_init("https://api.kwugwo.africa/v1/ugwo/{$ugwoUid}/activities");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('KWUGWO_SECRET_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'type' => 'charge',
'data' => [
'medium' => 'ussd',
'medium_params' => ['provider' => 'gtb'],
],
]),
]);
$activity = json_decode(curl_exec($ch), true);
curl_close($ch);
body, _ := json.Marshal(map[string]any{
"type": "charge",
"data": map[string]any{
"medium": "ussd",
"medium_params": map[string]any{"provider": "gtb"},
},
})
url := fmt.Sprintf("https://api.kwugwo.africa/v1/ugwo/%s/activities", ugwoUid)
req, _ := http.NewRequest("POST", url, bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("KWUGWO_SECRET_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
{
"uid": "act.VCvr.w9qTsfJMQkBIaITiGRDucv1u",
"activity_type": "charge",
"checkout": {
"uid": "chk.VCvr.vBtGwathtd99FpQGIGwIAATX",
"currency": "NGN",
"mediums": [{ "medium": "bank_transfer" }, { "medium": "ussd" }]
},
"ugwo_medium": null,
"psp": "paystack_ng",
"psp_external_id": "s09v485jla6ckt1",
"status": "requires_action",
"created_at": "2026-05-15T16:10:18+00:00",
"error": null,
"updated_at": "2026-05-15T16:10:18+00:00",
"amount": 500000,
"nzube_subscription_charge": 2500,
"refunded_amount": 0,
"charged_amount": 500000,
"next_action": {
"uid": "uac.VCvr.Rk4mZpQ7wLsD2vT8xNbHyCeU",
"action": {
"type": "user_action",
"instruction": "Please dial *737*33*4*92811# on your mobile phone to complete the transaction",
"headers": { "ussd": "*737*33*4*92811#" }
},
"status": "pending",
"last_error": null,
"expires_at": "2026-05-15T22:10:18+00:00",
"created_at": "2026-05-15T16:10:18+00:00",
"updated_at": "2026-05-15T16:10:18+00:00"
},
"is_double_charge": false
}
{
"uid": "act.VCvr.qnbBJaElzSTHOcaTzxbuDlIs",
"activity_type": "charge",
"checkout": {
"uid": "chk.VCvr.vBtGwathtd99FpQGIGwIAATX",
"currency": "NGN",
"mediums": [{ "medium": "bank_transfer" }, { "medium": "ussd" }]
},
"ugwo_medium": null,
"psp": "paystack_ng",
"psp_external_id": "5kfxw34ugz",
"status": "requires_action",
"created_at": "2026-05-14T19:55:50+00:00",
"error": null,
"updated_at": "2026-05-14T19:55:51+00:00",
"amount": 500000,
"nzube_subscription_charge": 2500,
"refunded_amount": 0,
"charged_amount": 500000,
"next_action": {
"uid": "uac.VCvr.Pz7nKq2WvLs9TdXr4BmHyCeU",
"action": {
"type": "user_action",
"instruction": "Transfer to bank",
"headers": {
"bank_name": "Test Bank",
"account_number": "1260881821",
"account_name": "PAYSTACK CHECKOUT",
"expires_at": "2026-05-14T20:10:50+00:00"
}
},
"status": "pending",
"last_error": null,
"expires_at": "2026-05-14T20:10:50+00:00",
"created_at": "2026-05-14T19:55:51+00:00",
"updated_at": "2026-05-14T19:55:51+00:00"
},
"is_double_charge": false
}
{
"uid": "act.VCvr.Ld8pWmXr3TfKq6NvZyBhCsEt",
"activity_type": "charge",
"checkout": {
"uid": "chk.VCvr.vBtGwathtd99FpQGIGwIAATX",
"currency": "NGN",
"mediums": [{ "medium": "bank_transfer" }, { "medium": "pay_with_bank" }]
},
"ugwo_medium": null,
"psp": "paystack_ng",
"psp_external_id": "kzp7bxu1lfhy3s2",
"status": "requires_action",
"created_at": "2026-08-12T10:04:11+00:00",
"error": null,
"updated_at": "2026-08-12T10:04:11+00:00",
"amount": 500000,
"nzube_subscription_charge": 2500,
"refunded_amount": 0,
"charged_amount": 500000,
"next_action": {
"uid": "uac.VCvr.Mw5rTq8NcXz2LpVb7KdHyFeJ",
"action": {
"type": "open_url",
"url": "https://checkout.paystack.com/kzp7bxu1lfhy3s2",
"headers": {
"account_name": "ADA OKONKWO",
"account_number": "8012345678"
},
"iframe": true,
"expires_at": "2026-08-12T10:34:11+00:00"
},
"status": "pending",
"last_error": null,
"expires_at": "2026-08-12T10:34:11+00:00",
"created_at": "2026-08-12T10:04:11+00:00",
"updated_at": "2026-08-12T10:04:11+00:00"
},
"is_double_charge": false
}
{
"message": "nzube.ugwo.error.routing_failed",
"code": "payment_routing_error",
"params": []
}
{
"message": "Bank transfers are unavailable right now. Please try USSD.",
"code": "payment_routing_error",
"params": []
}
{
"message": "nzube.ugwo.error.already_processed",
"code": "already_exists",
"params": []
}
{
"type": "validation.error",
"title": "An error occurred",
"status": 422,
"detail": "This value should not be blank.\nussd provider \"\" is not available for the checkout \"chk.VCvr.vBtGwathtd99FpQGIGwIAATX\" of this ugwo",
"message": "Validation failed",
"errors": [
{ "field": "provider", "message": "This value should not be blank." },
{ "field": "provider", "message": "ussd provider \"\" is not available for the checkout \"chk.VCvr.vBtGwathtd99FpQGIGwIAATX\" of this ugwo" }
]
}
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
- bank_transfer
- ussd
- pay_with_bank
- mobile_money
The customer transfers to a one-off virtual account.Next action:
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.{
"type": "charge",
"data": {
"medium": "bank_transfer",
"medium_params": {}
}
}
user_action
with bank_name, account_number, account_name and expires_at.The customer dials a code on the phone linked to their bank account.Next action:
string
required
Bank code, e.g.
gtb. Use Get medium
providers to list the banks your
PSPs support for this checkout, or the full code
table.{
"type": "charge",
"data": {
"medium": "ussd",
"medium_params": { "provider": "gtb" }
}
}
user_action
with the ussd code to dial.The customer approves a debit from their bank or wallet account.Next action: usually
string
required
Bank or wallet code, e.g.
palmpay. See Get medium
providers.string
required
The customer’s account number: exactly 10 digits, as a string.
string
required
3 to 20 characters of the account holder’s name, as the customer
typed it (a first name or surname is enough). Kwugwo looks up the
account and, if this fairly matches the name on it, returns the
resolved name in
next_action.action.headers.account_name so the
customer can confirm it’s their account.It doesn’t block the charge: if the name doesn’t match,
account_name comes back null and the attempt still goes ahead.{
"type": "charge",
"data": {
"medium": "pay_with_bank",
"medium_params": {
"provider": "palmpay",
"account_number": "8012345678",
"account_name_fragment": "Okonkwo"
}
}
}
open_url.
Some providers ask for an input_otp or input_pin
instead.Coming soon with Ghana (GHS) support.
Response
The new Activity object. Branch onstatus:
status | Do this |
|---|---|
requires_action | Show the customer next_action (how to render each type). Then wait for the webhook. |
processing | Nothing for the customer to do. Wait for the webhook. |
failed | Read error, then let the customer try again or pick another medium. |
Errors
| Status | message | Cause |
|---|---|---|
402 | nzube.ugwo.error.subscription_not_found | Your Kwugwo subscription can’t cover this charge with the routed PSP. Top up in the dashboard. The ugwo stays requires_ugwo. |
404 | nzube.ugwo.error.not_found | No such ugwo on this workspace. |
405 | nzube.ugwo.error.checkout_not_found | The ugwo has no checkout (checkout: null), so there is nothing to route through. |
405 | nzube.ugwo.error.checkout_medium_not_active | The medium isn’t enabled on the ugwo’s checkout. |
409 | nzube.ugwo.error.already_processed | The ugwo is already paid (ugwo_successful, partially_refunded, refunded) or cancelled. |
422 | (errors) | Unknown type or medium, missing or invalid medium parameters, e.g. no provider for ussd, or one not available on the ugwo’s checkout. |
500 | nzube.ugwo.error.unknown | Internal error. List activities before retrying, in case an attempt was created. |
503 | nzube.ugwo.error.routing_failed, or your routing rules’ failure message | Payment routing failed: no PSP on the route could take the charge. No activity is created, no webhooks are sent, and the ugwo stays requires_ugwo, so it’s safe to retry or try another medium. |
curl https://api.kwugwo.africa/v1/ugwo/ugw.VCvr.7K2qPmRtV9xLnQ8sD1cYwHfE/activities \
-H "Authorization: Bearer $KWUGWO_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "charge",
"data": {
"medium": "ussd",
"medium_params": { "provider": "gtb" }
}
}'
const activity = await fetch(
`https://api.kwugwo.africa/v1/ugwo/${ugwoUid}/activities`,
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KWUGWO_SECRET_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
type: "charge",
data: { medium: "ussd", medium_params: { provider: "gtb" } },
}),
}
).then(r => r.json());
import os, requests
activity = requests.post(
f"https://api.kwugwo.africa/v1/ugwo/{ugwo_uid}/activities",
headers={"Authorization": f"Bearer {os.environ['KWUGWO_SECRET_KEY']}"},
json={
"type": "charge",
"data": {"medium": "ussd", "medium_params": {"provider": "gtb"}},
},
).json()
<?php
$ch = curl_init("https://api.kwugwo.africa/v1/ugwo/{$ugwoUid}/activities");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('KWUGWO_SECRET_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'type' => 'charge',
'data' => [
'medium' => 'ussd',
'medium_params' => ['provider' => 'gtb'],
],
]),
]);
$activity = json_decode(curl_exec($ch), true);
curl_close($ch);
body, _ := json.Marshal(map[string]any{
"type": "charge",
"data": map[string]any{
"medium": "ussd",
"medium_params": map[string]any{"provider": "gtb"},
},
})
url := fmt.Sprintf("https://api.kwugwo.africa/v1/ugwo/%s/activities", ugwoUid)
req, _ := http.NewRequest("POST", url, bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+os.Getenv("KWUGWO_SECRET_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
{
"uid": "act.VCvr.w9qTsfJMQkBIaITiGRDucv1u",
"activity_type": "charge",
"checkout": {
"uid": "chk.VCvr.vBtGwathtd99FpQGIGwIAATX",
"currency": "NGN",
"mediums": [{ "medium": "bank_transfer" }, { "medium": "ussd" }]
},
"ugwo_medium": null,
"psp": "paystack_ng",
"psp_external_id": "s09v485jla6ckt1",
"status": "requires_action",
"created_at": "2026-05-15T16:10:18+00:00",
"error": null,
"updated_at": "2026-05-15T16:10:18+00:00",
"amount": 500000,
"nzube_subscription_charge": 2500,
"refunded_amount": 0,
"charged_amount": 500000,
"next_action": {
"uid": "uac.VCvr.Rk4mZpQ7wLsD2vT8xNbHyCeU",
"action": {
"type": "user_action",
"instruction": "Please dial *737*33*4*92811# on your mobile phone to complete the transaction",
"headers": { "ussd": "*737*33*4*92811#" }
},
"status": "pending",
"last_error": null,
"expires_at": "2026-05-15T22:10:18+00:00",
"created_at": "2026-05-15T16:10:18+00:00",
"updated_at": "2026-05-15T16:10:18+00:00"
},
"is_double_charge": false
}
{
"uid": "act.VCvr.qnbBJaElzSTHOcaTzxbuDlIs",
"activity_type": "charge",
"checkout": {
"uid": "chk.VCvr.vBtGwathtd99FpQGIGwIAATX",
"currency": "NGN",
"mediums": [{ "medium": "bank_transfer" }, { "medium": "ussd" }]
},
"ugwo_medium": null,
"psp": "paystack_ng",
"psp_external_id": "5kfxw34ugz",
"status": "requires_action",
"created_at": "2026-05-14T19:55:50+00:00",
"error": null,
"updated_at": "2026-05-14T19:55:51+00:00",
"amount": 500000,
"nzube_subscription_charge": 2500,
"refunded_amount": 0,
"charged_amount": 500000,
"next_action": {
"uid": "uac.VCvr.Pz7nKq2WvLs9TdXr4BmHyCeU",
"action": {
"type": "user_action",
"instruction": "Transfer to bank",
"headers": {
"bank_name": "Test Bank",
"account_number": "1260881821",
"account_name": "PAYSTACK CHECKOUT",
"expires_at": "2026-05-14T20:10:50+00:00"
}
},
"status": "pending",
"last_error": null,
"expires_at": "2026-05-14T20:10:50+00:00",
"created_at": "2026-05-14T19:55:51+00:00",
"updated_at": "2026-05-14T19:55:51+00:00"
},
"is_double_charge": false
}
{
"uid": "act.VCvr.Ld8pWmXr3TfKq6NvZyBhCsEt",
"activity_type": "charge",
"checkout": {
"uid": "chk.VCvr.vBtGwathtd99FpQGIGwIAATX",
"currency": "NGN",
"mediums": [{ "medium": "bank_transfer" }, { "medium": "pay_with_bank" }]
},
"ugwo_medium": null,
"psp": "paystack_ng",
"psp_external_id": "kzp7bxu1lfhy3s2",
"status": "requires_action",
"created_at": "2026-08-12T10:04:11+00:00",
"error": null,
"updated_at": "2026-08-12T10:04:11+00:00",
"amount": 500000,
"nzube_subscription_charge": 2500,
"refunded_amount": 0,
"charged_amount": 500000,
"next_action": {
"uid": "uac.VCvr.Mw5rTq8NcXz2LpVb7KdHyFeJ",
"action": {
"type": "open_url",
"url": "https://checkout.paystack.com/kzp7bxu1lfhy3s2",
"headers": {
"account_name": "ADA OKONKWO",
"account_number": "8012345678"
},
"iframe": true,
"expires_at": "2026-08-12T10:34:11+00:00"
},
"status": "pending",
"last_error": null,
"expires_at": "2026-08-12T10:34:11+00:00",
"created_at": "2026-08-12T10:04:11+00:00",
"updated_at": "2026-08-12T10:04:11+00:00"
},
"is_double_charge": false
}
{
"message": "nzube.ugwo.error.routing_failed",
"code": "payment_routing_error",
"params": []
}
{
"message": "Bank transfers are unavailable right now. Please try USSD.",
"code": "payment_routing_error",
"params": []
}
{
"message": "nzube.ugwo.error.already_processed",
"code": "already_exists",
"params": []
}
{
"type": "validation.error",
"title": "An error occurred",
"status": 422,
"detail": "This value should not be blank.\nussd provider \"\" is not available for the checkout \"chk.VCvr.vBtGwathtd99FpQGIGwIAATX\" of this ugwo",
"message": "Validation failed",
"errors": [
{ "field": "provider", "message": "This value should not be blank." },
{ "field": "provider", "message": "ussd provider \"\" is not available for the checkout \"chk.VCvr.vBtGwathtd99FpQGIGwIAATX\" of this ugwo" }
]
}