[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"doc-\u002Fes\u002Fdocs\u002Fcanaux\u002Fwebhook":3,"docs-nav-es":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},"\u002Fes\u002Fdocs\u002Fcanaux\u002Fwebhook","canaux",false,"","Webhook HTTP","Recepción genérica de eventos HTTP desde cualquier sistema: firma HMAC, rotación del secreto, formato del payload, respuesta y llamadas GET.",{"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","El canal de ",{"type":14,"tag":22,"props":23,"children":24},"strong",{},[25],{"type":19,"value":26},"webhook",{"type":19,"value":28}," es el punto de entrada genérico para conectar cualquier sistema capaz de hacer un POST HTTP. Es la opción a elegir cuando no existe un canal dedicado para tu fuente.",{"type":14,"tag":30,"props":31,"children":33},"h2",{"id":32},"cuándo-usarlo",[34],{"type":19,"value":35},"Cuándo usarlo",{"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},"Conectar una herramienta interna (ERP, aplicación de negocio, pasarela de pago).",{"type":14,"tag":41,"props":47,"children":48},{},[49],{"type":19,"value":50},"Recibir eventos de una plataforma de terceros que ofrece webhooks genéricos.",{"type":14,"tag":41,"props":52,"children":53},{},[54],{"type":19,"value":55},"Disparar un pipeline desde un cron externo o una CI.",{"type":14,"tag":30,"props":57,"children":59},{"id":58},"configuración",[60],{"type":19,"value":61},"Configuración",{"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},"En el editor del modelo, configura el nodo ",{"type":14,"tag":22,"props":72,"children":73},{},[74],{"type":19,"value":75},"Start",{"type":19,"value":77}," con un receptor ",{"type":14,"tag":22,"props":79,"children":80},{},[81],{"type":19,"value":82},"Webhook entrante",{"type":19,"value":84},".",{"type":14,"tag":41,"props":86,"children":87},{},[88,90,97],{"type":19,"value":89},"betool genera una URL pública (",{"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},"(Recomendado) Define un ",{"type":14,"tag":22,"props":105,"children":106},{},[107],{"type":19,"value":108},"secreto HMAC",{"type":19,"value":110}," en la configuración del receptor.",{"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},"Cuando hay un secreto configurado, tu sistema debe firmar el cuerpo bruto de cada petición — ",{"type":14,"tag":91,"props":117,"children":119},{"className":118},[],[120],{"type":19,"value":121},"HMAC-SHA256(secret, body)",{"type":19,"value":123},", en hexadecimal — y pasar la firma en la cabecera ",{"type":14,"tag":91,"props":125,"children":127},{"className":126},[],[128],{"type":19,"value":129},"X-Webhook-Signature",{"type":19,"value":131},", con la forma ",{"type":14,"tag":91,"props":133,"children":135},{"className":134},[],[136],{"type":19,"value":137},"sha256=\u003Chex>",{"type":19,"value":139}," o ",{"type":14,"tag":91,"props":141,"children":143},{"className":142},[],[144],{"type":19,"value":145},"\u003Chex>",{"type":19,"value":147}," solo. El nombre de la cabecera y el algoritmo (",{"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},") son configurables, por ejemplo para seguir la convención ",{"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. Toda petición sin una firma válida se rechaza entonces (",{"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},"Solo se verifica este formato: un HMAC hexadecimal del cuerpo bruto. Una firma con marca de tiempo (",{"type":14,"tag":91,"props":197,"children":199},{"className":198},[],[200],{"type":19,"value":201},"t=…,v1=…",{"type":19,"value":203},") o codificada en base64 no será reconocida.",{"type":14,"tag":30,"props":205,"children":207},{"id":206},"formato-de-la-carga-útil",[208],{"type":19,"value":209},"Formato de la carga útil",{"type":14,"tag":15,"props":211,"children":212},{},[213,215,220,222,228,230,236,237,243,245,251],{"type":19,"value":214},"Envías ",{"type":14,"tag":22,"props":216,"children":217},{},[218],{"type":19,"value":219},"cualquier JSON",{"type":19,"value":221},". betool no restringe la estructura. La carga útil se expone al pipeline bajo ",{"type":14,"tag":91,"props":223,"children":225},{"className":224},[],[226],{"type":19,"value":227},"webhook.payload",{"type":19,"value":229}," (con sus subclaves); las cabeceras, el método y la query string también están disponibles bajo ",{"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}," y ",{"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},"El cuerpo se lee según su ",{"type":14,"tag":91,"props":258,"children":260},{"className":259},[],[261],{"type":19,"value":262},"Content-Type",{"type":19,"value":264},": JSON analizado, formulario (",{"type":14,"tag":91,"props":266,"children":268},{"className":267},[],[269],{"type":19,"value":270},"application\u002Fx-www-form-urlencoded",{"type":19,"value":272},") como diccionario, XML y ",{"type":14,"tag":91,"props":274,"children":276},{"className":275},[],[277],{"type":19,"value":278},"text\u002F*",{"type":19,"value":280}," como texto bruto, ",{"type":14,"tag":91,"props":282,"children":284},{"className":283},[],[285],{"type":19,"value":286},"multipart\u002Fform-data",{"type":19,"value":288}," como campos + archivos adjuntos (",{"type":14,"tag":91,"props":290,"children":292},{"className":291},[],[293],{"type":19,"value":294},"webhook.payload._files",{"type":19,"value":296},"), y cualquier otro tipo (PDF, imagen, archivo comprimido…) se guarda como archivo. Un cuerpo comprimido en ",{"type":14,"tag":91,"props":298,"children":300},{"className":299},[],[301],{"type":19,"value":302},"gzip",{"type":19,"value":304}," se descomprime. Tamaño máximo: 50 MB (",{"type":14,"tag":91,"props":306,"children":308},{"className":307},[],[309],{"type":19,"value":310},"413",{"type":19,"value":312}," por encima).",{"type":14,"tag":15,"props":314,"children":315},{},[316],{"type":19,"value":317},"Ejemplo:",{"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},"El pipeline puede entonces conectar un agente que lea ",{"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}," directamente.",{"type":14,"tag":30,"props":351,"children":353},{"id":352},"respuesta",[354],{"type":19,"value":355},"Respuesta",{"type":14,"tag":15,"props":357,"children":358},{},[359,361,367,369,378,380,389,391,397],{"type":19,"value":360},"Dos modos de respuesta (",{"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}," (por defecto) se bloquea hasta el resultado del pipeline y lo devuelve en la respuesta; ",{"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}," devuelve de inmediato un ",{"type":14,"tag":91,"props":392,"children":394},{"className":393},[],[395],{"type":19,"value":396},"202 Accepted",{"type":19,"value":398}," tras poner el evento en una cola duradera (el pipeline se ejecuta después, con reintentos) — elígelo para los proveedores que agotan el tiempo de espera pronto.",{"type":14,"tag":30,"props":400,"children":402},{"id":401},"llamadas-get-opción",[403],{"type":19,"value":404},"Llamadas GET (opción)",{"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},"Por defecto, solo se acepta ",{"type":14,"tag":91,"props":411,"children":413},{"className":412},[],[414],{"type":19,"value":415},"POST",{"type":19,"value":417},": un ",{"type":14,"tag":91,"props":419,"children":421},{"className":420},[],[422],{"type":19,"value":423},"GET",{"type":19,"value":425}," recibe ",{"type":14,"tag":91,"props":427,"children":429},{"className":428},[],[430],{"type":19,"value":431},"405",{"type":19,"value":433},". Para un socio que impone una consulta en ",{"type":14,"tag":91,"props":435,"children":437},{"className":436},[],[438],{"type":19,"value":439},"GET ?action=…",{"type":19,"value":441},", marca ",{"type":14,"tag":22,"props":443,"children":444},{},[445],{"type":19,"value":446},"Aceptar también 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 pasa entonces a ser ",{"type":14,"tag":91,"props":458,"children":460},{"className":459},[],[461],{"type":19,"value":227},{"type":19,"value":463},", con la misma forma que un POST de formulario: el pipeline no necesita saber qué método se ha usado. Un ",{"type":14,"tag":91,"props":465,"children":467},{"className":466},[],[468],{"type":19,"value":423},{"type":19,"value":470}," no lleva body (rechazado con ",{"type":14,"tag":91,"props":472,"children":474},{"className":473},[],[475],{"type":19,"value":476},"400",{"type":19,"value":478},") y no es compatible con la firma HMAC (rechazado con ",{"type":14,"tag":91,"props":480,"children":482},{"className":481},[],[483],{"type":19,"value":431},{"type":19,"value":485}," mientras haya un secreto definido). Un identificador pasado en la query aparece en los registros de acceso: prefiere POST cuando el socio lo permita.",{"type":14,"tag":30,"props":487,"children":489},{"id":488},"seguridad",[490],{"type":19,"value":491},"Seguridad",{"type":14,"tag":37,"props":493,"children":494},{},[495,500,519],{"type":14,"tag":41,"props":496,"children":497},{},[498],{"type":19,"value":499},"Firma tus peticiones (HMAC) en cuanto el endpoint procese algo más que pruebas.",{"type":14,"tag":41,"props":501,"children":502},{},[503,505,510,512,517],{"type":19,"value":504},"El secreto se puede cambiar en cualquier momento en la configuración del receptor (rotación). Una vez guardado, nunca se vuelve a mostrar: el campo indica ",{"type":14,"tag":22,"props":506,"children":507},{},[508],{"type":19,"value":509},"« •••••• guardado — escribe para reemplazar »",{"type":19,"value":511},", y ",{"type":14,"tag":22,"props":513,"children":514},{},[515],{"type":19,"value":516},"Quitar",{"type":19,"value":518}," lo borra (la firma deja entonces de verificarse).",{"type":14,"tag":41,"props":520,"children":521},{},[522],{"type":19,"value":523},"Las cargas útiles se almacenan en texto plano en el historial de ejecuciones — no envíes datos que solo deban estar cifrados en tránsito.",{"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:es:docs:2.canaux:5.webhook.md","content","es\u002Fdocs\u002F2.canaux\u002F5.webhook.md","es\u002Fdocs\u002F2.canaux\u002F5.webhook","md",[540],{"title":541,"_path":542,"children":543},"Es","\u002Fes",[544],{"title":545,"_path":546,"children":547},"Docs","\u002Fes\u002Fdocs",[548,561,587,615,628,643,656,717],{"title":549,"_path":550,"children":551},"Primeros pasos","\u002Fes\u002Fdocs\u002Fdemarrer",[552,555,558],{"title":553,"_path":554},"Bienvenido","\u002Fes\u002Fdocs\u002Fdemarrer\u002Fbienvenue",{"title":556,"_path":557},"Crear una cuenta","\u002Fes\u002Fdocs\u002Fdemarrer\u002Fcreer-un-compte",{"title":559,"_path":560},"Conectar una clave LLM","\u002Fes\u002Fdocs\u002Fdemarrer\u002Fbrancher-llm",{"title":562,"_path":563,"children":564},"Canales","\u002Fes\u002Fdocs\u002Fcanaux",[565,568,571,574,577,578,581,584],{"title":566,"_path":567},"Visión general de los canales","\u002Fes\u002Fdocs\u002Fcanaux\u002Fvue-densemble",{"title":569,"_path":570},"Telefonía en tiempo real","\u002Fes\u002Fdocs\u002Fcanaux\u002Ftelephone",{"title":572,"_path":573},"Email","\u002Fes\u002Fdocs\u002Fcanaux\u002Femail",{"title":575,"_path":576},"Widget de chat web","\u002Fes\u002Fdocs\u002Fcanaux\u002Fchat-widget",{"title":8,"_path":4},{"title":579,"_path":580},"Mensajería (WhatsApp, Messenger, Telegram, Mattermost)","\u002Fes\u002Fdocs\u002Fcanaux\u002Fmessageries",{"title":582,"_path":583},"Meta Lead Ads","\u002Fes\u002Fdocs\u002Fcanaux\u002Ffacebook-leads",{"title":585,"_path":586},"Schedule (cron)","\u002Fes\u002Fdocs\u002Fcanaux\u002Fschedule",{"title":588,"_path":589,"children":590},"Pipelines","\u002Fes\u002Fdocs\u002Fpipelines",[591,594,597,600,603,606,609,612],{"title":592,"_path":593},"El editor visual","\u002Fes\u002Fdocs\u002Fpipelines\u002Fediteur-visuel",{"title":595,"_path":596},"Agentes IA","\u002Fes\u002Fdocs\u002Fpipelines\u002Fagents",{"title":598,"_path":599},"Operadores deterministas","\u002Fes\u002Fdocs\u002Fpipelines\u002Foperateurs",{"title":601,"_path":602},"Control de flujo","\u002Fes\u002Fdocs\u002Fpipelines\u002Fcontrole-flux",{"title":604,"_path":605},"Code Steps","\u002Fes\u002Fdocs\u002Fpipelines\u002Fcode-step",{"title":607,"_path":608},"Sub-pipelines","\u002Fes\u002Fdocs\u002Fpipelines\u002Fsous-pipelines",{"title":610,"_path":611},"Acciones no-code","\u002Fes\u002Fdocs\u002Fpipelines\u002Factions-no-code",{"title":613,"_path":614},"Base de conocimiento","\u002Fes\u002Fdocs\u002Fpipelines\u002Fbase-de-connaissances",{"title":616,"_path":617,"children":618},"Supervisión","\u002Fes\u002Fdocs\u002Fsupervision",[619,622,625],{"title":620,"_path":621},"Historial de ejecuciones","\u002Fes\u002Fdocs\u002Fsupervision\u002Fexecutions",{"title":623,"_path":624},"Créditos y medición","\u002Fes\u002Fdocs\u002Fsupervision\u002Fcredits-metering",{"title":626,"_path":627},"Benchmarks","\u002Fes\u002Fdocs\u002Fsupervision\u002Fbenchmarks",{"title":491,"_path":629,"children":630},"\u002Fes\u002Fdocs\u002Fsecurite",[631,634,637,640],{"title":632,"_path":633},"Principios de seguridad","\u002Fes\u002Fdocs\u002Fsecurite\u002Fprincipes",{"title":635,"_path":636},"Multi-tenancy estricto","\u002Fes\u002Fdocs\u002Fsecurite\u002Fmulti-tenant",{"title":638,"_path":639},"Auditoría RGPD y registro de accesos","\u002Fes\u002Fdocs\u002Fsecurite\u002Faudit-rgpd",{"title":641,"_path":642},"Despliegue soberano","\u002Fes\u002Fdocs\u002Fsecurite\u002Fdeploiement-souverain",{"title":644,"_path":645,"children":646},"Desarrolladores","\u002Fes\u002Fdocs\u002Fdeveloppeurs",[647,650,653],{"title":648,"_path":649},"API de administración","\u002Fes\u002Fdocs\u002Fdeveloppeurs\u002Fapi-admin",{"title":651,"_path":652},"Webhooks salientes","\u002Fes\u002Fdocs\u002Fdeveloppeurs\u002Fwebhooks-sortants",{"title":654,"_path":655},"Pilota betool desde Claude (MCP)","\u002Fes\u002Fdocs\u002Fdeveloppeurs\u002Fmcp",{"title":657,"_path":658,"children":659},"Integraciones","\u002Fes\u002Fdocs\u002Fintegrations",[660,663,666,669,672,675,678,681,684,687,690,693,696,699,702,705,708,711,714],{"title":661,"_path":662},"Visión general de las integraciones","\u002Fes\u002Fdocs\u002Fintegrations\u002Fvue-densemble",{"title":664,"_path":665},"Stripe","\u002Fes\u002Fdocs\u002Fintegrations\u002Fstripe",{"title":667,"_path":668},"GitHub","\u002Fes\u002Fdocs\u002Fintegrations\u002Fgithub",{"title":670,"_path":671},"Google","\u002Fes\u002Fdocs\u002Fintegrations\u002Fgoogle",{"title":673,"_path":674},"LinkedIn Ads","\u002Fes\u002Fdocs\u002Fintegrations\u002Flinkedin-ads",{"title":676,"_path":677},"Kavkom","\u002Fes\u002Fdocs\u002Fintegrations\u002Fkavkom",{"title":679,"_path":680},"Jira","\u002Fes\u002Fdocs\u002Fintegrations\u002Fjira",{"title":682,"_path":683},"Slack","\u002Fes\u002Fdocs\u002Fintegrations\u002Fslack",{"title":685,"_path":686},"SMS","\u002Fes\u002Fdocs\u002Fintegrations\u002Fsms",{"title":688,"_path":689},"Enable Banking (open banking)","\u002Fes\u002Fdocs\u002Fintegrations\u002Fenable-banking",{"title":691,"_path":692},"CRM, marketing y productividad","\u002Fes\u002Fdocs\u002Fintegrations\u002Fcrm-marketing",{"title":694,"_path":695},"HeyGen (vídeo)","\u002Fes\u002Fdocs\u002Fintegrations\u002Fheygen",{"title":697,"_path":698},"La Poste","\u002Fes\u002Fdocs\u002Fintegrations\u002Fla-poste",{"title":700,"_path":701},"CRM de negocio (beTool Application, Qhare)","\u002Fes\u002Fdocs\u002Fintegrations\u002Fcrm-metier",{"title":703,"_path":704},"Mitti (inspecciones de campo)","\u002Fes\u002Fdocs\u002Fintegrations\u002Fmitti",{"title":706,"_path":707},"Meta (Messenger, Páginas, Meta Ads)","\u002Fes\u002Fdocs\u002Fintegrations\u002Fmeta",{"title":709,"_path":710},"Onoff Business (Beta)","\u002Fes\u002Fdocs\u002Fintegrations\u002Fonoff",{"title":712,"_path":713},"Smart Life \u002F Tuya (objetos conectados)","\u002Fes\u002Fdocs\u002Fintegrations\u002Fsmart-life",{"title":715,"_path":716},"Productos beTool (Desktop, Kiosk, Terminal)","\u002Fes\u002Fdocs\u002Fintegrations\u002Fproduits-betool",{"title":718,"_path":719,"children":720},"Casos de uso","\u002Fes\u002Fdocs\u002Fcas-usage",[721,724,727,730,733,736],{"title":722,"_path":723},"Agentes de negocio tipo","\u002Fes\u002Fdocs\u002Fcas-usage\u002Fvue-densemble",{"title":725,"_path":726},"CFO IA","\u002Fes\u002Fdocs\u002Fcas-usage\u002Fcfo-ia",{"title":728,"_path":729},"COO IA","\u002Fes\u002Fdocs\u002Fcas-usage\u002Fcoo-ia",{"title":731,"_path":732},"CTO IA","\u002Fes\u002Fdocs\u002Fcas-usage\u002Fcto-ia",{"title":734,"_path":735},"Product Manager IA","\u002Fes\u002Fdocs\u002Fcas-usage\u002Fproduct-manager-ia",{"title":737,"_path":738},"Asistente personal","\u002Fes\u002Fdocs\u002Fcas-usage\u002Fassistant-personnel"]