j

NewJejeLaye

API Documentation

NewJejeLaye API

Professional docs that are still easy for beginners to follow

Simple, step-by-step API documentation for authentication, profile, wallet, services, airtime, data, transactions, and support.

Live API Base URL

https://jejelayegct.com.ng/api/v1

Sample API Token

1|njel_4f91c3ab8d2e7f6a95b1c42d8ef73a90c1de45fa6b7c809e

This token above is only an example to teach implementation. Real users must generate their own API token from the signed-in API page.

Mobile Quick Jump

Quick Start Behavior Token Airtime Data Boost Buy Logs Bulk SMS OTP Webhook

Important beginner note

On this platform, you buy using the platform service ID. You do not need to manually send raw network IDs or raw plan IDs.

Quick Start For Beginners

1. Generate your API token

Sign in to your user dashboard, open the API page, and click "Generate API Token". Copy the token immediately because the full token is only shown once.

2. Test login-free endpoints first

You can test public endpoints like register, login, forgot password, and resend verification without a token. This helps confirm your base URL is correct.

3. Add the token to Postman

Create an Authorization header using your token. For protected endpoints like profile, wallet, services, airtime, and data, the token must be present.

4. Discover service IDs before buying

Do not guess network IDs or plan IDs on this platform. First call `/services` and get the exact service ID and metadata you want to purchase.

5. Buy airtime or data with the correct service ID

Once you know the service ID, call `/services/{service}/purchase` with the request body required for that service type.

6. Verify billers before bill payment

For electricity and TV, call `/services/{service}/verify` first to confirm the meter or smartcard details before you purchase.

How To Implement The API Token

Your API token is sent inside the request header. Developers often call this a bearer token in raw HTTP, but for your users it is simply their API token.

Header Format
Authorization: Bearer 1|njel_4f91c3ab8d2e7f6a95b1c42d8ef73a90c1de45fa6b7c809e
Content-Type: application/json
cURL Example
curl --location 'https://jejelayegct.com.ng/api/v1/profile' \
--header 'Authorization: Bearer 1|njel_4f91c3ab8d2e7f6a95b1c42d8ef73a90c1de45fa6b7c809e' \
--header 'Content-Type: application/json'

How The API Behaves

This section explains the real response pattern of the API, especially for purchases. It is the fastest way to avoid integration mistakes.

Important behavior rules

Protected business endpoints require both a valid API token and a verified email address.
Most purchases do not return the final provider result immediately. The purchase endpoint returns `202 Accepted`, then the platform completes processing in the background.
After submitting a purchase, check `/transactions` or `/wallet.recent_transactions` to read the final `status`, `api_response`, refund state, and fulfillment metadata.
The verification endpoint is only for electricity and TV services. Calling it for other service types returns `422`.
Use `/services` first, because the platform expects the platform service ID, not raw upstream IDs.
Real Purchase Endpoint First Response
{
  "message": "Purchase processed in local synchronous mode.",
  "service": {
    "id": 353,
    "name": "MTN 1.0GB SME2",
    "slug": "mtn-1-0gb-sme2-353",
    "type": "data",
    "selling_price": "304.00",
    "min_amount": null,
    "max_amount": null,
    "is_active": true,
    "category": {
      "id": 2,
      "name": "Data",
      "slug": "data"
    },
    "metadata": {
      "network": "MTN",
      "plan_name": "1.0GB",
      "duration": "30 days"
    }
  }
}
What To Check Next
1. POST /services/{service}/purchase
2. Receive 202 Accepted style response
3. GET /transactions
4. Read final status, api_response, refund state, and meta

Required purchase fields by service type

airtime

`amount`, `mobile_number`, optional `Ported_number`, `airtime_type`

data

`mobile_number`, optional `Ported_number`, optional `ident`

electricity

`amount`, `billersCode`, `variation_code`

tv

`billersCode`, `subscription_type`

education

`quantity`, optional `billersCode`

print_card

`quantity`, optional `name_on_card`

social_boost

`link`, optional `quantity`, optional `comments`, optional `usernames`, plus service-specific optional fields like `runs`, `interval`, `min`, `max`, `posts`

buy_logs

`quantity`, optional `coupon`

bulk_sms

`sender`, `recipient`, `message`, optional `DND`

Complete Workflows

These are the easiest end-to-end paths for a beginner integrating the API.

Register To First Purchase

Register the user with `/auth/register`.
Verify the user email address.
Log in with `/auth/login` and save the returned token.
Call `/services?category=airtime` or `/services?category=data`.
Pick the correct service `id` from the list.
Send `POST /services/{service}/purchase` with the correct request body.
Check `/transactions` to confirm the final status and read the `api_response` field.

Data Purchase Flow

Call `/services?category=data` to list available data plans.
Read the `metadata.plan_name`, `metadata.duration`, and `metadata.network` fields.
Choose the correct service `id` for the desired plan.
Submit the data purchase request with `mobile_number`, `Ported_number`, and optional `ident`.
Read the response or later transaction record to get the final `api_response` shown to the customer.

Bills Purchase Flow

Call `/services?type=electricity`, `/services?type=tv`, or `/services?type=education` to list bill services.
Pick the correct service `id` from the list.
For electricity or TV, call `POST /services/{service}/verify` before payment.
If verification succeeds, call `POST /services/{service}/purchase` with the matching request body.
Read `/transactions` to get the final `api_response`, token, PIN, or customer-safe fulfillment details.

Recharge Card Printing Flow

Call `/services?type=print_card` to list available recharge-card denominations.
Pick the exact recharge-card service `id` you want.
Send `POST /services/{service}/purchase` with `quantity` and `name_on_card`.
Read the transaction response or `/transactions` to get the generated recharge PIN batch in `meta.fulfillment_items`.

Bulk SMS Flow

Call `/services?type=bulk_sms` to list available SMS routes.
Pick the exact bulk SMS service `id` you want.
Send `POST /services/{service}/purchase` with `sender`, `recipient`, `message`, and optional `DND`.
Read the transaction response or `/transactions` to confirm whether the SMS request was accepted successfully.

Buy Logs Flow

Call `/services?type=buy_logs` to list available Buy Logs products.
Pick the exact Buy Logs service `id` you want.
Send `POST /services/{service}/purchase` with `quantity` and optional `coupon`.
Read `/transactions` to get the final delivery details, generated account data, and customer-safe fulfillment metadata.

Boost Flow

Call `/services?type=social_boost` to list synced boost services.
Read the returned metadata to confirm platform, category, service type, rate mode, and quantity limits.
Pick the exact boost service `id` you want.
Send `POST /services/{service}/purchase` with `link` and the fields required by that service type.
Read `/transactions` to get the final order status and provider-safe response details.

How To Buy Airtime

Airtime purchase is a two-step process: first discover the airtime service ID, then buy with that exact service ID.

Step-by-step

Call `GET /services?category=airtime` or search by network name to list airtime services.
Pick the airtime service you want and keep its `id` value.
Use that `id` in `POST /services/{service}/purchase`.
Send `mobile_number`, `amount`, and optionally `Ported_number`.
Get Airtime Services
GET https://jejelayegct.com.ng/api/v1/services?category=airtime
Example Airtime Service List Response
[
  {
    "id": 15,
    "name": "MTN Airtime VTU",
    "type": "airtime",
    "selling_price": "100.00",
    "min_amount": "50.00",
    "max_amount": "5000.00",
    "metadata": {
      "network": "MTN",
      "network_id": 1,
      "airtime_type": "VTU"
    }
  },
  {
    "id": 16,
    "name": "GLO Airtime VTU",
    "type": "airtime",
    "selling_price": "100.00",
    "min_amount": "50.00",
    "max_amount": "5000.00",
    "metadata": {
      "network": "GLO",
      "network_id": 2,
      "airtime_type": "VTU"
    }
  }
]
Buy Airtime Example
POST https://jejelayegct.com.ng/api/v1/services/15/purchase

{
  "amount": 100,
  "mobile_number": "08123456789",
  "Ported_number": false,
  "airtime_type": "VTU"
}
Successful Airtime Response Example
{
  "message": "Purchase completed successfully.",
  "transaction": {
    "id": 1204,
    "reference": "TXN-20260331-8F4K2P",
    "status": "successful",
    "type": "airtime",
    "amount": "100.00",
    "service_id": 15,
    "user_id": 27,
    "api_response": "Airtime purchase completed successfully.",
    "created_at": "2026-03-31T09:14:22.000000Z"
  },
  "wallet": {
    "balance_before": "2500.00",
    "balance_after": "2400.00"
  },
  "service": {
    "id": 15,
    "name": "MTN Airtime VTU",
    "type": "airtime"
  },
  "meta": {
    "mobile_number": "08123456789",
    "Ported_number": false,
    "airtime_type": "VTU"
  }
}

How To Buy Data

Data purchase is also a two-step process: first discover the exact data plan service ID, then buy that plan. This is easier and safer than making users guess raw network IDs or raw plan IDs.

Step-by-step

Call `GET /services?category=data&search=mtn` or another network name to list data plans.
Read the returned service metadata to confirm the plan name, network, duration, and package reference.
Pick the exact data plan you want and keep its `id` value.
Use that `id` in `POST /services/{service}/purchase` with `mobile_number`, `Ported_number`, and optional `ident`.
Get Data Plans
GET https://jejelayegct.com.ng/api/v1/services?category=data
Example Data Plan List Response
[
  {
    "id": 353,
    "name": "MTN 1.0GB SME2",
    "type": "data",
    "selling_price": "304.00",
    "metadata": {
      "network": "MTN",
      "network_id": 1,
      "plan_type": "SME2",
      "plan_name": "1.0GB",
      "duration": "30 days",
      "plan_id": "353"
    }
  },
  {
    "id": 354,
    "name": "MTN 2.0GB SME2",
    "type": "data",
    "selling_price": "558.00",
    "metadata": {
      "network": "MTN",
      "network_id": 1,
      "plan_type": "SME2",
      "plan_name": "2.0GB",
      "duration": "30 days",
      "plan_id": "354"
    }
  }
]
Buy Data Example
POST https://jejelayegct.com.ng/api/v1/services/353/purchase

{
  "mobile_number": "08123456789",
  "Ported_number": true,
  "ident": "Data1234567890"
}
Successful Data Response Example
{
  "message": "Purchase completed successfully.",
  "transaction": {
    "id": 1210,
    "reference": "TXN-20260331-Q9M7LA",
    "status": "successful",
    "type": "data",
    "amount": "304.00",
    "service_id": 353,
    "user_id": 27,
    "api_response": "Dear Customer, You have successfully shared 1000MB Data to 2348123456789.",
    "created_at": "2026-03-31T09:21:10.000000Z"
  },
  "wallet": {
    "balance_before": "2400.00",
    "balance_after": "2096.00"
  },
  "service": {
    "id": 353,
    "name": "MTN 1.0GB SME2",
    "type": "data"
  },
  "meta": {
    "mobile_number": "08123456789",
    "Ported_number": true,
    "ident": "Data1234567890"
  }
}

How To Buy Social Boost Services

Boost services also use the same service-ID purchase pattern. First discover the synced boost service you want, then submit the purchase request with the target link and the fields required by that service type.

Step-by-step

Call `GET /services?type=social_boost` to list active boost services from the synced catalog.
Read the returned metadata to confirm the platform, category, service type, rate mode, and quantity limits.
Pick the exact boost service `id` you want and keep it.
Use that `id` in `POST /services/{service}/purchase` with `link` and the fields required by that service type.
For comment services send `comments` as one comment per line. For mention services send `usernames` as one username per line.
Get Boost Services
GET https://jejelayegct.com.ng/api/v1/services?type=social_boost
Example Boost Service List Response
[
  {
    "id": 761,
    "name": "Instagram Comments | Custom Comments | High Quality Accounts",
    "type": "social_boost",
    "selling_price": "48380.68",
    "min_amount": "10.00",
    "max_amount": "10000.00",
    "metadata": {
      "platform": "Instagram",
      "category": "Instagram Comments | Server III",
      "service_type": "custom comments",
      "rate_mode": "unit",
      "min_quantity": 10,
      "max_quantity": 10000
    }
  }
]
Boost Purchase Example
POST https://jejelayegct.com.ng/api/v1/services/761/purchase

{
  "link": "https://instagram.com/example-post",
  "comments": "Amazing post!\nLove this content!\nKeep it up!",
  "quantity": 10
}
Successful Boost Response Example
{
  "message": "Purchase completed successfully.",
  "transaction": {
    "reference": "trx-4af64f6a-3e35-4ff2-84ad-4de01b3a2d5b",
    "status": "successful",
    "type": "social_boost",
    "amount": "483806.80",
    "api_response": "Boost order created successfully.",
    "meta": {
      "target": "https://instagram.com/example-post",
      "quantity": 10
    }
  }
}

How To Send Bulk SMS

Bulk SMS uses the same service-ID purchase pattern. First discover the SMS route you want, then send the request with your sender name, recipients, and message body.

Step-by-step

Call `GET /services?type=bulk_sms` to list available SMS routes.
Pick the SMS service `id` you want and keep it.
Use that `id` in `POST /services/{service}/purchase` with `sender`, `recipient`, `message`, and optional `DND`.
Send recipients as a comma-separated string of 11-digit numbers.
Read the response or later transaction record to confirm the final `api_response` and recipient count.
Get Bulk SMS Services
GET https://jejelayegct.com.ng/api/v1/services?type=bulk_sms
Example Bulk SMS Service List Response
[
  {
    "id": 508,
    "name": "Bulk SMS Route",
    "type": "bulksms",
    "selling_price": "4.00",
    "metadata": {
      "unit": "SMS"
    }
  }
]
Send Bulk SMS Example
POST https://jejelayegct.com.ng/api/v1/services/508/purchase

{
  "sender": "JEJELAYE",
  "recipient": "08012345678,09076543210,08123456789",
  "message": "Hello from our platform",
  "DND": true
}
Successful Bulk SMS Response Example
{
  "message": "Purchase completed successfully.",
  "transaction": {
    "reference": "TXN-20260331-SM28YX",
    "status": "successful",
    "type": "bulksms",
    "amount": "12.00",
    "api_response": "Message succesfully sent ",
    "meta": {
      "customer_details": {
        "Sender": "JEJELAYE",
        "Recipient Count": 3,
        "DND Mode": "Enabled"
      }
    }
  }
}
Failed Bulk SMS Response With Refund Example
{
  "message": "Purchase failed and wallet refunded.",
  "transaction": {
    "reference": "TXN-20260331-SM77RF",
    "status": "refunded",
    "type": "bulksms",
    "amount": "12.00",
    "api_response": "Bulk SMS sending failed."
  },
  "wallet": {
    "balance_before": "3000.00",
    "balance_after": "3012.00"
  }
}

How To Buy Logs Products

Buy Logs products also follow the service-ID purchase pattern. First discover the exact product you want, then submit the purchase request with quantity and optional coupon.

Step-by-step

Call `GET /services?type=buy_logs` to list active Buy Logs products from the synced catalog.
Read the returned service details to confirm the product name, category, stock, and selling price.
Pick the exact Buy Logs service `id` you want and keep it.
Use that `id` in `POST /services/{service}/purchase` with `quantity` and optional `coupon`.
Read the later transaction detail to get the delivered account data in `meta.fulfillment_items`.
Get Buy Logs Services
GET https://jejelayegct.com.ng/api/v1/services?type=buy_logs
Example Buy Logs Service List Response
[
  {
    "id": 585,
    "name": "Instagram account with 0 posts, registered via phone, genuine products, temp-mail.io email, opend two-factor authentication.",
    "type": "buy_logs",
    "selling_price": "768.00",
    "metadata": {
      "category": "INSTAGRAM",
      "stock": 157,
      "summary": "Format: user | pass | 2fa | email access",
      "min_quantity": 1,
      "max_quantity": 1000000
    }
  }
]
Buy Logs Purchase Example
POST https://jejelayegct.com.ng/api/v1/services/585/purchase

{
  "quantity": 1,
  "coupon": ""
}
Successful Buy Logs Response Example
{
  "message": "Purchase completed successfully.",
  "transaction": {
    "reference": "trx-0659c8db-8fb3-4bc4-b834-5ad9523cfe01",
    "status": "successful",
    "type": "buy_logs",
    "amount": "768.00",
    "api_response": "Order created successfully.",
    "meta": {
      "customer_details": {
        "Product": "Instagram account with 0 posts, registered via phone, genuine products, temp-mail.io email, opend two-factor authentication.",
        "Quantity": 1,
        "Order Code": "3QVB69cc4f8649033"
      },
      "fulfillment_items": [
        {
          "Login": "debbie.lopezmdjf.931678",
          "Password": "o2zHQVJey",
          "Email": "YMXL7TG45WHLPKRT4F5OMGF55FVDF562",
          "Two Factor": "[email protected]",
          "Raw Data": "debbie.lopezmdjf.931678|o2zHQVJey|YMXL7TG45WHLPKRT4F5OMGF55FVDF562||[email protected]|"
        }
      ]
    }
  }
}

Virtual Number API

Virtual number purchases are available to API users through the public /api/v1 endpoints. Use the catalog response to discover the current USA server and service keys, then submit the purchase request with your optional routing preferences.

API endpoints

GET https://jejelayegct.com.ng/api/v1/virtual-numbers/categories lists USA and international categories.
GET https://jejelayegct.com.ng/api/v1/virtual-numbers/catalog?category=usa returns server keys and available services.
POST https://jejelayegct.com.ng/api/v1/virtual-numbers/purchase reserves the selected number.
GET https://jejelayegct.com.ng/api/v1/virtual-numbers/sessions returns active sessions and OTP status.

USA Number 2 with routing preferences

1. Call the USA catalog and select the server with server_key equal to usa_server_2.
2. Use that server's public_service_key in the purchase request.
3. If you want the same "Select Price Tier / Provider Slot" options shown on the Buy Number page, call GET https://jejelayegct.com.ng/api/v1/virtual-numbers/catalog again with category, server_key, country_code, and service_code.
4. Read the returned variations array and pass the chosen variation_id in the purchase request.
5. Optionally send area_codes as a comma-separated string, such as 212,646.
6. Optionally send carrier as at&t or tmobile.
7. Optionally send rent_specific_number to request one exact USA Number 2 phone number.
8. Optionally send re_rent_number to request a previously rented number again by its prior provider reference.
9. Selecting one routing option adds the configured API surcharge; selecting both adds both configured surcharges.
10. Check the returned session or poll /virtual-numbers/sessions for the OTP.

Purchase example

POST https://jejelayegct.com.ng/api/v1/virtual-numbers/purchase
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/json

{
  "category": "usa",
  "server_key": "usa_server_2",
  "public_service_key": "us-whatsapp",
  "number_type": "regular",
  "variation_id": "3170",
  "area_codes": "212,646",
  "carrier": "at&t",
  "rent_specific_number": "",
  "re_rent_number": "",
  "callback_url": "https://your-site.example/webhooks/otp"
}

Important behavior

variation_id, area_codes, carrier, rent_specific_number, and re_rent_number are all optional. Send variation_id only after reading the variations array from the catalog endpoint, send only the rent field that matches your flow, and expect an out-of-stock style response when the requested tier or routing combination is unavailable.

Form fields on the page

Category: decides whether the user is browsing USA or International verification offers.
Server: lets the user choose the hidden server slot without revealing the real provider brand.
Country: only appears for international flow and controls which country-specific services are loaded.
Service: shows the available verification product for the selected server and country.
Number Type: lists the number classes available for that selected service.

Session statuses and page behavior

waiting_for_otp: the number is reserved and the platform is still polling for OTP.
otp_received: the code has arrived and is shown directly on the session card.
refunded: timeout was reached and the wallet refund has been completed.
Countdown: the page shows a visible refund countdown and refreshes when the timer reaches zero.
Polling: the platform keeps checking for OTP in the background using queue jobs when the queue worker is running.

Example Session Before OTP

{
  "reference": "vns-75d973f8-e1b2-40ef-a3be-697cbd1343fd",
  "status": "waiting_for_otp",
  "category": "international",
  "country_name": "South Africa",
  "service_name": "Whatsapp",
  "number_type": "regular",
  "phone_number": "2782552098",
  "selling_price": "2288.00",
  "refund_amount": "2288.00",
  "expires_at": "2026-03-31T15:01:00+01:00"
}

Example Session After OTP

{
  "reference": "vns-75d973f8-e1b2-40ef-a3be-697cbd1343fd",
  "status": "otp_received",
  "category": "international",
  "country_name": "South Africa",
  "service_name": "Whatsapp",
  "number_type": "regular",
  "phone_number": "2782552098",
  "otp_code": "654321",
  "otp_received_at": "2026-03-31T15:00:32+01:00",
  "completed_at": "2026-03-31T15:00:32+01:00"
}

Auto refund behavior

The timeout value comes from the active virtual-number policy for the chosen category.
When timeout is reached, the platform attempts to cancel the remote activation and then refunds the wallet.
The session status changes to refunded and the refund timestamp is saved.
For guaranteed background refund behavior, the queue worker should be running. The page also reconciles overdue sessions when it loads.

JejeLaye Virtual Number OTP Webhook Contract

When your purchase request is routed through the JejeLaye virtual number provider, the provider sends OTP results back to your callback URL instead of returning the OTP immediately in the purchase response.

Callback URL Requirements

The callback URL must be publicly reachable from JejeLaye and should use your app's base URL.
The expected route is /api/v1/webhooks/jejelaye-otp with the same token query parameter your app registers.
A successful webhook POST must return HTTP 200 OK so JejeLaye considers the delivery complete.
If you are using a Laravel app with the shared API prefix, do not send /api/webhooks/... instead of /api/v1/webhooks/....
Example Purchase Payload
{
  "service_id": 420,
  "network": "MTN",
  "amount": 500,
  "callback_url": "https://your-app.com/api/v1/webhooks/jejelaye-otp?token=your-webhook-secret"
}
Expected Webhook Payload
reference=VNS-1234567890
status=otp_received
otp_code=123456
otp_received_at=2026-07-10T12:34:56+00:00
service_name=Whatsapp

How To Use Bills Services

Bills follow the same service-ID approach as airtime and data. First discover the bill service you want, then verify when needed, then purchase with the required request body.

Electricity

Call `GET /services?type=electricity` to list electricity services.
Pick the service `id` for the disco you want.
Call `POST /services/{service}/verify` with `billersCode` and `type` (`prepaid` or `postpaid`).
If verification succeeds, call `POST /services/{service}/purchase` with `amount`, `billersCode`, and `variation_code`.

TV Subscription

Call `GET /services?type=tv` to list available TV packages.
Pick the service `id` for the package you want.
Optionally verify the smartcard with `POST /services/{service}/verify` using `billersCode`.
Purchase with `billersCode` and `subscription_type` (`renew` or `change`).

Education

Call `GET /services?type=education` to list available education products.
Pick the service `id` you want.
Buy with `quantity` and optional `billersCode` if the product requires a profile or candidate ID.
Get Electricity Services
GET https://jejelayegct.com.ng/api/v1/services?type=electricity
Electricity Service Response
[
  {
    "id": 901,
    "name": "Ikeja Electric Payment - IKEDC",
    "type": "electricity",
    "selling_price": "0.00",
    "min_amount": "500.00",
    "max_amount": null,
    "metadata": {
      "service_id": "ikeja-electric",
      "service_name": "Ikeja Electric Payment - IKEDC",
      "meter_variations": [
        { "code": "prepaid", "label": "Prepaid" },
        { "code": "postpaid", "label": "Postpaid" }
      ],
      "billers_code_label": "Meter Number"
    }
  }
]
Verify Electricity Meter
POST https://jejelayegct.com.ng/api/v1/services/901/verify

{
  "billersCode": "1111111111111",
  "type": "prepaid"
}
Verification Success Example
{
  "message": "Verification successful.",
  "verification": {
    "Customer_Name": "TEST METER",
    "Address": "ADJACENT ISHAKU FILLING STATION, Taraba",
    "MeterNumber": "1111111111111",
    "Meter_Type": "PREPAID",
    "Min_Purchase_Amount": 500
  }
}
Pay Electricity Example
POST https://jejelayegct.com.ng/api/v1/services/901/purchase

{
  "amount": 2000,
  "billersCode": "1111111111111",
  "variation_code": "prepaid"
}
Electricity Success Example
{
  "message": "Purchase completed successfully.",
  "transaction": {
    "reference": "TXN-20260331-AB12CD",
    "status": "successful",
    "type": "electricity",
    "amount": "2100.00",
    "api_response": "Token: 1234 5678 9101 1121",
    "meta": {
      "vend_label": "Token",
      "vend_value": "1234 5678 9101 1121"
    }
  }
}
TV Service Response
[
  {
    "id": 1040,
    "name": "GOTV - GOtv Jinja",
    "type": "tv",
    "selling_price": "3300.00",
    "metadata": {
      "service_id": "gotv",
      "service_name": "GOTV",
      "variation_code": "gotv-jinja",
      "variation_name": "GOtv Jinja"
    }
  }
]
Pay TV Example
POST https://jejelayegct.com.ng/api/v1/services/1040/purchase

{
  "billersCode": "1234567890",
  "subscription_type": "renew"
}
TV Success Example
{
  "message": "Purchase completed successfully.",
  "transaction": {
    "reference": "TXN-20260331-TV88JK",
    "status": "successful",
    "type": "tv",
    "amount": "3300.00",
    "api_response": "TRANSACTION SUCCESSFUL",
    "meta": {
      "customer_details": {
        "Package": "GOtv Jinja",
        "Unique Element": "1234567890",
        "Status": "delivered",
        "Amount": "3300.00"
      }
    }
  }
}
Education Service Response
[
  {
    "id": 1102,
    "name": "JAMB PIN VENDING (UTME & Direct Entry)",
    "type": "education",
    "selling_price": "7700.00",
    "metadata": {
      "service_id": "jamb",
      "variation_code": "jamb-pin",
      "variation_name": "JAMB PIN VENDING (UTME & Direct Entry)"
    }
  }
]
Buy Education Example
POST https://jejelayegct.com.ng/api/v1/services/1102/purchase

{
  "quantity": 1,
  "billersCode": "0123456789"
}
Education Success Example
{
  "message": "Purchase completed successfully.",
  "transaction": {
    "reference": "TXN-20260331-ED55LM",
    "status": "successful",
    "type": "education",
    "amount": "7700.00",
    "api_response": "PIN: 3678251321392432",
    "meta": {
      "vend_label": "PIN",
      "vend_value": "3678251321392432"
    }
  }
}

Common Error Responses

These are the most common error shapes your app should be ready to handle.

401 Unauthenticated
{
  "message": "Unauthenticated. Send a valid API token in the Authorization header.",
  "documentation_url": "http://127.0.0.1/newjejelaye/laravel-app/api/documentation"
}
403 Email Not Verified
{
  "message": "Your email address is not verified."
}
422 Validation Error
{
  "message": "The mobile number field must be 11 characters.",
  "errors": {
    "mobile_number": [
      "The mobile number field must be 11 characters."
    ]
  }
}
Failed Purchase With Auto Refund
{
  "message": "Purchase failed and wallet refunded.",
  "transaction": {
    "reference": "TXN-20260331-X2K8LM",
    "status": "refunded",
    "amount": "304.00",
    "api_response": "Provider did not return a successful purchase status."
  },
  "wallet": {
    "balance_before": "2096.00",
    "balance_after": "2400.00"
  }
}

Wallet, Transactions, And Support Examples

These examples show where integrators should read the final outcome of purchases after the first `202` response.

Wallet Response Example
{
  "balance": "2400.00",
  "virtual_account": {
    "account_number": "1234567890",
    "bank_name": "Wema Bank",
    "reference": "VA-240031"
  },
  "recent_transactions": [
    {
      "id": 1210,
      "reference": "TXN-20260331-Q9M7LA",
      "status": "successful",
      "type": "data",
      "amount": "304.00",
      "narration": "Data purchase",
      "identifier": "08123456789",
      "api_response": "Dear Customer, You have successfully shared 1000MB Data to 2348123456789.",
      "service": {
        "id": 353,
        "name": "MTN 1.0GB SME2",
        "type": "data"
      },
      "created_at": "2026-03-31T09:21:10.000000Z"
    }
  ],
  "wallet_ledger": []
}
Transactions Response Example
{
  "current_page": 1,
  "data": [
    {
      "id": 1210,
      "reference": "TXN-20260331-Q9M7LA",
      "status": "successful",
      "type": "data",
      "amount": "304.00",
      "fee": "0.00",
      "profit": "54.00",
      "wallet_balance_before": "2400.00",
      "wallet_balance_after": "2096.00",
      "narration": "Data purchase",
      "identifier": "08123456789",
      "api_response": "Dear Customer, You have successfully shared 1000MB Data to 2348123456789.",
      "service": {
        "id": 353,
        "name": "MTN 1.0GB SME2",
        "type": "data"
      },
      "meta": {
        "mobile_number": "08123456789"
      },
      "created_at": "2026-03-31T09:21:10.000000Z",
      "updated_at": "2026-03-31T09:21:12.000000Z"
    }
  ],
  "first_page_url": "http://127.0.0.1/newjejelaye/laravel-app/api/v1/transactions?page=1",
  "from": 1,
  "last_page": 1,
  "last_page_url": "http://127.0.0.1/newjejelaye/laravel-app/api/v1/transactions?page=1",
  "next_page_url": null,
  "path": "http://127.0.0.1/newjejelaye/laravel-app/api/v1/transactions",
  "per_page": 20,
  "prev_page_url": null,
  "to": 1,
  "total": 1
}
Support Ticket Create Response Example
{
  "id": 54,
  "ticket_number": "SUP-AB12CD34EF",
  "subject": "Airtime purchase issue",
  "category": "purchase",
  "priority": "normal",
  "status": "open",
  "last_reply_at": "2026-03-31T11:03:22.000000Z",
  "messages": [
    {
      "id": 88,
      "user_id": 27,
      "message": "My order is still pending after payment.",
      "is_admin": false,
      "created_at": "2026-03-31T11:03:22.000000Z"
    }
  ]
}

Pagination Guide

Endpoints like `/services`, `/transactions`, and `/support-tickets` return paginated responses.
Use `current_page`, `last_page`, and `total` to understand the full result set.
Use `next_page_url` to continue to the next page when more records exist.
Read the `data` array for the actual records on the current page.

Field Guide

Ported_number

Set this to `true` when the recipient number has been ported from one telecom network to another.

ident

Optional custom identifier you can send with a data purchase for your own tracking or reconciliation.

service id

The platform ID returned by `/services`. This is the main value used when buying airtime or data through the API.

api_response

The customer-safe transaction message returned after processing. This is what your app should display or log.

billersCode

The meter number, smartcard number, or candidate/profile reference used for bill-related purchases.

variation_code

For electricity, this is the meter type such as `prepaid` or `postpaid`.

name_on_card

The business or label text to print on a recharge-card batch.

quantity

The number of items to generate for products like recharge-card printing and education PIN vending.

recipient

A comma-separated string of 11-digit phone numbers used for Bulk SMS requests.

sender

Your SMS sender name. Keep it short and within 12 characters.

DND

Set this to `true` if you want to force-send to numbers with Do Not Disturb restrictions.

Endpoint Reference

Use this section as your full endpoint list after following the quick-start steps above.

Authentication

Registration, login, verification recovery, password reset, and account lookup.

POST https://jejelayegct.com.ng/api/v1/auth/register
Public

Create a user account. Registration requires an 11-digit phone number and an 8-character password minimum. The user must verify email before using protected service endpoints.

Sample Request Body

{
  "name": "Jane Doe",
  "email": "[email protected]",
  "phone": "08123456789",
  "password": "SecurePass123",
  "password_confirmation": "SecurePass123",
  "referral_code": "ABCD1234"
}
POST https://jejelayegct.com.ng/api/v1/auth/login
Public

Log in and receive a Sanctum bearer token. Unverified users are blocked and automatically sent a fresh verification email.

Sample Request Body

{
  "email": "[email protected]",
  "password": "SecurePass123",
  "device_name": "Postman"
}
POST https://jejelayegct.com.ng/api/v1/auth/resend-verification
Public

Send a fresh email verification link to an unverified account.

Sample Request Body

{
  "email": "[email protected]"
}
POST https://jejelayegct.com.ng/api/v1/auth/forgot-password
Public

Send a password reset email to the user.

Sample Request Body

{
  "email": "[email protected]"
}
POST https://jejelayegct.com.ng/api/v1/auth/reset-password
Public

Reset the password using the token from the email.

Sample Request Body

{
  "token": "PASSWORD_RESET_TOKEN",
  "email": "[email protected]",
  "password": "NewSecurePass123",
  "password_confirmation": "NewSecurePass123"
}
GET https://jejelayegct.com.ng/api/v1/auth/me
API token

Return the authenticated user profile.

POST https://jejelayegct.com.ng/api/v1/auth/logout
API token

Revoke the current Sanctum token.

Profile

Simple account settings for API clients.

GET https://jejelayegct.com.ng/api/v1/profile
API token

Fetch the current authenticated profile details.

PATCH https://jejelayegct.com.ng/api/v1/profile
API token

Update the user display name. Email and phone are intentionally locked and cannot be changed through this endpoint.

Sample Request Body

{
  "name": "Jane A. Doe"
}
POST https://jejelayegct.com.ng/api/v1/profile/password
API token

Change the user password with current password verification.

Sample Request Body

{
  "current_password": "SecurePass123",
  "new_password": "NewSecurePass123",
  "new_password_confirmation": "NewSecurePass123"
}

Catalog And Purchases

Discover services, list synced airtime and data plans, then buy through the generic purchase endpoint.

GET https://jejelayegct.com.ng/api/v1/categories
API token

List active service categories. For business endpoints like this, the user should have a verified email address.

GET https://jejelayegct.com.ng/api/v1/services?category=data&search=mtn
API token

List active services. Filter by category slug, type, and free-text search. This is intended for verified user accounts.

GET https://jejelayegct.com.ng/api/v1/services/{service}
API token

Get a single service detail including metadata and category. This is intended for verified user accounts.

POST https://jejelayegct.com.ng/api/v1/services/{service}/verify
API token

Verify an electricity meter or TV smartcard before purchase. Use only for service types `electricity` and `tv`.

Sample Request Body

{
  "billersCode": "1111111111111",
  "type": "prepaid"
}
POST https://jejelayegct.com.ng/api/v1/services/{service}/purchase
API token

Buy airtime. Use a service ID whose type is `airtime`. The account should be verified before making purchase calls.

Sample Request Body

{
  "amount": 100,
  "mobile_number": "08123456789",
  "Ported_number": false,
  "airtime_type": "VTU"
}
POST https://jejelayegct.com.ng/api/v1/services/{service}/purchase
API token

Buy data. Use a service ID whose type is `data`. The account should be verified before making purchase calls.

Sample Request Body

{
  "mobile_number": "08123456789",
  "Ported_number": true,
  "ident": "Data1234567890"
}
POST https://jejelayegct.com.ng/api/v1/services/{service}/purchase
API token

Pay electricity. Use a service ID whose type is `electricity`.

Sample Request Body

{
  "amount": 2000,
  "billersCode": "1111111111111",
  "variation_code": "prepaid"
}
POST https://jejelayegct.com.ng/api/v1/services/{service}/purchase
API token

Pay TV subscription. Use a service ID whose type is `tv`.

Sample Request Body

{
  "billersCode": "1234567890",
  "subscription_type": "renew"
}
POST https://jejelayegct.com.ng/api/v1/services/{service}/purchase
API token

Buy education products like result checkers or PIN vending. Use a service ID whose type is `education`.

Sample Request Body

{
  "quantity": 1,
  "billersCode": "0123456789"
}
POST https://jejelayegct.com.ng/api/v1/services/{service}/purchase
API token

Generate recharge cards. Use a service ID whose type is `print_card`.

Sample Request Body

{
  "quantity": 5,
  "name_on_card": "MY BUSINESS NAME"
}
POST https://jejelayegct.com.ng/api/v1/services/{service}/purchase
API token

Buy logs or account products. Use a service ID whose type is `buy_logs` or `logs`.

Sample Request Body

{
  "quantity": 1,
  "coupon": ""
}
POST https://jejelayegct.com.ng/api/v1/services/{service}/purchase
API token

Buy social boost services. Use a service ID whose type is `social_boost`.

Sample Request Body

{
  "link": "https://instagram.com/example-post",
  "comments": "Amazing post!\nLove this content!\nKeep it up!",
  "quantity": 10
}
POST https://jejelayegct.com.ng/api/v1/services/{service}/purchase
API token

Send bulk SMS. Use a service ID whose type is `bulk_sms`, `bulksms`, or `sms`.

Sample Request Body

{
  "sender": "JEJELAYE",
  "recipient": "08012345678,09076543210,08123456789",
  "message": "Hello from our platform",
  "DND": true
}

Wallet, Transactions, And Support

Fetch wallet state, review order history, and open support tickets.

GET https://jejelayegct.com.ng/api/v1/wallet
API token

Return wallet balance, virtual account details, recent transactions, and wallet ledger items. This endpoint is for verified accounts.

GET https://jejelayegct.com.ng/api/v1/transactions
API token

Return paginated user transactions with service and refund relationships. This endpoint is for verified accounts.

GET https://jejelayegct.com.ng/api/v1/support-tickets
API token

List support tickets opened by the authenticated user. This endpoint is for verified accounts.

POST https://jejelayegct.com.ng/api/v1/support-tickets
API token

Create a new support ticket with its first message. This endpoint is for verified accounts.

Sample Request Body

{
  "subject": "Airtime purchase issue",
  "category": "purchase",
  "priority": "normal",
  "message": "My order is still pending after payment."
}

Implementation Notes

API token and bearer token mean the same thing here. The token is sent as `Authorization: Bearer YOUR_API_TOKEN`.
Users can generate and copy their API token from the signed-in `API` page inside the dashboard.
On this platform, your API app should use the platform service ID. You do not need to send raw network IDs or raw plan IDs when purchasing through this API.
Service purchases use one generic endpoint. The request body changes depending on the service type.
Airtime and data purchases are wallet-funded. If the transaction processor does not return an explicit successful status, the platform auto-refunds the wallet.
Bill purchases are also wallet-funded. Electricity, TV, and education purchases auto-refund when the transaction processor does not return a true successful delivery state.
Recharge-card printing is wallet-funded too. If the processor does not return a successful status, the wallet is refunded automatically.
Buy Logs products also use the generic purchase endpoint. First get the correct `buy_logs` service ID from `/services?type=buy_logs`.
Boost services also use the generic purchase endpoint. First get the correct `social_boost` service ID from `/services?type=social_boost`.
Bulk SMS is wallet-funded as well. If the processor does not return a successful send response, the wallet is refunded automatically.
Virtual Number purchases are available to API users through `/api/v1/virtual-numbers/*`. Use `/virtual-numbers/catalog` first to discover the current server and service keys before sending a purchase request.
USA Number 2 API purchases support optional `area_codes`, `carrier`, `rent_specific_number`, and `re_rent_number` fields. Send only the rent field that matches your flow.
Use `/services` first in Postman to discover the correct service IDs for airtime, data, and bills before sending a purchase request.
Recharge-card printing also uses the generic purchase endpoint. First get the correct `print_card` service ID from `/services?type=print_card`.
Buy Logs purchases can return account delivery data in the final transaction metadata. Encourage API users to read `/transactions` for the completed fulfillment payload.
Bulk SMS also uses the generic purchase endpoint. First get the correct SMS service ID from `/services?type=bulk_sms`.
Password reset and email verification depend on a working mail configuration in your Laravel `.env`.