PB

Pickbo Drive Offer Recharge API Documentation

Professional integration guide for authentication, checking offers, submitting offers and checking offer recharge status.

Sandbox Ready Production Ready Bearer Secured

Pickbo Drive Offer Recharge API Reference

This documentation helps developers authenticate securely, fetch active drive offers, submit offer recharges, and check recharge status. Each endpoint includes request examples in cURL, PowerShell, Node.js, Python, Java, PHP and Ruby, along with correct response samples, validation rules and production / sandbox URLs.

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

Create Token

Generate a Bearer access token using your client_id and client_secret.

2

Check Offer

Fetch all active offers or filter by operator_id using action = check_offer.

3

Submit Offer

Submit a recharge using offer_id and phone with action = submit_offer.

4

Check Status

Track the recharge result later using action = check_status and the same transaction_id.

Important integration note

For authentication, the grant_type value must always be client_credentials. For drive offer recharge, all actions use the same endpoint: /drive/offer.php. Only the request body action changes between check_offer, submit_offer, and check_status.

Authentication

Create Access Token

POST

Generate a Bearer access token using your client credentials. This token is required for all secured offer recharge 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
Use sandbox credentials for sandbox and production credentials for production.
4
The access token must be sent in Authorization header as Bearer token.
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 balance countries operators"
}
{
    "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
Drive Offer Recharge

Check Offer

POST

Fetch all active drive offers, or filter by operator_id. This endpoint uses the same URL for production and sandbox, only the domain changes.

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 action = check_offer in request body.
3
operator_id is optional.
4
If operator_id is omitted, all active offers are returned.
5
If operator_id is provided, only that operator’s offers are returned.
Request Body Example
{
    "action": "check_offer",
    "operator_id": 23
}

Response Examples

Expand each response to see sample output.

{
    "success": true,
    "message": "All active offers fetched successfully.",
    "data": {
        "operator_id": null,
        "total_offers": 2,
        "offers": [
            {
                "offer_id": 2,
                "country_iso": "BD",
                "operator_id": 23,
                "operator_name": "Grameenphone",
                "offer_type": "minutes",
                "offer_name": "120 Minutes",
                "validity": "7 Days",
                "offer_price": "98.0000",
                "currency_code": "BDT",
                "promo_text": "new offer",
                "status": "active"
            },
            {
                "offer_id": 1,
                "country_iso": "BD",
                "operator_id": 23,
                "operator_name": "Grameenphone",
                "offer_type": "minutes",
                "offer_name": "45 Minutes",
                "validity": "1 Days",
                "offer_price": "29.0000",
                "currency_code": "BDT",
                "promo_text": "hot offer",
                "status": "active"
            }
        ]
    }
}
{
    "success": false,
    "message": "Unauthorized."
}
{
    "success": false,
    "message": "Insufficient scope."
}
{
    "success": false,
    "message": "No active offers found."
}
{
    "success": false,
    "message": "Invalid action. Use check_offer, submit_offer, or check_status."
}
POST
https://topups.pickbo.com/drive/offer.php

Request Samples

Switch between languages and copy the sample instantly.

curl --request POST \
  --url "https://topups.pickbo.com/drive/offer.php" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  --data '{
    "action": "check_offer"
  }'
$headers = @{
    "Accept" = "application/json"
    "Content-Type" = "application/json"
    "Authorization" = "Bearer YOUR_ACCESS_TOKEN"
}

$body = @{
    action = "check_offer"
} | ConvertTo-Json

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

fetch("https://topups.pickbo.com/drive/offer.php", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN"
  },
  body: JSON.stringify({
    action: "check_offer"
  })
})
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => console.error(err));
import requests

url = "https://topups.pickbo.com/drive/offer.php"
headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN"
}
payload = {
    "action": "check_offer"
}

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 = "{\"action\":\"check_offer\"}";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://topups.pickbo.com/drive/offer.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/drive/offer.php";
$payload = [
    "action" => "check_offer"
];

$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/drive/offer.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 = {
  action: "check_offer"
}.to_json

response = http.request(request)
puts response.code
puts response.body
Ready to Integrate
https://topups.pickbo.com/drive/offer.php https://sandbox-topups.pickbo.com/drive/offer.php
Drive Offer Recharge

Submit Offer

POST

Submit a drive offer recharge using offer_id and phone. The system validates offer, phone prefix, wallet balance, and then creates the recharge transaction.

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 action = submit_offer in request body.
3
offer_id and phone are required.
4
transaction_id is optional. If omitted, a unique transaction_id is generated automatically.
5
Duplicate transaction_id is not allowed.
6
Phone number must match the offer prefix.
7
Sandbox uses sandbox wallet balance.
8
This endpoint uses the same path for both production and sandbox, only the domain changes.
Request Body Example
{
    "action": "submit_offer",
    "offer_id": 1,
    "phone": "01328884749",
    "transaction_id": "DRV-TEST-10001"
}

Response Examples

Expand each response to see sample output.

{
    "success": true,
    "message": "Sandbox drive offer submitted successfully.",
    "data": {
        "transaction_id": "DRV-TEST-10001",
        "status": "SUCCESS",
        "provider_status": "SUCCESS",
        "provider_operator_transaction_id": "BD190326153045123456",
        "provider_response": "Sandbox recharge processed successfully",
        "offer_id": 1,
        "recipient_phone": "01328884749",
        "country_iso": "BD",
        "operator_id": 23,
        "operator_name": "Grameenphone",
        "offer_type": "minutes",
        "offer_name": "45 Minutes",
        "validity": "1 Days",
        "offer_price": "29.0000",
        "offer_currency": "BDT",
        "debit_amount": "29.0000",
        "debit_currency": "BDT",
        "commission_amount": "0.0000",
        "commission_currency": "BDT",
        "wallet_type": "sandbox",
        "sandbox_balance_before": "5000.0000",
        "sandbox_balance_after": "4971.0000"
    }
}
{
    "success": false,
    "message": "Unauthorized."
}
{
    "success": false,
    "message": "Insufficient scope."
}
{
    "success": false,
    "message": "Offer not found."
}
{
    "success": false,
    "message": "Duplicate transaction_id is not allowed."
}
{
    "success": false,
    "message": "offer_id and phone are required."
}
{
    "success": false,
    "message": "Phone number does not match offer prefix."
}
{
    "success": false,
    "message": "Insufficient sandbox balance.",
    "data": {
        "available_balance": "10.0000",
        "required_debit": "29.0000",
        "currency": "BDT"
    }
}
{
    "success": false,
    "message": "Internal server error.",
    "error": "Detailed server error message"
}
POST
https://topups.pickbo.com/drive/offer.php

Request Samples

Switch between languages and copy the sample instantly.

curl --request POST \
  --url "https://topups.pickbo.com/drive/offer.php" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  --data '{
    "action": "submit_offer",
    "offer_id": 1,
    "phone": "01328884749",
    "transaction_id": "DRV-TEST-10001"
  }'
$headers = @{
    "Accept" = "application/json"
    "Content-Type" = "application/json"
    "Authorization" = "Bearer YOUR_ACCESS_TOKEN"
}

$body = @{
    action         = "submit_offer"
    offer_id       = 1
    phone          = "01328884749"
    transaction_id = "DRV-TEST-10001"
} | ConvertTo-Json

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

fetch("https://topups.pickbo.com/drive/offer.php", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN"
  },
  body: JSON.stringify({
    action: "submit_offer",
    offer_id: 1,
    phone: "01328884749",
    transaction_id: "DRV-TEST-10001"
  })
})
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => console.error(err));
import requests

url = "https://topups.pickbo.com/drive/offer.php"
headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN"
}
payload = {
    "action": "submit_offer",
    "offer_id": 1,
    "phone": "01328884749",
    "transaction_id": "DRV-TEST-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 = "{\"action\":\"submit_offer\",\"offer_id\":1,\"phone\":\"01328884749\",\"transaction_id\":\"DRV-TEST-10001\"}";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://topups.pickbo.com/drive/offer.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/drive/offer.php";
$payload = [
    "action" => "submit_offer",
    "offer_id" => 1,
    "phone" => "01328884749",
    "transaction_id" => "DRV-TEST-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/drive/offer.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 = {
  action: "submit_offer",
  offer_id: 1,
  phone: "01328884749",
  transaction_id: "DRV-TEST-10001"
}.to_json

response = http.request(request)
puts response.code
puts response.body
Ready to Integrate
https://topups.pickbo.com/drive/offer.php https://sandbox-topups.pickbo.com/drive/offer.php
Drive Offer Recharge

Check Offer Status

POST

Check the status of a previously submitted drive offer recharge using transaction_id.

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 action = check_status in request body.
3
transaction_id is required.
4
The same transaction_id returned from submit_offer must be used here.
Request Body Example
{
    "action": "check_status",
    "transaction_id": "DRV-TEST-10001"
}

Response Examples

Expand each response to see sample output.

{
    "success": true,
    "message": "Status fetched successfully.",
    "data": {
        "transaction_id": "DRV-TEST-10001",
        "status": "SUCCESS",
        "provider_status": "SUCCESS",
        "provider_operator_transaction_id": "BD190326153045123456",
        "provider_response": "Sandbox recharge processed successfully",
        "recipient_phone": "01328884749",
        "country_iso": "BD",
        "operator_id": 23,
        "operator_name": "Grameenphone",
        "offer_id": 1,
        "offer_type": "minutes",
        "offer_name": "45 Minutes",
        "validity": "1 Days",
        "request_amount": "29.0000",
        "request_currency": "BDT",
        "debit_amount": "29.0000",
        "debit_currency": "BDT",
        "wallet_type": "sandbox",
        "commission_amount": "0.0000",
        "commission_currency": "BDT",
        "failure_reason": null,
        "created_at": "2026-03-19 15:30:45",
        "updated_at": "2026-03-19 15:30:45"
    }
}
{
    "success": false,
    "message": "Unauthorized."
}
{
    "success": false,
    "message": "Transaction not found."
}
{
    "success": false,
    "message": "transaction_id is required."
}
{
    "success": false,
    "message": "Internal server error.",
    "error": "Detailed server error message"
}
POST
https://topups.pickbo.com/drive/offer.php

Request Samples

Switch between languages and copy the sample instantly.

curl --request POST \
  --url "https://topups.pickbo.com/drive/offer.php" \
  --header "Accept: application/json" \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  --data '{
    "action": "check_status",
    "transaction_id": "DRV-TEST-10001"
  }'
$headers = @{
    "Accept" = "application/json"
    "Content-Type" = "application/json"
    "Authorization" = "Bearer YOUR_ACCESS_TOKEN"
}

$body = @{
    action         = "check_status"
    transaction_id = "DRV-TEST-10001"
} | ConvertTo-Json

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

fetch("https://topups.pickbo.com/drive/offer.php", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN"
  },
  body: JSON.stringify({
    action: "check_status",
    transaction_id: "DRV-TEST-10001"
  })
})
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => console.error(err));
import requests

url = "https://topups.pickbo.com/drive/offer.php"
headers = {
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Authorization": "Bearer YOUR_ACCESS_TOKEN"
}
payload = {
    "action": "check_status",
    "transaction_id": "DRV-TEST-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 = "{\"action\":\"check_status\",\"transaction_id\":\"DRV-TEST-10001\"}";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://topups.pickbo.com/drive/offer.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/drive/offer.php";
$payload = [
    "action" => "check_status",
    "transaction_id" => "DRV-TEST-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/drive/offer.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 = {
  action: "check_status",
  transaction_id: "DRV-TEST-10001"
}.to_json

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