Vérifier le Statut par ID
curl --request GET \
--url https://api.oneclickdz.com/v3/mobile/check-id/{id} \
--header 'X-Access-Token: <api-key>'import requests
url = "https://api.oneclickdz.com/v3/mobile/check-id/{id}"
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/check-id/{id}', 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/check-id/{id}",
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/check-id/{id}"
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/check-id/{id}")
.header("X-Access-Token", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.oneclickdz.com/v3/mobile/check-id/{id}")
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": {
"_id": "<string>",
"ref": "<string>",
"status": "<string>",
"plan_code": "<string>",
"MSSIDN": "<string>",
"topup_amount": 123,
"balance_amount": 123,
"created_at": "<string>",
"refund_message": "<string>",
"suggested_offers": [
{
"typename": "<string>",
"plan_code": "<string>",
"amount": 123
}
],
"follow_orderid": "<string>",
"retry_orderid": "<string>"
},
"meta": {
"timestamp": "<string>"
}
}Recharges mobiles
Vérifier le Statut par ID
Vérifier le statut d’une recharge mobile en utilisant l’ID interne
GET
/
v3
/
mobile
/
check-id
/
{id}
Vérifier le Statut par ID
curl --request GET \
--url https://api.oneclickdz.com/v3/mobile/check-id/{id} \
--header 'X-Access-Token: <api-key>'import requests
url = "https://api.oneclickdz.com/v3/mobile/check-id/{id}"
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/check-id/{id}', 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/check-id/{id}",
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/check-id/{id}"
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/check-id/{id}")
.header("X-Access-Token", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.oneclickdz.com/v3/mobile/check-id/{id}")
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": {
"_id": "<string>",
"ref": "<string>",
"status": "<string>",
"plan_code": "<string>",
"MSSIDN": "<string>",
"topup_amount": 123,
"balance_amount": 123,
"created_at": "<string>",
"refund_message": "<string>",
"suggested_offers": [
{
"typename": "<string>",
"plan_code": "<string>",
"amount": 123
}
],
"follow_orderid": "<string>",
"retry_orderid": "<string>"
},
"meta": {
"timestamp": "<string>"
}
}Vue d’Ensemble
Suivez le statut d’une recharge mobile en utilisant letopupId retourné depuis l’endpoint d’envoi. En général, nos serveurs traiteront votre requête en environ 5 à 30 secondes.
Important : Il est obligatoire de comprendre tous les statuts possibles pour gérer correctement la mise à jour et la notification de vos utilisateurs.
Paramètres de Chemin
string
requis
ID interne de la recharge depuis la réponse
/mobile/sendRéponse
boolean
requis
Indique si la requête a réussi
object
requis
Afficher properties
Afficher properties
string
requis
Identifiant de la recharge
string
Votre référence personnalisée (si fournie)
string
requis
Statut actuel :
PENDING, HANDLING, FULFILLED, REFUNDED, ou
UNKNOWN_ERRORstring
requis
Code de forfait utilisé
string
requis
Numéro de téléphone
number
requis
Montant de la recharge en DZD
number
requis
Montant déduit de votre solde
string
requis
Horodatage de création (ISO 8601)
string
Message en arabe pour l’utilisateur final (uniquement si REFUNDED ou UNKNOWN_ERROR)
array
string
ID de commande de suivi si la commande a été redirigée
string
ID de commande de nouvelle tentative si la commande a été réessayée
Valeurs de Statut
PENDING
PENDING
Le statut
PENDING indique que la commande a été créée et est actuellement en file d’attente, en attente de traitement par l’un de nos serveurs. Elle sera traitée dès que possible.Durée typique : 2 à 15 secondesAction : Continuez à interroger toutes les 5 à 10 secondesHANDLING
HANDLING
Le statut
HANDLING indique que la commande est actuellement en cours de traitement par l’un de nos serveurs.Durée typique : 3 à 8 secondesAction : Continuez à interroger toutes les 5 à 10 secondesFULFILLED
FULFILLED
Le statut
FULFILLED indique que la recharge mobile a été envoyée avec succès. ✅Action : Mettez à jour le statut de la commande comme terminée, notifiez l’utilisateurREFUNDED
REFUNDED
Le statut
REFUNDED indique que la recharge mobile a été remboursée. ❌Champs disponibles :refund_message: Affichez ceci à l’utilisateur (en arabe)suggested_offers: Forfaits alternatifs (en cas de non-correspondance)
UNKNOWN_ERROR
UNKNOWN_ERROR
Le statut Action :
UNKNOWN_ERROR indique que la recharge mobile peut avoir réussi ou échoué. Le statut se mettra à jour dans 1 à 12 heures en FULFILLED ou REFUNDED après vérification manuelle par notre équipe de support. Nous serons immédiatement notifiés et aucune action de votre part n’est requise. ⚠️De telles erreurs surviennent en raison de la nature des commandes AT et des comportements inattendus des opérateurs (nouveaux messages, problèmes réseau, etc.).VOUS NE DEVEZ PAS REMBOURSER LE MONTANT à votre utilisateur à ce statut !
- Affichez
refund_messageà l’utilisateur - NE remboursez PAS immédiatement
- Configurez une tâche cron quotidienne pour vérifier les commandes UNKNOWN_ERROR et les mettre à jour en FULFILLED ou REFUNDED
- Vérifiez à nouveau après 24 heures
- Gérez ensuite les remboursements si le statut devient REFUNDED
Exemples
curl https://api.oneclickdz.com/v3/mobile/check-id/6901616fe9e88196b4eb64b0 \
-H "X-Access-Token: YOUR_API_KEY"
const topupId = "6901616fe9e88196b4eb64b0";
const response = await fetch(
`https://api.oneclickdz.com/v3/mobile/check-id/${topupId}`,
{ headers: { "X-Access-Token": "YOUR_API_KEY" } }
);
const { data } = await response.json();
console.log(data.status);
import requests
topup_id = '6901616fe9e88196b4eb64b0'
response = requests.get(
f'https://api.oneclickdz.com/v3/mobile/check-id/{topup_id}',
headers={'X-Access-Token': 'YOUR_API_KEY'}
)
status = response.json()['data']['status']
<?php
$topupId = '6901616fe9e88196b4eb64b0';
$ch = curl_init("https://api.oneclickdz.com/v3/mobile/check-id/{$topupId}");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Access-Token: YOUR_API_KEY']);
$response = json_decode(curl_exec($ch), true);
$status = $response['data']['status'];
?>
Réponse FULFILLED
{
"success": true,
"data": {
"_id": "6901616fe9e88196b4eb64b0",
"ref": "order-12345",
"status": "FULFILLED",
"plan_code": "PREPAID_DJEZZY",
"MSSIDN": "0778037340",
"topup_amount": 500,
"balance_amount": 490,
"created_at": "2025-10-29T00:35:59.378Z"
},
"meta": {
"timestamp": "2025-10-29T00:36:15.606Z"
},
"requestId": "req_1730160975_abc123"
}
Réponse REFUNDED
{
"success": true,
"data": {
"_id": "6901616fe9e88196b4eb64b0",
"ref": "order-12345",
"status": "REFUNDED",
"plan_code": "PREPAID_DJEZZY",
"MSSIDN": "0778037340",
"topup_amount": 500,
"balance_amount": 490,
"created_at": "2025-10-29T00:35:59.378Z",
"refund_message": "الرصيد المطلوب غير متوفر لهذا الرقم"
},
"meta": {
"timestamp": "2025-10-29T00:36:15.606Z"
},
"requestId": "req_1730160975_def456"
}
Réponse REFUNDED avec Offres Suggérées
Lorsque le code de forfait ne correspond pas au type de numéro de téléphone, vous recevrez des alternatives suggérées :{
"success": true,
"data": {
"_id": "6901616fe9e88196b4eb64b0",
"ref": "order-12345",
"status": "REFUNDED",
"plan_code": "PREPAID_DJEZZY",
"MSSIDN": "0778037340",
"topup_amount": 500,
"balance_amount": 490,
"created_at": "2025-10-29T00:35:59.378Z",
"refund_message": "هذا العرض غير متوافق مع هذا الرقم جرب فاتورة",
"suggested_offers": [
{
"typename": "📋 FACTURE | فاتورة",
"plan_code": "FACTURE_DJEZZY",
"amount": 500
}
]
},
"meta": {
"timestamp": "2025-10-29T00:36:15.606Z"
},
"requestId": "req_1730160975_ghi789"
}
VEUILLEZ NOTER :
suggested_offers est un tableau et peut contenir plusieurs éléments, par exemple lorsque vous envoyez des forfaits GETMENU.Stratégie de Polling
Synchroniser Notre API avec Votre Backend
1
Démarrer le Polling
Commencez à vérifier le statut immédiatement après l’envoi de la recharge. Une approche simple consiste à définir un intervalle de 5 à 10 secondes sur votre frontend pour vérifier le statut. Une fois le statut FULFILLED, REFUNDED ou UNKNOWN_ERROR, effacez l’intervalle et arrêtez d’envoyer des requêtes.
const topupId = response.data.topupId;
const status = await pollStatus(topupId);
2
Intervalle de Polling
Vérifiez toutes les 5 à 10 secondes tant que PENDING ou HANDLING. Cette approche maintiendra les requêtes au minimum (5 à 10 par transaction).Pour chaque requête GET de vos utilisateurs, vous pouvez lire le statut dans votre base de données. Seulement si le statut n’est pas
FULFILLED, REFUNDED ou UNKNOWN_ERROR, envoyez une requête de vérification à notre API, mettez à jour votre base de données, puis répondez à votre utilisateur.async function pollStatus(topupId, maxAttempts = 60) {
for (let i = 0; i < maxAttempts; i++) {
const { data } = await checkTopupStatus(topupId);
if (['FULFILLED', 'REFUNDED', 'UNKNOWN_ERROR'].includes(data.status)) {
return data;
}
await sleep(5000); // Wait 5 seconds
}
throw new Error('Timeout');
}
3
Gérer le Résultat
Mettez à jour la commande en fonction du statut final
if (status === 'FULFILLED') {
await markOrderComplete(orderId);
} else if (status === 'REFUNDED') {
await refundUser(orderId);
await notifyUser(refund_message);
} else if (status === 'UNKNOWN_ERROR') {
await markForReview(orderId);
// DO NOT refund yet - wait for daily cronjob
}
Exemple de Polling Complet
async function pollTopupStatus(topupId) {
const maxAttempts = 60; // 5 minutes max
const pollInterval = 5000; // 5 seconds
for (let i = 0; i < maxAttempts; i++) {
const response = await fetch(
`https://api.oneclickdz.com/v3/mobile/check-id/${topupId}`,
{ headers: { "X-Access-Token": process.env.API_KEY } }
);
const { data } = await response.json();
// Final states
if (["FULFILLED", "REFUNDED", "UNKNOWN_ERROR"].includes(data.status)) {
return data;
}
// Still processing
console.log(`Attempt ${i + 1}: Status is ${data.status}`);
await new Promise((resolve) => setTimeout(resolve, pollInterval));
}
throw new Error("Polling timeout after 5 minutes");
}
// Usage
try {
const result = await pollTopupStatus("6901616fe9e88196b4eb64b0");
console.log("Final status:", result.status);
} catch (error) {
console.error("Polling failed:", error.message);
}
import requests
import time
def poll_topup_status(topup_id, max_attempts=60, poll_interval=5):
"""Poll top-up status until completion or timeout"""
url = f'https://api.oneclickdz.com/v3/mobile/check-id/{topup_id}'
headers = {'X-Access-Token': 'YOUR_API_KEY'}
for attempt in range(max_attempts):
response = requests.get(url, headers=headers)
data = response.json()['data']
# Check if final state
if data['status'] in ['FULFILLED', 'REFUNDED', 'UNKNOWN_ERROR']:
return data
# Still processing
print(f"Attempt {attempt + 1}: Status is {data['status']}")
time.sleep(poll_interval)
raise TimeoutError('Polling timeout after 5 minutes')
# Usage
try:
result = poll_topup_status('6901616fe9e88196b4eb64b0')
print(f"Final status: {result['status']}")
except TimeoutError as e:
print(f"Error: {e}")
Gestion de UNKNOWN_ERROR
NE remboursez PAS immédiatement lorsque le statut est UNKNOWN_ERROR !
UNKNOWN_ERROR indique une incertitude quant au succès ou à l’échec de la recharge. Cela se produit en raison de la nature des commandes AT et des comportements inattendus des opérateurs (nouveaux messages, problèmes réseau, etc.).
1
Afficher le Message
Affichez
refund_message à l’utilisateur expliquant le délai2
Marquer pour Révision
Signalez la commande pour révision manuelle ou revérification automatisée. Nous serons immédiatement notifiés et aucune action de votre part n’est requise.
3
Revérification Automatisée
Configurez une tâche cron quotidienne pour vérifier les commandes incertaines. Le statut se mettra à jour dans 1 à 12 heures (jusqu’à 24h) en FULFILLED ou REFUNDED après vérification manuelle par notre équipe de support.
// Daily at midnight
cron.schedule('0 0 * * *', async () => {
const uncertainOrders = await db.orders.find({
status: 'UNKNOWN_ERROR',
createdAt: { $lt: new Date(Date.now() - 24*60*60*1000) }
});
for (const order of uncertainOrders) {
const status = await checkTopupStatus(order.apiTopupId);
await updateOrderStatus(order.id, status.data.status);
// Now handle refund if status is REFUNDED
if (status.data.status === 'REFUNDED') {
await processRefund(order);
}
}
});
4
Résolution Finale
Le statut se mettra à jour en FULFILLED ou REFUNDED dans les 24 heures. C’est seulement à ce moment que vous devrez traiter les remboursements si le statut final est REFUNDED.
Bonnes Pratiques
Mettre en Cache le Statut
Stockez le statut dans votre base de données et ne vérifiez l’API que pour les commandes en attente
Éviter le Sur-polling
Ne vérifiez pas plus fréquemment que toutes les 5 secondes pour les commandes actives
Gérer UNKNOWN_ERROR
Ne remboursez jamais immédiatement - attendez la résolution dans les 24 heures
Notifier les Utilisateurs
Envoyez des notifications push ou e-mail lorsque le statut change en état final
Gestion des Remboursements
Unrefund_message (message en arabe) sera ajouté à l’opération de recharge, et vous devez l’afficher tel quel à votre client.
Exemples de scénarios :
Mauvais Numéro de Téléphone
Si votre client saisit un mauvais numéro de téléphone :refund_message: "رقم الهاتف خاطئ، يرجى التأكد مع العميل"
Inadéquation du Plan
Si vous essayez d’envoyer PREPAID_DJEZZY vers un numéro facture (postpayé) :{
"refund_message": "هذا العرض غير متوافق مع هذا الرقم جرب فاتورة",
"suggested_offers": [
{
"typename": "📋 FACTURE | فاتورة",
"plan_code": "FACTURE_DJEZZY",
"amount": 500
}
]
}
Tableau des Offres Suggérées
Le tableausuggested_offers affiche les plans corrects pour le numéro de téléphone. Mettez à jour l’interface de votre application pour représenter ces nouveaux plans au lieu d’afficher tous les plans.
suggested_offers est un tableau et peut contenir plusieurs éléments, surtout lorsque vous envoyez des requêtes GETMENU.Tests en Sandbox
Activez le sandbox sur votre page de paramètres pour tester les requêtes sans affecter votre solde. Toutes les opérations simuleront une opération réelle :1
Flux Normal
N’importe quel numéro de téléphone normal :
- 5 premières secondes : statut
PENDING - 15 premières secondes : statut
HANDLING - Ensuite : statut
FULFILLED
2
Tester le Remboursement avec Message
Téléphone : 0600000001Tester le statut REFUNDED avec
refund_message à afficher au client3
Tester le Remboursement avec Suggestions
Téléphone : 0600000002Tester le statut REFUNDED avec
refund_message et suggested_offers4
Tester l'Erreur Inconnue
Téléphone : 0600000003Tester le statut
UNKNOWN_ERROR pour s’assurer que votre logique de tâche quotidienne fonctionne correctementEndpoints Associés
Vérifier par Référence
Suivre avec votre référence personnalisée
Envoyer une Recharge
Créer une nouvelle recharge

