Validate Phone Number
curl --request GET \
--url https://api.oneclickdz.com/v3/internet/check-number \
--header 'X-Access-Token: <api-key>'import requests
url = "https://api.oneclickdz.com/v3/internet/check-number"
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/internet/check-number', 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/internet/check-number",
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/internet/check-number"
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/internet/check-number")
.header("X-Access-Token", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.oneclickdz.com/v3/internet/check-number")
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_bodyInternet Top-Ups
Validate Phone Number
Validate phone numbers before processing internet top-up
GET
/
v3
/
internet
/
check-number
Validate Phone Number
curl --request GET \
--url https://api.oneclickdz.com/v3/internet/check-number \
--header 'X-Access-Token: <api-key>'import requests
url = "https://api.oneclickdz.com/v3/internet/check-number"
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/internet/check-number', 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/internet/check-number",
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/internet/check-number"
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/internet/check-number")
.header("X-Access-Token", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.oneclickdz.com/v3/internet/check-number")
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_bodyOverview
Validates phone numbers for ADSL or 4G services before submission. Helps prevent errors and reduces refund issues.Always validate phone numbers before submitting top-up requests to
minimize failures.
Query Parameters
string
required
Service type:
ADSL or 4Gstring
required
Phone number to validate - ADSL:
0[0-9]{8} (e.g., 036362608) - 4G:
213[0-9]{9} (e.g., 213472731602)Response
Valid ADSL Number
{
"success": true,
"data": {
"ncli": "11022*****",
"offre": "FTTc-b_10M'",
"type": "ADSL"
},
"meta": {
"timestamp": "2025-10-29T00:36:48.823Z"
}
}
Valid 4G Number
{
"success": true,
"data": {
"ncli": "11034*****",
"type": "4GLTE"
},
"meta": {
"timestamp": "2025-10-29T00:36:49.847Z"
}
}
Invalid Number
{
"success": false,
"error": {
"code": "ERR_PHONE",
"message": "عذرًا، لم نتمكن من تأكيد هذا الرقم. يرجى التحقق من صحة الرقم ومن نوع العرض. إذا كان الرقم صحيحًا، يرجى المحاولة مرة أخرى لاحقًا."
},
"requestId": "req_01HQ..."
}
The
message is written for the end user and can be shown as-is. ERR_PHONE covers all three cases: the number doesn’t exist at Algérie Télécom, it doesn’t match the type you sent, or AT is temporarily unreachable.Sandbox
With a sandbox key this endpoint answers from fixtures: no line is contacted at Algérie Télécom, no captcha is solved, and the response is instant. The number decides the answer:| Number | Response |
|---|---|
030000000 | 400 ERR_PHONE |
| any other number matching the format | 200 valid, with ncli: "****" and a test offre |
Sandbox: valid number
{
"success": true,
"data": {
"ncli": "****",
"offre": "FTTH 600M Prepaid individual",
"type": "ADSL"
},
"meta": { "timestamp": "2026-08-02T21:32:52.933Z" }
}
030000000 to exercise your ERR_PHONE path, and any other valid-format number for the success path. The same numbers carry over to Send Top-Up, where they also decide how the order’s status evolves.
Examples
curl "https://api.oneclickdz.com/v3/internet/check-number?type=ADSL&number=036362608" \
-H "X-Access-Token: YOUR_API_KEY"
async function validateNumber(type, number) {
const response = await fetch(
`https://api.oneclickdz.com/v3/internet/check-number?type=${type}&number=${number}`,
{ headers: { "X-Access-Token": process.env.API_KEY } }
);
if (!response.ok) {
const error = await response.json();
throw new Error(error.error.message);
}
return await response.json();
}
// Usage
try {
await validateNumber("ADSL", "036362608");
console.log("Number is valid");
} catch (error) {
console.error("Invalid number:", error.message);
}
def validate_number(type, number):
response = requests.get(
'https://api.oneclickdz.com/v3/internet/check-number',
headers={'X-Access-Token': 'YOUR_API_KEY'},
params={'type': type, 'number': number}
)
if response.ok:
return True
else:
error = response.json()
raise ValueError(error['error']['message'])
# Usage
try:
validate_number('ADSL', '036362608')
print('Valid number')
except ValueError as e:
print(f'Invalid: {e}')
<?php
function validateNumber($type, $number) {
$url = "https://api.oneclickdz.com/v3/internet/check-number?type={$type}&number={$number}";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Access-Token: YOUR_API_KEY']);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 200) {
return true;
} else {
$error = json_decode($response, true);
throw new Exception($error['error']['message']);
}
}
// Usage
try {
validateNumber('ADSL', '036362608');
echo "Valid number\n";
} catch (Exception $e) {
echo "Invalid: " . $e->getMessage() . "\n";
}
?>
Phone Number Formats
- ADSL
- 4G
Format:
0[0-9]{8} Valid Examples: - ✅ 036362608 - ✅
031417237 - ✅ 021123456 Invalid Examples: - ❌ 36362608 (missing
leading 0) - ❌ 0363626081 (too long) - ❌ 213636362608 (wrong format)Format:
213[0-9]{9} Valid Examples: - ✅ 213472731602 - ✅
213665983439 - ✅ 213778037340 Invalid Examples: - ❌ 0665983439
(wrong format, should include country code) - ❌ 665983439 (missing
country code) - ❌ +213665983439 (shouldn’t include +)Integration Example
// Complete validation flow
async function prepareInternetTopup(type, number, value) {
// Step 1: Validate number
try {
await validateNumber(type, number);
} catch (error) {
return {
success: false,
error: "Invalid phone number",
details: error.message,
};
}
// Step 2: Check product availability
const products = await getProducts(type);
const product = products.find((p) => p.value === value && p.available);
if (!product) {
return {
success: false,
error: "Product not available",
};
}
// Step 3: Send top-up
return await sendInternetTopup({ type, number, value });
}
Why Validate?
Reduce Errors
Catch invalid numbers before submission
Better UX
Show immediate feedback to users
Fewer Refunds
Minimize failed transactions and refunds
Verify Format
Ensure number matches service type
Best Practices
Client-Side Validation
Client-Side Validation
Validate format client-side first, then confirm with API:
function validateADSLFormat(number) {
return /^0[0-9]{8}$/.test(number);
}
function validate4GFormat(number) {
return /^213[0-9]{9}$/.test(number);
}
Show Helpful Messages
Show Helpful Messages
Display clear messages when validation fails: - “Please enter a valid ADSL
number (e.g., 036362608)” - “4G numbers should start with 213 (e.g.,
213665983439)” - “Number format: 9 digits starting with 0”
Cache Validation Results
Cache Validation Results
Cache successful validations for a short period:
const validationCache = new Map();
async function validateWithCache(type, number) {
const key = `${type}:${number}`;
if (validationCache.has(key)) {
return validationCache.get(key);
}
const result = await validateNumber(type, number);
validationCache.set(key, result);
// Clear after 5 minutes
setTimeout(() => validationCache.delete(key), 5 * 60 * 1000);
return result;
}
Related Endpoints
List Products
Get available cards
Send Top-Up
Purchase internet card

