PB

Pickbo Airtime API Documentation

Professional integration guide for authentication, operator lookup and recharge workflow.

Sandbox Ready Production Ready Bearer Secured

Pickbo Airtime API Reference

This documentation helps developers authenticate securely, check account balance, fetch active countries, validate operators and create airtime topups. Each endpoint includes request examples in cURL, PowerShell, Node.js, Python, Java, PHP and Ruby, along with response samples, validation rules and environment-specific URLs.

Production Auth https://auth.pickbo.com
Sandbox Auth https://sandbox-auth.pickbo.com
Production Topups https://topups.pickbo.com
Sandbox Topups https://sandbox-topups.pickbo.com
1

Create Token

Generate a Bearer access token using your client_id and client_secret.

2

Check Balance

Confirm your account balance before attempting any live or sandbox recharge.

3

Get Countries

Retrieve active countries to build a country-aware airtime flow.

4

Validate Operator

Use country and operator ID to get operator details, prefix and amount rules.

5

Create Recharge

After operator validation, call /topups/create.php to process the recharge.

Important integration note

For authentication, the grant_type value must always be client_credentials. This value is fixed and cannot be changed. For recharge, always validate the operator first, then call the topup create endpoint using the same country_iso and operator_id.

Authentication

Create Access Token

POST

Generate a Bearer access token using your client credentials. This token is required for all secured API requests.

Security & Request Details

Authorization method, validation notes and input structure.

Security Type
None
Scheme
This endpoint does not require Bearer token. Send client_id, client_secret and grant_type in JSON body.
Method
POST
1
Use this endpoint first before calling any secured endpoint.
2
The grant_type value must always be client_credentials.
3
grant_type is fixed and cannot be changed to any other value.
4
Use sandbox credentials for sandbox and production credentials for production.
Request Body Example
{
    "client_id": "your_client_id",
    "client_secret": "your_client_secret",
    "grant_type": "client_credentials"
}

Response Examples

Expand each response to see sample output.

{
    "access_token": "your_generated_access_token_here",
    "token_type": "Bearer",
    "expires_in": 2592000,
    "scope": "topups"
}
{
    "error": "INVALID_REQUEST",
    "message": "client_id, client_secret, and grant_type are required. grant_type must be client_credentials."
}
{
    "error": "INVALID_CLIENT",
    "message": "Client authentication failed."
}
{
    "error": "CLIENT_INACTIVE",
    "message": "API client is not active."
}
POST
https://auth.pickbo.com/oauth-token.php

Request Samples

Switch between languages and copy the sample instantly.

curl --request POST \
  --url "https://auth.pickbo.com/oauth-token.php" \
  --header "Content-Type: application/json" \
  --data '{
    "client_id": "your_client_id",
    "client_secret": "your_client_secret",
    "grant_type": "client_credentials"
  }'
$headers = @{
    "Content-Type" = "application/json"
}

$body = @{
    client_id     = "your_client_id"
    client_secret = "your_client_secret"
    grant_type    = "client_credentials"
} | ConvertTo-Json

Invoke-RestMethod -Uri "https://auth.pickbo.com/oauth-token.php" `
    -Method POST `
    -Headers $headers `
    -Body $body
const fetch = require("node-fetch");

fetch("https://auth.pickbo.com/oauth-token.php", {
  method: "POST",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    client_id: "your_client_id",
    client_secret: "your_client_secret",
    grant_type: "client_credentials"
  })
})
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => console.error(err));
import requests

url = "https://auth.pickbo.com/oauth-token.php"
payload = {
    "client_id": "your_client_id",
    "client_secret": "your_client_secret",
    "grant_type": "client_credentials"
}

response = requests.post(url, json=payload)
print(response.status_code)
print(response.json())
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
    public static void main(String[] args) throws Exception {
        String json = "{\"client_id\":\"your_client_id\",\"client_secret\":\"your_client_secret\",\"grant_type\":\"client_credentials\"}";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://auth.pickbo.com/oauth-token.php"))
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(json))
            .build();

        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.statusCode());
        System.out.println(response.body());
    }
}
<?php

$url = "https://auth.pickbo.com/oauth-token.php";
$payload = [
    "client_id" => "your_client_id",
    "client_secret" => "your_client_secret",
    "grant_type" => "client_credentials"
];

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
    CURLOPT_POSTFIELDS => json_encode($payload),
]);

$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo $status . PHP_EOL;
echo $response;
require "net/http"
require "json"
require "uri"

uri = URI("https://auth.pickbo.com/oauth-token.php")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri.request_uri)
request["Content-Type"] = "application/json"
request.body = {
  client_id: "your_client_id",
  client_secret: "your_client_secret",
  grant_type: "client_credentials"
}.to_json

response = http.request(request)
puts response.code
puts response.body
Ready to Integrate
https://auth.pickbo.com/oauth-token.php https://sandbox-auth.pickbo.com/oauth-token.php
Account

View Account Balance

GET

Retrieve the current account balance and basic user details for the authenticated account.

Security & Request Details

Authorization method, validation notes and input structure.

Security Type
HTTP Bearer Token
Scheme
Authorization: Bearer YOUR_ACCESS_TOKEN
Method
GET
1
A valid Bearer token is required.
2
Use this endpoint to confirm wallet balance before making transactions.
3
Response includes balance, currencyCode, and basic user details.

Response Examples

Expand each response to see sample output.

{
    "balance": 5000,
    "currencyCode": "USD",
    "user": {
        "name": "John Doe",
        "username": "johnapi"
    }
}
{
    "error": "UNAUTHORIZED",
    "message": "Invalid or expired access token."
}
{
    "error": "METHOD_NOT_ALLOWED",
    "message": "Only GET method is allowed."
}
GET
https://topups.pickbo.com/accounts/balance.php

Request Samples

Switch between languages and copy the sample instantly.

curl --request GET \
  --url "https://topups.pickbo.com/accounts/balance.php" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YOUR_ACCESS_TOKEN"
$headers = @{
    "Accept" = "application/json"
    "Authorization" = "Bearer YOUR_ACCESS_TOKEN"
}

Invoke-RestMethod -Uri "https://topups.pickbo.com/accounts/balance.php" `
    -Method GET `
    -Headers $headers
const fetch = require("node-fetch");

fetch("https://topups.pickbo.com/accounts/balance.php", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN"
  }
})
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => console.error(err));
import requests

url = "https://topups.pickbo.com/accounts/balance.php"
headers = {
    "Accept": "application/json",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN"
}

response = requests.get(url, headers=headers)
print(response.status_code)
print(response.json())
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
    public static void main(String[] args) throws Exception {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://topups.pickbo.com/accounts/balance.php"))
            .header("Accept", "application/json")
            .header("Authorization", "Bearer YOUR_ACCESS_TOKEN")
            .GET()
            .build();

        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.statusCode());
        System.out.println(response.body());
    }
}
<?php

$ch = curl_init("https://topups.pickbo.com/accounts/balance.php");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Accept: application/json",
        "Authorization: Bearer YOUR_ACCESS_TOKEN"
    ],
]);

$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo $status . PHP_EOL;
echo $response;
require "net/http"
require "uri"

uri = URI("https://topups.pickbo.com/accounts/balance.php")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Get.new(uri.request_uri)
request["Accept"] = "application/json"
request["Authorization"] = "Bearer YOUR_ACCESS_TOKEN"

response = http.request(request)
puts response.code
puts response.body
Ready to Integrate
https://topups.pickbo.com/accounts/balance.php https://sandbox-topups.pickbo.com/accounts/balance.php
Operators

Get Countries

GET

Fetch all active countries available for operator and airtime-related requests.

Security & Request Details

Authorization method, validation notes and input structure.

Security Type
HTTP Bearer Token
Scheme
Authorization: Bearer YOUR_ACCESS_TOKEN
Method
GET
1
A valid Bearer token is required.
2
Returns only active countries.
3
Use this endpoint before operator lookup when building country-specific flows.

Response Examples

Expand each response to see sample output.

{
    "success": true,
    "message": "Countries fetched successfully.",
    "data": [
        {
            "id": 1,
            "iso_code": "BD",
            "name": "Bangladesh",
            "continent": "Asia",
            "currency_code": "BDT",
            "currency_name": "Bangladeshi Taka",
            "currency_symbol": "৳",
            "flag_url": "https://example.com/flags/bd.png",
            "calling_codes": "+880",
            "status": "active"
        },
        {
            "id": 2,
            "iso_code": "NG",
            "name": "Nigeria",
            "continent": "Africa",
            "currency_code": "NGN",
            "currency_name": "Naira",
            "currency_symbol": "₦",
            "flag_url": "https://example.com/flags/ng.png",
            "calling_codes": "+234",
            "status": "active"
        }
    ]
}
{
    "success": false,
    "message": "Unauthorized."
}
{
    "success": false,
    "message": "Internal server error."
}
GET
https://topups.pickbo.com/operator/countries.php

Request Samples

Switch between languages and copy the sample instantly.

curl --request GET \
  --url "https://topups.pickbo.com/operator/countries.php" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YOUR_ACCESS_TOKEN"
$headers = @{
    "Accept" = "application/json"
    "Authorization" = "Bearer YOUR_ACCESS_TOKEN"
}

Invoke-RestMethod -Uri "https://topups.pickbo.com/operator/countries.php" `
    -Method GET `
    -Headers $headers
const fetch = require("node-fetch");

fetch("https://topups.pickbo.com/operator/countries.php", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN"
  }
})
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => console.error(err));
import requests

url = "https://topups.pickbo.com/operator/countries.php"
headers = {
    "Accept": "application/json",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN"
}

response = requests.get(url, headers=headers)
print(response.status_code)
print(response.json())
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
    public static void main(String[] args) throws Exception {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://topups.pickbo.com/operator/countries.php"))
            .header("Accept", "application/json")
            .header("Authorization", "Bearer YOUR_ACCESS_TOKEN")
            .GET()
            .build();

        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.statusCode());
        System.out.println(response.body());
    }
}
<?php

$ch = curl_init("https://topups.pickbo.com/operator/countries.php");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Accept: application/json",
        "Authorization: Bearer YOUR_ACCESS_TOKEN"
    ],
]);

$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo $status . PHP_EOL;
echo $response;
require "net/http"
require "uri"

uri = URI("https://topups.pickbo.com/operator/countries.php")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Get.new(uri.request_uri)
request["Accept"] = "application/json"
request["Authorization"] = "Bearer YOUR_ACCESS_TOKEN"

response = http.request(request)
puts response.code
puts response.body
Ready to Integrate
https://topups.pickbo.com/operator/countries.php https://sandbox-topups.pickbo.com/operator/countries.php
Operators

Get Operator(s)

GET

Fetch active operators by country. If operator_id is provided, the endpoint returns a specific operator. If operator_id is omitted, it returns all active operators for the given country.

Security & Request Details

Authorization method, validation notes and input structure.

Security Type
HTTP Bearer Token
Scheme
Authorization: Bearer YOUR_ACCESS_TOKEN
Method
GET
1
A valid Bearer token is required.
2
country is required and must be a valid 2-letter ISO country code.
3
operator_id is optional.
4
If operator_id is provided, the endpoint returns one specific operator.
5
If operator_id is omitted, the endpoint returns all active operators for that country.
6
Use this endpoint before topup creation to validate operator details, prefixes, and amount rules.
Query Parameters
{
    "country": "BD",
    "operator_id": "(optional) 1"
}

Response Examples

Expand each response to see sample output.

{
    "success": true,
    "message": "Operator fetched successfully.",
    "data": {
        "country_iso": "BD",
        "operator_id": 1,
        "operator_name": "Grameenphone",
        "prefix": "88017,88013",
        "topup_type": "range",
        "fixed_amounts": "",
        "min_amount": 10,
        "max_amount": 1000,
        "currency_code": "BDT",
        "status": "active"
    }
}
{
    "success": true,
    "message": "Operators fetched successfully.",
    "data": [
        {
            "country_iso": "BD",
            "operator_id": 1,
            "operator_name": "Grameenphone",
            "prefix": "88017,88013",
            "topup_type": "range",
            "fixed_amounts": "",
            "min_amount": 10,
            "max_amount": 1000,
            "currency_code": "BDT",
            "status": "active"
        },
        {
            "country_iso": "BD",
            "operator_id": 2,
            "operator_name": "Robi",
            "prefix": "88018,88016",
            "topup_type": "range",
            "fixed_amounts": "",
            "min_amount": 10,
            "max_amount": 1000,
            "currency_code": "BDT",
            "status": "active"
        }
    ]
}
{
    "success": false,
    "message": "Operator not found."
}
{
    "success": false,
    "message": "country is required."
}
GET
https://topups.pickbo.com/operator/check-operator.php?country=BD

Request Samples

Switch between languages and copy the sample instantly.

curl --request GET \
  --url "https://topups.pickbo.com/operator/check-operator.php?country=BD" \
  --header "Accept: application/json" \
  --header "Authorization: Bearer YOUR_ACCESS_TOKEN"
$headers = @{
    "Accept" = "application/json"
    "Authorization" = "Bearer YOUR_ACCESS_TOKEN"
}

Invoke-RestMethod -Uri "https://topups.pickbo.com/operator/check-operator.php?country=BD" `
    -Method GET `
    -Headers $headers
const fetch = require("node-fetch");

fetch("https://topups.pickbo.com/operator/check-operator.php?country=BD", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN"
  }
})
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => console.error(err));
import requests

url = "https://topups.pickbo.com/operator/check-operator.php?country=BD"
headers = {
    "Accept": "application/json",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN"
}

response = requests.get(url, headers=headers)
print(response.status_code)
print(response.json())
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
    public static void main(String[] args) throws Exception {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://topups.pickbo.com/operator/check-operator.php?country=BD"))
            .header("Accept", "application/json")
            .header("Authorization", "Bearer YOUR_ACCESS_TOKEN")
            .GET()
            .build();

        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.statusCode());
        System.out.println(response.body());
    }
}
<?php

$ch = curl_init("https://topups.pickbo.com/operator/check-operator.php?country=BD");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Accept: application/json",
        "Authorization: Bearer YOUR_ACCESS_TOKEN"
    ],
]);

$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo $status . PHP_EOL;
echo $response;
require "net/http"
require "uri"

uri = URI("https://topups.pickbo.com/operator/check-operator.php?country=BD")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Get.new(uri.request_uri)
request["Accept"] = "application/json"
request["Authorization"] = "Bearer YOUR_ACCESS_TOKEN"

response = http.request(request)
puts response.code
puts response.body
Ready to Integrate
https://topups.pickbo.com/operator/check-operator.php?country=BD https://sandbox-topups.pickbo.com/operator/check-operator.php?country=BD
Topups

Create Topup / Recharge

POST

Create a recharge request after selecting a valid operator. The system validates phone prefix, operator, amount, scope, user balance, FX rate, and then processes the topup.

Security & Request Details

Authorization method, validation notes and input structure.

Security Type
HTTP Bearer Token
Scheme
Authorization: Bearer YOUR_ACCESS_TOKEN
Method
POST
1
A valid Bearer token with topups scope is required.
2
Use Get Operator by ID first, then call this endpoint with the same country_iso and operator_id.
3
phone, country_iso, operator_id and amount are required.
4
client_reference is optional. If omitted, a unique reference is auto-generated.
5
Duplicate client_reference is not allowed.
6
Phone number must match the selected operator prefix.
7
Amount must follow operator rules: fixed_amounts or min/max range.
8
If provider processing fails after wallet debit, the amount is refunded automatically.
9
Sandbox URL is for testing and Production URL is for live recharge.
Request Body Example
{
    "phone": "8801712345678",
    "country_iso": "BD",
    "operator_id": 1,
    "amount": 100,
    "client_reference": "ORDER-10001"
}

Response Examples

Expand each response to see sample output.

{
    "success": true,
    "message": "Topup processed successfully.",
    "data": {
        "transaction_id": "ORD-AB12CD34EF567",
        "client_reference": "ORDER-10001",
        "status": "SUCCESS",
        "provider_status": "SUCCESSFUL",
        "provider_transaction_id": "4455667788",
        "provider_operator_transaction_id": "9988776655",
        "recipient_phone": "8801712345678",
        "country_iso": "BD",
        "operator_id": 1,
        "operator_name": "Grameenphone",
        "amount": "100.0000",
        "currency": "BDT",
        "debit_amount": "100.0000",
        "debit_currency": "BDT",
        "commission_amount": "2.0000",
        "commission_currency": "BDT"
    }
}
{
    "success": false,
    "message": "Unauthorized."
}
{
    "success": false,
    "message": "Insufficient scope."
}
{
    "success": false,
    "message": "Operator not found."
}
{
    "success": false,
    "message": "Duplicate client_reference is not allowed."
}
{
    "success": false,
    "message": "phone, country_iso, operator_id and amount are required."
}
{
    "success": false,
    "message": "Topup failed.",
    "transaction": {
        "id": "ORD-AB12CD34EF567",
        "status": "FAILED"
    }
}
{
    "success": false,
    "message": "Provider service unavailable.",
    "transaction": {
        "id": "ORD-AB12CD34EF567",
        "status": "FAILED"
    }
}
POST
https://topups.pickbo.com/topups/create.php

Request Samples

Switch between languages and copy the sample instantly.

curl --request POST \
  --url "https://topups.pickbo.com/topups/create.php" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  --data '{
    "phone": "8801712345678",
    "country_iso": "BD",
    "operator_id": 1,
    "amount": 100,
    "client_reference": "ORDER-10001"
  }'
$headers = @{
    "Accept" = "application/json"
    "Content-Type" = "application/json"
    "Authorization" = "Bearer YOUR_ACCESS_TOKEN"
}

$body = @{
    phone            = "8801712345678"
    country_iso      = "BD"
    operator_id      = 1
    amount           = 100
    client_reference = "ORDER-10001"
} | ConvertTo-Json

Invoke-RestMethod -Uri "https://topups.pickbo.com/topups/create.php" `
    -Method POST `
    -Headers $headers `
    -Body $body
const fetch = require("node-fetch");

fetch("https://topups.pickbo.com/topups/create.php", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN"
  },
  body: JSON.stringify({
    phone: "8801712345678",
    country_iso: "BD",
    operator_id: 1,
    amount: 100,
    client_reference: "ORDER-10001"
  })
})
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => console.error(err));
import requests

url = "https://topups.pickbo.com/topups/create.php"
headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN"
}
payload = {
    "phone": "8801712345678",
    "country_iso": "BD",
    "operator_id": 1,
    "amount": 100,
    "client_reference": "ORDER-10001"
}

response = requests.post(url, headers=headers, json=payload)
print(response.status_code)
print(response.json())
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
    public static void main(String[] args) throws Exception {
        String json = "{\"phone\":\"8801712345678\",\"country_iso\":\"BD\",\"operator_id\":1,\"amount\":100,\"client_reference\":\"ORDER-10001\"}";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://topups.pickbo.com/topups/create.php"))
            .header("Accept", "application/json")
            .header("Content-Type", "application/json")
            .header("Authorization", "Bearer YOUR_ACCESS_TOKEN")
            .POST(HttpRequest.BodyPublishers.ofString(json))
            .build();

        HttpClient client = HttpClient.newHttpClient();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.statusCode());
        System.out.println(response.body());
    }
}
<?php

$url = "https://topups.pickbo.com/topups/create.php";
$payload = [
    "phone" => "8801712345678",
    "country_iso" => "BD",
    "operator_id" => 1,
    "amount" => 100,
    "client_reference" => "ORDER-10001"
];

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Accept: application/json",
        "Content-Type: application/json",
        "Authorization: Bearer YOUR_ACCESS_TOKEN"
    ],
    CURLOPT_POSTFIELDS => json_encode($payload),
]);

$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo $status . PHP_EOL;
echo $response;
require "net/http"
require "json"
require "uri"

uri = URI("https://topups.pickbo.com/topups/create.php")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri.request_uri)
request["Accept"] = "application/json"
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer YOUR_ACCESS_TOKEN"
request.body = {
  phone: "8801712345678",
  country_iso: "BD",
  operator_id: 1,
  amount: 100,
  client_reference: "ORDER-10001"
}.to_json

response = http.request(request)
puts response.code
puts response.body
Ready to Integrate
https://topups.pickbo.com/topups/create.php https://sandbox-topups.pickbo.com/topups/create.php