đŸ« Cacaomatic API du pseudo-ERP · TP R5.MTD.14

Documentation de l'API

Générée à partir de openapi.yaml : toujours à jour avec l'API. Pour tester un appel, utilisez l'onglet « Essayer un appel » de l'espace équipe.

Authentification et rĂšgles

Adresse de base : https://cacaomatic.alt4b.fr/api

API du pseudo-ERP fictif de Cacaomatic, une entreprise qui fabrique du chocolat. Elle sert de support aux TP d'interopérabilité (n8n, Postman, curl
). Toutes les données sont fictives.

Authentification : une clĂ© d'API par Ă©quipe, dans l'en-tĂȘte Authorization: Bearer <clĂ©>. Les donnĂ©es de chaque Ă©quipe sont isolĂ©es.

Limite : 120 requĂȘtes par minute et par clĂ© (rĂ©ponse 429).

Erreurs : toutes les erreurs ont le mĂȘme format {"erreur": "code_machine", "message": "
", "details": {
}}.

QuantitĂ©s : le stock, les rĂ©servations et les ordres de fabrication sont exprimĂ©s en unitĂ©s. Une commande peut ĂȘtre passĂ©e en carton : un carton contient N unitĂ©s selon l'article.

Les exemples curl ci-dessous se tapent dans un terminal (pas dans le navigateur). Ils montrent les informations Ă  reporter dans n8n ou Postman : mĂ©thode, adresse, en-tĂȘtes et corps JSON. Pour essayer un appel depuis le navigateur, utilisez l'onglet « Essayer un appel » de l'espace Ă©quipe.

Dans n8n : nƓud HTTP Request → Authentication « Generic Credential Type » → Header Auth, nom Authorization, valeur Bearer <votre clĂ©>. Pour un corps JSON : Send Body → JSON.

Format des erreurs

Codes HTTP utilisés : 401, 404, 409, 422, 429, 503. Le corps est toujours :

{"erreur": "stock_insuffisant", "message": "texte en français", "details": {}}

Public

GET /api/ping sans clé
Vérifier que l'API répond

Réponses

200
L'API répond.
Exemple
{
    "statut": "ok",
    "service": "cacaomatic-api",
    "heure": "2026-10-24T09:00:00+00:00"
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/ping

Commandes

GET /api/commandes
Lister les commandes de l'équipe

ParamĂštres

NomOĂčTypeDescription
reference_client requĂȘtestring Ne renvoie que les commandes ayant cette rĂ©fĂ©rence client (liste vide si aucune).

Réponses

200
Liste des commandes.
Exemple
{
    "donnees": [
        {
            "id": 1,
            "reference_client": "texte",
            "client": "texte",
            "date_livraison_souhaitee": "2026-12-01",
            "statut": "recue",
            "cree_le": "2026-10-24T09:00:00+00:00",
            "lignes": [
                {
                    "code_article": "texte",
                    "quantite": 1,
                    "unite": "unite",
                    "quantite_unites": 1
                }
            ]
        }
    ]
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "ClĂ© d'API manquante : ajoutez l'en-tĂȘte « Authorization: Bearer <clĂ©> ».",
    "details": []
}
429
Limite de 120 requĂȘtes par minute dĂ©passĂ©e. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
503
Panne simulĂ©e en cours pour votre Ă©quipe. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/commandes \
  -H "Authorization: Bearer <votre clé>"
POST /api/commandes
Enregistrer une commande client

Corps JSON

ChampTypeDescription
reference_clientobligatoire stringUnique par équipe.
clientobligatoire string
date_livraison_souhaitee string(peut ĂȘtre nul)
lignes[]obligatoire liste d'objets
lignes[].code_articleobligatoire string
lignes[].quantiteobligatoire integer(min 1)
lignes[].uniteobligatoire string(valeurs : unite, carton)
{
    "reference_client": "CMD-2026-001",
    "client": "Épicerie Fictive du Port",
    "date_livraison_souhaitee": "2026-12-01",
    "lignes": [
        {
            "code_article": "TAB-001",
            "quantite": 5,
            "unite": "carton"
        },
        {
            "code_article": "TAB-002",
            "quantite": 10,
            "unite": "unite"
        }
    ]
}

Réponses

201
Commande enregistrée.
Exemple
{
    "id": 1,
    "reference_client": "texte",
    "client": "texte",
    "date_livraison_souhaitee": "2026-12-01",
    "statut": "recue",
    "cree_le": "2026-10-24T09:00:00+00:00",
    "lignes": [
        {
            "code_article": "texte",
            "quantite": 1,
            "unite": "unite",
            "quantite_unites": 1
        }
    ]
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "ClĂ© d'API manquante : ajoutez l'en-tĂȘte « Authorization: Bearer <clĂ©> ».",
    "details": []
}
409
Une commande avec cette reference_client existe déjà pour votre équipe.
Exemple
{
    "erreur": "commande_existante",
    "message": "Une commande avec la référence client « CMD-2026-001 » existe déjà.",
    "details": {
        "reference_client": "CMD-2026-001"
    }
}
422
Données invalides (champ manquant, quantité non entiÚre ou < 1, code article inconnu
).
Exemple
{
    "erreur": "validation_echouee",
    "message": "Les données envoyées sont invalides.",
    "details": {
        "champs": {
            "lignes.0.quantite": [
                "Le champ lignes.0.quantite doit ĂȘtre supĂ©rieur ou Ă©gal Ă  1."
            ]
        }
    }
}
429
Limite de 120 requĂȘtes par minute dĂ©passĂ©e. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
503
Panne simulĂ©e en cours pour votre Ă©quipe. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl -X POST https://cacaomatic.alt4b.fr/api/commandes \
  -H "Authorization: Bearer <votre clé>" \
  -H "Content-Type: application/json" \
  -d '{"reference_client":"CMD-2026-001","client":"Épicerie Fictive du Port","date_livraison_souhaitee":"2026-12-01","lignes":[{"code_article":"TAB-001","quantite":5,"unite":"carton"},{"code_article":"TAB-002","quantite":10,"unite":"unite"}]}'
GET /api/commandes/{id}
Consulter une commande

ParamĂštres

NomOĂčTypeDescription
idobligatoire chemininteger

Réponses

200
La commande.
Exemple
{
    "id": 1,
    "reference_client": "texte",
    "client": "texte",
    "date_livraison_souhaitee": "2026-12-01",
    "statut": "recue",
    "cree_le": "2026-10-24T09:00:00+00:00",
    "lignes": [
        {
            "code_article": "texte",
            "quantite": 1,
            "unite": "unite",
            "quantite_unites": 1
        }
    ]
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "ClĂ© d'API manquante : ajoutez l'en-tĂȘte « Authorization: Bearer <clĂ©> ».",
    "details": []
}
404
Commande introuvable (ou appartenant à une autre équipe).
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
429
Limite de 120 requĂȘtes par minute dĂ©passĂ©e. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
503
Panne simulĂ©e en cours pour votre Ă©quipe. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/commandes/<id> \
  -H "Authorization: Bearer <votre clé>"

Stocks

GET /api/stocks/{code_article}
Consulter le stock d'un article (en unités)

ParamĂštres

NomOĂčTypeDescription
code_articleobligatoire cheminstring Exemple : TAB-001

Réponses

200
Stock de l'article. disponible = stock_unites − reserve.
Exemple
{
    "code_article": "TAB-001",
    "stock_unites": 400,
    "reserve": 0,
    "disponible": 400
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "ClĂ© d'API manquante : ajoutez l'en-tĂȘte « Authorization: Bearer <clĂ©> ».",
    "details": []
}
404
Code article inconnu.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
429
Limite de 120 requĂȘtes par minute dĂ©passĂ©e. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
503
Panne simulĂ©e en cours pour votre Ă©quipe. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/stocks/<code_article> \
  -H "Authorization: Bearer <votre clé>"

Réservations

POST /api/reservations
Réserver du stock (tout ou rien)

Les quantités sont en unités. Une réservation est acceptée si, pour chaque article, la quantité demandée est inférieure ou égale au disponible (égalité acceptée). Si une ligne est insuffisante, aucune ligne n'est réservée (409).

Corps JSON

ChampTypeDescription
reference_commandeobligatoire string
lignes[]obligatoire liste d'objets
lignes[].code_articleobligatoire string
lignes[].quantiteobligatoire integerEn unités. (min 1)
{
    "reference_commande": "CMD-2026-001",
    "lignes": [
        {
            "code_article": "TAB-001",
            "quantite": 100
        }
    ]
}

Réponses

201
Réservation enregistrée.
Exemple
{
    "id": 1,
    "reference_commande": "texte",
    "cree_le": "2026-10-24T09:00:00+00:00",
    "lignes": [
        {
            "code_article": "texte",
            "quantite": 1
        }
    ]
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "ClĂ© d'API manquante : ajoutez l'en-tĂȘte « Authorization: Bearer <clĂ©> ».",
    "details": []
}
409
Stock insuffisant ; details.lignes donne le détail par ligne.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "Stock insuffisant : aucune réservation n'a été enregistrée.",
    "details": {
        "lignes": [
            {
                "code_article": "TAB-001",
                "demande": 10,
                "disponible": 400,
                "suffisant": true
            },
            {
                "code_article": "TAB-004",
                "demande": 61,
                "disponible": 60,
                "suffisant": false
            }
        ]
    }
}
422
Données invalides (champ manquant, quantité non entiÚre ou < 1, code article inconnu
).
Exemple
{
    "erreur": "validation_echouee",
    "message": "Les données envoyées sont invalides.",
    "details": {
        "champs": {
            "lignes.0.quantite": [
                "Le champ lignes.0.quantite doit ĂȘtre supĂ©rieur ou Ă©gal Ă  1."
            ]
        }
    }
}
429
Limite de 120 requĂȘtes par minute dĂ©passĂ©e. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
503
Panne simulĂ©e en cours pour votre Ă©quipe. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl -X POST https://cacaomatic.alt4b.fr/api/reservations \
  -H "Authorization: Bearer <votre clé>" \
  -H "Content-Type: application/json" \
  -d '{"reference_commande":"CMD-2026-001","lignes":[{"code_article":"TAB-001","quantite":100}]}'

Fabrication

POST /api/ordres-fabrication
Créer un ordre de fabrication

Corps JSON

ChampTypeDescription
code_articleobligatoire string
quantiteobligatoire integer(min 1)
reference_commandeobligatoire string
{
    "code_article": "CAL-001",
    "quantite": 120,
    "reference_commande": "CMD-2026-001"
}

Réponses

201
Ordre de fabrication créé.
Exemple
{
    "id": 1,
    "code_article": "texte",
    "quantite": 1,
    "reference_commande": "texte",
    "statut": "planifie",
    "cree_le": "2026-10-24T09:00:00+00:00"
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "ClĂ© d'API manquante : ajoutez l'en-tĂȘte « Authorization: Bearer <clĂ©> ».",
    "details": []
}
422
Données invalides (champ manquant, quantité non entiÚre ou < 1, code article inconnu
).
Exemple
{
    "erreur": "validation_echouee",
    "message": "Les données envoyées sont invalides.",
    "details": {
        "champs": {
            "lignes.0.quantite": [
                "Le champ lignes.0.quantite doit ĂȘtre supĂ©rieur ou Ă©gal Ă  1."
            ]
        }
    }
}
429
Limite de 120 requĂȘtes par minute dĂ©passĂ©e. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
503
Panne simulĂ©e en cours pour votre Ă©quipe. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl -X POST https://cacaomatic.alt4b.fr/api/ordres-fabrication \
  -H "Authorization: Bearer <votre clé>" \
  -H "Content-Type: application/json" \
  -d '{"code_article":"CAL-001","quantite":120,"reference_commande":"CMD-2026-001"}'

Notifications

GET /api/notifications
Lister les notifications de l'équipe

Réponses

200
Notifications, de la plus ancienne à la plus récente.
Exemple
{
    "donnees": [
        {
            "id": 1,
            "destinataire": "adv",
            "sujet": "texte",
            "message": "texte",
            "cree_le": "2026-10-24T09:00:00+00:00"
        }
    ]
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "ClĂ© d'API manquante : ajoutez l'en-tĂȘte « Authorization: Bearer <clĂ©> ».",
    "details": []
}
429
Limite de 120 requĂȘtes par minute dĂ©passĂ©e. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
503
Panne simulĂ©e en cours pour votre Ă©quipe. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/notifications \
  -H "Authorization: Bearer <votre clé>"
POST /api/notifications
Envoyer une notification

Aucun e-mail n'est envoyé : les notifications sont consultables avec GET /notifications.

Corps JSON

ChampTypeDescription
destinataireobligatoire string(valeurs : adv, production, client)
sujetobligatoire string(longueur max 200)
messageobligatoire string(longueur max 2000)
{
    "destinataire": "adv",
    "sujet": "texte",
    "message": "texte"
}

Réponses

201
Notification enregistrée.
Exemple
{
    "id": 1,
    "destinataire": "adv",
    "sujet": "texte",
    "message": "texte",
    "cree_le": "2026-10-24T09:00:00+00:00"
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "ClĂ© d'API manquante : ajoutez l'en-tĂȘte « Authorization: Bearer <clĂ©> ».",
    "details": []
}
422
Données invalides (champ manquant, quantité non entiÚre ou < 1, code article inconnu
).
Exemple
{
    "erreur": "validation_echouee",
    "message": "Les données envoyées sont invalides.",
    "details": {
        "champs": {
            "lignes.0.quantite": [
                "Le champ lignes.0.quantite doit ĂȘtre supĂ©rieur ou Ă©gal Ă  1."
            ]
        }
    }
}
429
Limite de 120 requĂȘtes par minute dĂ©passĂ©e. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
503
Panne simulĂ©e en cours pour votre Ă©quipe. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl -X POST https://cacaomatic.alt4b.fr/api/notifications \
  -H "Authorization: Bearer <votre clé>" \
  -H "Content-Type: application/json" \
  -d '{"destinataire":"adv","sujet":"texte","message":"texte"}'

Boutique

Boutique en ligne fictive : le systÚme source qui reçoit les commandes des clients, dans son propre format (sku, cartons ou piÚces, dates jj/mm/aaaa). Votre workflow lit ces commandes, les traduit pour l'ERP (commandes, réservations, fabrication), puis renvoie à la boutique le résultat avec POST /boutique/commandes/{id}/statut.

Les commandes sont publiées au fil du temps : relisez réguliÚrement la liste (a_venir indique combien restent à venir). La boutique n'est pas touchée par la panne simulée de l'ERP.

GET /api/boutique/commandes
Lister les commandes publiées par la boutique

Commandes dĂ©jĂ  publiĂ©es pour votre Ă©quipe, de la plus ancienne Ă  la plus rĂ©cente. Une commande renvoyĂ©e par la boutique (doublon) porte le mĂȘme id_commande_web mais un id diffĂ©rent. Le sku n'est pas le code article de l'ERP : utilisez la table de correspondance donnĂ©e dans le sujet du TP.

ParamĂštres

NomOĂčTypeDescription
statut requĂȘtestring Ne renvoie que les commandes ayant ce statut (nouvelle = pas encore traitĂ©e). Exemple : nouvelle

Réponses

200
Commandes publiées et nombre de commandes encore à venir.
Exemple
{
    "donnees": [
        {
            "id": 1,
            "id_commande_web": "WEB-2026-0001",
            "passee_le": "24/10/2026 09:12",
            "client": {
                "nom": "Épicerie Fictive du Port",
                "email": "achats@epicerie-port.example"
            },
            "livraison_souhaitee": "15/12/2026",
            "articles": [
                {
                    "sku": "CHOC-LAIT-100",
                    "designation": "Tablette Lait Onctueux",
                    "quantite": 2,
                    "conditionnement": "carton"
                }
            ],
            "statut": "nouvelle",
            "reference_erp": "texte",
            "motif": "texte"
        }
    ],
    "a_venir": 5
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "ClĂ© d'API manquante : ajoutez l'en-tĂȘte « Authorization: Bearer <clĂ©> ».",
    "details": []
}
422
Données invalides (champ manquant, quantité non entiÚre ou < 1, code article inconnu
).
Exemple
{
    "erreur": "validation_echouee",
    "message": "Les données envoyées sont invalides.",
    "details": {
        "champs": {
            "lignes.0.quantite": [
                "Le champ lignes.0.quantite doit ĂȘtre supĂ©rieur ou Ă©gal Ă  1."
            ]
        }
    }
}
429
Limite de 120 requĂȘtes par minute dĂ©passĂ©e. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/boutique/commandes \
  -H "Authorization: Bearer <votre clé>"
GET /api/boutique/commandes/{id}
Consulter une commande de la boutique

ParamĂštres

NomOĂčTypeDescription
idobligatoire chemininteger Identifiant technique (id)

Réponses

200
La commande.
Exemple
{
    "id": 1,
    "id_commande_web": "WEB-2026-0001",
    "passee_le": "24/10/2026 09:12",
    "client": {
        "nom": "Épicerie Fictive du Port",
        "email": "achats@epicerie-port.example"
    },
    "livraison_souhaitee": "15/12/2026",
    "articles": [
        {
            "sku": "CHOC-LAIT-100",
            "designation": "Tablette Lait Onctueux",
            "quantite": 2,
            "conditionnement": "carton"
        }
    ],
    "statut": "nouvelle",
    "reference_erp": "texte",
    "motif": "texte"
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "ClĂ© d'API manquante : ajoutez l'en-tĂȘte « Authorization: Bearer <clĂ©> ».",
    "details": []
}
404
Commande inconnue ou pas encore publiée.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
429
Limite de 120 requĂȘtes par minute dĂ©passĂ©e. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/boutique/commandes/<id> \
  -H "Authorization: Bearer <votre clé>"
POST /api/boutique/commandes/{id}/statut
Renvoyer à la boutique le résultat du traitement

Peut ĂȘtre rappelĂ© : le dernier statut remplace le prĂ©cĂ©dent.

ParamĂštres

NomOĂčTypeDescription
idobligatoire chemininteger Identifiant technique (id). Exemple : 1

Corps JSON

ChampTypeDescription
statutobligatoire string(valeurs : acceptee, refusee, en_attente_fabrication)
reference_erp stringRéférence de la commande cÎté ERP (facultatif). (longueur max 100)
motif stringExplication, notamment pour un refus (facultatif). (longueur max 500)
{
    "statut": "acceptee",
    "reference_erp": "WEB-2026-0001"
}

Réponses

200
Commande mise Ă  jour.
Exemple
{
    "id": 1,
    "id_commande_web": "WEB-2026-0001",
    "passee_le": "24/10/2026 09:12",
    "client": {
        "nom": "Épicerie Fictive du Port",
        "email": "achats@epicerie-port.example"
    },
    "livraison_souhaitee": "15/12/2026",
    "articles": [
        {
            "sku": "CHOC-LAIT-100",
            "designation": "Tablette Lait Onctueux",
            "quantite": 2,
            "conditionnement": "carton"
        }
    ],
    "statut": "nouvelle",
    "reference_erp": "texte",
    "motif": "texte"
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "ClĂ© d'API manquante : ajoutez l'en-tĂȘte « Authorization: Bearer <clĂ©> ».",
    "details": []
}
404
Commande inconnue ou pas encore publiée.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
422
Données invalides (champ manquant, quantité non entiÚre ou < 1, code article inconnu
).
Exemple
{
    "erreur": "validation_echouee",
    "message": "Les données envoyées sont invalides.",
    "details": {
        "champs": {
            "lignes.0.quantite": [
                "Le champ lignes.0.quantite doit ĂȘtre supĂ©rieur ou Ă©gal Ă  1."
            ]
        }
    }
}
429
Limite de 120 requĂȘtes par minute dĂ©passĂ©e. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl -X POST https://cacaomatic.alt4b.fr/api/boutique/commandes/<id>/statut \
  -H "Authorization: Bearer <votre clé>" \
  -H "Content-Type: application/json" \
  -d '{"statut":"acceptee","reference_erp":"WEB-2026-0001"}'

Panne simulée

Panne propre à votre équipe. Tant qu'elle est active, tous vos autres appels répondent 503 avec Retry-After.

GET /api/panne
État de la panne

Réponses

200
État courant.
Exemple
{
    "active": true,
    "fin": "2026-10-24T09:00:00+00:00",
    "secondes_restantes": 1
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "ClĂ© d'API manquante : ajoutez l'en-tĂȘte « Authorization: Bearer <clĂ©> ».",
    "details": []
}
429
Limite de 120 requĂȘtes par minute dĂ©passĂ©e. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/panne \
  -H "Authorization: Bearer <votre clé>"
POST /api/panne
Déclencher une panne de votre ERP

Corps JSON (facultatif)

ChampTypeDescription
duree_secondes integer(min 1 ; max 600 ; défaut 120)
{
    "duree_secondes": 1
}

Réponses

201
Panne démarrée.
Exemple
{
    "active": true,
    "fin": "2026-10-24T09:00:00+00:00",
    "secondes_restantes": 1
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "ClĂ© d'API manquante : ajoutez l'en-tĂȘte « Authorization: Bearer <clĂ©> ».",
    "details": []
}
422
Données invalides (champ manquant, quantité non entiÚre ou < 1, code article inconnu
).
Exemple
{
    "erreur": "validation_echouee",
    "message": "Les données envoyées sont invalides.",
    "details": {
        "champs": {
            "lignes.0.quantite": [
                "Le champ lignes.0.quantite doit ĂȘtre supĂ©rieur ou Ă©gal Ă  1."
            ]
        }
    }
}
429
Limite de 120 requĂȘtes par minute dĂ©passĂ©e. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl -X POST https://cacaomatic.alt4b.fr/api/panne \
  -H "Authorization: Bearer <votre clé>" \
  -H "Content-Type: application/json" \
  -d '{"duree_secondes":1}'
DELETE /api/panne
ArrĂȘter la panne

Réponses

200
Panne arrĂȘtĂ©e.
Exemple
{
    "active": true,
    "fin": "2026-10-24T09:00:00+00:00",
    "secondes_restantes": 1
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "ClĂ© d'API manquante : ajoutez l'en-tĂȘte « Authorization: Bearer <clĂ©> ».",
    "details": []
}
429
Limite de 120 requĂȘtes par minute dĂ©passĂ©e. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl -X DELETE https://cacaomatic.alt4b.fr/api/panne \
  -H "Authorization: Bearer <votre clé>"

Enseignant

Réservé à la clé enseignant.

GET /api/admin/equipes
Lister les équipes

Réponses

200
Équipes et compteurs d'activitĂ©.
Exemple
{
    "donnees": [
        {
            "code": "texte",
            "nom": "texte",
            "session": {
                "promotion": "texte",
                "annee": 1,
                "groupe": "texte"
            },
            "scenario": "texte",
            "panne_active": true,
            "panne_fin": "2026-10-24T09:00:00+00:00",
            "commandes": 1,
            "reservations": 1,
            "ordres_fabrication": 1,
            "notifications": 1,
            "appels": 1
        }
    ]
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "ClĂ© d'API manquante : ajoutez l'en-tĂȘte « Authorization: Bearer <clĂ©> ».",
    "details": []
}
429
Limite de 120 requĂȘtes par minute dĂ©passĂ©e. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl https://cacaomatic.alt4b.fr/api/admin/equipes \
  -H "Authorization: Bearer <votre clé>"
POST /api/admin/equipes/{code}/reinitialiser
Remettre une équipe à l'état initial

Remet les stocks, commandes, réservations, ordres de fabrication, notifications, journal et panne de l'équipe à l'état initial.

ParamĂštres

NomOĂčTypeDescription
codeobligatoire cheminstring Exemple : A

Réponses

200
Équipe rĂ©initialisĂ©e.
Exemple
{
    "code": "A",
    "message": "L'équipe A a été réinitialisée."
}
401
Clé d'API absente, invalide ou sans droit sur cette route.
Exemple
{
    "erreur": "non_authentifie",
    "message": "ClĂ© d'API manquante : ajoutez l'en-tĂȘte « Authorization: Bearer <clĂ©> ».",
    "details": []
}
404
Équipe inconnue.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
429
Limite de 120 requĂȘtes par minute dĂ©passĂ©e. Voir l'en-tĂȘte Retry-After.
Exemple
{
    "erreur": "stock_insuffisant",
    "message": "texte",
    "details": {}
}
Exemple curl
curl -X POST https://cacaomatic.alt4b.fr/api/admin/equipes/<code>/reinitialiser \
  -H "Authorization: Bearer <votre clé>"