KDA API Logo
API Docs
Services

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

MTN

Provider IDs: kds-pin-mtn-v1, kds-pin-mtn-v2

Airtel

Airtel

Provider IDs: kds-pin-airtel-v1, kds-pin-airtel-v2

GLO

GLO

Provider IDs: kds-pin-glo-v1, kds-pin-glo-v2

9mobile

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.