Aller au contenu principal

Événements webhook Roasthubs

Les webhooks sortants envoient un POST JSON vers l'URL configurée lorsqu'un événement correspondant se produit.

Configurez sous System → Webhooks (un webhook par type d'événement).

Comment utiliser ceci dans Notion

  1. Importez ce fichier via Notion → Import → Markdown, ou collez le contenu dans une nouvelle page.
  2. Transformez chaque titre de groupe (Lots, Sales, …) en titre Toggle si vous voulez un document repliable.
  3. Transformez éventuellement la section résumé en base de données Notion (une ligne par groupe).

Résumé — ce qui se déclenche où

Chaque webhook utilise la même enveloppe. Le contenu spécifique à l'événement est toujours dans data. Utilisez l'id de premier niveau comme clé d'idempotence.

Lots

  • Où : Création/mise à jour de lot, évaluation QC, traitement torréfaction
  • Événements : lot_create, lot_update, lot_delete, lot_target_pass, lot_target_fail, lot_qc_pass, lot_qc_fail
  • Données typiques : Enregistrement de lot, ou résultat cible / QC

Productions

  • Où : API de planification de production
  • Événements : production_create, production_update, production_delete
  • Données typiques : Enregistrement de production

Recipes

  • Où : CRUD recettes + échange de composants en masse
  • Événements : recipe_create, recipe_update, recipe_delete, bulk_exchange_recipe_component
  • Données typiques : Enregistrement de recette, ou corps de requête d'échange

Sales

  • Où : API ventes / lignes de vente + processeur de lots torréfiés
  • Événements : sale_create, sale_update, sale_lines_create, sale_lines_update
  • Données typiques : Enregistrement de vente ou de ligne de vente

Products

  • Où : API produits
  • Événements : product_create, product_update, product_process_stage_create, product_process_stage_update
  • Données typiques : Champs produit, ou { product_id, recipe_id, recipe_name }

Contrats et call-offs

  • Où : APIs achats / contrats + cron / mises à jour de poids de lot
  • Événements : contracts_create, contracts_update, contracts_call_offs_*, contracts_call_offs_lines_*
  • Données typiques : Enregistrement de contrat, call-off ou ligne

Sites

  • Où : API sites
  • Événements : site_create, site_update
  • Données typiques : Enregistrement de site

Targets

  • Où : API cibles laboratoire
  • Événements : target_create, target_update, target_delete
  • Données typiques : Enregistrement de cible

Returns

  • Où : API retours
  • Événements : return_create, return_update, return_add_lot, return_remove_lot
  • Données typiques : Enregistrement de retour, ou charge utile d'ajout/retrait de lot

Containers

  • Où : API conteneurs + helpers OPC
  • Événements : container_create, container_update, container_delete, container_history_added, plus variantes seedées
  • Données typiques : { container } ou entrées d'historique

Integrations

  • Où : API intégrations
  • Événements : integration_create, integration_update, integration_delete
  • Données typiques : Enregistrement d'intégration

Contrôle usine

  • Où : OPC-UA / UI usine (dosage, dump, inventaire, balances)
  • Événements : Dump, inventaire, skip/annulation/résolution de dosage, correction de poids de cellule, validation de balance, mode/contrôle
  • Données typiques : Paquets spécifiques à l'action ou charges utiles cellule/dump

Nœuds d'usine

  • Où : API de mise à jour des nœuds d'usine
  • Événements : plant_node_update
  • Données typiques : Enregistrement de nœud d'usine

System

  • Où : Auth / commentaires
  • Événements : user_log_in, user_log_out, user_comment
  • Données typiques : Texte de commentaire, ou charge utile de connexion minimale

Remarque : Les groupes de type CRUD ci-dessus sont activement émis depuis le code de l'application. Plusieurs événements de contrôle usine et d'auth (user_log_in / user_log_out, manual_mode_*, tag_update, production_plan_*, …) sont sélectionnables dans l'UI Webhooks mais peuvent ne pas se déclencher tant que ce chemin ne les émet pas.


Livraison

ComportementDétail
MéthodePOST
Content-Typeapplication/json
Nouvelles tentatives0–10, backoff exponentiel (2^attempt × 1000 ms)
Idempotenceid de premier niveau

Enveloppe commune

{
"id": 12345,
"type_id": "lot_create",
"user_id": 1,
"resource_id": 42,
"resource_name": "lots",
"plant_node_id": null,
"roasthubs_zone_id": 1,
"data": {}
}
ChampTypeRequisDescription
idnumberouiId du journal d'événements (clé d'idempotence)
type_idstringouiIdentifiant du type d'événement
user_idnumberouiUtilisateur agissant (0 / 1 = système)
resource_idnumbernonId de ressource associée
resource_namestringnonNom de ressource / table
plant_node_idnumbernonNœud d'usine associé
roasthubs_zone_idnumbernonZone associée
dataobjectnonCharge utile spécifique à l'événement

Les champs omis peuvent apparaître comme null dans les événements stockés.


Lots

lot_create

Création d'un lot.

  • resource_name : lots (lorsqu'il est défini)
  • resource_id : id du lot
  • roasthubs_zone_id : zone du lot

data — enregistrement de lot créé :

{
"id": 42,
"id_tag": "L-0042",
"number": "BATCH-1",
"recipe_id": 10,
"roasthubs_zone_id": 1,
"remaining_weight_kg": 60,
"actual_weight_kg_input": 60,
"expected_weight_kg_input": 60,
"status": "created",
"erp_id": null,
"supplier_id": 3,
"contracts_call_offs_line_id": null,
"created_at": "2026-09-03T10:00:00.000Z"
}

lot_update

Mise à jour d'un lot (par ex. après torréfaction).

  • resource_name : lots
  • resource_id : id du lot

data — enregistrement de lot mis à jour.

lot_delete

Suppression d'un lot.

Seedé pour les webhooks ; confirmez l'émission dans votre déploiement si vous vous y fiez.

lot_target_pass / lot_target_fail

Une cible QC sur un lot a été évaluée.

  • resource_id : id du lot
  • roasthubs_zone_id : zone du lot

data — la ligne targets (id, parameter_id, lower_bound, upper_bound, recipe_id, …).

Variante plus étroite de lot_target_pass :

{ "status": "pass", "target_id": 7 }

lot_qc_pass / lot_qc_fail

Toutes les cibles d'un lot évaluées ; résultat QC global.

  • resource_id : id du lot
  • roasthubs_zone_id : zone du lot

data — enregistrement de lot incluant les lots_targets associés.


Productions

production_create / production_update / production_delete

  • resource_id : id de production
  • roasthubs_zone_id : zone de production
  • plant_node_id : nœud d'usine de réalisation

data — enregistrement de production : id, name, recipe_id, batch_size_kg, batch_qty, status, type, due_date, product_id, order_line_id, …


Recipes

recipe_create / recipe_update

  • resource_name : recipes
  • resource_id : id de recette
  • roasthubs_zone_id : zone cible

data — enregistrement de recette, ou lors d'un échange en masse :

{
"text": "A recipe component id 5 is exchange for 12 and has been updated by bulk exchange",
"recipe_id": 20,
"exchangeCoffee": 12,
"updated_by_user_id": 1
}

recipe_delete

Suppression d'une recette.

Seedé pour les webhooks ; confirmez l'émission dans votre déploiement si vous vous y fiez.

bulk_exchange_recipe_component

  • resource_name : recipes
  • resource_id : id de la recette composant échangée
  • roasthubs_zone_id : typiquement 2

data — corps de requête d'échange en masse (recettes sélectionnées, id café d'échange, id utilisateur, …).


Sales

sale_create / sale_update

  • resource_name : sales
  • resource_id : id de vente

data — enregistrement de vente : id, id_tag, customer_id, customer_name, status, due_date, erp_id, reference, …

sale_lines_create

  • resource_name : sales
  • resource_id : id de vente parent

data — ligne de vente : id, sale_id, product_id, product_name, qty, weight_ordered, weight_remaining, status, …

sale_lines_update

  • resource_name : sales ou sales_lines
  • resource_id : id de vente ou id de ligne de vente (varie selon l'appelant)

data — enregistrement de ligne de vente mis à jour.


Products

product_create / product_update

  • resource_name : products
  • resource_id : id de produit

data — champs produit : id_tag, reference, name, is_producable, mass_smallest_unit, qty_per_product_smallest_unit, price, … (incluant souvent les étapes de process).

product_process_stage_create

  • resource_id : id de produit
  • resource_name : products (lorsqu'il est défini)

data :

{
"product_id": 10,
"recipe_id": 5,
"recipe_name": "Espresso blend"
}

product_process_stage_update

Mise à jour d'une étape de process produit.

Seedé pour les webhooks ; confirmez l'émission dans votre déploiement si vous vous y fiez.


Contrats et call-offs

contracts_create / contracts_update

  • resource_name : contracts
  • resource_id : id de contrat

data — enregistrement de contrat ou mise à jour partielle : id, id_tag, contract_number, recipe_id, price_per_unit, contract_quantity, status, contract_quantity_remaining_actual, supplier_id, …

contracts_call_offs_create / contracts_call_offs_update

  • resource_name : contracts_call_offs
  • resource_id : id de call-off

data — enregistrement de call-off : id, id_tag, call_off_number, supplier_id, status, ordered_receiving_date, … — ou { "status": "delivered" }.

contracts_call_offs_lines_create / contracts_call_offs_lines_update / contracts_call_offs_lines_delete

  • resource_name : contracts_call_offs ou contracts_call_offs_lines
  • resource_id : id de call-off (ou id de ligne sur certaines mises à jour)

data — ligne de call-off : id, contract_id, contract_call_off_id, quantity, status, eudr_dds_number, …


Sites

site_create / site_update

  • resource_name : sites
  • resource_id : id de site

data — enregistrement de site : id, name, address_line1, city, country, time_zone, site_status, unit_system, …


Targets

Ids d'événements UI : target_create, target_update, target_delete.

Le code peut émettre targets_create, targets_update, targets_delete. Faites correspondre le type_id d'une charge utile de test webhook réelle.

  • resource_name : targets
  • resource_id : id de cible

data — enregistrement de cible : id, parameter_id, lower_bound, upper_bound, recipe_id, plant_node_id, applies_to_all_lots, removed, …


Returns

return_create / return_update

  • resource_name : returns
  • resource_id : id de retour

data — enregistrement de retour : id, id_tag, name, supplier_id, status, note, …

return_add_lot

{
"return_id": 3,
"lot_id": 42,
"add_back_to_contract": true
}

return_remove_lot

{
"return_id": 3,
"lot_id": 42,
"remove_from_contract": true
}

Containers

Les ids UI / seed incluent container_creation, container_deletion. Les événements create/delete émis utilisent container_create / container_delete. Faites correspondre le type_id réel.

container_create / container_update / container_delete

  • resource_name : containers
  • resource_id : id de conteneur

data :

{
"container": {
"id": 1,
"reference": "BIN-01",
"status": "active",
"erp_id": null,
"capacity": 1000,
"allowed_maximum_usages": null
}
}

container_history_added

  • resource_name : containers
  • resource_id : id de conteneur

data :

{
"containerId": 1,
"historyAdded": [
{
"id": 10,
"container_id": 1,
"lot_id": 42,
"plant_node_id": 5,
"action": "add",
"lot_weight": 60.5,
"created_at": "2026-09-03T10:00:00.000Z"
}
]
}

Autres événements conteneur seedés

  • container_remove_lots
  • container_added_to_node
  • container_removed_from_node

Confirmez l'émission dans votre déploiement si vous vous y fiez.


Integrations

integration_create / integration_update / integration_delete

  • resource_name : integrations
  • resource_id : id d'intégration

data — enregistrement d'intégration : id, name, basic_auth_username, description, disabled, removed, is_system_integrations, …

Traitez les identifiants dans les charges utiles comme sensibles.


Contrôle usine

inventory_cell_start

  • plant_node_id : nœud d'usine de la cellule source
  • roasthubs_zone_id : zone de la cellule source

data :

{
"cell_start_weight": 120.5,
"target_cell_plant_node_id": 8,
"scale_plant_node_id": 12,
"source_cell_plant_node_id": 7,
"source_cell_name": "Silo A1",
"target_cell_name": "Silo B2"
}

inventory_cell_stop

Même enveloppe que start.

data :

{
"cell_start_weight": 120.5,
"inventorized_weight": 118.2,
"target_cell_plant_node_id": 8,
"scale_plant_node_id": 12,
"source_cell_plant_node_id": 7,
"source_cell_name": "Silo A1",
"target_cell_name": "Silo B2"
}

cell_theoretical_weight_correction

  • plant_node_id : nœud d'usine de la cellule
  • roasthubs_zone_id : zone

data :

{
"cellId": 3,
"initialCellWeight": 100,
"actualCellWeight": 0,
"correctedCellWeight": 95.2,
"initialCellLines": [],
"correctedCellLines": []
}

actualCellWeight vs correctedCellWeight dépend du chemin de correction.

skip_cell_dosing_order / resolve_cell_not_found / cancel_dosing_order

  • roasthubs_zone_id : typiquement 2 (roast)

data — paquet de contrôle client (scalePlantNodeId, recipeId, zone, chosenCells, …).

dumping_green_lot_fully_finished / dumping_green_lot_partially_finished

  • roasthubs_zone_id : zone de dump

data :

{ "fullyDumped": true }

lot_dump_fully_finished / lot_dump_partially_finished

  • roasthubs_zone_id : zone source

data :

{
"sourcePlantNodeId": 7,
"sourceLotId": 42,
"resolvedSourceLotId": 42,
"lotFullyDumped": true,
"viaRealisationBufferStop": true
}

scale_validation

  • resource_name : lots
  • resource_id : id de lot associé

data — enregistrement de lot associé au moment de la validation.

Autres événements de contrôle usine seedés

Id d'événementDescription
component_skipIgnorer un composant d'ordre de dosage
coponent_switchChanger un composant d'ordre de dosage
dumping_green_startDump démarré
manual_control_runningActif en marche (contrôle manuel)
manual_control_not_runningActif arrêté (contrôle manuel)
manual_mode_onActif basculé en mode manuel
manual_mode_offActif basculé en mode automatique
production_plan_startPlan de production démarré
production_plan_stopPlan de production arrêté
switching_cell_dosing_orderChanger de cellule après alarme de flux
tag_updateMise à jour de tag
auto_cell_selectionSélection automatique de cellule

System

user_comment

  • resource_name : par ex. contracts
  • resource_id : id de ressource associée

data :

{ "comment": "Human-readable comment text…" }

user_log_in / user_log_out

Connexion / déconnexion utilisateur.

Seedé pour les webhooks ; confirmez l'émission dans votre déploiement si vous vous y fiez.


Nœuds d'usine

plant_node_update

  • resource_name : plant_nodes
  • resource_id : id de nœud d'usine

data — nœud d'usine : id, name, plant_node_type_id, capacity_kg, roasthubs_zone_id, is_blocked_input, is_blocked_output, properties, …


Index complet des types d'événements

Types configurables en webhook (enable_webhook: true dans le seed).

Index Lots

Id d'événementDescription
lot_createCréer un lot
lot_updateMettre à jour un lot
lot_deleteSupprimer un lot

Également émis : lot_target_pass, lot_target_fail, lot_qc_pass, lot_qc_fail.

Index Productions

Id d'événementDescription
production_createCréer une production
production_updateMettre à jour une production
production_deleteSupprimer une production

Index Recipes

Id d'événementDescription
recipe_createCréer une recette
recipe_updateMettre à jour une recette
recipe_deleteSupprimer une recette
bulk_exchange_recipe_componentÉchange en masse d'un composant de recette

Index Sales

Id d'événementDescription
sale_createCréer une vente
sale_updateMettre à jour une vente
sale_lines_createCréer une ligne de vente
sale_lines_updateMettre à jour une ligne de vente

Index Products

Id d'événementDescription
product_createCréer un produit
product_updateMettre à jour un produit
product_process_stage_createCréer une étape de process produit
product_process_stage_updateMettre à jour une étape de process produit

Index Contrats et call-offs

Id d'événementDescription
contracts_createCréer un contrat
contracts_updateMettre à jour un contrat
contracts_call_offs_createCréer un call-off
contracts_call_offs_updateMettre à jour un call-off
contracts_call_offs_lines_createCréer une ligne de call-off
contracts_call_offs_lines_updateMettre à jour une ligne de call-off
contracts_call_offs_lines_deleteSupprimer une ligne de call-off

Index Sites

Id d'événementDescription
site_createCréer un site
site_updateMettre à jour un site

Index Targets

Id d'événementDescription
target_createCréer une cible
target_updateMettre à jour une cible
target_deleteSupprimer une cible

Index Returns

Id d'événementDescription
return_createCréer un retour
return_updateMettre à jour un retour
return_add_lotAjouter un lot au retour
return_remove_lotRetirer un lot du retour

Index Containers

Id d'événementDescription
container_creationCréer un conteneur (id UI ; le code peut émettre container_create)
container_updateMettre à jour un conteneur
container_deletionSupprimer un conteneur (id UI ; le code peut émettre container_delete)
container_remove_lotsVider les lots du conteneur
container_added_to_nodeConteneur lié à un nœud d'usine
container_removed_from_nodeConteneur détaché d'un nœud d'usine

Également émis : container_history_added.

Index Integrations

Id d'événementDescription
integration_createCréer une intégration
integration_updateMettre à jour une intégration
integration_deleteSupprimer une intégration

Index Contrôle usine

Id d'événementDescription
auto_cell_selectionSélection automatique de cellule
cancel_dosing_orderAnnuler l'ordre de dosage complet
cell_theoretical_weight_correctionCorrection théorique du poids de cellule
component_skipIgnorer un composant d'ordre de dosage
coponent_switchChanger un composant d'ordre de dosage
dumping_green_startDump démarré
dumping_green_lot_fully_finishedDump vert ; lot entièrement déchargé
dumping_green_lot_partially_finishedDump vert ; lot partiellement déchargé
lot_dump_fully_finishedDump arrêté ; lot entièrement vidé
lot_dump_partially_finishedDump arrêté ; lot partiellement vidé
inventory_cell_startInventaire de cellule démarré
inventory_cell_stopInventaire de cellule arrêté
manual_control_runningContrôle manuel en marche
manual_control_not_runningContrôle manuel arrêté
manual_mode_onMode manuel activé
manual_mode_offMode automatique activé
production_plan_startPlan de production démarré
production_plan_stopPlan de production arrêté
resolve_cell_not_foundRésoudre un composant de cellule manquant
scale_validationValidation de balance
skip_cell_dosing_orderIgnorer l'ordre de dosage de cellule
switching_cell_dosing_orderChanger de cellule pour l'ordre de dosage
tag_updateMise à jour de tag

Également émis : plant_node_update.

Index System

Id d'événementDescription
user_log_inConnexion utilisateur
user_log_outDéconnexion utilisateur
user_commentCommentaire utilisateur

Exemple de récepteur

POST /your-endpoint HTTP/1.1
Content-Type: application/json

{
"id": 9876,
"type_id": "lot_create",
"user_id": 4,
"resource_id": 42,
"resource_name": "lots",
"roasthubs_zone_id": 1,
"data": {
"id": 42,
"id_tag": "L-0042",
"status": "created"
}
}

Répondez avec 2xx pour que Roasthubs considère la livraison comme réussie. Les réponses non-2xx déclenchent des nouvelles tentatives selon le retry_count du webhook.