[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"doc-\u002Fdocs\u002Fcanaux\u002Fwebhook":3,"docs-nav-fr":539},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"body":10,"_type":533,"_id":534,"_source":535,"_file":536,"_stem":537,"_extension":538},"\u002Fdocs\u002Fcanaux\u002Fwebhook","canaux",false,"","Webhook HTTP","Réception générique d'événements HTTP signés depuis n'importe quel système.",{"type":11,"children":12,"toc":524},"root",[13,29,36,56,62,111,186,204,210,252,313,318,330,350,356,399,405,486,492],{"type":14,"tag":15,"props":16,"children":17},"element","p",{},[18,21,27],{"type":19,"value":20},"text","Le canal ",{"type":14,"tag":22,"props":23,"children":24},"strong",{},[25],{"type":19,"value":26},"webhook",{"type":19,"value":28}," est l'entrée générique pour brancher tout système qui sait faire un POST HTTP. C'est l'option à choisir quand aucun canal dédié n'existe pour votre source.",{"type":14,"tag":30,"props":31,"children":33},"h2",{"id":32},"quand-lutiliser",[34],{"type":19,"value":35},"Quand l'utiliser",{"type":14,"tag":37,"props":38,"children":39},"ul",{},[40,46,51],{"type":14,"tag":41,"props":42,"children":43},"li",{},[44],{"type":19,"value":45},"Brancher un outil maison (ERP, application métier, gateway de paiement).",{"type":14,"tag":41,"props":47,"children":48},{},[49],{"type":19,"value":50},"Recevoir des événements d'une plateforme tierce qui propose des webhooks génériques.",{"type":14,"tag":41,"props":52,"children":53},{},[54],{"type":19,"value":55},"Déclencher un pipeline depuis un cron externe ou une CI.",{"type":14,"tag":30,"props":57,"children":59},{"id":58},"configuration",[60],{"type":19,"value":61},"Configuration",{"type":14,"tag":63,"props":64,"children":65},"ol",{},[66,85,99],{"type":14,"tag":41,"props":67,"children":68},{},[69,71,76,78,83],{"type":19,"value":70},"Dans l'éditeur du modèle, configurez le nœud ",{"type":14,"tag":22,"props":72,"children":73},{},[74],{"type":19,"value":75},"Start",{"type":19,"value":77}," avec un récepteur ",{"type":14,"tag":22,"props":79,"children":80},{},[81],{"type":19,"value":82},"Webhook entrant",{"type":19,"value":84},".",{"type":14,"tag":41,"props":86,"children":87},{},[88,90,97],{"type":19,"value":89},"betool génère une URL publique (",{"type":14,"tag":91,"props":92,"children":94},"code",{"className":93},[],[95],{"type":19,"value":96},"https:\u002F\u002Fplatform.betool.ai\u002Fentries\u002Fwebhook\u002F\u003Ctoken>",{"type":19,"value":98},").",{"type":14,"tag":41,"props":100,"children":101},{},[102,104,109],{"type":19,"value":103},"(Recommandé) Définissez un ",{"type":14,"tag":22,"props":105,"children":106},{},[107],{"type":19,"value":108},"secret HMAC",{"type":19,"value":110}," dans la config du récepteur.",{"type":14,"tag":15,"props":112,"children":113},{},[114,116,122,124,130,132,138,140,146,148,154,156,162,163,169,171,177,179,185],{"type":19,"value":115},"Quand un secret est configuré, votre système doit signer le corps brut de chaque requête — ",{"type":14,"tag":91,"props":117,"children":119},{"className":118},[],[120],{"type":19,"value":121},"HMAC-SHA256(secret, body)",{"type":19,"value":123},", en hexadécimal — et passer la signature dans le header ",{"type":14,"tag":91,"props":125,"children":127},{"className":126},[],[128],{"type":19,"value":129},"X-Webhook-Signature",{"type":19,"value":131},", sous la forme ",{"type":14,"tag":91,"props":133,"children":135},{"className":134},[],[136],{"type":19,"value":137},"sha256=\u003Chex>",{"type":19,"value":139}," ou ",{"type":14,"tag":91,"props":141,"children":143},{"className":142},[],[144],{"type":19,"value":145},"\u003Chex>",{"type":19,"value":147}," seul. Le nom du header et l'algorithme (",{"type":14,"tag":91,"props":149,"children":151},{"className":150},[],[152],{"type":19,"value":153},"sha256",{"type":19,"value":155},", ",{"type":14,"tag":91,"props":157,"children":159},{"className":158},[],[160],{"type":19,"value":161},"sha384",{"type":19,"value":155},{"type":14,"tag":91,"props":164,"children":166},{"className":165},[],[167],{"type":19,"value":168},"sha512",{"type":19,"value":170},") sont configurables, par exemple pour suivre la convention ",{"type":14,"tag":91,"props":172,"children":174},{"className":173},[],[175],{"type":19,"value":176},"X-Hub-Signature-256",{"type":19,"value":178}," de GitHub. Toute requête sans signature valide est alors refusée (",{"type":14,"tag":91,"props":180,"children":182},{"className":181},[],[183],{"type":19,"value":184},"401",{"type":19,"value":98},{"type":14,"tag":187,"props":188,"children":190},"alert",{"type":189},"warning",[191],{"type":14,"tag":15,"props":192,"children":193},{},[194,196,202],{"type":19,"value":195},"Seul ce format est vérifié : un HMAC hexadécimal du corps brut. Une signature horodatée (",{"type":14,"tag":91,"props":197,"children":199},{"className":198},[],[200],{"type":19,"value":201},"t=…,v1=…",{"type":19,"value":203},") ou encodée en base64 ne sera pas reconnue.",{"type":14,"tag":30,"props":205,"children":207},{"id":206},"format-du-payload",[208],{"type":19,"value":209},"Format du payload",{"type":14,"tag":15,"props":211,"children":212},{},[213,215,220,222,228,230,236,237,243,245,251],{"type":19,"value":214},"Vous envoyez ",{"type":14,"tag":22,"props":216,"children":217},{},[218],{"type":19,"value":219},"n'importe quel JSON",{"type":19,"value":221},". betool ne contraint pas la structure. Le payload est exposé au pipeline sous ",{"type":14,"tag":91,"props":223,"children":225},{"className":224},[],[226],{"type":19,"value":227},"webhook.payload",{"type":19,"value":229}," (avec ses sous-clés) ; les en-têtes, la méthode et la query string sont aussi disponibles sous ",{"type":14,"tag":91,"props":231,"children":233},{"className":232},[],[234],{"type":19,"value":235},"webhook.headers",{"type":19,"value":155},{"type":14,"tag":91,"props":238,"children":240},{"className":239},[],[241],{"type":19,"value":242},"webhook.method",{"type":19,"value":244}," et ",{"type":14,"tag":91,"props":246,"children":248},{"className":247},[],[249],{"type":19,"value":250},"webhook.query",{"type":19,"value":84},{"type":14,"tag":15,"props":253,"children":254},{},[255,257,263,265,271,273,279,281,287,289,295,297,303,305,311],{"type":19,"value":256},"Le corps est lu selon son ",{"type":14,"tag":91,"props":258,"children":260},{"className":259},[],[261],{"type":19,"value":262},"Content-Type",{"type":19,"value":264}," : JSON parsé, formulaire (",{"type":14,"tag":91,"props":266,"children":268},{"className":267},[],[269],{"type":19,"value":270},"application\u002Fx-www-form-urlencoded",{"type":19,"value":272},") en dictionnaire, XML et ",{"type":14,"tag":91,"props":274,"children":276},{"className":275},[],[277],{"type":19,"value":278},"text\u002F*",{"type":19,"value":280}," en texte brut, ",{"type":14,"tag":91,"props":282,"children":284},{"className":283},[],[285],{"type":19,"value":286},"multipart\u002Fform-data",{"type":19,"value":288}," en champs + fichiers joints (",{"type":14,"tag":91,"props":290,"children":292},{"className":291},[],[293],{"type":19,"value":294},"webhook.payload._files",{"type":19,"value":296},"), tout autre type (PDF, image, archive…) enregistré comme fichier. Un corps compressé en ",{"type":14,"tag":91,"props":298,"children":300},{"className":299},[],[301],{"type":19,"value":302},"gzip",{"type":19,"value":304}," est décompressé. Taille maximale : 50 Mo (",{"type":14,"tag":91,"props":306,"children":308},{"className":307},[],[309],{"type":19,"value":310},"413",{"type":19,"value":312}," au-delà).",{"type":14,"tag":15,"props":314,"children":315},{},[316],{"type":19,"value":317},"Exemple :",{"type":14,"tag":319,"props":320,"children":325},"pre",{"className":321,"code":323,"language":324,"meta":7},[322],"language-bash","curl -X POST https:\u002F\u002Fplatform.betool.ai\u002Fentries\u002Fwebhook\u002Fabc123 \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"X-Webhook-Signature: sha256=$SIGNATURE\" \\\n  -d '{\n    \"type\": \"order.created\",\n    \"order_id\": \"ord_42\",\n    \"amount_cents\": 9900,\n    \"customer_email\": \"client@exemple.com\"\n  }'\n","bash",[326],{"type":14,"tag":91,"props":327,"children":328},{"__ignoreMap":7},[329],{"type":19,"value":323},{"type":14,"tag":15,"props":331,"children":332},{},[333,335,341,342,348],{"type":19,"value":334},"Le pipeline peut alors brancher un agent qui lit ",{"type":14,"tag":91,"props":336,"children":338},{"className":337},[],[339],{"type":19,"value":340},"webhook.payload.customer_email",{"type":19,"value":244},{"type":14,"tag":91,"props":343,"children":345},{"className":344},[],[346],{"type":19,"value":347},"webhook.payload.amount_cents",{"type":19,"value":349}," directement.",{"type":14,"tag":30,"props":351,"children":353},{"id":352},"réponse",[354],{"type":19,"value":355},"Réponse",{"type":14,"tag":15,"props":357,"children":358},{},[359,361,367,369,378,380,389,391,397],{"type":19,"value":360},"Deux modes de réponse (",{"type":14,"tag":91,"props":362,"children":364},{"className":363},[],[365],{"type":19,"value":366},"response_mode",{"type":19,"value":368},") : ",{"type":14,"tag":22,"props":370,"children":371},{},[372],{"type":14,"tag":91,"props":373,"children":375},{"className":374},[],[376],{"type":19,"value":377},"sync",{"type":19,"value":379}," (par défaut) bloque jusqu'au résultat du pipeline et le renvoie dans la réponse ; ",{"type":14,"tag":22,"props":381,"children":382},{},[383],{"type":14,"tag":91,"props":384,"children":386},{"className":385},[],[387],{"type":19,"value":388},"ack",{"type":19,"value":390}," renvoie immédiatement un ",{"type":14,"tag":91,"props":392,"children":394},{"className":393},[],[395],{"type":19,"value":396},"202 Accepted",{"type":19,"value":398}," après avoir mis l'événement en file durable (le pipeline s'exécute ensuite, avec réessais) — à choisir pour les providers qui timeoutent tôt.",{"type":14,"tag":30,"props":400,"children":402},{"id":401},"appels-get-option",[403],{"type":19,"value":404},"Appels GET (option)",{"type":14,"tag":15,"props":406,"children":407},{},[408,410,416,418,424,426,432,434,440,442,447,449,455,457,462,464,469,471,477,479,484],{"type":19,"value":409},"Par défaut, seul ",{"type":14,"tag":91,"props":411,"children":413},{"className":412},[],[414],{"type":19,"value":415},"POST",{"type":19,"value":417}," est accepté : un ",{"type":14,"tag":91,"props":419,"children":421},{"className":420},[],[422],{"type":19,"value":423},"GET",{"type":19,"value":425}," reçoit ",{"type":14,"tag":91,"props":427,"children":429},{"className":428},[],[430],{"type":19,"value":431},"405",{"type":19,"value":433},". Pour un partenaire qui impose une consultation en ",{"type":14,"tag":91,"props":435,"children":437},{"className":436},[],[438],{"type":19,"value":439},"GET ?action=…",{"type":19,"value":441},", cochez ",{"type":14,"tag":22,"props":443,"children":444},{},[445],{"type":19,"value":446},"Accepter aussi GET",{"type":19,"value":448}," (",{"type":14,"tag":91,"props":450,"children":452},{"className":451},[],[453],{"type":19,"value":454},"allow_get",{"type":19,"value":456},"). La query string devient alors ",{"type":14,"tag":91,"props":458,"children":460},{"className":459},[],[461],{"type":19,"value":227},{"type":19,"value":463},", sous la même forme qu'un POST de formulaire : le pipeline n'a pas à savoir quelle méthode a été utilisée. Un ",{"type":14,"tag":91,"props":465,"children":467},{"className":466},[],[468],{"type":19,"value":423},{"type":19,"value":470}," ne porte pas de body (refusé en ",{"type":14,"tag":91,"props":472,"children":474},{"className":473},[],[475],{"type":19,"value":476},"400",{"type":19,"value":478},") et n'est pas compatible avec la signature HMAC (refusé en ",{"type":14,"tag":91,"props":480,"children":482},{"className":481},[],[483],{"type":19,"value":431},{"type":19,"value":485}," tant qu'un secret est renseigné). Un identifiant passé en query apparaît dans les journaux d'accès : préférez POST quand le partenaire le permet.",{"type":14,"tag":30,"props":487,"children":489},{"id":488},"sécurité",[490],{"type":19,"value":491},"Sécurité",{"type":14,"tag":37,"props":493,"children":494},{},[495,500,519],{"type":14,"tag":41,"props":496,"children":497},{},[498],{"type":19,"value":499},"Signez vos requêtes (HMAC) dès que l'endpoint traite autre chose que du test.",{"type":14,"tag":41,"props":501,"children":502},{},[503,505,510,512,517],{"type":19,"value":504},"Le secret se change à tout moment dans la config du récepteur (rotation). Une fois enregistré, il n'est plus jamais réaffiché : le champ indique ",{"type":14,"tag":22,"props":506,"children":507},{},[508],{"type":19,"value":509},"« •••••• enregistré — saisir pour remplacer »",{"type":19,"value":511},", et ",{"type":14,"tag":22,"props":513,"children":514},{},[515],{"type":19,"value":516},"Retirer",{"type":19,"value":518}," l'efface (la signature n'est alors plus vérifiée).",{"type":14,"tag":41,"props":520,"children":521},{},[522],{"type":19,"value":523},"Les payloads sont stockés en clair dans l'historique d'exécutions — n'envoyez pas de données qui devraient être chiffrées en transit uniquement.",{"title":7,"searchDepth":525,"depth":525,"links":526},2,[527,528,529,530,531,532],{"id":32,"depth":525,"text":35},{"id":58,"depth":525,"text":61},{"id":206,"depth":525,"text":209},{"id":352,"depth":525,"text":355},{"id":401,"depth":525,"text":404},{"id":488,"depth":525,"text":491},"markdown","content:docs:2.canaux:5.webhook.md","content","docs\u002F2.canaux\u002F5.webhook.md","docs\u002F2.canaux\u002F5.webhook","md",[540],{"title":541,"_path":542,"children":543},"Docs","\u002Fdocs",[544,557,583,611,624,639,652,713],{"title":545,"_path":546,"children":547},"Démarrer","\u002Fdocs\u002Fdemarrer",[548,551,554],{"title":549,"_path":550},"Bienvenue","\u002Fdocs\u002Fdemarrer\u002Fbienvenue",{"title":552,"_path":553},"Créer un compte","\u002Fdocs\u002Fdemarrer\u002Fcreer-un-compte",{"title":555,"_path":556},"Brancher une clé LLM","\u002Fdocs\u002Fdemarrer\u002Fbrancher-llm",{"title":558,"_path":559,"children":560},"Canaux","\u002Fdocs\u002Fcanaux",[561,564,567,570,573,574,577,580],{"title":562,"_path":563},"Vue d'ensemble des canaux","\u002Fdocs\u002Fcanaux\u002Fvue-densemble",{"title":565,"_path":566},"Téléphonie temps réel","\u002Fdocs\u002Fcanaux\u002Ftelephone",{"title":568,"_path":569},"Email","\u002Fdocs\u002Fcanaux\u002Femail",{"title":571,"_path":572},"Chat widget web","\u002Fdocs\u002Fcanaux\u002Fchat-widget",{"title":8,"_path":4},{"title":575,"_path":576},"Messageries (WhatsApp, Messenger, Telegram, Mattermost)","\u002Fdocs\u002Fcanaux\u002Fmessageries",{"title":578,"_path":579},"Meta Lead Ads","\u002Fdocs\u002Fcanaux\u002Ffacebook-leads",{"title":581,"_path":582},"Planification (cron)","\u002Fdocs\u002Fcanaux\u002Fschedule",{"title":584,"_path":585,"children":586},"Pipelines","\u002Fdocs\u002Fpipelines",[587,590,593,596,599,602,605,608],{"title":588,"_path":589},"L'éditeur visuel","\u002Fdocs\u002Fpipelines\u002Fediteur-visuel",{"title":591,"_path":592},"Agents IA","\u002Fdocs\u002Fpipelines\u002Fagents",{"title":594,"_path":595},"Opérateurs déterministes","\u002Fdocs\u002Fpipelines\u002Foperateurs",{"title":597,"_path":598},"Contrôle de flux","\u002Fdocs\u002Fpipelines\u002Fcontrole-flux",{"title":600,"_path":601},"Étapes de code","\u002Fdocs\u002Fpipelines\u002Fcode-step",{"title":603,"_path":604},"Sous-pipelines","\u002Fdocs\u002Fpipelines\u002Fsous-pipelines",{"title":606,"_path":607},"Actions sans code","\u002Fdocs\u002Fpipelines\u002Factions-no-code",{"title":609,"_path":610},"Base de connaissances","\u002Fdocs\u002Fpipelines\u002Fbase-de-connaissances",{"title":612,"_path":613,"children":614},"Supervision","\u002Fdocs\u002Fsupervision",[615,618,621],{"title":616,"_path":617},"Historique d'exécutions","\u002Fdocs\u002Fsupervision\u002Fexecutions",{"title":619,"_path":620},"Crédits & metering","\u002Fdocs\u002Fsupervision\u002Fcredits-metering",{"title":622,"_path":623},"Benchmarks","\u002Fdocs\u002Fsupervision\u002Fbenchmarks",{"title":491,"_path":625,"children":626},"\u002Fdocs\u002Fsecurite",[627,630,633,636],{"title":628,"_path":629},"Principes de sécurité","\u002Fdocs\u002Fsecurite\u002Fprincipes",{"title":631,"_path":632},"Multi-tenant strict","\u002Fdocs\u002Fsecurite\u002Fmulti-tenant",{"title":634,"_path":635},"Audit RGPD & journal d'accès","\u002Fdocs\u002Fsecurite\u002Faudit-rgpd",{"title":637,"_path":638},"Déploiement souverain","\u002Fdocs\u002Fsecurite\u002Fdeploiement-souverain",{"title":640,"_path":641,"children":642},"Développeurs","\u002Fdocs\u002Fdeveloppeurs",[643,646,649],{"title":644,"_path":645},"API admin","\u002Fdocs\u002Fdeveloppeurs\u002Fapi-admin",{"title":647,"_path":648},"Webhooks sortants","\u002Fdocs\u002Fdeveloppeurs\u002Fwebhooks-sortants",{"title":650,"_path":651},"Piloter betool depuis Claude (MCP)","\u002Fdocs\u002Fdeveloppeurs\u002Fmcp",{"title":653,"_path":654,"children":655},"Intégrations","\u002Fdocs\u002Fintegrations",[656,659,662,665,668,671,674,677,680,683,686,689,692,695,698,701,704,707,710],{"title":657,"_path":658},"Vue d'ensemble des intégrations","\u002Fdocs\u002Fintegrations\u002Fvue-densemble",{"title":660,"_path":661},"Stripe","\u002Fdocs\u002Fintegrations\u002Fstripe",{"title":663,"_path":664},"GitHub","\u002Fdocs\u002Fintegrations\u002Fgithub",{"title":666,"_path":667},"Google","\u002Fdocs\u002Fintegrations\u002Fgoogle",{"title":669,"_path":670},"LinkedIn Ads","\u002Fdocs\u002Fintegrations\u002Flinkedin-ads",{"title":672,"_path":673},"Kavkom","\u002Fdocs\u002Fintegrations\u002Fkavkom",{"title":675,"_path":676},"Jira","\u002Fdocs\u002Fintegrations\u002Fjira",{"title":678,"_path":679},"Slack","\u002Fdocs\u002Fintegrations\u002Fslack",{"title":681,"_path":682},"SMS","\u002Fdocs\u002Fintegrations\u002Fsms",{"title":684,"_path":685},"Enable Banking (open banking)","\u002Fdocs\u002Fintegrations\u002Fenable-banking",{"title":687,"_path":688},"CRM, marketing & productivité","\u002Fdocs\u002Fintegrations\u002Fcrm-marketing",{"title":690,"_path":691},"HeyGen (vidéo)","\u002Fdocs\u002Fintegrations\u002Fheygen",{"title":693,"_path":694},"La Poste","\u002Fdocs\u002Fintegrations\u002Fla-poste",{"title":696,"_path":697},"CRM métier (beTool Application, Qhare)","\u002Fdocs\u002Fintegrations\u002Fcrm-metier",{"title":699,"_path":700},"Mitti (inspections terrain)","\u002Fdocs\u002Fintegrations\u002Fmitti",{"title":702,"_path":703},"Meta (Messenger, Pages, Meta Ads)","\u002Fdocs\u002Fintegrations\u002Fmeta",{"title":705,"_path":706},"Onoff Business (Beta)","\u002Fdocs\u002Fintegrations\u002Fonoff",{"title":708,"_path":709},"Smart Life \u002F Tuya (objets connectés)","\u002Fdocs\u002Fintegrations\u002Fsmart-life",{"title":711,"_path":712},"Produits beTool (Desktop, Kiosk, Terminal)","\u002Fdocs\u002Fintegrations\u002Fproduits-betool",{"title":714,"_path":715,"children":716},"Cas d'usage","\u002Fdocs\u002Fcas-usage",[717,720,723,726,729,732],{"title":718,"_path":719},"Agents métier types","\u002Fdocs\u002Fcas-usage\u002Fvue-densemble",{"title":721,"_path":722},"CFO IA","\u002Fdocs\u002Fcas-usage\u002Fcfo-ia",{"title":724,"_path":725},"COO IA","\u002Fdocs\u002Fcas-usage\u002Fcoo-ia",{"title":727,"_path":728},"CTO IA","\u002Fdocs\u002Fcas-usage\u002Fcto-ia",{"title":730,"_path":731},"Product Manager IA","\u002Fdocs\u002Fcas-usage\u002Fproduct-manager-ia",{"title":733,"_path":734},"Assistant personnel","\u002Fdocs\u002Fcas-usage\u002Fassistant-personnel"]