[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"doc-\u002Fen\u002Fdocs\u002Fcanaux\u002Fwebhook":3,"docs-nav-en":540},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"body":10,"_type":534,"_id":535,"_source":536,"_file":537,"_stem":538,"_extension":539},"\u002Fen\u002Fdocs\u002Fcanaux\u002Fwebhook","canaux",false,"","HTTP Webhook","Generic reception of HTTP events from any system: HMAC signature, secret rotation, payload format, response and optional GET calls.",{"type":11,"children":12,"toc":525},"root",[13,29,36,56,62,111,186,204,210,253,314,319,331,351,357,400,406,487,493],{"type":14,"tag":15,"props":16,"children":17},"element","p",{},[18,21,27],{"type":19,"value":20},"text","The ",{"type":14,"tag":22,"props":23,"children":24},"strong",{},[25],{"type":19,"value":26},"webhook",{"type":19,"value":28}," channel is the generic entry point for connecting any system capable of making an HTTP POST. It is the option to choose when no dedicated channel exists for your source.",{"type":14,"tag":30,"props":31,"children":33},"h2",{"id":32},"when-to-use-it",[34],{"type":19,"value":35},"When to use it",{"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},"Connect an in-house tool (ERP, business application, payment gateway).",{"type":14,"tag":41,"props":47,"children":48},{},[49],{"type":19,"value":50},"Receive events from a third-party platform that offers generic webhooks.",{"type":14,"tag":41,"props":52,"children":53},{},[54],{"type":19,"value":55},"Trigger a pipeline from an external cron job or a CI pipeline.",{"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},"In the model editor, configure the ",{"type":14,"tag":22,"props":72,"children":73},{},[74],{"type":19,"value":75},"Start",{"type":19,"value":77}," node with an ",{"type":14,"tag":22,"props":79,"children":80},{},[81],{"type":19,"value":82},"Inbound webhook",{"type":19,"value":84}," receiver.",{"type":14,"tag":41,"props":86,"children":87},{},[88,90,97],{"type":19,"value":89},"betool generates a public URL (",{"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},"(Recommended) Set an ",{"type":14,"tag":22,"props":105,"children":106},{},[107],{"type":19,"value":108},"HMAC secret",{"type":19,"value":110}," in the receiver configuration.",{"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},"When a secret is configured, your system must sign the raw body of each request — ",{"type":14,"tag":91,"props":117,"children":119},{"className":118},[],[120],{"type":19,"value":121},"HMAC-SHA256(secret, body)",{"type":19,"value":123},", in hexadecimal — and pass the signature in the ",{"type":14,"tag":91,"props":125,"children":127},{"className":126},[],[128],{"type":19,"value":129},"X-Webhook-Signature",{"type":19,"value":131}," header, as ",{"type":14,"tag":91,"props":133,"children":135},{"className":134},[],[136],{"type":19,"value":137},"sha256=\u003Chex>",{"type":19,"value":139}," or ",{"type":14,"tag":91,"props":141,"children":143},{"className":142},[],[144],{"type":19,"value":145},"\u003Chex>",{"type":19,"value":147}," alone. The header name and the algorithm (",{"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},") are configurable, for example to follow GitHub's ",{"type":14,"tag":91,"props":172,"children":174},{"className":173},[],[175],{"type":19,"value":176},"X-Hub-Signature-256",{"type":19,"value":178}," convention. Any request without a valid signature is then rejected (",{"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},"Only this format is verified: a hexadecimal HMAC of the raw body. A timestamped signature (",{"type":14,"tag":91,"props":197,"children":199},{"className":198},[],[200],{"type":19,"value":201},"t=…,v1=…",{"type":19,"value":203},") or a base64-encoded one will not be recognized.",{"type":14,"tag":30,"props":205,"children":207},{"id":206},"payload-format",[208],{"type":19,"value":209},"Payload format",{"type":14,"tag":15,"props":211,"children":212},{},[213,215,220,222,228,230,236,237,243,245,251],{"type":19,"value":214},"You send ",{"type":14,"tag":22,"props":216,"children":217},{},[218],{"type":19,"value":219},"any JSON you like",{"type":19,"value":221},". betool does not constrain the structure. The payload is exposed to the pipeline under ",{"type":14,"tag":91,"props":223,"children":225},{"className":224},[],[226],{"type":19,"value":227},"webhook.payload",{"type":19,"value":229}," (with its sub-keys); the headers, the method and the query string are also available under ",{"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}," and ",{"type":14,"tag":91,"props":246,"children":248},{"className":247},[],[249],{"type":19,"value":250},"webhook.query",{"type":19,"value":252},".",{"type":14,"tag":15,"props":254,"children":255},{},[256,258,264,266,272,274,280,282,288,290,296,298,304,306,312],{"type":19,"value":257},"The body is read according to its ",{"type":14,"tag":91,"props":259,"children":261},{"className":260},[],[262],{"type":19,"value":263},"Content-Type",{"type":19,"value":265},": JSON parsed, form (",{"type":14,"tag":91,"props":267,"children":269},{"className":268},[],[270],{"type":19,"value":271},"application\u002Fx-www-form-urlencoded",{"type":19,"value":273},") as a dictionary, XML and ",{"type":14,"tag":91,"props":275,"children":277},{"className":276},[],[278],{"type":19,"value":279},"text\u002F*",{"type":19,"value":281}," as raw text, ",{"type":14,"tag":91,"props":283,"children":285},{"className":284},[],[286],{"type":19,"value":287},"multipart\u002Fform-data",{"type":19,"value":289}," as fields + attached files (",{"type":14,"tag":91,"props":291,"children":293},{"className":292},[],[294],{"type":19,"value":295},"webhook.payload._files",{"type":19,"value":297},"), any other type (PDF, image, archive…) stored as a file. A ",{"type":14,"tag":91,"props":299,"children":301},{"className":300},[],[302],{"type":19,"value":303},"gzip",{"type":19,"value":305},"-compressed body is decompressed. Maximum size: 50 MB (",{"type":14,"tag":91,"props":307,"children":309},{"className":308},[],[310],{"type":19,"value":311},"413",{"type":19,"value":313}," beyond).",{"type":14,"tag":15,"props":315,"children":316},{},[317],{"type":19,"value":318},"Example:",{"type":14,"tag":320,"props":321,"children":326},"pre",{"className":322,"code":324,"language":325,"meta":7},[323],"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",[327],{"type":14,"tag":91,"props":328,"children":329},{"__ignoreMap":7},[330],{"type":19,"value":324},{"type":14,"tag":15,"props":332,"children":333},{},[334,336,342,343,349],{"type":19,"value":335},"The pipeline can then wire an agent that reads ",{"type":14,"tag":91,"props":337,"children":339},{"className":338},[],[340],{"type":19,"value":341},"webhook.payload.customer_email",{"type":19,"value":244},{"type":14,"tag":91,"props":344,"children":346},{"className":345},[],[347],{"type":19,"value":348},"webhook.payload.amount_cents",{"type":19,"value":350}," directly.",{"type":14,"tag":30,"props":352,"children":354},{"id":353},"response",[355],{"type":19,"value":356},"Response",{"type":14,"tag":15,"props":358,"children":359},{},[360,362,368,370,379,381,390,392,398],{"type":19,"value":361},"Two response modes (",{"type":14,"tag":91,"props":363,"children":365},{"className":364},[],[366],{"type":19,"value":367},"response_mode",{"type":19,"value":369},"): ",{"type":14,"tag":22,"props":371,"children":372},{},[373],{"type":14,"tag":91,"props":374,"children":376},{"className":375},[],[377],{"type":19,"value":378},"sync",{"type":19,"value":380}," (default) blocks until the pipeline result and returns it in the response; ",{"type":14,"tag":22,"props":382,"children":383},{},[384],{"type":14,"tag":91,"props":385,"children":387},{"className":386},[],[388],{"type":19,"value":389},"ack",{"type":19,"value":391}," immediately returns ",{"type":14,"tag":91,"props":393,"children":395},{"className":394},[],[396],{"type":19,"value":397},"202 Accepted",{"type":19,"value":399}," after placing the event in a durable queue (the pipeline then runs, with retries) — choose it for providers with short timeouts.",{"type":14,"tag":30,"props":401,"children":403},{"id":402},"get-calls-option",[404],{"type":19,"value":405},"GET calls (option)",{"type":14,"tag":15,"props":407,"children":408},{},[409,411,417,419,425,427,433,435,441,443,448,450,456,458,463,465,470,472,478,480,485],{"type":19,"value":410},"By default only ",{"type":14,"tag":91,"props":412,"children":414},{"className":413},[],[415],{"type":19,"value":416},"POST",{"type":19,"value":418}," is accepted: a ",{"type":14,"tag":91,"props":420,"children":422},{"className":421},[],[423],{"type":19,"value":424},"GET",{"type":19,"value":426}," gets ",{"type":14,"tag":91,"props":428,"children":430},{"className":429},[],[431],{"type":19,"value":432},"405",{"type":19,"value":434},". For a partner that requires a ",{"type":14,"tag":91,"props":436,"children":438},{"className":437},[],[439],{"type":19,"value":440},"GET ?action=…",{"type":19,"value":442}," lookup, tick ",{"type":14,"tag":22,"props":444,"children":445},{},[446],{"type":19,"value":447},"Also accept GET",{"type":19,"value":449}," (",{"type":14,"tag":91,"props":451,"children":453},{"className":452},[],[454],{"type":19,"value":455},"allow_get",{"type":19,"value":457},"). The query string then becomes ",{"type":14,"tag":91,"props":459,"children":461},{"className":460},[],[462],{"type":19,"value":227},{"type":19,"value":464},", in the same shape as a form POST: the pipeline does not need to know which method was used. A ",{"type":14,"tag":91,"props":466,"children":468},{"className":467},[],[469],{"type":19,"value":424},{"type":19,"value":471}," carries no body (refused with ",{"type":14,"tag":91,"props":473,"children":475},{"className":474},[],[476],{"type":19,"value":477},"400",{"type":19,"value":479},") and is incompatible with HMAC signing (refused with ",{"type":14,"tag":91,"props":481,"children":483},{"className":482},[],[484],{"type":19,"value":432},{"type":19,"value":486}," while a secret is set). A credential passed in the query appears in access logs: prefer POST when the partner allows it.",{"type":14,"tag":30,"props":488,"children":490},{"id":489},"security",[491],{"type":19,"value":492},"Security",{"type":14,"tag":37,"props":494,"children":495},{},[496,501,520],{"type":14,"tag":41,"props":497,"children":498},{},[499],{"type":19,"value":500},"Sign your requests (HMAC) as soon as the endpoint handles anything beyond tests.",{"type":14,"tag":41,"props":502,"children":503},{},[504,506,511,513,518],{"type":19,"value":505},"The secret can be changed at any time in the receiver configuration (rotation). Once saved, it is never displayed again: the field shows ",{"type":14,"tag":22,"props":507,"children":508},{},[509],{"type":19,"value":510},"\"•••••• saved — type to replace\"",{"type":19,"value":512},", and ",{"type":14,"tag":22,"props":514,"children":515},{},[516],{"type":19,"value":517},"Remove",{"type":19,"value":519}," clears it (the signature is then no longer verified).",{"type":14,"tag":41,"props":521,"children":522},{},[523],{"type":19,"value":524},"Payloads are stored in plain text in the execution history — do not send data that should be encrypted in transit only.",{"title":7,"searchDepth":526,"depth":526,"links":527},2,[528,529,530,531,532,533],{"id":32,"depth":526,"text":35},{"id":58,"depth":526,"text":61},{"id":206,"depth":526,"text":209},{"id":353,"depth":526,"text":356},{"id":402,"depth":526,"text":405},{"id":489,"depth":526,"text":492},"markdown","content:en:docs:2.canaux:5.webhook.md","content","en\u002Fdocs\u002F2.canaux\u002F5.webhook.md","en\u002Fdocs\u002F2.canaux\u002F5.webhook","md",[541],{"title":542,"_path":543,"children":544},"En","\u002Fen",[545],{"title":546,"_path":547,"children":548},"Docs","\u002Fen\u002Fdocs",[549,562,588,616,629,644,657,718],{"title":550,"_path":551,"children":552},"Getting started","\u002Fen\u002Fdocs\u002Fdemarrer",[553,556,559],{"title":554,"_path":555},"Welcome","\u002Fen\u002Fdocs\u002Fdemarrer\u002Fbienvenue",{"title":557,"_path":558},"Create an account","\u002Fen\u002Fdocs\u002Fdemarrer\u002Fcreer-un-compte",{"title":560,"_path":561},"Connect an LLM key","\u002Fen\u002Fdocs\u002Fdemarrer\u002Fbrancher-llm",{"title":563,"_path":564,"children":565},"Channels","\u002Fen\u002Fdocs\u002Fcanaux",[566,569,572,575,578,579,582,585],{"title":567,"_path":568},"Channels overview","\u002Fen\u002Fdocs\u002Fcanaux\u002Fvue-densemble",{"title":570,"_path":571},"Real-time telephony","\u002Fen\u002Fdocs\u002Fcanaux\u002Ftelephone",{"title":573,"_path":574},"Email","\u002Fen\u002Fdocs\u002Fcanaux\u002Femail",{"title":576,"_path":577},"Web chat widget","\u002Fen\u002Fdocs\u002Fcanaux\u002Fchat-widget",{"title":8,"_path":4},{"title":580,"_path":581},"Messaging (WhatsApp, Messenger, Telegram, Mattermost)","\u002Fen\u002Fdocs\u002Fcanaux\u002Fmessageries",{"title":583,"_path":584},"Meta Lead Ads","\u002Fen\u002Fdocs\u002Fcanaux\u002Ffacebook-leads",{"title":586,"_path":587},"Schedule (cron)","\u002Fen\u002Fdocs\u002Fcanaux\u002Fschedule",{"title":589,"_path":590,"children":591},"Pipelines","\u002Fen\u002Fdocs\u002Fpipelines",[592,595,598,601,604,607,610,613],{"title":593,"_path":594},"The Visual Editor","\u002Fen\u002Fdocs\u002Fpipelines\u002Fediteur-visuel",{"title":596,"_path":597},"AI Agents","\u002Fen\u002Fdocs\u002Fpipelines\u002Fagents",{"title":599,"_path":600},"Deterministic Operators","\u002Fen\u002Fdocs\u002Fpipelines\u002Foperateurs",{"title":602,"_path":603},"Flow Control","\u002Fen\u002Fdocs\u002Fpipelines\u002Fcontrole-flux",{"title":605,"_path":606},"Code Steps","\u002Fen\u002Fdocs\u002Fpipelines\u002Fcode-step",{"title":608,"_path":609},"Sub-pipelines","\u002Fen\u002Fdocs\u002Fpipelines\u002Fsous-pipelines",{"title":611,"_path":612},"No-code actions","\u002Fen\u002Fdocs\u002Fpipelines\u002Factions-no-code",{"title":614,"_path":615},"Knowledge base","\u002Fen\u002Fdocs\u002Fpipelines\u002Fbase-de-connaissances",{"title":617,"_path":618,"children":619},"Supervision","\u002Fen\u002Fdocs\u002Fsupervision",[620,623,626],{"title":621,"_path":622},"Execution History","\u002Fen\u002Fdocs\u002Fsupervision\u002Fexecutions",{"title":624,"_path":625},"Credits & Metering","\u002Fen\u002Fdocs\u002Fsupervision\u002Fcredits-metering",{"title":627,"_path":628},"Benchmarks","\u002Fen\u002Fdocs\u002Fsupervision\u002Fbenchmarks",{"title":492,"_path":630,"children":631},"\u002Fen\u002Fdocs\u002Fsecurite",[632,635,638,641],{"title":633,"_path":634},"Security principles","\u002Fen\u002Fdocs\u002Fsecurite\u002Fprincipes",{"title":636,"_path":637},"Strict multi-tenancy","\u002Fen\u002Fdocs\u002Fsecurite\u002Fmulti-tenant",{"title":639,"_path":640},"GDPR audit & access log","\u002Fen\u002Fdocs\u002Fsecurite\u002Faudit-rgpd",{"title":642,"_path":643},"Sovereign deployment","\u002Fen\u002Fdocs\u002Fsecurite\u002Fdeploiement-souverain",{"title":645,"_path":646,"children":647},"Developers","\u002Fen\u002Fdocs\u002Fdeveloppeurs",[648,651,654],{"title":649,"_path":650},"Admin API","\u002Fen\u002Fdocs\u002Fdeveloppeurs\u002Fapi-admin",{"title":652,"_path":653},"Outbound webhooks","\u002Fen\u002Fdocs\u002Fdeveloppeurs\u002Fwebhooks-sortants",{"title":655,"_path":656},"Drive betool from Claude (MCP)","\u002Fen\u002Fdocs\u002Fdeveloppeurs\u002Fmcp",{"title":658,"_path":659,"children":660},"Integrations","\u002Fen\u002Fdocs\u002Fintegrations",[661,664,667,670,673,676,679,682,685,688,691,694,697,700,703,706,709,712,715],{"title":662,"_path":663},"Integrations overview","\u002Fen\u002Fdocs\u002Fintegrations\u002Fvue-densemble",{"title":665,"_path":666},"Stripe","\u002Fen\u002Fdocs\u002Fintegrations\u002Fstripe",{"title":668,"_path":669},"GitHub","\u002Fen\u002Fdocs\u002Fintegrations\u002Fgithub",{"title":671,"_path":672},"Google","\u002Fen\u002Fdocs\u002Fintegrations\u002Fgoogle",{"title":674,"_path":675},"LinkedIn Ads","\u002Fen\u002Fdocs\u002Fintegrations\u002Flinkedin-ads",{"title":677,"_path":678},"Kavkom","\u002Fen\u002Fdocs\u002Fintegrations\u002Fkavkom",{"title":680,"_path":681},"Jira","\u002Fen\u002Fdocs\u002Fintegrations\u002Fjira",{"title":683,"_path":684},"Slack","\u002Fen\u002Fdocs\u002Fintegrations\u002Fslack",{"title":686,"_path":687},"SMS","\u002Fen\u002Fdocs\u002Fintegrations\u002Fsms",{"title":689,"_path":690},"Enable Banking (open banking)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fenable-banking",{"title":692,"_path":693},"CRM, marketing & productivity","\u002Fen\u002Fdocs\u002Fintegrations\u002Fcrm-marketing",{"title":695,"_path":696},"HeyGen (video)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fheygen",{"title":698,"_path":699},"La Poste","\u002Fen\u002Fdocs\u002Fintegrations\u002Fla-poste",{"title":701,"_path":702},"Industry CRM (beTool Application, Qhare)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fcrm-metier",{"title":704,"_path":705},"Mitti (field inspections)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fmitti",{"title":707,"_path":708},"Meta (Messenger, Pages, Meta Ads)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fmeta",{"title":710,"_path":711},"Onoff Business (Beta)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fonoff",{"title":713,"_path":714},"Smart Life \u002F Tuya (connected devices)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fsmart-life",{"title":716,"_path":717},"beTool products (Desktop, Kiosk, Terminal)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fproduits-betool",{"title":719,"_path":720,"children":721},"Use cases","\u002Fen\u002Fdocs\u002Fcas-usage",[722,725,728,731,734,737],{"title":723,"_path":724},"Typical business agents","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fvue-densemble",{"title":726,"_path":727},"CFO IA","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fcfo-ia",{"title":729,"_path":730},"COO IA","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fcoo-ia",{"title":732,"_path":733},"CTO IA","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fcto-ia",{"title":735,"_path":736},"Product Manager IA","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fproduct-manager-ia",{"title":738,"_path":739},"Personal assistant","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fassistant-personnel"]