Recharge Cards
Generate printable airtime PINs for all major Nigerian networks.
Endpoints
All API requests must be made over HTTPS to: https://kda-turbo-web.vercel.app
Supported Providers
KDA supports recharge card PIN generation for the following networks. Each provider is accessible via one or both routes where available:
-v1-— Primary infrastructure.-v2-— Secondary infrastructure.
MTN
Provider IDs: kds-pin-mtn-v1, kds-pin-mtn-v2
Airtel
Provider IDs: kds-pin-airtel-v1, kds-pin-airtel-v2
GLO
Provider IDs: kds-pin-glo-v1, kds-pin-glo-v2
9mobile
Provider IDs: kds-pin-9mobile-v2
Fetch Plans
curl -X GET https://kda-turbo-web.vercel.app/api/services/recharge-card/plans \
-H "Authorization: Bearer kds_test_YOUR_API_KEY"{
"success": true,
"count": 19,
"data": [
{
"id": "kds-pin-airtel-100-v2",
"label": "100",
"salePrice": "97",
"provider": "AIRTEL"
},
{
"id": "kds-pin-mtn-100-v2",
"label": "100",
"salePrice": "98",
"provider": "MTN"
},
{
"id": "kds-pin-glo-200-v1",
"label": "200",
"salePrice": "196",
"provider": "GLO"
},
{
"id": "kds-pin-9mobile-100-v2",
"label": "100",
"salePrice": "98",
"provider": "9MOBILE"
},
{
"id": "kds-pin-mtn-1000-v2",
"label": "1000",
"salePrice": "980",
"provider": "MTN"
}
]
}Fetching without any filter returns all plans. Pass ?id=<planId> to fetch a single plan.
Fetch a single plan by its id:
curl -X GET "https://kda-turbo-web.vercel.app/api/services/recharge-card/plans?id=kds-pin-mtn-100-v2" \
-H "Authorization: Bearer kds_test_YOUR_API_KEY"The salePrice indicates the discount applied to the face value. For example, "98" means purchasing ₦100 airtime will actually only deduct ₦97 from your wallet.
Anatomy of a Recharge Card Plan
Each plan object represents a specific network, denomination, and route combination:
{
"id": "kds-pin-mtn-100-v2",
"label": "100",
"salePrice": "98",
"provider": "MTN"
}Prop
Type
Purchase Flow
Purchase Request
Request Body
Prop
Type
Example
curl -X POST https://kda-turbo-web.vercel.app/api/services/recharge-card \
-H "Authorization: Bearer kds_test_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"planId": "kds-pin-mtn-100-v2",
"quantity": 2,
"cardName": "Eko Print Services",
"idempotencyKey": "681227cc-2638-49fe-bbe3-d2500cf54767"
}'const response = await fetch("https://kda-turbo-web.vercel.app/api/services/recharge-card", {
method: "POST",
headers: {
"Authorization": "Bearer kds_test_YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
planId: "kds-pin-mtn-100-v2",
quantity: 2,
cardName: "Musbahu Print",
idempotencyKey: crypto.randomUUID()
})
});
const data = await response.json();import requests
import uuid
response = requests.post(
"https://kda-turbo-web.vercel.app/api/services/recharge-card",
headers={
"Authorization": "Bearer kds_test_YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"planId": "kds-pin-mtn-100-v2",
"quantity": 2,
"cardName": "Yellow Communication",
"idempotencyKey": str(uuid.uuid4()),
},
)
data = response.json()<?php
$ch = curl_init("https://kda-turbo-web.vercel.app/api/services/recharge-card");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer kds_test_YOUR_API_KEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"planId" => "kds-pin-mtn-100-v2",
"quantity" => 2,
"cardName" => "Eko Print Services",
"idempotencyKey" => bin2hex(random_bytes(16)),
]),
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
print_r($data);Success Response
The response includes the pin and serial in the data object for you to print.
{
"success": true,
"message": "Recharge Card Purchase purchase successful!",
"transactionId": "KDS-RC-TY81N02B-SN",
"data": {
"amount": 196,
"label": "200",
"planId": "kds-pin-glo-200-v1",
"provider": "GLO",
"status": "SUCCESS",
"description": "Recharge Card Purchase purchase successful!",
"transactionId": "KDS-RC-TY81N02B-SN",
"createdAt": "2026-06-17T12:00:00.000Z",
"quantity": "2",
"pin": "123455666,122333333",
"serial": "856073001_3,348311767_4",
"cardName": "Eko Print Services",
"type": "PIN_PRINT",
"idempotencyKey": "681227cc-2638-49fe-bbe3-d2500cf54767"
}
}Best Practices & Next Steps
PIN Array Processing: Recharge card PINs and serial numbers are returned as comma-separated values in the pin and serial fields. Always split and securely store these values before printing or displaying them to end-users.
Safe Retries with Idempotency: Always attach a unique idempotencyKey (UUID v4) to your request body. If your connection drops or times out, you can safely resubmit the exact same request without risk of debiting your wallet twice.
Handling Pending Statuses: While most purchases complete in under 3 seconds, vendor delays can occasionally leave a transaction in a PENDING state. Do not retry with a new idempotency key. Instead, listen for real-time status updates via Webhooks.