[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"doc-\u002Fen\u002Fdocs\u002Fpipelines\u002Foperateurs":3,"docs-nav-en":1354},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"body":10,"_type":1348,"_id":1349,"_source":1350,"_file":1351,"_stem":1352,"_extension":1353},"\u002Fen\u002Fdocs\u002Fpipelines\u002Foperateurs","pipelines",false,"","Deterministic Operators","Action nodes that bypass the LLM — HTTP, DB, transformations, computations.",{"type":11,"children":12,"toc":1324},"root",[13,36,43,55,60,66,80,85,198,216,264,273,278,343,355,390,528,585,637,660,669,674,797,803,858,867,886,926,935,971,976,981,1013,1025,1034,1060,1066,1085,1090,1152,1165,1213,1254,1259,1265,1270,1298],{"type":14,"tag":15,"props":16,"children":17},"element","p",{},[18,21,27,29,34],{"type":19,"value":20},"text","An ",{"type":14,"tag":22,"props":23,"children":24},"strong",{},[25],{"type":19,"value":26},"operator",{"type":19,"value":28}," is a node that executes a ",{"type":14,"tag":22,"props":30,"children":31},{},[32],{"type":19,"value":33},"deterministic",{"type":19,"value":35}," action: no LLM, no randomness. For any given input, the output is predictable.",{"type":14,"tag":37,"props":38,"children":40},"h2",{"id":39},"why-use-them",[41],{"type":19,"value":42},"Why use them",{"type":14,"tag":15,"props":44,"children":45},{},[46,48,53],{"type":19,"value":47},"Any logic that can be written explicitly ",{"type":14,"tag":22,"props":49,"children":50},{},[51],{"type":19,"value":52},"should",{"type":19,"value":54}," be. An LLM that \"computes a total\" or \"formats a date\" is an anti-pattern: it is slower, more expensive, and can make mistakes.",{"type":14,"tag":15,"props":56,"children":57},{},[58],{"type":19,"value":59},"Practical rule: if you can write the function in 5 lines of Python, it is an operator — not an agent.",{"type":14,"tag":37,"props":61,"children":63},{"id":62},"available-types",[64],{"type":19,"value":65},"Available types",{"type":14,"tag":67,"props":68,"children":70},"h3",{"id":69},"webhook_action-http-call",[71,78],{"type":14,"tag":72,"props":73,"children":75},"code",{"className":74},[],[76],{"type":19,"value":77},"webhook_action",{"type":19,"value":79}," (HTTP call)",{"type":14,"tag":15,"props":81,"children":82},{},[83],{"type":19,"value":84},"Makes an outbound HTTP call. Configuration:",{"type":14,"tag":86,"props":87,"children":88},"ul",{},[89,95,145,180,193],{"type":14,"tag":90,"props":91,"children":92},"li",{},[93],{"type":19,"value":94},"URL, method, headers and query parameters (with placeholders from context)",{"type":14,"tag":90,"props":96,"children":97},{},[98,100,106,108,114,115,121,122,128,129,135,137,143],{"type":19,"value":99},"Body: ",{"type":14,"tag":72,"props":101,"children":103},{"className":102},[],[104],{"type":19,"value":105},"none",{"type":19,"value":107},", ",{"type":14,"tag":72,"props":109,"children":111},{"className":110},[],[112],{"type":19,"value":113},"json",{"type":19,"value":107},{"type":14,"tag":72,"props":116,"children":118},{"className":117},[],[119],{"type":19,"value":120},"form",{"type":19,"value":107},{"type":14,"tag":72,"props":123,"children":125},{"className":124},[],[126],{"type":19,"value":127},"raw",{"type":19,"value":107},{"type":14,"tag":72,"props":130,"children":132},{"className":131},[],[133],{"type":19,"value":134},"multipart",{"type":19,"value":136},", or ",{"type":14,"tag":72,"props":138,"children":140},{"className":139},[],[141],{"type":19,"value":142},"mapper",{"type":19,"value":144}," (body composed by the mapping language, see below)",{"type":14,"tag":90,"props":146,"children":147},{},[148,150,156,157,163,164,170,172,178],{"type":19,"value":149},"Authentication: ",{"type":14,"tag":72,"props":151,"children":153},{"className":152},[],[154],{"type":19,"value":155},"bearer",{"type":19,"value":107},{"type":14,"tag":72,"props":158,"children":160},{"className":159},[],[161],{"type":19,"value":162},"basic",{"type":19,"value":107},{"type":14,"tag":72,"props":165,"children":167},{"className":166},[],[168],{"type":19,"value":169},"api_key_header",{"type":19,"value":171}," (custom header), or ",{"type":14,"tag":72,"props":173,"children":175},{"className":174},[],[176],{"type":19,"value":177},"oauth2",{"type":19,"value":179}," (see below)",{"type":14,"tag":90,"props":181,"children":182},{},[183,185,191],{"type":19,"value":184},"Accepted HTTP statuses, maximum timeout, and number of retries (",{"type":14,"tag":72,"props":186,"children":188},{"className":187},[],[189],{"type":19,"value":190},"retry_count",{"type":19,"value":192},", 0 by default, exponential backoff)",{"type":14,"tag":90,"props":194,"children":195},{},[196],{"type":19,"value":197},"Output key where the response is published",{"type":14,"tag":67,"props":199,"children":201},{"id":200},"database_query-database_manage",[202,208,210],{"type":14,"tag":72,"props":203,"children":205},{"className":204},[],[206],{"type":19,"value":207},"database_query",{"type":19,"value":209}," \u002F ",{"type":14,"tag":72,"props":211,"children":213},{"className":212},[],[214],{"type":19,"value":215},"database_manage",{"type":14,"tag":15,"props":217,"children":218},{},[219,224,226,231,233,239,241,246,248,254,256,262],{"type":14,"tag":72,"props":220,"children":222},{"className":221},[],[223],{"type":19,"value":207},{"type":19,"value":225}," reads rows from a betool no-code database or from an external database (Postgres, MySQL, MongoDB) registered in ",{"type":14,"tag":22,"props":227,"children":228},{},[229],{"type":19,"value":230},"Applications → Databases → Connections",{"type":19,"value":232},": ",{"type":14,"tag":72,"props":234,"children":236},{"className":235},[],[237],{"type":19,"value":238},"where",{"type":19,"value":240}," filter, full-text search, limit. ",{"type":14,"tag":72,"props":242,"children":244},{"className":243},[],[245],{"type":19,"value":215},{"type":19,"value":247}," writes to it (",{"type":14,"tag":72,"props":249,"children":251},{"className":250},[],[252],{"type":19,"value":253},"create",{"type":19,"value":255}," or ",{"type":14,"tag":72,"props":257,"children":259},{"className":258},[],[260],{"type":19,"value":261},"update",{"type":19,"value":263},"), the content being composed by the mapping language.",{"type":14,"tag":67,"props":265,"children":267},{"id":266},"file_transform",[268],{"type":14,"tag":72,"props":269,"children":271},{"className":270},[],[272],{"type":19,"value":266},{"type":14,"tag":15,"props":274,"children":275},{},[276],{"type":19,"value":277},"Transforms a file. Built-in transformers:",{"type":14,"tag":86,"props":279,"children":280},{},[281,292,303,314,332],{"type":14,"tag":90,"props":282,"children":283},{},[284,290],{"type":14,"tag":72,"props":285,"children":287},{"className":286},[],[288],{"type":19,"value":289},"pdf_extract_text",{"type":19,"value":291}," — selectable text from a PDF (no OCR: a scanned PDF yields no text)",{"type":14,"tag":90,"props":293,"children":294},{},[295,301],{"type":14,"tag":72,"props":296,"children":298},{"className":297},[],[299],{"type":19,"value":300},"pdf_split",{"type":19,"value":302}," — splitting a PDF",{"type":14,"tag":90,"props":304,"children":305},{},[306,312],{"type":14,"tag":72,"props":307,"children":309},{"className":308},[],[310],{"type":19,"value":311},"pdf_to_images",{"type":19,"value":313}," — rendering a PDF's pages as images",{"type":14,"tag":90,"props":315,"children":316},{},[317,323,324,330],{"type":14,"tag":72,"props":318,"children":320},{"className":319},[],[321],{"type":19,"value":322},"xlsx_to_json",{"type":19,"value":209},{"type":14,"tag":72,"props":325,"children":327},{"className":326},[],[328],{"type":19,"value":329},"xls_to_json",{"type":19,"value":331}," — reading an Excel workbook as JSON rows",{"type":14,"tag":90,"props":333,"children":334},{},[335,341],{"type":14,"tag":72,"props":336,"children":338},{"className":337},[],[339],{"type":19,"value":340},"unzip",{"type":19,"value":342}," — extracting an archive",{"type":14,"tag":67,"props":344,"children":346},{"id":345},"file_link-download-links",[347,353],{"type":14,"tag":72,"props":348,"children":350},{"className":349},[],[351],{"type":19,"value":352},"file_link",{"type":19,"value":354}," (download links)",{"type":14,"tag":15,"props":356,"children":357},{},[358,360,365,367,372,374,379,381,388],{"type":19,"value":359},"Delivers files to a third party ",{"type":14,"tag":22,"props":361,"children":362},{},[363],{"type":19,"value":364},"by link",{"type":19,"value":366},", without putting their content into the flow: for each file in a list from the context (the files of a download, received attachments, the photos of an inspection…), the ",{"type":14,"tag":22,"props":368,"children":369},{},[370],{"type":19,"value":371},"Download links",{"type":19,"value":373}," node produces a ",{"type":14,"tag":22,"props":375,"children":376},{},[377],{"type":19,"value":378},"signed download link",{"type":19,"value":380}," with a limited lifetime. A following step composes what the recipient receives: response of an ",{"type":14,"tag":382,"props":383,"children":385},"a",{"href":384},"\u002Fen\u002Fdocs\u002Fcanaux\u002Fwebhook",[386],{"type":19,"value":387},"inbound webhook",{"type":19,"value":389},", email…",{"type":14,"tag":391,"props":392,"children":393},"table",{},[394,413],{"type":14,"tag":395,"props":396,"children":397},"thead",{},[398],{"type":14,"tag":399,"props":400,"children":401},"tr",{},[402,408],{"type":14,"tag":403,"props":404,"children":405},"th",{},[406],{"type":19,"value":407},"Setting",{"type":14,"tag":403,"props":409,"children":410},{},[411],{"type":19,"value":412},"Role",{"type":14,"tag":414,"props":415,"children":416},"tbody",{},[417,447,467,480,500],{"type":14,"tag":399,"props":418,"children":419},{},[420,434],{"type":14,"tag":421,"props":422,"children":423},"td",{},[424,426,432],{"type":19,"value":425},"List of files to link (",{"type":14,"tag":72,"props":427,"children":429},{"className":428},[],[430],{"type":19,"value":431},"input_path",{"type":19,"value":433},")",{"type":14,"tag":421,"props":435,"children":436},{},[437,439,445],{"type":19,"value":438},"Where to read the list in the flow — each entry carries ",{"type":14,"tag":72,"props":440,"children":442},{"className":441},[],[443],{"type":19,"value":444},"path",{"type":19,"value":446}," (the file's key in the organisation's storage) and optionally a file name. Required.",{"type":14,"tag":399,"props":448,"children":449},{},[450,462],{"type":14,"tag":421,"props":451,"children":452},{},[453,455,461],{"type":19,"value":454},"Allowed sub-folders (",{"type":14,"tag":72,"props":456,"children":458},{"className":457},[],[459],{"type":19,"value":460},"path_scope",{"type":19,"value":433},{"type":14,"tag":421,"props":463,"children":464},{},[465],{"type":19,"value":466},"Optional: restricts the signable files to certain sub-folders of the organisation's storage.",{"type":14,"tag":399,"props":468,"children":469},{},[470,475],{"type":14,"tag":421,"props":471,"children":472},{},[473],{"type":19,"value":474},"Link lifetime",{"type":14,"tag":421,"props":476,"children":477},{},[478],{"type":19,"value":479},"15 minutes by default, from 1 minute to 24 hours.",{"type":14,"tag":399,"props":481,"children":482},{},[483,495],{"type":14,"tag":421,"props":484,"children":485},{},[486,488,494],{"type":19,"value":487},"Maximum number of files (",{"type":14,"tag":72,"props":489,"children":491},{"className":490},[],[492],{"type":19,"value":493},"max_files",{"type":19,"value":433},{"type":14,"tag":421,"props":496,"children":497},{},[498],{"type":19,"value":499},"20 by default, 100 at most.",{"type":14,"tag":399,"props":501,"children":502},{},[503,515],{"type":14,"tag":421,"props":504,"children":505},{},[506,508,514],{"type":19,"value":507},"Output key (",{"type":14,"tag":72,"props":509,"children":511},{"className":510},[],[512],{"type":19,"value":513},"output_key",{"type":19,"value":433},{"type":14,"tag":421,"props":516,"children":517},{},[518,520,526],{"type":19,"value":519},"Default ",{"type":14,"tag":72,"props":521,"children":523},{"className":522},[],[524],{"type":19,"value":525},"linked.files",{"type":19,"value":527},".",{"type":14,"tag":15,"props":529,"children":530},{},[531,533,539,541,547,549,555,557,563,564,570,571,577,578,584],{"type":19,"value":532},"The output contains ",{"type":14,"tag":72,"props":534,"children":536},{"className":535},[],[537],{"type":19,"value":538},"files",{"type":19,"value":540}," (each original entry, enriched with ",{"type":14,"tag":72,"props":542,"children":544},{"className":543},[],[545],{"type":19,"value":546},"url",{"type":19,"value":548}," and ",{"type":14,"tag":72,"props":550,"children":552},{"className":551},[],[553],{"type":19,"value":554},"expires_at",{"type":19,"value":556},"), ",{"type":14,"tag":72,"props":558,"children":560},{"className":559},[],[561],{"type":19,"value":562},"file_count",{"type":19,"value":107},{"type":14,"tag":72,"props":565,"children":567},{"className":566},[],[568],{"type":19,"value":569},"failed",{"type":19,"value":107},{"type":14,"tag":72,"props":572,"children":574},{"className":573},[],[575],{"type":19,"value":576},"requested",{"type":19,"value":548},{"type":14,"tag":72,"props":579,"children":581},{"className":580},[],[582],{"type":19,"value":583},"ttl_seconds",{"type":19,"value":527},{"type":14,"tag":86,"props":586,"children":587},{},[588,598,608,625],{"type":14,"tag":90,"props":589,"children":590},{},[591,596],{"type":14,"tag":22,"props":592,"children":593},{},[594],{"type":19,"value":595},"Never outside your organisation",{"type":19,"value":597},": a file outside its storage is refused.",{"type":14,"tag":90,"props":599,"children":600},{},[601,606],{"type":14,"tag":22,"props":602,"children":603},{},[604],{"type":19,"value":605},"Existence checked before signing",{"type":19,"value":607},": a missing file is never signed.",{"type":14,"tag":90,"props":609,"children":610},{},[611,616,618,623],{"type":14,"tag":22,"props":612,"children":613},{},[614],{"type":19,"value":615},"Nothing omitted",{"type":19,"value":617},": a file that is not linked (out of scope, not found, beyond the cap, signing impossible) appears in ",{"type":14,"tag":72,"props":619,"children":621},{"className":620},[],[622],{"type":19,"value":569},{"type":19,"value":624}," with its reason.",{"type":14,"tag":90,"props":626,"children":627},{},[628,630,635],{"type":19,"value":629},"Links are ",{"type":14,"tag":22,"props":631,"children":632},{},[633],{"type":19,"value":634},"recreated on every execution",{"type":19,"value":636},", and every link issued is logged.",{"type":14,"tag":638,"props":639,"children":641},"alert",{"type":640},"warning",[642],{"type":14,"tag":15,"props":643,"children":644},{},[645,647,651,653,658],{"type":19,"value":646},"The link is a ",{"type":14,"tag":22,"props":648,"children":649},{},[650],{"type":19,"value":155},{"type":19,"value":652}," link: whoever holds it downloads the file until it expires. Keep the lifetime short, and fill in the ",{"type":14,"tag":22,"props":654,"children":655},{},[656],{"type":19,"value":657},"allowed sub-folders",{"type":19,"value":659}," as soon as the list comes from modifiable data (a table row) — otherwise anyone who can write that data could get a link signed to any file of the organisation.",{"type":14,"tag":67,"props":661,"children":663},{"id":662},"compute",[664],{"type":14,"tag":72,"props":665,"children":667},{"className":666},[],[668],{"type":19,"value":662},{"type":14,"tag":15,"props":670,"children":671},{},[672],{"type":19,"value":673},"Deterministic computations on context data. Built-in operations:",{"type":14,"tag":86,"props":675,"children":676},{},[677,709,720,731,742,753,764,775,786],{"type":14,"tag":90,"props":678,"children":679},{},[680,686,688,694,695,701,702,708],{"type":14,"tag":72,"props":681,"children":683},{"className":682},[],[684],{"type":19,"value":685},"column_stats",{"type":19,"value":687}," — per column of a list of rows, how many equal a given value (",{"type":14,"tag":72,"props":689,"children":691},{"className":690},[],[692],{"type":19,"value":693},"count",{"type":19,"value":107},{"type":14,"tag":72,"props":696,"children":698},{"className":697},[],[699],{"type":19,"value":700},"total",{"type":19,"value":107},{"type":14,"tag":72,"props":703,"children":705},{"className":704},[],[706],{"type":19,"value":707},"pct",{"type":19,"value":433},{"type":14,"tag":90,"props":710,"children":711},{},[712,718],{"type":14,"tag":72,"props":713,"children":715},{"className":714},[],[716],{"type":19,"value":717},"compose_text",{"type":19,"value":719}," — composing a text from a template and flow values",{"type":14,"tag":90,"props":721,"children":722},{},[723,729],{"type":14,"tag":72,"props":724,"children":726},{"className":725},[],[727],{"type":19,"value":728},"regex_extract",{"type":19,"value":730}," — extracting values with a regular expression",{"type":14,"tag":90,"props":732,"children":733},{},[734,740],{"type":14,"tag":72,"props":735,"children":737},{"className":736},[],[738],{"type":19,"value":739},"select_by_substring",{"type":19,"value":741}," — splitting a list into groups according to \"contains \u002F does not contain\" predicates",{"type":14,"tag":90,"props":743,"children":744},{},[745,751],{"type":14,"tag":72,"props":746,"children":748},{"className":747},[],[749],{"type":19,"value":750},"list_compare",{"type":19,"value":752}," — consistency of several lists by pivot key",{"type":14,"tag":90,"props":754,"children":755},{},[756,762],{"type":14,"tag":72,"props":757,"children":759},{"className":758},[],[760],{"type":19,"value":761},"multi_source_compliance",{"type":19,"value":763}," — multi-dimension, multi-source compliance audit",{"type":14,"tag":90,"props":765,"children":766},{},[767,773],{"type":14,"tag":72,"props":768,"children":770},{"className":769},[],[771],{"type":19,"value":772},"contact_extract",{"type":19,"value":774}," — email addresses and phone numbers found in a text, with their origin",{"type":14,"tag":90,"props":776,"children":777},{},[778,784],{"type":14,"tag":72,"props":779,"children":781},{"className":780},[],[782],{"type":19,"value":783},"free_slots",{"type":19,"value":785}," — free time slots derived from busy periods",{"type":14,"tag":90,"props":787,"children":788},{},[789,795],{"type":14,"tag":72,"props":790,"children":792},{"className":791},[],[793],{"type":19,"value":794},"url_expand",{"type":19,"value":796}," — composing URLs from bases and paths",{"type":14,"tag":67,"props":798,"children":800},{"id":799},"mapping-language",[801],{"type":19,"value":802},"Mapping language",{"type":14,"tag":15,"props":804,"children":805},{},[806,808,814,815,821,822,828,830,835,837,842,844,849,851,857],{"type":19,"value":807},"This is not a node: it is the language that composes an output payload from context data (functions ",{"type":14,"tag":72,"props":809,"children":811},{"className":810},[],[812],{"type":19,"value":813},"$now",{"type":19,"value":107},{"type":14,"tag":72,"props":816,"children":818},{"className":817},[],[819],{"type":19,"value":820},"$uuid",{"type":19,"value":107},{"type":14,"tag":72,"props":823,"children":825},{"className":824},[],[826],{"type":19,"value":827},"$concat",{"type":19,"value":829},"…). It is used by the ",{"type":14,"tag":72,"props":831,"children":833},{"className":832},[],[834],{"type":19,"value":142},{"type":19,"value":836}," body of ",{"type":14,"tag":72,"props":838,"children":840},{"className":839},[],[841],{"type":19,"value":77},{"type":19,"value":843},", the content written by ",{"type":14,"tag":72,"props":845,"children":847},{"className":846},[],[848],{"type":19,"value":215},{"type":19,"value":850}," and the variables of an outbound ",{"type":14,"tag":72,"props":852,"children":854},{"className":853},[],[855],{"type":19,"value":856},"phone_call",{"type":19,"value":527},{"type":14,"tag":67,"props":859,"children":861},{"id":860},"data_to_file",[862],{"type":14,"tag":72,"props":863,"children":865},{"className":864},[],[866],{"type":19,"value":860},{"type":14,"tag":15,"props":868,"children":869},{},[870,872,884],{"type":19,"value":871},"Produces an ",{"type":14,"tag":22,"props":873,"children":874},{},[875,877,883],{"type":19,"value":876},"Excel file (",{"type":14,"tag":72,"props":878,"children":880},{"className":879},[],[881],{"type":19,"value":882},".xlsx",{"type":19,"value":433},{"type":19,"value":885}," from context data — a list of rows, a grid, or several lists (one sheet each). Options: file name (templatable), sheet name, choice and order of columns, header row. The file is stored in your organisation's storage, ready to be sent by email or dropped on a Drive.",{"type":14,"tag":15,"props":887,"children":888},{},[889,891,897,898,904,905,911,912,918,920,924],{"type":19,"value":890},"For security, cells starting with ",{"type":14,"tag":72,"props":892,"children":894},{"className":893},[],[895],{"type":19,"value":896},"=",{"type":19,"value":107},{"type":14,"tag":72,"props":899,"children":901},{"className":900},[],[902],{"type":19,"value":903},"+",{"type":19,"value":107},{"type":14,"tag":72,"props":906,"children":908},{"className":907},[],[909],{"type":19,"value":910},"-",{"type":19,"value":255},{"type":14,"tag":72,"props":913,"children":915},{"className":914},[],[916],{"type":19,"value":917},"@",{"type":19,"value":919}," are written as ",{"type":14,"tag":22,"props":921,"children":922},{},[923],{"type":19,"value":19},{"type":19,"value":925}," by default (no formula injected). When Excel's limits require cutting, the file is flagged as truncated.",{"type":14,"tag":67,"props":927,"children":929},{"id":928},"web_fetch",[930],{"type":14,"tag":72,"props":931,"children":933},{"className":932},[],[934],{"type":19,"value":928},{"type":14,"tag":15,"props":936,"children":937},{},[938,940,945,947,953,955,961,963,969],{"type":19,"value":939},"Reads one or more ",{"type":14,"tag":22,"props":941,"children":942},{},[943],{"type":19,"value":944},"web pages",{"type":19,"value":946}," and publishes their readable text in the context (default ",{"type":14,"tag":72,"props":948,"children":950},{"className":949},[],[951],{"type":19,"value":952},"web.pages",{"type":19,"value":954},"). Settings: number of pages, concurrency, timeout, maximum size. The ",{"type":14,"tag":72,"props":956,"children":958},{"className":957},[],[959],{"type":19,"value":960},"robots.txt",{"type":19,"value":962}," verdict is always computed and reported; it is only enforced if you enable it (",{"type":14,"tag":72,"props":964,"children":966},{"className":965},[],[967],{"type":19,"value":968},"respect_robots",{"type":19,"value":970},").",{"type":14,"tag":15,"props":972,"children":973},{},[974],{"type":19,"value":975},"Pages rendered only by JavaScript are not executed: only the served HTML is read. A failed page is reported in the result, without failing the pipeline.",{"type":14,"tag":15,"props":977,"children":978},{},[979],{"type":19,"value":980},"On the agent side, two equivalent tools:",{"type":14,"tag":86,"props":982,"children":983},{},[984,995],{"type":14,"tag":90,"props":985,"children":986},{},[987,993],{"type":14,"tag":72,"props":988,"children":990},{"className":989},[],[991],{"type":19,"value":992},"web_scrape.fetch_page",{"type":19,"value":994}," — reads a page (title, text, email and phone links found).",{"type":14,"tag":90,"props":996,"children":997},{},[998,1004,1006,1011],{"type":14,"tag":72,"props":999,"children":1001},{"className":1000},[],[1002],{"type":19,"value":1003},"web_search.search",{"type":19,"value":1005}," — ",{"type":14,"tag":22,"props":1007,"children":1008},{},[1009],{"type":19,"value":1010},"web search",{"type":19,"value":1012}," via a SearXNG engine self-hosted by the platform: up to 5 results (title, URL, snippet).",{"type":14,"tag":15,"props":1014,"children":1015},{},[1016,1018,1023],{"type":19,"value":1017},"All web reads go through the same ",{"type":14,"tag":22,"props":1019,"children":1020},{},[1021],{"type":19,"value":1022},"anti-SSRF",{"type":19,"value":1024}," protection: internal, private and cloud metadata addresses are refused after DNS resolution, and redirects are re-checked at each hop.",{"type":14,"tag":67,"props":1026,"children":1028},{"id":1027},"code_step",[1029],{"type":14,"tag":72,"props":1030,"children":1032},{"className":1031},[],[1033],{"type":19,"value":1027},{"type":14,"tag":15,"props":1035,"children":1036},{},[1037,1039,1044,1046,1051,1053,1059],{"type":19,"value":1038},"When deterministic logic exceeds what ",{"type":14,"tag":72,"props":1040,"children":1042},{"className":1041},[],[1043],{"type":19,"value":662},{"type":19,"value":1045}," can handle, a ",{"type":14,"tag":22,"props":1047,"children":1048},{},[1049],{"type":19,"value":1050},"code step",{"type":19,"value":1052}," executes custom code in a Starlark sandbox — editable directly, run as soon as it is saved, and bounded by a tool allowlist. See ",{"type":14,"tag":382,"props":1054,"children":1056},{"href":1055},"\u002Fen\u002Fdocs\u002Fpipelines\u002Fcode-step",[1057],{"type":19,"value":1058},"Code steps",{"type":19,"value":527},{"type":14,"tag":37,"props":1061,"children":1063},{"id":1062},"authentication-secrets",[1064],{"type":19,"value":1065},"Authentication & secrets",{"type":14,"tag":15,"props":1067,"children":1068},{},[1069,1071,1076,1078,1083],{"type":19,"value":1070},"Operators that communicate with an external system (HTTP, DB) reference an ",{"type":14,"tag":22,"props":1072,"children":1073},{},[1074],{"type":19,"value":1075},"account",{"type":19,"value":1077}," registered within the organisation. Credentials are ",{"type":14,"tag":22,"props":1079,"children":1080},{},[1081],{"type":19,"value":1082},"never",{"type":19,"value":1084}," visible inside the pipeline itself — only an account name is referenced.",{"type":14,"tag":15,"props":1086,"children":1087},{},[1088],{"type":19,"value":1089},"As a result, rotating a password requires no edits to any pipeline.",{"type":14,"tag":15,"props":1091,"children":1092},{},[1093,1095,1100,1102,1107,1109,1114,1116,1121,1123,1128,1130,1135,1137,1143,1145,1151],{"type":19,"value":1094},"When a secret is entered directly in a node (",{"type":14,"tag":72,"props":1096,"children":1098},{"className":1097},[],[1099],{"type":19,"value":155},{"type":19,"value":1101}," token, ",{"type":14,"tag":72,"props":1103,"children":1105},{"className":1104},[],[1106],{"type":19,"value":162},{"type":19,"value":1108}," password or ",{"type":14,"tag":72,"props":1110,"children":1112},{"className":1111},[],[1113],{"type":19,"value":169},{"type":19,"value":1115}," value of ",{"type":14,"tag":72,"props":1117,"children":1119},{"className":1118},[],[1120],{"type":19,"value":77},{"type":19,"value":1122},", password of an encrypted PDF or archive for ",{"type":14,"tag":72,"props":1124,"children":1126},{"className":1125},[],[1127],{"type":19,"value":266},{"type":19,"value":1129},"), it is ",{"type":14,"tag":22,"props":1131,"children":1132},{},[1133],{"type":19,"value":1134},"masked",{"type":19,"value":1136}," as soon as it is saved: the editor, the API and the MCP tools only show a marker. See ",{"type":14,"tag":382,"props":1138,"children":1140},{"href":1139},"\u002Fen\u002Fdocs\u002Fpipelines\u002Fediteur-visuel",[1141],{"type":19,"value":1142},"The visual editor",{"type":19,"value":1144},", section ",{"type":14,"tag":1146,"props":1147,"children":1148},"em",{},[1149],{"type":19,"value":1150},"Secrets",{"type":19,"value":527},{"type":14,"tag":67,"props":1153,"children":1155},{"id":1154},"outbound-oauth2-client_credentials",[1156,1158,1164],{"type":19,"value":1157},"Outbound OAuth2 (",{"type":14,"tag":72,"props":1159,"children":1161},{"className":1160},[],[1162],{"type":19,"value":1163},"client_credentials",{"type":19,"value":433},{"type":14,"tag":15,"props":1166,"children":1167},{},[1168,1170,1175,1177,1182,1184,1190,1191,1197,1198,1204,1205,1211],{"type":19,"value":1169},"For APIs that require an OAuth2 token (enterprise cloud, ERP, third-party providers), the HTTP operator supports ",{"type":14,"tag":72,"props":1171,"children":1173},{"className":1172},[],[1174],{"type":19,"value":177},{"type":19,"value":1176}," mode. You register an ",{"type":14,"tag":22,"props":1178,"children":1179},{},[1180],{"type":19,"value":1181},"OAuth2 credential",{"type":19,"value":1183}," in the organisation — ",{"type":14,"tag":72,"props":1185,"children":1187},{"className":1186},[],[1188],{"type":19,"value":1189},"token_url",{"type":19,"value":107},{"type":14,"tag":72,"props":1192,"children":1194},{"className":1193},[],[1195],{"type":19,"value":1196},"client_id",{"type":19,"value":107},{"type":14,"tag":72,"props":1199,"children":1201},{"className":1200},[],[1202],{"type":19,"value":1203},"client_secret",{"type":19,"value":107},{"type":14,"tag":72,"props":1206,"children":1208},{"className":1207},[],[1209],{"type":19,"value":1210},"scope",{"type":19,"value":1212}," — and the node references only a non-sensitive identifier.",{"type":14,"tag":15,"props":1214,"children":1215},{},[1216,1218,1223,1225,1230,1232,1236,1238,1244,1246,1252],{"type":19,"value":1217},"At call time, betool obtains a token and reuses it as long as it remains valid; it ",{"type":14,"tag":22,"props":1219,"children":1220},{},[1221],{"type":19,"value":1222},"lazily refreshes",{"type":19,"value":1224}," it on expiry, with no background task. The ",{"type":14,"tag":72,"props":1226,"children":1228},{"className":1227},[],[1229],{"type":19,"value":1203},{"type":19,"value":1231}," is ",{"type":14,"tag":22,"props":1233,"children":1234},{},[1235],{"type":19,"value":1082},{"type":19,"value":1237}," returned by the administration API (only a ",{"type":14,"tag":72,"props":1239,"children":1241},{"className":1240},[],[1242],{"type":19,"value":1243},"has_secret",{"type":19,"value":1245}," indicator is exposed), and the obtained token is placed as ",{"type":14,"tag":72,"props":1247,"children":1249},{"className":1248},[],[1250],{"type":19,"value":1251},"Authorization: Bearer …",{"type":19,"value":1253}," on the outbound request.",{"type":14,"tag":15,"props":1255,"children":1256},{},[1257],{"type":19,"value":1258},"Rotating the secret after a provider-side rotation requires no pipeline edits: the next call refreshes automatically.",{"type":14,"tag":37,"props":1260,"children":1262},{"id":1261},"idempotency",[1263],{"type":19,"value":1264},"Idempotency",{"type":14,"tag":15,"props":1266,"children":1267},{},[1268],{"type":19,"value":1269},"Any operator that produces a side effect (HTTP POST, DB INSERT, email send) must be designed for idempotency on the target side. Recommended practice:",{"type":14,"tag":86,"props":1271,"children":1272},{},[1273,1293],{"type":14,"tag":90,"props":1274,"children":1275},{},[1276,1278,1284,1286,1292],{"type":19,"value":1277},"Include an ",{"type":14,"tag":72,"props":1279,"children":1281},{"className":1280},[],[1282],{"type":19,"value":1283},"idempotency_key",{"type":19,"value":1285}," in the payload (typically ",{"type":14,"tag":72,"props":1287,"children":1289},{"className":1288},[],[1290],{"type":19,"value":1291},"exchange_id",{"type":19,"value":970},{"type":14,"tag":90,"props":1294,"children":1295},{},[1296],{"type":19,"value":1297},"Check on the target side whether the key has already been processed.",{"type":14,"tag":15,"props":1299,"children":1300},{},[1301,1303,1308,1310,1315,1317,1322],{"type":19,"value":1302},"Apart from the retries you explicitly configure on ",{"type":14,"tag":72,"props":1304,"children":1306},{"className":1305},[],[1307],{"type":19,"value":77},{"type":19,"value":1309}," (",{"type":14,"tag":72,"props":1311,"children":1313},{"className":1312},[],[1314],{"type":19,"value":190},{"type":19,"value":1316},"), betool does not automatically retry a failed operator: it is your pipeline's responsibility to orchestrate the retry strategy. ",{"type":14,"tag":72,"props":1318,"children":1320},{"className":1319},[],[1321],{"type":19,"value":77},{"type":19,"value":1323}," is also protected against double sending during an internal re-dispatch: a request already delivered with an accepted status is not sent again.",{"title":7,"searchDepth":1325,"depth":1325,"links":1326},2,[1327,1328,1343,1347],{"id":39,"depth":1325,"text":42},{"id":62,"depth":1325,"text":65,"children":1329},[1330,1333,1335,1336,1338,1339,1340,1341,1342],{"id":69,"depth":1331,"text":1332},3,"webhook_action (HTTP call)",{"id":200,"depth":1331,"text":1334},"database_query \u002F database_manage",{"id":266,"depth":1331,"text":266},{"id":345,"depth":1331,"text":1337},"file_link (download links)",{"id":662,"depth":1331,"text":662},{"id":799,"depth":1331,"text":802},{"id":860,"depth":1331,"text":860},{"id":928,"depth":1331,"text":928},{"id":1027,"depth":1331,"text":1027},{"id":1062,"depth":1325,"text":1065,"children":1344},[1345],{"id":1154,"depth":1331,"text":1346},"Outbound OAuth2 (client_credentials)",{"id":1261,"depth":1325,"text":1264},"markdown","content:en:docs:3.pipelines:3.operateurs.md","content","en\u002Fdocs\u002F3.pipelines\u002F3.operateurs.md","en\u002Fdocs\u002F3.pipelines\u002F3.operateurs","md",[1355],{"title":1356,"_path":1357,"children":1358},"En","\u002Fen",[1359],{"title":1360,"_path":1361,"children":1362},"Docs","\u002Fen\u002Fdocs",[1363,1376,1403,1427,1440,1456,1469,1530],{"title":1364,"_path":1365,"children":1366},"Getting started","\u002Fen\u002Fdocs\u002Fdemarrer",[1367,1370,1373],{"title":1368,"_path":1369},"Welcome","\u002Fen\u002Fdocs\u002Fdemarrer\u002Fbienvenue",{"title":1371,"_path":1372},"Create an account","\u002Fen\u002Fdocs\u002Fdemarrer\u002Fcreer-un-compte",{"title":1374,"_path":1375},"Connect an LLM key","\u002Fen\u002Fdocs\u002Fdemarrer\u002Fbrancher-llm",{"title":1377,"_path":1378,"children":1379},"Channels","\u002Fen\u002Fdocs\u002Fcanaux",[1380,1383,1386,1389,1392,1394,1397,1400],{"title":1381,"_path":1382},"Channels overview","\u002Fen\u002Fdocs\u002Fcanaux\u002Fvue-densemble",{"title":1384,"_path":1385},"Real-time telephony","\u002Fen\u002Fdocs\u002Fcanaux\u002Ftelephone",{"title":1387,"_path":1388},"Email","\u002Fen\u002Fdocs\u002Fcanaux\u002Femail",{"title":1390,"_path":1391},"Web chat widget","\u002Fen\u002Fdocs\u002Fcanaux\u002Fchat-widget",{"title":1393,"_path":384},"HTTP Webhook",{"title":1395,"_path":1396},"Messaging (WhatsApp, Messenger, Telegram, Mattermost)","\u002Fen\u002Fdocs\u002Fcanaux\u002Fmessageries",{"title":1398,"_path":1399},"Meta Lead Ads","\u002Fen\u002Fdocs\u002Fcanaux\u002Ffacebook-leads",{"title":1401,"_path":1402},"Schedule (cron)","\u002Fen\u002Fdocs\u002Fcanaux\u002Fschedule",{"title":1404,"_path":1405,"children":1406},"Pipelines","\u002Fen\u002Fdocs\u002Fpipelines",[1407,1409,1412,1413,1416,1418,1421,1424],{"title":1408,"_path":1139},"The Visual Editor",{"title":1410,"_path":1411},"AI Agents","\u002Fen\u002Fdocs\u002Fpipelines\u002Fagents",{"title":8,"_path":4},{"title":1414,"_path":1415},"Flow Control","\u002Fen\u002Fdocs\u002Fpipelines\u002Fcontrole-flux",{"title":1417,"_path":1055},"Code Steps",{"title":1419,"_path":1420},"Sub-pipelines","\u002Fen\u002Fdocs\u002Fpipelines\u002Fsous-pipelines",{"title":1422,"_path":1423},"No-code actions","\u002Fen\u002Fdocs\u002Fpipelines\u002Factions-no-code",{"title":1425,"_path":1426},"Knowledge base","\u002Fen\u002Fdocs\u002Fpipelines\u002Fbase-de-connaissances",{"title":1428,"_path":1429,"children":1430},"Supervision","\u002Fen\u002Fdocs\u002Fsupervision",[1431,1434,1437],{"title":1432,"_path":1433},"Execution History","\u002Fen\u002Fdocs\u002Fsupervision\u002Fexecutions",{"title":1435,"_path":1436},"Credits & Metering","\u002Fen\u002Fdocs\u002Fsupervision\u002Fcredits-metering",{"title":1438,"_path":1439},"Benchmarks","\u002Fen\u002Fdocs\u002Fsupervision\u002Fbenchmarks",{"title":1441,"_path":1442,"children":1443},"Security","\u002Fen\u002Fdocs\u002Fsecurite",[1444,1447,1450,1453],{"title":1445,"_path":1446},"Security principles","\u002Fen\u002Fdocs\u002Fsecurite\u002Fprincipes",{"title":1448,"_path":1449},"Strict multi-tenancy","\u002Fen\u002Fdocs\u002Fsecurite\u002Fmulti-tenant",{"title":1451,"_path":1452},"GDPR audit & access log","\u002Fen\u002Fdocs\u002Fsecurite\u002Faudit-rgpd",{"title":1454,"_path":1455},"Sovereign deployment","\u002Fen\u002Fdocs\u002Fsecurite\u002Fdeploiement-souverain",{"title":1457,"_path":1458,"children":1459},"Developers","\u002Fen\u002Fdocs\u002Fdeveloppeurs",[1460,1463,1466],{"title":1461,"_path":1462},"Admin API","\u002Fen\u002Fdocs\u002Fdeveloppeurs\u002Fapi-admin",{"title":1464,"_path":1465},"Outbound webhooks","\u002Fen\u002Fdocs\u002Fdeveloppeurs\u002Fwebhooks-sortants",{"title":1467,"_path":1468},"Drive betool from Claude (MCP)","\u002Fen\u002Fdocs\u002Fdeveloppeurs\u002Fmcp",{"title":1470,"_path":1471,"children":1472},"Integrations","\u002Fen\u002Fdocs\u002Fintegrations",[1473,1476,1479,1482,1485,1488,1491,1494,1497,1500,1503,1506,1509,1512,1515,1518,1521,1524,1527],{"title":1474,"_path":1475},"Integrations overview","\u002Fen\u002Fdocs\u002Fintegrations\u002Fvue-densemble",{"title":1477,"_path":1478},"Stripe","\u002Fen\u002Fdocs\u002Fintegrations\u002Fstripe",{"title":1480,"_path":1481},"GitHub","\u002Fen\u002Fdocs\u002Fintegrations\u002Fgithub",{"title":1483,"_path":1484},"Google","\u002Fen\u002Fdocs\u002Fintegrations\u002Fgoogle",{"title":1486,"_path":1487},"LinkedIn Ads","\u002Fen\u002Fdocs\u002Fintegrations\u002Flinkedin-ads",{"title":1489,"_path":1490},"Kavkom","\u002Fen\u002Fdocs\u002Fintegrations\u002Fkavkom",{"title":1492,"_path":1493},"Jira","\u002Fen\u002Fdocs\u002Fintegrations\u002Fjira",{"title":1495,"_path":1496},"Slack","\u002Fen\u002Fdocs\u002Fintegrations\u002Fslack",{"title":1498,"_path":1499},"SMS","\u002Fen\u002Fdocs\u002Fintegrations\u002Fsms",{"title":1501,"_path":1502},"Enable Banking (open banking)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fenable-banking",{"title":1504,"_path":1505},"CRM, marketing & productivity","\u002Fen\u002Fdocs\u002Fintegrations\u002Fcrm-marketing",{"title":1507,"_path":1508},"HeyGen (video)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fheygen",{"title":1510,"_path":1511},"La Poste","\u002Fen\u002Fdocs\u002Fintegrations\u002Fla-poste",{"title":1513,"_path":1514},"Industry CRM (beTool Application, Qhare)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fcrm-metier",{"title":1516,"_path":1517},"Mitti (field inspections)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fmitti",{"title":1519,"_path":1520},"Meta (Messenger, Pages, Meta Ads)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fmeta",{"title":1522,"_path":1523},"Onoff Business (Beta)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fonoff",{"title":1525,"_path":1526},"Smart Life \u002F Tuya (connected devices)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fsmart-life",{"title":1528,"_path":1529},"beTool products (Desktop, Kiosk, Terminal)","\u002Fen\u002Fdocs\u002Fintegrations\u002Fproduits-betool",{"title":1531,"_path":1532,"children":1533},"Use cases","\u002Fen\u002Fdocs\u002Fcas-usage",[1534,1537,1540,1543,1546,1549],{"title":1535,"_path":1536},"Typical business agents","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fvue-densemble",{"title":1538,"_path":1539},"CFO IA","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fcfo-ia",{"title":1541,"_path":1542},"COO IA","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fcoo-ia",{"title":1544,"_path":1545},"CTO IA","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fcto-ia",{"title":1547,"_path":1548},"Product Manager IA","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fproduct-manager-ia",{"title":1550,"_path":1551},"Personal assistant","\u002Fen\u002Fdocs\u002Fcas-usage\u002Fassistant-personnel"]