List Mobile Plans
curl --request GET \
--url https://api.oneclickdz.com/v3/mobile/plans \
--header 'X-Access-Token: <api-key>'import requests
url = "https://api.oneclickdz.com/v3/mobile/plans"
headers = {"X-Access-Token": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Access-Token': '<api-key>'}};
fetch('https://api.oneclickdz.com/v3/mobile/plans', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.oneclickdz.com/v3/mobile/plans",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Access-Token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.oneclickdz.com/v3/mobile/plans"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Access-Token", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.oneclickdz.com/v3/mobile/plans")
.header("X-Access-Token", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.oneclickdz.com/v3/mobile/plans")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Access-Token"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"dynamicPlans": [
{
"code": "<string>",
"name": "<string>",
"operator": "<string>",
"cost": 123,
"isEnabled": true,
"min_amount": 123,
"max_amount": 123
}
],
"fixedPlans": [
{
"code": "<string>",
"name": "<string>",
"operator": "<string>",
"cost": 123,
"isEnabled": true,
"amount": 123
}
]
},
"meta": {
"timestamp": "<string>"
}
}Mobile Top-Ups
List Mobile Plans
Get all available mobile top-up plans for Algerian operators
GET
/
v3
/
mobile
/
plans
List Mobile Plans
curl --request GET \
--url https://api.oneclickdz.com/v3/mobile/plans \
--header 'X-Access-Token: <api-key>'import requests
url = "https://api.oneclickdz.com/v3/mobile/plans"
headers = {"X-Access-Token": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Access-Token': '<api-key>'}};
fetch('https://api.oneclickdz.com/v3/mobile/plans', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.oneclickdz.com/v3/mobile/plans",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Access-Token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.oneclickdz.com/v3/mobile/plans"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Access-Token", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.oneclickdz.com/v3/mobile/plans")
.header("X-Access-Token", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.oneclickdz.com/v3/mobile/plans")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Access-Token"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"dynamicPlans": [
{
"code": "<string>",
"name": "<string>",
"operator": "<string>",
"cost": 123,
"isEnabled": true,
"min_amount": 123,
"max_amount": 123
}
],
"fixedPlans": [
{
"code": "<string>",
"name": "<string>",
"operator": "<string>",
"cost": 123,
"isEnabled": true,
"amount": 123
}
]
},
"meta": {
"timestamp": "<string>"
}
}Overview
Returns comprehensive list of all available mobile top-up plans for Mobilis, Djezzy, Ooredoo, operators.Plans are stable and rarely change. Safe to cache in your database with
your own pricing.
Plan Types
- Dynamic Plans
- Fixed Plans
- GetMenu Plans
Variable amount plans where you specify the amount within a range.
Examples: Prepaid, Postpaid (Facture), International Required
fields: -
plan_code - MSSIDN (phone number) - amount (between
min_amount and max_amount)Fixed amount plans that are directly activated. Examples: “Pixx 500”,
“Special 2000”, “Data Pack 1GB” Required fields: -
plan_code - MSSIDN
(phone number) - Amount is predetermined (amount field in response)Special plans that retrieve all available offers for a specific number.
Codes:
GETMENU_Mobilis, GETMENU_Ooredoo, GETMENU_Djezzy Returns
the user’s available offers based on their subscription.Response
boolean
required
Indicates if the request was successful
object
required
Show properties
Show properties
array
required
Array of variable amount plans where you specify the amount within a range
Show Dynamic plan object
Show Dynamic plan object
string
Unique plan code for API requests
string
User-friendly plan name for display
string
Mobile operator: Mobilis, Djezzy, Ooredoo (or GMobilis, GDjezzy, GOoredoo for wholesale)
number
Your cost multiplier (e.g., 0.96 = you pay 960 DZD for 1000 DZD top-up). Only present for retail plans.
boolean
Whether plan is currently available
number
Minimum top-up amount in DZD
number
Maximum top-up amount in DZD
Examples
curl https://api.oneclickdz.com/v3/mobile/plans \
-H "X-Access-Token: YOUR_API_KEY"
const response = await fetch("https://api.oneclickdz.com/v3/mobile/plans", {
headers: { "X-Access-Token": "YOUR_API_KEY" },
});
const { data } = await response.json();
console.log(data.dynamicPlans, data.fixedPlans);
import requests
response = requests.get(
'https://api.oneclickdz.com/v3/mobile/plans',
headers={'X-Access-Token': 'YOUR_API_KEY'}
)
data = response.json()['data']
dynamic_plans = data['dynamicPlans']
fixed_plans = data['fixedPlans']
<?php
$ch = curl_init('https://api.oneclickdz.com/v3/mobile/plans');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Access-Token: YOUR_API_KEY']);
$response = json_decode(curl_exec($ch), true);
$dynamicPlans = $response['data']['dynamicPlans'];
$fixedPlans = $response['data']['fixedPlans'];
?>
Response Example
{
"success": true,
"data": {
"dynamicPlans": [
{
"code": "GROS_MOBILIS",
"name": "📱 GROS MOBILIS | جملة",
"operator": "GMobilis",
"isEnabled": true,
"min_amount": 5000,
"max_amount": 300000
},
{
"code": "PREPAID_DJEZZY",
"name": "📱 PREPAID | عادي",
"operator": "Djezzy",
"cost": 0.9925,
"isEnabled": true,
"min_amount": 100,
"max_amount": 10000
},
{
"code": "PREPAID_MOBILIS",
"name": "📱 PREPAID | عادي",
"operator": "Mobilis",
"cost": 0.96,
"isEnabled": true,
"min_amount": 40,
"max_amount": 3999
},
{
"code": "FACTURE_DJEZZY",
"name": "📋 FACTURE | فاتورة",
"operator": "Djezzy",
"cost": 0.9925,
"isEnabled": true,
"min_amount": 100,
"max_amount": 10000
}
],
"fixedPlans": [
{
"code": "MIX50_DJEZZY",
"name": "📱🌐 Auto | MIX 50",
"operator": "Djezzy",
"isEnabled": true,
"cost": 0.9925,
"amount": 50
},
{
"code": "MIX1000_OOREDOO",
"name": "📱🌐 AUTO | MIX 1000",
"operator": "Ooredoo",
"isEnabled": true,
"cost": 0.99,
"amount": 1000
},
{
"code": "MIX500_MOBILIS",
"name": "📱🌐 AUTO | MIX 500",
"operator": "Mobilis",
"isEnabled": true,
"cost": 0.96,
"amount": 500
},
{
"code": "GETMENU_Mobilis",
"name": "إظهار كافة العروض ",
"operator": "Mobilis",
"isEnabled": true,
"cost": 0.96,
"amount": 0
}
]
},
"meta": {
"timestamp": "2025-10-29T00:35:59.220Z"
}
}
Plan Properties Explained
Understanding Cost
Understanding Cost
The
cost field is your wholesale price multiplier:0.98= You pay 98% of face value- For 1000 DZD top-up: your cost = 1000 × 0.98 = 980 DZD
- Your profit margin: 1000 - 980 = 20 DZD (2%)
cost from responses to end users. Apply your own markup.Amount Ranges
Amount Ranges
Dynamic plans have
min_amount and max_amount: - Users can choose any
amount within this range - Common range: 50 - 5000 DZD - Some operators allow
up to 10,000 DZD Fixed plans have a single amount: - No amount selection
needed - Directly activate the service - Common for special offers and data
packsPlan Availability
Plan Availability
The
isEnabled field indicates:true: Plan available for usefalse: Temporarily disabled (maintenance, operator issues)
Integration Strategy
1
Initial Load
Call this endpoint once when your application starts or during setup
2
Store Plans
Save plans to your database with your own pricing
CREATE TABLE mobile_plans (
code VARCHAR PRIMARY KEY,
name VARCHAR,
operator VARCHAR,
our_cost DECIMAL,
sell_price DECIMAL,
min_amount INT,
max_amount INT,
amount INT,
is_enabled BOOLEAN,
updated_at TIMESTAMP
);
3
Apply Markup
Calculate your selling price:
const ourCost = faceValue * plan.cost;
const markup = 0.05; // 5% profit
const sellPrice = ourCost * (1 + markup);
4
Serve to Users
Display plans with your pricing to end users
{
code: plan.code,
name: plan.name,
operator: plan.operator,
price: sellPrice, // Your price, not wholesale cost
minAmount: plan.min_amount,
maxAmount: plan.max_amount
}
5
Periodic Sync
Sync plans daily or when notified of changes
// Daily sync at midnight
cron.schedule('0 0 * * *', syncPlans);
Filtering Plans
const mobilisPlans = [
...data.dynamicPlans.filter((p) => p.operator === "Mobilis"),
...data.fixedPlans.filter((p) => p.operator === "Mobilis")
];
const djezzyPlans = [
...data.dynamicPlans.filter((p) => p.operator === "Djezzy"),
...data.fixedPlans.filter((p) => p.operator === "Djezzy")
];
const dynamicPlans = data.dynamicPlans;
const fixedPlans = data.fixedPlans;
const allPlans = [...data.dynamicPlans, ...data.fixedPlans];
const availableDynamic = data.dynamicPlans.filter((p) => p.isEnabled);
const availableFixed = data.fixedPlans.filter((p) => p.isEnabled);
Best Practices
Cache Plans
Store plans in your database to reduce API calls and improve performance
Remove Cost
Never expose wholesale
cost to end users. Show only your retail pricesCheck Enabled
Always verify
isEnabled before displaying plans to usersSync Regularly
Implement daily sync or webhook listener for plan updates
Related Endpoints
Send Top-Up
Send a mobile top-up using a plan code
Check Status
Track top-up status

