Aller au contenu
Démo — données fictivesConçu par Algeria Agency

Intégrations

Branchez votre boutique sur le réseau

Une API REST en JSON pour créer des expéditions, suivre chaque colis, demander un ramassage et lire vos reversements ; des webhooks signés pour être prévenu ; des modules pour les boutiques en ligne ; un modèle d’import pour tout le reste.

Démarrer en trois appels

Tout passe par l’adresse de test ci-dessous, en JSON encodé en UTF-8. Les montants sont des dinars entiers, les dates suivent l’heure d’Alger.

Adresse de base
https://algeriaagency.com/api/demos/logistique/v1
Authentification
Chaque requête porte votre clé dans l’en-tête X-Api-Key. Une clé se crée dans l’espace vendeur, rubrique API ; elle commence par kh_test_ et elle est affichée une seule fois.X-Api-Key: kh_test_••••••••••••••••••••7Q2m
Requêtes rejouables
Ajoutez un en-tête Idempotency-Key à chaque POST : la même clé renvoyée dans les 24 heures rend la même réponse, sans créer un second colis. Le même en-tête avec un autre contenu est refusé en 409.
Ce que fait le bac à sable
Dans la démonstration, chaque destinataire est remplacé à la réception par un destinataire démo au numéro masqué, et seul un condensé du numéro est conservé. Les webhooks sont inscrits dans le journal de votre espace, jamais envoyés vers l’extérieur. Tout est effacé après 24 heures.
  1. Créez une clé de test dans l’espace vendeur.
  2. Demandez un prix avec GET /tariffs/quote pour afficher la livraison dans votre panier.
  3. Créez l’expédition avec POST /shipments quand la commande est validée, puis imprimez l’étiquette.
  4. Écoutez shipment.status_changed pour mettre à jour la commande sans interroger l’API.

Points d’entrée

Six points d’entrée couvrent le parcours d’une commande, du prix affiché au panier jusqu’à l’argent reversé.

POST/api/demos/logistique/v1/shipments

Créer une expédition

Enregistre un colis, calcule son prix, sa fenêtre de livraison et son risque de refus, et renvoie le numéro de suivi et l’étiquette.

Accepte Idempotency-KeyErreurs possibles :400 · 401 · 409 · 422 · 429

Corps de la requête
ChampTypeObligatoireDescription
referencestring≤ 40nonVotre numéro de commande, rendu tel quel.
recipientobjectouiLe destinataire.
recipient.namestring2–80ouiSon nom. Remplacé par un nom démo dans le bac à sable.
recipient.phonestringouiUn mobile algérien. Masqué et remplacé dans le bac à sable ; seul un condensé est gardé.
destinationobjectouiOù livrer.
destination.wilayainteger1–69ouiCode de la wilaya, de 1 à 69.
destination.communestring2–60ouiCommune de cette wilaya : son identifiant ou son nom, en arabe, en français ou en latin.
destination.landmarkstring≤ 160nonUn repère plutôt qu’une adresse : « en face de la mosquée », « derrière la poste ».
modestringhomestop-deskouihome (à domicile) ou stop-desk (retrait en agence).
agencystringnonL’agence de retrait pour un stop-desk, par défaut celle de la wilaya.
weight_kgnumber0.05–70ouiPoids en kilogrammes.
dimensions_cmobjectnonDimensions en centimètres, pour le poids volumétrique.
dimensions_cm.lengthinteger1–300ouiLongueur.
dimensions_cm.widthinteger1–300ouiLargeur.
dimensions_cm.heightinteger1–300ouiHauteur.
cod_amountinteger0–1000000ouiMontant à encaisser à la porte, en dinars ; 0 pour un colis prépayé.
declared_valueinteger0–5000000nonValeur déclarée pour l’assurance ; par défaut le montant encaissé.
productstring2–120ouiCe que contient le colis, en quelques mots.
quantityinteger1–99nonNombre d’articles.
optionsarray≤ 6insurancefragileexchangeconfirmationopen-on-deliveryexpressnonOptions : assurance, fragile, échange, confirmation, ouverture avant paiement, express.
notestring≤ 200nonUne consigne pour le livreur.
Réponse 201
ChampTypeObligatoireDescription
tracking_numberstringouiNuméro de suivi : KH et dix chiffres, le dernier étant une clé de contrôle.
referencestringnonVotre numéro de commande, rendu tel quel.
statestring
Valeurs (19)pending-confirmationconfirmedawaiting-pickuppicked-upat-origin-hubin-line-haulat-destination-hubout-for-deliverydeliveredattempt-failedrescheduledat-stop-deskcollected-from-stop-deskrefusedreturn-in-transitreturnedexchangelostcancelled
ouiL’état du colis.
priceobjectouiLe prix de l’envoi.
price.htintegerouiHors taxes.
price.tvaintegerouiTVA.
price.ttcintegerouiToutes taxes comprises.
price.lines[]arrayouiLe détail, ligne par ligne.
price.lines[].keystringouiLa nature de la ligne : transport, frais d’encaissement, option…
price.lines[].amountintegerouiSon montant TTC.
price.indicativebooleanouiToujours vrai : le tarif est indicatif.
slaobjectouiLa fenêtre de livraison promise, en heures après le ramassage.
sla.min_hoursintegerouiAu plus tôt.
sla.max_hoursintegerouiAu plus tard.
riskobjectouiLe risque de refus estimé, avec ses raisons dans l’espace vendeur.
risk.scoreinteger0–100ouiDe 0 à 100.
risk.bandstringlowmediumhighouiFaible, moyen ou élevé.
label_urlstringouiL’étiquette 10 × 15 en PDF (spécimen dans la démonstration).
tracking_urlstringouiLa page de suivi à envoyer au client.
created_atdatetimeouiDate de création.
Requête — curl
curl -X POST 'https://algeriaagency.com/api/demos/logistique/v1/shipments' \
  -H 'X-Api-Key: kh_test_••••••••••••••••••••7Q2m' \
  -H 'Idempotency-Key: 6f1c2d0e-commande-0412' \
  -H 'Content-Type: application/json' \
  -d '{
    "reference": "CMD-2026-0412",
    "recipient": {
      "name": "Destinataire démo n° 42",
      "phone": "06 •• •• 48 17"
    },
    "destination": {
      "wilaya": 16,
      "commune": "Bab Ezzouar",
      "landmark": "en face de la mosquée El Feth"
    },
    "mode": "home",
    "weight_kg": 0.8,
    "cod_amount": 2500,
    "product": "Coffret soins visage",
    "options": [
      "confirmation"
    ]
  }'
Réponse 201
{
  "tracking_number": "KH4831200573",
  "reference": "CMD-2026-0412",
  "state": "pending-confirmation",
  "price": {
    "ht": 437,
    "tva": 83,
    "ttc": 520,
    "lines": [
      {
        "key": "transport",
        "amount": 400
      },
      {
        "key": "cod-fee",
        "amount": 50
      },
      {
        "key": "confirmation",
        "amount": 70
      }
    ],
    "indicative": true
  },
  "sla": {
    "min_hours": 12,
    "max_hours": 24
  },
  "risk": {
    "score": 21,
    "band": "low"
  },
  "label_url": "/api/demos/logistique/v1/shipments/KH4831200573/label.pdf",
  "tracking_url": "/demos/logistique/suivi/KH4831200573",
  "created_at": "2026-10-19T10:42:00+01:00"
}

GET/api/demos/logistique/v1/shipments/{tracking}

Lire une expédition

L’état d’un colis, ses étapes, son encaissement et, en cours de livraison, sa fenêtre d’arrivée.

Erreurs possibles :401 · 404 · 429

Paramètre dans le chemin
ChampTypeObligatoireDescription
trackingstringouiNuméro de suivi : KH et dix chiffres, le dernier étant une clé de contrôle.
Réponse 200
ChampTypeObligatoireDescription
tracking_numberstringouiNuméro de suivi : KH et dix chiffres, le dernier étant une clé de contrôle.
statestring
Valeurs (19)pending-confirmationconfirmedawaiting-pickuppicked-upat-origin-hubin-line-haulat-destination-hubout-for-deliverydeliveredattempt-failedrescheduledat-stop-deskcollected-from-stop-deskrefusedreturn-in-transitreturnedexchangelostcancelled
ouiL’état du colis.
modestringhomestop-deskouihome (à domicile) ou stop-desk (retrait en agence).
destinationobjectouiOù livrer.
destination.wilayainteger1–69ouiCode de la wilaya, de 1 à 69.
destination.communestring2–60ouiCommune de cette wilaya : son identifiant ou son nom, en arabe, en français ou en latin.
cod_amountintegerouiMontant à encaisser à la porte, en dinars ; 0 pour un colis prépayé.
cod_statestring
Valeurs (8)pendingcollectedin-transit-to-hubreconciledpaid-outpartialdisputedrefunded
ouiOù en est l’argent encaissé.
attemptsinteger0–3ouiTentatives de livraison, trois au plus.
etaobjectnonLa fenêtre d’arrivée, une fois le colis en livraison.
eta.earliestdatetimeouiDébut de la fenêtre.
eta.latestdatetimeouiFin de la fenêtre.
events[]arrayouiLes étapes, de la plus ancienne à la plus récente.
events[].statestring
Valeurs (19)pending-confirmationconfirmedawaiting-pickuppicked-upat-origin-hubin-line-haulat-destination-hubout-for-deliverydeliveredattempt-failedrescheduledat-stop-deskcollected-from-stop-deskrefusedreturn-in-transitreturnedexchangelostcancelled
ouiL’état du colis.
events[].atdatetimeouiHeure de l’étape.
events[].placestringouiLieu : commune, code du hub ou agence.
events[].reasonstringabsentrefusedwrong-addressunreachablereschedulednonPour un échec, la raison.
Requête — curl
curl -X GET 'https://algeriaagency.com/api/demos/logistique/v1/shipments/KH4831200573' \
  -H 'X-Api-Key: kh_test_••••••••••••••••••••7Q2m' \
  --compressed
Réponse 200
{
  "tracking_number": "KH4831200573",
  "state": "out-for-delivery",
  "mode": "home",
  "destination": {
    "wilaya": 16,
    "commune": "Bab Ezzouar"
  },
  "cod_amount": 2500,
  "cod_state": "pending",
  "attempts": 0,
  "eta": {
    "earliest": "2026-10-20T10:30:00+01:00",
    "latest": "2026-10-20T12:30:00+01:00"
  },
  "events": [
    {
      "state": "picked-up",
      "at": "2026-10-19T15:10:00+01:00",
      "place": "Bab Ezzouar"
    },
    {
      "state": "at-origin-hub",
      "at": "2026-10-19T19:45:00+01:00",
      "place": "RBA"
    },
    {
      "state": "out-for-delivery",
      "at": "2026-10-20T08:20:00+01:00",
      "place": "Bab Ezzouar"
    }
  ]
}

POST/api/demos/logistique/v1/shipments/bulk

Créer des expéditions en lot

Jusqu’à 500 colis par appel. Les lignes valides sont créées, les autres reviennent avec la raison et, pour un lieu, des suggestions.

Accepte Idempotency-KeyErreurs possibles :400 · 401 · 409 · 413 · 429

Corps de la requête
ChampTypeObligatoireDescription
shipments[]array1–500ouiLes colis, au même format qu’une expédition seule.
shipments[].referencestring≤ 40nonVotre numéro de commande, rendu tel quel.
shipments[].recipientobjectouiLe destinataire.
shipments[].recipient.namestring2–80ouiSon nom. Remplacé par un nom démo dans le bac à sable.
shipments[].recipient.phonestringouiUn mobile algérien. Masqué et remplacé dans le bac à sable ; seul un condensé est gardé.
shipments[].destinationobjectouiOù livrer.
shipments[].destination.wilayainteger1–69ouiCode de la wilaya, de 1 à 69.
shipments[].destination.communestring2–60ouiCommune de cette wilaya : son identifiant ou son nom, en arabe, en français ou en latin.
shipments[].destination.landmarkstring≤ 160nonUn repère plutôt qu’une adresse : « en face de la mosquée », « derrière la poste ».
shipments[].modestringhomestop-deskouihome (à domicile) ou stop-desk (retrait en agence).
shipments[].agencystringnonL’agence de retrait pour un stop-desk, par défaut celle de la wilaya.
shipments[].weight_kgnumber0.05–70ouiPoids en kilogrammes.
shipments[].dimensions_cmobjectnonDimensions en centimètres, pour le poids volumétrique.
shipments[].dimensions_cm.lengthinteger1–300ouiLongueur.
shipments[].dimensions_cm.widthinteger1–300ouiLargeur.
shipments[].dimensions_cm.heightinteger1–300ouiHauteur.
shipments[].cod_amountinteger0–1000000ouiMontant à encaisser à la porte, en dinars ; 0 pour un colis prépayé.
shipments[].declared_valueinteger0–5000000nonValeur déclarée pour l’assurance ; par défaut le montant encaissé.
shipments[].productstring2–120ouiCe que contient le colis, en quelques mots.
shipments[].quantityinteger1–99nonNombre d’articles.
shipments[].optionsarray≤ 6insurancefragileexchangeconfirmationopen-on-deliveryexpressnonOptions : assurance, fragile, échange, confirmation, ouverture avant paiement, express.
shipments[].notestring≤ 200nonUne consigne pour le livreur.
Réponse 200
ChampTypeObligatoireDescription
accepted[]arrayouiLes lignes créées.
accepted[].indexintegerouiPosition de la ligne dans le lot, à partir de 0.
accepted[].tracking_numberstringouiNuméro de suivi : KH et dix chiffres, le dernier étant une clé de contrôle.
rejected[]arrayouiLes lignes refusées.
rejected[].indexintegerouiPosition de la ligne dans le lot, à partir de 0.
rejected[].errors[]arrayouiCe qui ne va pas.
rejected[].errors[].pathstringouiLe champ en cause.
rejected[].errors[].codestringouiUn code stable.
rejected[].errors[].suggestionsarraynonPour un lieu, les noms les plus proches.
Requête — curl
curl -X POST 'https://algeriaagency.com/api/demos/logistique/v1/shipments/bulk' \
  -H 'X-Api-Key: kh_test_••••••••••••••••••••7Q2m' \
  -H 'Idempotency-Key: 6f1c2d0e-commande-0412' \
  -H 'Content-Type: application/json' \
  -d '{
    "shipments": [
      {
        "reference": "CMD-2026-0412",
        "recipient": {
          "name": "Destinataire démo n° 42",
          "phone": "06 •• •• 48 17"
        },
        "destination": {
          "wilaya": 16,
          "commune": "Bab Ezzouar",
          "landmark": "en face de la mosquée El Feth"
        },
        "mode": "home",
        "weight_kg": 0.8,
        "cod_amount": 2500,
        "product": "Coffret soins visage",
        "options": [
          "confirmation"
        ]
      },
      {
        "reference": "CMD-2026-0413",
        "recipient": {
          "name": "Destinataire démo n° 42",
          "phone": "06 •• •• 48 17"
        },
        "destination": {
          "wilaya": 31,
          "commune": "Bir Djir"
        },
        "mode": "home",
        "weight_kg": 0.8,
        "cod_amount": 2500,
        "product": "Coffret soins visage",
        "options": [
          "confirmation"
        ]
      }
    ]
  }'
Réponse 200
{
  "accepted": [
    {
      "index": 0,
      "tracking_number": "KH4831200573"
    }
  ],
  "rejected": [
    {
      "index": 1,
      "errors": [
        {
          "path": "destination.commune",
          "code": "commune-unknown",
          "suggestions": [
            "Bir el-Djir"
          ]
        }
      ]
    }
  ]
}

GET/api/demos/logistique/v1/tariffs/quote

Calculer un tarif

Le prix toutes taxes et la fenêtre de livraison entre deux wilayas, avec les options. Le tarif est indicatif et suit la grille de la direction.

Erreurs possibles :400 · 401 · 422 · 429

Paramètres de la requête
ChampTypeObligatoireDescription
from_wilayainteger1–69ouiWilaya de départ.
to_wilayainteger1–69ouiWilaya d’arrivée.
to_communestringnonCommune d’arrivée, pour distinguer la même ville.
weight_kgnumber0.05–70ouiPoids en kilogrammes.
modestringhomestop-deskouihome (à domicile) ou stop-desk (retrait en agence).
cod_amountinteger0≥ nonMontant à encaisser à la porte, en dinars ; 0 pour un colis prépayé.
optionsstringnonLes mêmes options, séparées par des virgules.
Réponse 200
ChampTypeObligatoireDescription
bandstringouiLa bande tarifaire : même ville, même wilaya ou paire de zones.
priceobjectouiLe prix de l’envoi.
price.htintegerouiHors taxes.
price.tvaintegerouiTVA.
price.ttcintegerouiToutes taxes comprises.
price.lines[]arrayouiLe détail, ligne par ligne.
price.lines[].keystringouiLa nature de la ligne : transport, frais d’encaissement, option…
price.lines[].amountintegerouiSon montant TTC.
price.indicativebooleanouiToujours vrai : le tarif est indicatif.
slaobjectouiLa fenêtre de livraison promise, en heures après le ramassage.
sla.min_hoursintegerouiAu plus tôt.
sla.max_hoursintegerouiAu plus tard.
unavailablearrayouiLes options demandées qui ne sont pas proposées sur ce trajet.
Requête — curl
curl -X GET 'https://algeriaagency.com/api/demos/logistique/v1/tariffs/quote?from_wilaya=16&to_wilaya=31&weight_kg=1.2&mode=home&cod_amount=3500&options=insurance,fragile' \
  -H 'X-Api-Key: kh_test_••••••••••••••••••••7Q2m' \
  --compressed
Réponse 200
{
  "band": "north>north",
  "price": {
    "ht": 882,
    "tva": 168,
    "ttc": 1050,
    "lines": [
      {
        "key": "transport",
        "amount": 750
      },
      {
        "key": "cod-fee",
        "amount": 50
      },
      {
        "key": "insurance",
        "amount": 100
      },
      {
        "key": "fragile",
        "amount": 150
      }
    ],
    "indicative": true
  },
  "sla": {
    "min_hours": 24,
    "max_hours": 48
  },
  "unavailable": []
}

POST/api/demos/logistique/v1/pickups

Demander un ramassage

Un livreur passe chez vous le jour ouvré choisi, le matin ou l’après-midi. Après 14 h, le ramassage du jour même n’est plus garanti.

Accepte Idempotency-KeyErreurs possibles :400 · 401 · 409 · 422 · 429

Corps de la requête
ChampTypeObligatoireDescription
datedateouiUn jour ouvré : ni vendredi ni jour férié.
slotstringmorningafternoonouiMatin ou après-midi.
parcelsinteger1–500ouiCombien de colis attendent.
tracking_numbersarray≤ 500nonLes numéros concernés, si vous les avez.
locationobjectouiOù passer, avec un repère.
location.wilayainteger1–69ouiCode de la wilaya, de 1 à 69.
location.communestring2–60ouiCommune de cette wilaya : son identifiant ou son nom, en arabe, en français ou en latin.
location.landmarkstring≤ 160nonUn repère plutôt qu’une adresse : « en face de la mosquée », « derrière la poste ».
Réponse 201
ChampTypeObligatoireDescription
pickup_refstringouiLa référence du ramassage.
datedateouiUn jour ouvré : ni vendredi ni jour férié.
slotstringmorningafternoonouiMatin ou après-midi.
statestringscheduledcollectedmissedcancelledouiPrévu, effectué, manqué ou annulé.
Requête — curl
curl -X POST 'https://algeriaagency.com/api/demos/logistique/v1/pickups' \
  -H 'X-Api-Key: kh_test_••••••••••••••••••••7Q2m' \
  -H 'Idempotency-Key: 6f1c2d0e-commande-0412' \
  -H 'Content-Type: application/json' \
  -d '{
    "date": "2026-10-20",
    "slot": "morning",
    "parcels": 14,
    "location": {
      "wilaya": 16,
      "commune": "Bab Ezzouar",
      "landmark": "à côté de la pharmacie de nuit"
    }
  }'
Réponse 201
{
  "pickup_ref": "KH-DEMO-RAM-01877",
  "date": "2026-10-20",
  "slot": "morning",
  "state": "scheduled"
}

GET/api/demos/logistique/v1/payouts

Lister les reversements

Les reversements des encaissements, par virement bancaire ou CCP, avec le détail des frais retenus et le prochain jour de reversement.

Erreurs possibles :400 · 401 · 429

Paramètres de la requête
ChampTypeObligatoireDescription
fromdatenonDepuis cette date.
todatenonJusqu’à cette date.
statestringscheduledsentnonPrévu ou envoyé.
pageinteger1≥ nonNuméro de page.
per_pageinteger1–100nonLignes par page.
Réponse 200
ChampTypeObligatoireDescription
payouts[]arrayouiLes reversements, du plus récent au plus ancien.
payouts[].refstringouiLe relevé du reversement.
payouts[].scheduled_fordateouiJour prévu.
payouts[].sent_atdatetimenonHeure d’envoi.
payouts[].methodstringbankccpouiVirement bancaire ou CCP.
payouts[].parcelsintegerouiColis compris dans le reversement.
payouts[].collectedintegerouiTotal encaissé.
payouts[].feesintegerouiFrais retenus : livraison, encaissement, options, retours.
payouts[].netintegerouiMontant versé.
payouts[].statestringscheduledsentouiPrévu ou envoyé.
next_payout_daydateouiLe prochain jour de reversement.
next_pageintegernonLa page suivante, ou rien.
Requête — curl
curl -X GET 'https://algeriaagency.com/api/demos/logistique/v1/payouts?from=2026-10-01&state=sent' \
  -H 'X-Api-Key: kh_test_••••••••••••••••••••7Q2m' \
  --compressed
Réponse 200
{
  "payouts": [
    {
      "ref": "KH-DEMO-REL-00318",
      "scheduled_for": "2026-10-18",
      "sent_at": "2026-10-18T10:05:00+01:00",
      "method": "ccp",
      "parcels": 37,
      "collected": 112400,
      "fees": 18620,
      "net": 93780,
      "state": "sent"
    }
  ],
  "next_payout_day": "2026-10-21",
  "next_page": null
}

Webhooks signés

Déclarez une adresse dans l’espace vendeur et choisissez les événements. Chaque envoi porte une signature que vous vérifiez avant de faire confiance au contenu.

Événements

shipment.status_changed

Un colis change d’état : ramassé, au hub, en livraison, livré, absent, refusé, retourné.

Contenu de l’événement
{
  "id": "evt_7Hc2Qm8LxP0aR4tN9kDz",
  "type": "shipment.status_changed",
  "created_at": "2026-10-20T11:02:13+01:00",
  "data": {
    "tracking_number": "KH4831200573",
    "reference": "CMD-2026-0412",
    "from": "out-for-delivery",
    "to": "delivered",
    "at": "2026-10-20T11:02:10+01:00",
    "place": "Bab Ezzouar"
  }
}

cod.collected

Le livreur a encaissé le montant à la porte, en totalité ou en partie.

Contenu de l’événement
{
  "id": "evt_7Hc2Qm8LxP0aR4tN9kDz",
  "type": "cod.collected",
  "created_at": "2026-10-20T11:02:13+01:00",
  "data": {
    "tracking_number": "KH4831200573",
    "amount": 2500,
    "collected_at": "2026-10-20T11:02:10+01:00",
    "partial": false
  }
}

payout.sent

Un reversement est parti vers votre compte bancaire ou CCP.

Contenu de l’événement
{
  "id": "evt_7Hc2Qm8LxP0aR4tN9kDz",
  "type": "payout.sent",
  "created_at": "2026-10-20T11:02:13+01:00",
  "data": {
    "ref": "KH-DEMO-REL-00318",
    "net": 93780,
    "method": "ccp",
    "parcels": 37,
    "sent_at": "2026-10-18T10:05:00+01:00"
  }
}

Vérifier une signature

L’en-tête X-Khatt-Signature contient t= (l’heure d’envoi en secondes) et v1= (le HMAC-SHA256, en hexadécimal, de t, d’un point et du corps brut, calculé avec le secret de l’adresse). Recalculez-le, comparez en temps constant et refusez un envoi de plus de cinq minutes.

X-Khatt-Signature: t=1760954533,v1=5f0c…e21a
Vérification en JavaScript
import { createHmac, timingSafeEqual } from 'node:crypto'

export function verify(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')))
  const age = Math.abs(Date.now() / 1000 - Number(parts.t))
  if (!parts.t || !parts.v1 || age > 300) return false
  const expected = createHmac('sha256', secret).update(`${parts.t}.${rawBody}`).digest('hex')
  return timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1))
}
  • Répondez par un code 2xx en moins de dix secondes. Sinon l’envoi est retenté après 1 min, 5 min, 30 min, 2 h puis 6 h, et marqué en échec dans le journal.
  • Le bouton « Envoyer un test » de l’espace vendeur (ou POST /webhooks/test) produit un exemple de chaque événement.

Limites et erreurs

  • Au plus 300 requêtes par heure et par clé. Les en-têtes X-RateLimit-Remaining et X-RateLimit-Reset disent où vous en êtes ; au-delà, la réponse est 429 avec Retry-After.
  • Un lot compte pour une requête et prend au plus 500 colis. Une liste est paginée par 100 lignes au plus.
  • Une erreur a toujours la même forme : un code stable, un message lisible et, pour un champ, son chemin et sa raison.
422
{
  "error": {
    "code": "unprocessable",
    "message": "…",
    "fields": [
      {
        "path": "destination.commune",
        "code": "commune-other-wilaya"
      }
    ]
  }
}
HTTPcodeDescription
400invalid_requestRequête illisible : JSON invalide ou paramètre manquant.
401unauthorizedClé absente, inconnue ou révoquée.
403forbiddenLa clé n’a pas accès à cette ressource.
404not_foundAucun colis ou reversement à ce numéro pour ce compte.
409conflictIdempotency-Key déjà utilisée avec un autre contenu.
413too_largeLot de plus de 500 colis.
422unprocessableContenu valide mais refusé : wilaya inconnue, commune d’une autre wilaya, poids hors limites.
429rate_limitedTrop de requêtes : attendez la durée indiquée.
500internalErreur de notre côté : réessayez avec la même Idempotency-Key.

Pour les boutiques en ligne

Pas d’API à écrire : un module installe le tarif au panier, crée l’expédition à la validation et met la commande à jour à chaque étape.

  • Boutiques sous CMS open source

    Un module à installer depuis l’administration de la boutique : tarif par wilaya au panier, choix domicile ou stop-desk, étiquette depuis la commande.

    Démonstration
  • Boutiques hébergées

    Une application à connecter en deux clics avec votre clé : les commandes arrivent dans l’espace vendeur, prêtes à être confirmées et étiquetées.

    Démonstration
  • Places de marché

    Un connecteur qui lit les commandes des places de marché où vous vendez et renvoie le numéro de suivi au client final.

    Démonstration
  • Ventes par messages

    Vous vendez en messages privés ? Collez la commande dans l’espace vendeur : l’adresse et le montant sont reconnus, vous confirmez chaque champ.

    Démonstration

Import CSV et Excel

Pour envoyer une journée de commandes d’un coup, sans API : un fichier, une ligne par colis, jusqu’à 500 lignes.

Colonnes reconnues

L’ordre ne compte pas et les en-têtes en arabe ou en anglais sont reconnus aussi. Le nom, le téléphone, la wilaya, la commune et le montant sont obligatoires.

À l’import, chaque ligne est vérifiée : une commune qui n’est pas dans sa wilaya est signalée avec les communes proches, un poids vide vaut 1 kg.

Dans la démonstration, les noms et les numéros du fichier sont remplacés par des valeurs démo dès l’import. Les numéros du modèle sont masqués.

NomObligatoire
Nomoui
Téléphoneoui
Wilayaoui
Communeoui
Adressenon
Poidsnon
Montantoui
Produitnon
Remarquenon
Quantiténon
Modenon

Livraison e-commerce, transport de marchandises et entreposage, dans les 69 wilayas.

Nous joindre

Numéro masqué06 •• •• 48 17

contact@exemple.dz

Écrire sur WhatsApp

Numéro masqué et adresse de démonstration. Conversation simulée dans la démonstration : rien n’est envoyé.

Le réseau

5 hubs · 69 agences

Toutes les agences

Horaires des agences

  • Samedi au mercredi, 8 h 30 – 18 h
  • Jeudi, 8 h 30 – 13 h
  • Vendredi fermé ; les hubs travaillent en trois équipes et les lignes roulent.

Démonstration Démonstration conçue par Algeria Agency. Khatt n’existe pas : l’entreprise, ses hubs, ses agences, ses véhicules, ses personnages, ses vendeurs, ses clients, ses colis et ses avis sont fictifs. Les tarifs sont indicatifs, aucun numéro n’est joignable, aucune position n’est réelle, et rien n’est encaissé, livré ni envoyé.

Les personnes présentées dans la démonstration sont des personnages fictifs. Personnage fictif

RC 16/00-DÉMO · NIF DÉMO · NIS DÉMO · Société fictive de démonstration

Carte et géographie : © les contributeurs d’OpenStreetMap, base de données sous licence ODbL. Licence de la carte

Crédits photos

Photographies libres de droits, hébergées par la démonstration ; les autres images sont générées.

  • La vue la plus spectaculaire depuis l’autoroute Est Ouest Bouira AlgérieAuteur : Bouizriphotography · CC BY-SA 4.0 · Source
  • Autoroute est ouest ghomri2Auteur : Sandervalya · CC BY-SA 3.0 · Source
  • Route au milieu du sableAuteur : habib kaki 2 from Zeralda · Domaine public · Source
  • Une route en pleine montagnes de DjurjuraAuteur : Zinou2go · CC BY-SA 3.0 · Source
  • Route d’El MfatehaAuteur : Habib kaki · CC0 1.0 · Source
  • Parc National du Tassili N’Ajjer (W. Illizi) 01Auteur : W.aliane9509 · CC BY-SA 4.0 · Source
  • Route OuarglaAuteur : Abdelkadermer · CC BY-SA 3.0 · Source
  • Wooden-pallets stacked 8Auteur : W.carter · CC0 1.0 · Source
  • Wooden-pallets stacked 7Auteur : W.carter · CC0 1.0 · Source
  • Highway light trains at night (Unsplash)Auteur : Jamie Street · CC0 1.0 · Source
  • KlisterpapirAuteur : Ditlev Petersen · CC BY-SA 3.0 · Source
  • Macro photography – barcode detailAuteur : Frettie · CC BY 3.0 · Source
  • Corrugated CardboardAuteur : Richard Wheeler (Zephyris) · CC BY-SA 3.0 · Source
Conçu par Algeria Agency

Nous mesurons l’audience de ce site avec Google Analytics, pour savoir quelles pages servent vraiment. Vous pouvez arrêter cette mesure à tout moment depuis le pied de page.Ce site mesure son audience. Politique de cookiesCookies