PayIn transactions allow you to receive payments from your customers via mobile money, card, or bank transfer. When a customer pays you, the funds are credited to your merchant wallet.
Below are the payment channels and methods available:
Available for the following countries:
| Country | Code | Available Methods |
|---|---|---|
| Democratic Republic of Congo | CD |
mpesa,
airtel,
orange,
afrimoney
|
| Zambia | ZM |
airtel,
mtn,
zamtel
|
method parameter when initiating transactions.
Bank transfer payments are accepted in NGN for Nigeria. The API creates a virtual bank account that your customer transfers money into. No phone_number or method parameter is required â set channel to bank_transfer and country to NG.
| Country | Code | Currency | Method |
|---|---|---|---|
| Nigeria | NG |
NGN |
bank_transfer |
Upon successful initialization, the API returns a bank_account object. Redirect or display these details to your customer so they can complete the transfer from their own bank app.
Card payments are accepted globally in USD only. No country or method parameter is required â set channel to card and the system handles the rest.
Upon successful initialization, the API returns a payment_url where the customer must be redirected to complete the card payment on the hosted payment page.
"is_test": true to process test card transactions without real charges. Test mode is only available for the card channel.
https://genesyspay.com/api/v2/payins
Create a new PayIn transaction to receive payment from a customer.
| Parameter | Type | Required | Description |
|---|---|---|---|
amount |
number | Required | Transaction amount |
currency |
string | Required | 3-letter currency code (e.g., CDF, USD, ZMW). Card payments only accept USD. |
channel |
string | Required | Payment channel: mobile_money or card |
country |
string | Required* | 2-letter country code (e.g., CD, ZM). *Required for mobile_money, not used for card. |
method |
string | Required* | Payment method (e.g., airtel, orange). *Required for mobile_money, not used for card. |
phone_number |
string | Required* | Customer phone number. *Required for mobile_money and card. |
email |
string | Required* | Customer email address. *Required for card. |
tx_ref |
string | Required | Your unique transaction reference |
callback_url |
string | Optional | URL to receive transaction status webhook |
redirect_url |
string | Optional | URL to redirect the customer after successful card payment |
cancel_url |
string | Optional | URL to redirect the customer if they cancel the card payment |
bearer |
string | Optional | Who bears the transaction fee: customer (default) or merchant |
extras |
object | Optional | Custom data to attach to transaction (returned in webhooks) |
When channel is bank_transfer, use the following instead of phone_number/method:
| Parameter | Type | Required | Description |
|---|---|---|---|
country |
string | Required | Must be NG for bank transfer |
currency |
string | Required | Must be NGN for bank transfer |
method |
string | Required | Use bank_transfer |
The following billing parameters are required when channel is card:
| Parameter | Type | Required | Description |
|---|---|---|---|
first_name |
string | Required | Cardholder first name |
last_name |
string | Required | Cardholder last name |
billing_address_line1 |
string | Required | Billing street address |
billing_city |
string | Required | Billing city |
billing_state |
string | Required | Billing state / province |
billing_postal_code |
string | Required | Billing postal / ZIP code |
billing_country |
string | Required | 2-letter billing country code (e.g., US, CD) |
is_test |
boolean | Optional | Set to true to process a test card transaction (no real charge). Only available for card channel. |
curl -X POST https://genesyspay.com/api/v2/payins \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_PRIVATE_KEY" \
-d '{
"currency": "CDF",
"amount": 100,
"country": "CD",
"channel": "mobile_money",
"method": "airtel",
"phone_number": "2439xxxxxxxx",
"tx_ref": "X238V",
"callback_url": "https://yoursite.com/webhook",
"extras": {
"customer_id": "3028",
"order_id": "F23"
}
}'
{
"status": "success",
"message": "Payment initialized successfully",
"data": {
"transaction_id": "MP260214.081725.E7B5DBC4",
"tx_ref": "X238V",
"amount": "100.00",
"fee": "0.00",
"total_amount": "100.00",
"currency": "CDF",
"status": "SUBMITTED",
"channel": "mobile_money",
"payment_method": "airtel",
"summary": "Payment to BIZ via airtel",
"mobile_money": {
"phone_number": "2439xxxxxxxx",
"network": "airtel",
"mno_transaction_id": null
},
"failure_reason": null,
"extras": {
"customer_id": "3028",
"order_id": "F23"
},
"account_balance": null,
"created_at": "2026-02-14T08:17:25+00:00",
"updated_at": "2026-02-14T08:17:27+00:00",
"phone_number": "2439xxxxxxxx"
}
}
curl -X POST https://genesyspay.com/api/v2/payins \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_PRIVATE_KEY" \
-d '{
"currency": "USD",
"amount": 25.00,
"channel": "card",
"first_name": "Jane",
"last_name": "Doe",
"email": "[email protected]",
"phone_number": "2439xxxxxxxx",
"billing_address_line1": "123 Main Street",
"billing_city": "Kinshasa",
"billing_state": "Kinshasa",
"billing_postal_code": "00000",
"billing_country": "CD",
"tx_ref": "CARD-X001",
"redirect_url": "https://yoursite.com/payment/success",
"cancel_url": "https://yoursite.com/payment/cancel",
"callback_url": "https://yoursite.com/webhook",
"is_test": true
}'
For card payments the response includes a payment_url. Redirect your customer to this URL to complete the payment on the hosted card payment page.
{
"status": "success",
"message": "Payment initialized successfully",
"data": {
"transaction_id": "CP260410.102530.A1B2C3D4",
"tx_ref": "CARD-X001",
"amount": "25.00",
"fee": "0.75",
"total_amount": "25.75",
"currency": "USD",
"status": "SUBMITTED",
"channel": "card",
"payment_method": "card",
"summary": "Card payment to BIZ",
"failure_reason": null,
"extras": null,
"account_balance": null,
"payment_url": "https://pay.gofreshpay.com/checkout/abc123xyz",
"created_at": "2026-04-10T10:25:30+00:00",
"updated_at": "2026-04-10T10:25:31+00:00",
"email": "[email protected]"
}
}
curl -X POST https://genesyspay.com/api/v2/payins \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_PRIVATE_KEY" \
-d '{
"currency": "NGN",
"amount": 5000,
"country": "NG",
"channel": "bank_transfer",
"method": "bank_transfer",
"tx_ref": "BT-NG-001",
"callback_url": "https://yoursite.com/webhook"
}'
The response includes a bank_account object. Display these details to your customer so they can complete the transfer.
{
"status": "success",
"message": "Payment initialized successfully",
"data": {
"transaction_id": "BT260521.141500.X9Y8Z7W6",
"tx_ref": "BT-NG-001",
"amount": "5000.00",
"fee": "50.00",
"total_amount": "5050.00",
"currency": "NGN",
"status": "SUBMITTED",
"channel": "bank_transfer",
"payment_method": "bank_transfer",
"summary": "Bank transfer to BIZ",
"bank_account": {
"account_number": "1234567890",
"account_name": "BIZ / BT-NG-001",
"bank_name": "VFD Bank"
},
"failure_reason": null,
"extras": null,
"account_balance": null,
"created_at": "2026-05-21T14:15:00+00:00",
"updated_at": "2026-05-21T14:15:01+00:00"
}
}
SUCCESS, then fire a webhook to your callback_url.
payment_url is a one-time link. Redirect the customer to this URL as soon as possible after receiving the response. The link expires after a short period of inactivity.
Use the following test card numbers when "is_test": true is set. Use any future expiry date and any 3-digit CVV.
| Card Number | Expiry | Result |
|---|---|---|
4000 0000 0000 0002 |
Any future date | Successful payment |
| Error Code | HTTP Status | Description |
|---|---|---|
VALIDATION_ERROR |
422 | Invalid or missing parameters |
INVALID_CURRENCY |
422 | Currency not supported |
INVALID_COUNTRY |
422 | Country not supported |
METHOD_NOT_AVAILABLE |
422 | Payment method not available for currency/country |
INVALID_ARGUMENT |
400/422 | tx_ref already exists or amount outside limits |
PAYMENT_FAILED |
422 | Payment processing failed |
PROVIDER_ERROR |
422 | Payment provider error |
https://genesyspay.com/api/v2/payins/{identifier}
Retrieve a specific PayIn transaction by its ID or reference.
curl -X GET https://genesyspay.com/api/v2/payins/TXN-REF-123456 \ -H "Authorization: Bearer YOUR_PRIVATE_KEY"
{
"status": "success",
"data": {
"transaction_id": "TXN-REF-123456",
"tx_ref": "TXN-2026-001",
"amount": "5000.00",
"fee": "150.00",
"total_amount": "5150.00",
"currency": "CDF",
"status": "SUCCESS",
"channel": "mobile_money",
"payment_method": "airtel",
"summary": "Payment completed successfully",
"mobile_money": {
"phone_number": "0707070707",
"network": "airtel",
"mno_transaction_id": "MNO123456789"
},
"account_balance": {
"previous_balance": "10000.00",
"current_balance": "14850.00",
"balance_type": "AVAILABLE"
},
"created_at": "2026-02-14T10:30:00Z",
"updated_at": "2026-02-14T10:32:15Z"
}
}
https://genesyspay.com/api/v2/payins/status/{txRef}
Retrieve a PayIn transaction using your custom transaction reference.
curl -X GET https://genesyspay.com/api/v2/payins/status/TXN-2026-001 \ -H "Authorization: Bearer YOUR_PRIVATE_KEY"
https://genesyspay.com/api/v2/payins
Retrieve a paginated list of all PayIn transactions.
| Parameter | Type | Description |
|---|---|---|
status |
string | Filter by status: PENDING, SUBMITTED, SUCCESS, FAILED, CANCELLED |
per_page |
integer | Results per page (1-100, default: 20) |
page |
integer | Page number (default: 1) |
curl -X GET "https://genesyspay.com/api/v2/payins?status=SUCCESS&per_page=10&page=1" \ -H "Authorization: Bearer YOUR_PRIVATE_KEY"
{
"status": "success",
"data": [
{
"transaction_id": "TXN-REF-123456",
"tx_ref": "TXN-2026-001",
"amount": "5000.00",
"status": "SUCCESS",
"created_at": "2026-02-14T10:30:00Z"
}
],
"meta": {
"current_page": 1,
"last_page": 5,
"per_page": 10,
"total": 50
}
}
| Status | Description |
|---|---|
PENDING |
Transaction initiated, awaiting customer action |
SUBMITTED |
Transaction submitted to payment provider |
SUCCESS |
Payment completed successfully |
FAILED |
Payment failed |
CANCELLED |
Transaction cancelled |
When a transaction status changes, we'll send a POST request to your callback_url with the transaction details. For detailed webhook implementation guide, security best practices, and webhook resend functionality, see the Webhooks documentation.
Here's an example of what you'll receive:
{
"event":"payin.successful",
"timestamp":1770993791,
"data":{
"transaction_id":"MP260213.144231.E679AA9A",
"tx_ref":"1234kj0e30m12",
"amount":"15.00",
"fee":"0.45",
"total_amount":"15.45",
"currency":"ZMW",
"status":"SUCCESS",
"channel":"mobile_money",
"payment_method":"airtel",
"summary":"Payment to BIZ via airtel",
"failure_reason":null,
"created_at":"2026-02-13T14:42:31+00:00",
"updated_at":"2026-02-13T14:43:08+00:00",
"mobile_money":{
"phone_number":"260773317519",
"network":"airtel",
"mno_transaction_id":null
},
"extras":{
"customer_id":"3028",
"order_id": "F23"
},
"account_balance":{
"previous_balance":"880.00",
"current_balance":"895.00",
"balance_type":"AVAILABLE"
}
}
}