API SRV-APPS — Référence complète
Base URL : http://192.168.1.17:8002/api
Accessible depuis le réseau interne uniquement.
Authentification
Les routes protégées requièrent un token Bearer :
Authorization: Bearer <EDI_ENGINE_API_TOKEN>
Défini dans /opt/medithau/api/.env → EDI_ENGINE_API_TOKEN.
Si la variable est vide, toutes les requêtes sont autorisées (réseau fermé).
Statut système
GET /health
Aucune authentification.
{
"status": "ok",
"version": "1.0",
"mode": "production",
"timestamp": "2026-06-10T07:00:00+02:00"
}
EDI Engine
Toutes les routes ci-dessous requièrent le token Bearer.
Deux préfixes équivalents :
/api/...— chemins courts (rétrocompatibilité)/api/edi-engine/...— recommandé pour les nouveaux appels
Fichiers en attente
GET /api/edi-engine/incoming
Liste les fichiers en attente dans incoming/.
[
{
"filename": "order_001.pdf",
"source": "pdf",
"size_bytes": 45210,
"mtime": "2026-06-10T08:30:00+02:00",
"error_excerpt": "2026-06-10 08:30 | ERROR | Fichier illisible"
}
]
error_excerpt : dernière ligne de log mentionnant ce fichier (null si aucune).
DELETE /api/edi-engine/incoming/{type}/{filename}
Supprime un fichier de la file d'attente.
Réponse 200 :
{ "deleted": true, "type": "pdf", "filename": "order_001.pdf" }
Erreurs : 400 type invalide, 404 introuvable.
Archives
GET /api/edi-engine/dates
Liste les dates ayant des archives ou des fichiers en quarantaine.
["20260610", "20260609", "20260608"]
GET /api/edi-engine/commands
Commandes traitées (archives + quarantaine) pour une date.
| Param | Type | Défaut | Description |
|---|---|---|---|
date | string | requis | Format YYYYMMDD |
page | int | 1 | |
per_page | int | 200 |
{
"page": 1,
"per_page": 200,
"total": 42,
"items": [
{
"filename": "order_001.json",
"source": "edi",
"origin": "carrefour",
"order_number": "CMD-12345",
"client": "CARREFOUR VAUVERT",
"order_date": "2026-06-10",
"delivery_date": "2026-06-12",
"status": "OK",
"warnings": [],
"edi_exists": true,
"source_file": "order_001.pdf",
"pdf_url": "/api/edi-engine/pdfs/20260610/order_001.pdf",
"edi_url": "/api/edi-engine/edis/20260610/CMD-12345.edi",
"metadata_url": "/api/edi-engine/commands/order_001.json?date=20260610",
"quarantined": false
}
]
}
status : OK | WARNING | QUARANTINE
GET /api/edi-engine/commands/{filename}
Détail complet d'une commande (contenu JSON du fichier archivé).
| Param | Type | Description |
|---|---|---|
date | string | Requis. Format YYYYMMDD |
GET /api/edi-engine/pdfs/{date}/{filename}
Sert le PDF source. Réponse : application/pdf.
GET /api/edi-engine/edis/{date}/{filename}
Sert le fichier EDI généré. Réponse : text/plain.
Quarantaine
GET /api/edi-engine/quarantine
Fichiers en quarantaine pour une date.
| Param | Type | Description |
|---|---|---|
date | string | Requis |
[
{
"filename": "order_002.json",
"source": "edi",
"size_bytes": 1240,
"mtime": "2026-06-10T09:00:00+02:00",
"type": "json",
"url": "/api/edi-engine/quarantine/20260610/edi/order_002.json",
"order_number": "CMD-99999",
"client": "CLIENT INCONNU",
"warnings": ["GLN non trouvé : 3012345678901"]
}
]
GET /api/edi-engine/quarantine/{date}/{source}/{filename}
Sert un fichier de quarantaine (PDF, JSON ou texte).
Erreurs
GET /api/edi-engine/errors
Lignes ERROR/ERREUR du log pour une date.
| Param | Type | Description |
|---|---|---|
date | string | Requis |
[
{
"filename": "order_003.pdf",
"message": "2026-06-10 10:15:32 | ERROR | Impossible de lire le fichier",
"ts": "2026-06-10 10:15:32"
}
]
Logs
GET /api/edi-engine/logs
Dernières entrées du log EDI Engine.
| Param | Type | Défaut | Description |
|---|---|---|---|
date | string | requis | Format YYYYMMDD |
tail | int | 200 | Nb de lignes |
[
{ "ts": "2026-06-10 08:30:00", "level": "INFO", "message": "Traitement de order_001.pdf" },
{ "ts": "2026-06-10 08:30:05", "level": "ERROR", "message": "GLN non trouvé" }
]
level : INFO | WARNING | ERROR
GET /api/edi-engine/logs/{date}/raw
Log brut en téléchargement (Content-Disposition: attachment).
Jobs (retraitement)
POST /api/edi-engine/commands/{date}/{filename}/reprocess
Lance le retraitement d'une commande archivée.
Réponse 202 :
{ "job_id": "019eabcd-..." }
POST /api/edi-engine/commands/{date}/{filename}/force-integration
Force l'intégration d'une commande (bypasse les vérifications).
Body requis :
{ "user": "prenom.nom" }
Réponse 202 :
{
"job_id": "019eabcd-...",
"type": "force-integration",
"date": "20260610",
"filename": "order_001.json",
"params": { "user": "prenom.nom" },
"status": "pending",
"requested_by": { "ip": "192.168.1.27", "user_agent": "..." },
"requested_at": "2026-06-10T08:30:00+02:00",
"started_at": null,
"finished_at": null,
"result": null
}
GET /api/edi-engine/jobs/{jobId}
Suivi d'un job de retraitement.
status : pending | running | done | failed
Même structure que force-integration ci-dessus.
Configuration
GET /api/edi-engine/config/crons
Contenu de crons.json (planification des scripts EDI).
PUT /api/edi-engine/config/crons
Met à jour crons.json.
Body : nouvel objet complet.
{ "status": "ok", "message": "crons.json mis à jour." }
GET /api/edi-engine/config/gln
Table de correspondance GLN → clients.
PUT /api/edi-engine/config/gln
Met à jour la table GLN.
GET /api/edi-engine/config/env
Variables d'environnement de l'EDI Engine.
Les clés contenant PASSWORD, TOKEN, PASS, SECRET, KEY sont masquées en ***.
{
"ERP_SSH_IP": "192.168.1.13",
"ERP_SSH_PORT": "34322",
"ERP_SSH_USER": "edi",
"CRF_USER": "mon_user",
"CRF_PASSWORD": "***"
}
PUT /api/edi-engine/config/env
Met à jour des variables d'environnement (hors clés secrètes).
Erreur 403 si une clé secrète est incluse.
Web-Orders
Webhooks WooCommerce
Sans authentification Bearer. Sécurité par token dans le corps XML et vérification User-Agent.
POST /api/web-orders/webhook/main
Reçoit une commande de la boutique principale.
Body : XML WooCommerce brut.
<?xml version="1.0" encoding="UTF-8"?>
<Orders>
<Order>
<token>xxxx</token>
<NumCommandeweb>67489</NumCommandeweb>
<datecommande>2026-06-10 09:00</datecommande>
...
</Order>
</Orders>
Réponse 202 :
{
"status": "received",
"id": "019eabcd-...",
"filename": "order_20260610_090000_abc12345.xml"
}
Erreurs : 400 XML invalide ou vide, 403 token invalide ou User-Agent non autorisé.
POST /api/web-orders/webhook/ostrealia
Identique à webhook/main pour la boutique Ostrealia.
Gestion (Bearer token requis)
GET /api/web-orders
100 dernières commandes web. Filtrables par ?source=main|ostrealia et ?status=.
[
{
"id": "019eabcd-...",
"source": "main",
"filename": "order_20260610_090000_abc12345.xml",
"status": "transferred",
"error": null,
"received_at": "2026-06-10T09:00:00.000000Z",
"transferred_at": "2026-06-10T09:00:01.000000Z",
"order_number": "67489",
"order_date": "2026-06-10 09:00",
"delivery_date": "2026-06-10",
"delivery_type": "pickup",
"shipping_method": "Retrait au Mas",
"client": "Nicolas Lapeyre",
"company": "Medithau frontignan",
"total": 5.60,
"lines_count": 2
}
]
status : received | transferring | transferred | failed
GET /api/web-orders/{id}
Détail complet avec parsed_data (sans le XML brut).
{
"id": "019eabcd-...",
"parsed_data": {
"order_number": "67489",
"billing": { "last_name": "Lapeyre", "first_name": "Nicolas", ... },
"shipping": { ... },
"lines": [
{ "reference": "MITSV1,4unit", "name": "Moules d'Italie", "qty": 2, "unit_price": 2.65, "line_total": 5.30 }
],
"totals": { "shipping": 0.0, "refund": 0.0, "total": 5.60 },
"coupons": []
}
}
POST /api/web-orders/{id}/retry
Relance le transfert d'une commande failed.
Réponse 200 :
{ "status": "queued", "id": "019eabcd-..." }
Erreur 409 si la commande n'est pas en statut failed.
Codes HTTP
| Code | Signification |
|---|---|
200 | Succès |
202 | Accepté (job ou commande en file) |
400 | Paramètre manquant ou invalide |
401 | Token Bearer absent ou incorrect |
403 | Action interdite (clé secrète, token XML invalide, User-Agent) |
404 | Ressource introuvable |
409 | Conflit d'état (ex. retry sur commande non failed) |
Notes d'intégration
- Toutes les réponses sont
application/jsonsauf les endpoints fichiers (PDF, EDI, log brut). - Les dates en réponse sont en ISO 8601 UTC (
2026-06-10T09:00:00.000000Z). - Les IDs des commandes web sont des UUID v7.
- Pas de pagination pour
/api/web-orders(limite fixe 100) — filtrer parsourceetstatus. - Pour les jobs de retraitement : polling sur
GET /api/edi-engine/jobs/{jobId}jusqu'àstatus: doneoufailed.