⚙️ Documentation développeurs · API REST

Intégrez Antera à votre système

Connectez votre boutique e-commerce, votre ERP ou votre marketplace à Antera pour créer des livraisons, suivre vos colis en temps réel et synchroniser les statuts — via une API REST simple et sécurisée.

Introduction

L'API Antera est une API REST au format JSON qui permet à un système tiers d'opérer sur la plateforme de livraison. Vous pouvez automatiser l'envoi de vos commandes vers Antera, suivre l'avancement de chaque colis et récupérer les informations financières (encaissement à la livraison / COD).

  • Style : REST — requêtes et réponses en application/json (en-têtes Content-Type et Accept)
  • Authentification : clé API (jeton porteur / Bearer token) dans l'en-tête Authorization
  • Relations : référencées par IRI, ex. /api/cities/45
  • Isolation : chaque clé est rattachée à un espace (workspace) ; vous ne voyez que vos propres données
  • Documentation interactive (OpenAPI / Swagger) : /api/docs

Cas d'usage

📦

Créer des livraisons

Poussez automatiquement chaque commande prête à expédier depuis votre boutique ou ERP.

📍

Suivre les colis

Récupérez le statut et l'historique complet d'un colis via son numéro de suivi.

💰

Suivre le COD

Sachez quand le paiement à la livraison a été encaissé et reversé.

🔄

Synchroniser les statuts

Mettez à jour l'état de vos commandes selon l'avancement de la livraison.

Obtenir un accès

L'accès à l'API est réservé aux comptes partenaires. Pour démarrer une intégration :

  1. Contactez notre équipe à contact@antera.app pour ouvrir un compte partenaire et un espace dédié.
  2. Recevez vos identifiants ainsi que votre clé API (jeton). La clé détermine à elle seule votre espace : ne la partagez jamais.
  3. Testez vos appels en environnement de validation, puis passez en production.
Une clé = un espace Toutes les livraisons créées avec une clé donnée sont automatiquement rattachées et isolées dans l'espace correspondant.

Authentification

Chaque requête authentifiée doit inclure votre clé API dans l'en-tête HTTP Authorization, selon le schéma Bearer :

Authorization: Bearer VOTRE_CLE_API

Si vous disposez d'un identifiant e-mail / mot de passe, vous pouvez aussi obtenir un jeton dynamiquement :

POST/api/login
curl -X POST https://votre-espace.antera.app/api/login \
  -H "Content-Type: application/json" \
  -d '{ "email": "partenaire@exemple.com", "password": "••••••••" }'

# Réponse
{ "token": "9f8c1e…", "user": { "id": 7, "name": "Ma Boutique" } }
Cycle de vie du jeton Chaque appel à /api/login régénère le jeton et invalide le précédent. Pour une intégration serveur à serveur, connectez-vous une seule fois et réutilisez le jeton mémorisé — ou demandez-nous une clé API permanente pour sauter l'étape /api/login.
Sécurité Transmettez toujours vos appels en HTTPS et conservez la clé côté serveur (jamais dans un front-end public ou une application mobile distribuée).

URL de base

Tous les points d'accès sont préfixés par /api sur votre sous-domaine d'espace :

https://votre-espace.antera.app/api

Remplacez votre-espace par le sous-domaine qui vous a été attribué.

Démarrage rapide

Un parcours complet en quatre appels : s'authentifier, trouver la ville de destination, créer la livraison, puis suivre le colis.

# 1) Obtenir un jeton (ou utiliser directement votre clé API permanente)
TOKEN=$(curl -s -X POST https://votre-espace.antera.app/api/login \
  -H "Content-Type: application/json" \
  -d '{ "email": "partenaire@exemple.com", "password": "••••••••" }' \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['token'])")

# 2) Trouver l'IRI de la ville de destination
curl -s "https://votre-espace.antera.app/api/cities?name=Ariana" \
  -H "Authorization: Bearer $TOKEN"
# -> { "member": [ { "@id": "/api/cities/22", "name": "Ariana Ville", ... } ] }

# 3) Créer la livraison
curl -s -X POST https://votre-espace.antera.app/api/deliveries \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "arrivalContactName": "Mariem Trabelsi",
    "arrivalContactPhone": "+216 22 333 444",
    "arrivalCity": "/api/cities/22",
    "dateTimeBegin": "2026-06-15T10:00:00+01:00"
  }'
# -> 201 { "trackingNumber": "ANT-20260615-000123", "status": "pending", ... }

# 4) Suivre le colis
curl -s https://votre-espace.antera.app/api/parcels/ANT-20260615-000123 \
  -H "Authorization: Bearer $TOKEN"
C'est tout Seuls quatre champs sont obligatoires pour créer une livraison. Tout le reste — numéro de suivi, espace, adresse d'expédition — est géré automatiquement (voir ci-dessous).

Créer une livraison

Crée une nouvelle livraison (colis) dans votre espace. La livraison est créée au statut pending ; un numéro de suivi unique et immuable est généré et renvoyé.

POST/api/deliveries
En-têtes requis Authorization: Bearer VOTRE_CLE_API et Content-Type: application/json. Les relations (ville, etc.) sont référencées par IRI, ex. /api/cities/22.

Champs obligatoires

ChampTypeDescription
arrivalContactName *stringNom du destinataire
arrivalContactPhone *stringTéléphone du destinataire (8 à 20 caractères, chiffres / + / espaces / -)
arrivalCity *IRIVille de destination, ex. /api/cities/45 (voir Référentiel villes)
dateTimeBegin *datetimeDate/heure souhaitée (ISO 8601), ex. 2026-06-02T10:00:00+01:00

Champs recommandés

ChampTypeDescription
arrivalAddressstringAdresse complète de livraison
arrivalLatitude / arrivalLongitudefloatCoordonnées GPS (améliorent l'optimisation de tournée)
designationstringDescription du contenu du colis
nombreArticlesintegerNombre d'articles (défaut 1)
poidsdecimalPoids en kg
montantdecimalMontant à encaisser à la livraison (COD)
modePaiementstringespece (défaut), cheque ou espece_ou_cheque
echangebooleanColis avec échange (reprise d'un article au destinataire). Défaut false
observationstringNote / consigne pour le livreur

Champs gérés automatiquement — à ne pas envoyer

Ces champs sont déterminés côté serveur ; toute valeur que vous enverriez serait ignorée ou écrasée :

ChampComment il est rempli
trackingNumberGénéré (format ANT-AAAAMMJJ-NNNNNN), immuable — conservez-le
statusInitialisé à pending
qrCodeGénéré automatiquement pour le colis
Espace (workspace) & expéditeurDéduits de votre clé API
Adresse / coordonnées de départHéritées de l'adresse de votre compte si non fournies

Exemple minimal (champs obligatoires uniquement)

curl -X POST https://votre-espace.antera.app/api/deliveries \
  -H "Authorization: Bearer VOTRE_CLE_API" \
  -H "Content-Type: application/json" \
  -d '{
    "arrivalContactName": "Mariem Trabelsi",
    "arrivalContactPhone": "+216 22 333 444",
    "arrivalCity": "/api/cities/22",
    "dateTimeBegin": "2026-06-15T10:00:00+01:00"
  }'

Exemple complet (avec encaissement COD)

curl -X POST https://votre-espace.antera.app/api/deliveries \
  -H "Authorization: Bearer VOTRE_CLE_API" \
  -H "Content-Type: application/json" \
  -d '{
    "arrivalContactName": "Mariem Trabelsi",
    "arrivalContactPhone": "+216 22 333 444",
    "arrivalAddress": "12 rue de Carthage, Ariana",
    "arrivalCity": "/api/cities/22",
    "arrivalLatitude": 36.8625,
    "arrivalLongitude": 10.1956,
    "dateTimeBegin": "2026-06-15T10:00:00+01:00",
    "designation": "Sneakers x1, T-shirt x2",
    "nombreArticles": 3,
    "poids": "1.500",
    "montant": "129.000",
    "modePaiement": "espece",
    "observation": "Appeler avant livraison"
  }'

Réponse — 201 Created

Avec Accept: application/json, les relations (ville…) sont renvoyées sous forme d'objets imbriqués :

{
  "id": 10245,
  "trackingNumber": "ANT-20260615-000123",
  "status": "pending",
  "qrCode": "uploads/qrcodes/parcel_ANT_20260615_000123.png",
  "dateTimeCreation": "2026-06-15T09:41:12+01:00",
  "dateTimeBegin": "2026-06-15T10:00:00+01:00",
  "arrivalContactName": "Mariem Trabelsi",
  "arrivalContactPhone": "+216 22 333 444",
  "arrivalCity": { "id": 22, "name": "Ariana Ville", "fullName": "Ariana Ville, Ariana" },
  "arrivalAddress": "12 rue de Carthage, Ariana",
  "montant": "129.000",
  "modePaiement": "espece",
  "nombreArticles": 3,
  "designation": "Sneakers x1, T-shirt x2"
}

Exemples de code

Création d'une livraison dans les langages les plus courants. Stockez la clé API hors du code (variable d'environnement) et conservez le trackingNumber renvoyé.

PHP (cURL)

<?php
$apiKey = getenv('ANTERA_API_KEY');

$ch = curl_init('https://votre-espace.antera.app/api/deliveries');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'arrivalContactName'  => 'Mariem Trabelsi',
        'arrivalContactPhone' => '+216 22 333 444',
        'arrivalCity'         => '/api/cities/22',
        'dateTimeBegin'       => '2026-06-15T10:00:00+01:00',
        'montant'             => '129.000',
    ]),
]);

$response = json_decode(curl_exec($ch), true);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode === 201) {
    echo 'Colis créé : ' . $response['trackingNumber'];
}

Python (requests)

import os, requests

resp = requests.post(
    "https://votre-espace.antera.app/api/deliveries",
    headers={"Authorization": f"Bearer {os.environ['ANTERA_API_KEY']}"},
    json={
        "arrivalContactName": "Mariem Trabelsi",
        "arrivalContactPhone": "+216 22 333 444",
        "arrivalCity": "/api/cities/22",
        "dateTimeBegin": "2026-06-15T10:00:00+01:00",
        "montant": "129.000",
    },
)
resp.raise_for_status()
print("Colis créé :", resp.json()["trackingNumber"])

Node.js (fetch)

const res = await fetch("https://votre-espace.antera.app/api/deliveries", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.ANTERA_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    arrivalContactName: "Mariem Trabelsi",
    arrivalContactPhone: "+216 22 333 444",
    arrivalCity: "/api/cities/22",
    dateTimeBegin: "2026-06-15T10:00:00+01:00",
    montant: "129.000",
  }),
});

if (!res.ok) throw new Error(`Antera API: HTTP ${res.status}`);
const data = await res.json();
console.log("Colis créé :", data.trackingNumber);

Suivre un colis

Récupère l'état courant d'un colis à partir de son numéro de suivi.

GET/api/parcels/{trackingNumber}
curl https://votre-espace.antera.app/api/parcels/ANT-20260602-000123 \
  -H "Authorization: Bearer VOTRE_CLE_API"

# Réponse
{
  "tracking_number": "ANT-20260615-000123",
  "id": 10245,
  "status": "in_progress",
  "derived_status": "out_for_delivery",
  "custody": { "type": "delivery_man", "description": "Chez le livreur" },
  "shipper": { "id": 7, "name": "Ma Boutique" },
  "recipient": { "name": "Mariem Trabelsi", "address": "12 rue de Carthage, Ariana", "phone": "+216 22 333 444" },
  "cod_amount": "129.000",
  "cod_collected": false,
  "designation": "Sneakers x1, T-shirt x2",
  "qr_code": "uploads/qrcodes/parcel_ANT_20260615_000123.png",
  "created_at": "2026-06-15T09:41:12+01:00"
}

Pour l'historique complet et horodaté des mouvements du colis :

GET/api/parcels/{trackingNumber}/timeline

Référentiel des villes

Le champ arrivalCity attend une référence (IRI) vers une ville du référentiel Antera. Recherchez la ville par son nom pour obtenir son identifiant, puis construisez l'IRI /api/cities/{id}.

GET/api/cities?name={recherche}
curl "https://votre-espace.antera.app/api/cities?name=Ariana" \
  -H "Authorization: Bearer VOTRE_CLE_API"

Filtres disponibles : name (recherche partielle), governorate (exact), postalCode (exact).

Astuce Chargez le référentiel une fois et mettez en cache la correspondance « nom de ville → identifiant » côté votre système.

Statuts de livraison

Le champ status d'une livraison évolue tout au long du cycle de vie du colis :

StatutSignification
pendingEn attente d'assignation
assignedAssignée à un livreur
picked_upColis ramassé
in_progressEn cours de livraison
completedLivrée avec succès
client_absentDestinataire absent
failedÉchec de livraison
pending_retryEn attente d'une nouvelle tentative
returnedRetournée à l'expéditeur

Codes de réponse

CodeSignificationQue faire
201Livraison crééeStockez le trackingNumber renvoyé
400Requête mal formée (JSON / IRI invalide)Corrigez la requête (pas de nouvelle tentative)
401Clé API absente ou invalideVérifiez l'en-tête Authorization
404Ressource introuvableVérifiez le numéro de suivi / l'identifiant
415Type de contenu non supportéAjoutez l'en-tête Content-Type: application/json
422Validation échouéeCorrigez les données (téléphone, ville…)
5xxErreur serveurRéessayez avec un délai progressif (backoff)

Les erreurs d'authentification renvoient un objet error :

{ "error": "Invalid credentials" }

Les erreurs de validation (422) détaillent chaque champ fautif dans violations :

{
  "status": 422,
  "violations": [
    {
      "propertyPath": "arrivalContactPhone",
      "message": "Le numéro de téléphone du destinataire est obligatoire"
    }
  ],
  "detail": "arrivalContactPhone: Le numéro de téléphone du destinataire est obligatoire",
  "title": "An error occurred"
}

Bonnes pratiques

  • Idempotence — conservez la correspondance entre votre référence de commande et le trackingNumber Antera afin de ne jamais créer deux fois la même livraison.
  • Reprises — réessayez uniquement sur les erreurs réseau ou 5xx, avec un délai progressif (backoff exponentiel).
  • Pagination — paginez systématiquement la lecture des collections volumineuses.
  • Sécurité — appels en HTTPS, clé stockée côté serveur, rotation régulière de la clé.
  • Journalisation — tracez chaque appel (référence commande ↔ trackingNumber) pour faciliter le support.

Documentation interactive

L'ensemble des ressources et schémas est exposé via une documentation interactive OpenAPI (Swagger), où vous pouvez explorer et tester les endpoints :

Ouvrir l'API interactive →

Support

Une question sur l'intégration ? Notre équipe technique vous accompagne.