[{"data":1,"prerenderedAt":67337},["ShallowReactive",2],{"search-dialog-corpus":3,"search-dialog-default-links":66570,"pinned-blogs":66571,"content-\u002Fblog\u002Fchatgpt-web-scraping":66572,"content-doc-\u002Fblog\u002Fchatgpt-web-scraping-inline":66572,"author-Alex Barlow":67038,"current-doc":71,"related-posts":67055,"doc-nav-siblings:%2Fblog%2Fchatgpt-web-scraping":67056,"hero-media-\u002Fblog\u002Fchatgpt-web-scraping":67059},[4,80,713,763,867,938,1058,1076,1231,1246,1408,1458,1527,1595,1649,1711,1772,1831,1891,2136,2190,2242,2428,2834,2921,3113,3164,3251,3510,3874,3917,4151,4209,4562,5343,5566,6320,7317,7633,7751,8259,9834,10423,10847,11158,11698,11744,12482,13135,13170,13544,13953,14666,14995,15527,15765,16083,16322,16481,16681,16955,17219,17692,17833,18088,18253,19122,19544,19885,20122,20423,20835,21009,21195,21481,22235,22441,22642,22669,22858,22978,23371,24988,25513,25806,26296,26332,26447,26538,28097,28169,28988,29062,29192,29318,29933,30028,30163,30513,30728,30851,30896,31256,31315,31564,32163,32342,32377,32423,32586,32657,32818,32938,33166,33253,33696,33735,33861,34111,34405,34517,34562,34633,34681,34892,34979,35439,35584,35664,35756,35898,36065,36287,36343,36528,36615,36729,36776,37413,37648,37816,37995,38159,39286,39610,39679,39718,39765,39846,39961,40213,40258,40765,40893,40984,41027,41228,41472,41586,41639,41806,41928,42116,42234,42464,42640,42668,42717,43210,43455,43646,43858,43988,44192,44648,44725,44996,45197,45430,45606,45798,45900,45917,46108,46190,46263,46312,46638,46818,46880,46924,46966,47015,47054,47152,47238,47466,47573,47622,47668,47722,47874,48182,48488,48623,48670,48744,48813,48915,48957,49007,49078,49194,49263,49349,49393,49449,49570,49656,49713,49763,49820,49887,49998,50095,50148,50233,50289,50373,50476,50581,50675,50800,50852,50908,51048,51128,51198,51262,51430,51556,51688,51812,51867,51964,52070,52152,52336,52423,52509,52601,52655,52735,52810,52863,52909,53002,53101,53185,53259,53325,53376,53536,53615,53668,53762,53843,53921,53960,54017,54069,54134,54205,54273,54320,54390,54454,54528,54599,54682,54754,54811,54870,54974,55040,55120,55187,55252,55348,55417,55506,55599,55674,55736,55792,55918,56074,56210,56447,56614,56769,56939,57080,57234,57372,57438,57498,57564,57635,57700,57935,58146,58288,58391,58566,58757,58917,59086,59243,59380,59424,59503,60026,60905,61283,61351,61443,61694,62344,62399,62582,62715,62782,62919,63050,63167,63229,63302,63406,63536,63834,63874,64012,64113,64226,64266,64415,64491,64542,64661,64717,64824,65073,65116,65324,65352,65412,65444,65460,65531,65598,65670,65682,65740,65782,66062,66174,66200],{"id":5,"title":6,"body":7,"date":71,"description":72,"extension":73,"meta":74,"navigation":75,"order":71,"path":76,"seo":77,"stem":78,"__hash__":79},"content\u002F _about.md","About axciom ai",{"type":8,"value":9,"toc":66},"minimark",[10,15,32,40,46,52,56,62],[11,12],"page-header-centered-text",{"description":13,"headline":14},"Turns out it’s not that easy. That's why we're building tools to make browser automation easier for both no-coders and coders.","We thought it’d be cool to automate your browser with a few clicks…",[16,17,20,25,29],"image-text-section",{"alt":18,"image":19},"Selector Tool interface","axiom-step-finder.jpg",[21,22,24],"h3",{"id":23},"our-story","Our story",[26,27,28],"p",{},"Simply point and click on the data you wish to scrape. You can extract different types of data, including HTML, text, links, and images.",[26,30,31],{},"Our built-in pattern recognition algorithms help group related elements.\nEasily pass your data through other steps, from applying filters to removing or replacing strings to outputting data to Google Sheets.",[33,34,36],"background-wrapper",{"bg-class":35},"gray",[37,38],"centered-text",{"headline":39},"Our values",[33,41,42],{"bg-class":35},[43,44],"list-sections",{":sections":45},"[{\"title\":\"Matter-of-fact\",\"subtitle\":\"\",\"items\":[\"Tools that do the job\",\"No hype—just results\",\"Reasonably priced\",\"Actively maintained by a core team\",\"Good customer support\",\"Comprehensive guides and docs\"]},{\"title\":\"Trustworthy\",\"subtitle\":\"\",\"items\":[\"Committed to data privacy\",\"We don’t access or store your data\",\"Clear, fair terms of service\",\"No hidden agendas or upsells\"]},{\"title\":\"Empowering\",\"subtitle\":\"\",\"items\":[\"Gain the skill of browser automation\",\"Automate repetitive tasks without code\",\"Stay in control of your data\",\"Use tools that work the way you do\"]}]",[47,48],"customer-quote",{"author":49,"className":50,"quote":51},"Tom Graham",[35],"Amazing app, you are pretty much limited by your imagination.",[53,54],"chrome-reviews",{"className":55},[35],[57,58],"faq-list",{":faqs":59,"className":60,"title":61},"[{\"question\":\"Is axiom.ai backed by YC\",\"answer\":\"axiom.ai is a browser automation tool that lets you automate tasks without code. Learn more about our \u003Ca href='\u002Fdocs'>documentation\u003C\u002Fa>.\"},{\"question\":\"Is axiom.ai rasing a round?\",\"answer\":\"We offer a free tier with 2 hours of runtime, and flexible paid plans after that. Check out our \u003Ca href='\u002Fpricing'>pricing page\u003C\u002Fa> for more details.\"},{\"question\":\"Can I use it for scraping?\",\"answer\":\"Yes! You can extract data from websites using our visual builder or AI-powered tools. See our \u003Ca href='\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fget-data'>web scraping guide\u003C\u002Fa> to get started.\"}]",[35],"Frequent questions?",[63,64],"call-to-action",{"className":65},[35],{"title":67,"searchDepth":68,"depth":68,"links":69},"",3,[70],{"id":23,"depth":68,"text":24},null,"Build and run browser bots to automate website actions and repetitive tasks on any website or web application.","md",{},true,"\u002F_about",{"title":6,"description":72}," _about","xnWy0sZ_ItO6xRi2hUhgPL43pAtD03FmLa72EpfpLlY",{"id":81,"title":82,"body":83,"date":71,"description":707,"extension":73,"meta":708,"navigation":75,"order":71,"path":709,"seo":710,"stem":711,"__hash__":712},"content\u002F _components.md","A list of available compoenents and there variables",{"type":8,"value":84,"toc":667},[85,103,114,124,133,149,159,170,242,253,266,275,287,297,308,316,327,340,353,359,371,378,390,395,407,411,418,427,434,440,449,456,460,467,471,480,492,520,531,536,545,556,559,570,575,584,596,601,610,621,626,638],[86,87,92,97,100],"layout",{"className":88},[89,90,91],"layout-wide","space-y-6","py-16",[93,94,96],"h1",{"id":95},"web-components","Web components",[26,98,99],{},"Component-based pages have no built-in layout, by design — this lets components set full-width backgrounds or isometric grids. Each component handles its own content width.",[26,101,102],{},"Blog and docs pages are exceptions and use a default layout.",[86,104,106,111],{"className":105},[89,90,91],[107,108,110],"h2",{"id":109},"hero-left","Hero left",[112,113],"hr",{},[115,116],"left-hero",{"className":117,"description":118,"primaryText":119,"primaryTo":120,"secondaryText":121,"secondaryTo":122,"title":123},[35],"A Chrome extension that builds browser bots visually.\nDrag steps together, hit run, schedule it.\n","Add to Chrome","\u002Finstall-chrome-extension","Watch a 90-second demo","\u002F","Automate any website. Click, don't code.",[86,125,127,131],{"className":126},[89,90,91],[107,128,130],{"id":129},"hero","Hero",[112,132],{},[86,134,137,141],{"className":135},[89,90,136,91],"gap-y-4",[21,138,140],{"id":139},"primary-page-hero","Primary page hero",[26,142,143,144,148],{},"Pass in a value to set background and vh of the component ",[145,146,147],"code",{},"{minVh=\"50\" class=\"gray\"}",".",[150,151],"infrastructure-hero",{"className":152,"ctaText":153,"ctaTo":154,"description":155,"min-vh":156,"title":157,"trust":158},[35],"Get started","\u002Fsignup","Build bots with no-code, code them, or describe them to Claude.\naxiom runs on our cloud or your machine.\n","50","Browser automation for everyone.\n","Try for free, with 2 hours of runtime.",[86,160,162,166],{"className":161},[89,90,136,91],[21,163,165],{"id":164},"secondary-page-2-col-hero","Secondary page 2 col hero",[26,167,143,168,148],{},[145,169,147],{},[171,172,182],"page-hero",{":features":173,"buttonPath":174,"buttonText":175,"className":176,"description":177,"featurePath":178,"featurePathText":179,"featuresTitle":180,"header":181},"[]","https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Faxiom-browser-automation\u002Fcpgamigjcbffkaiciiepndmonbfdimbb","Start for free",[35],"The axiom.ai Builder features a range of steps that make it easy to automate virtually any use case in the browser without code, from AI to CSV to data entry.","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps","Find out more","Type of steps","No-code steps for making browser automation. Easy.",[183,184,185],"template",{"v-slot:features":67},[186,187,188,196,202,208,213,219,225,231,236],"ul",{},[189,190,191,195],"li",{},[192,193,194],"strong",{},"Get data"," Point and click web scraper",[189,197,198,201],{},[192,199,200],{},"AI"," Extract data or generate text with LLMs",[189,203,204,207],{},[192,205,206],{},"Web actions"," Click buttons, interact with UI",[189,209,210,207],{},[192,211,212],{},"Looping and logic",[189,214,215,218],{},[192,216,217],{},"Filters"," Proxies and IP rotation",[189,220,221,224],{},[192,222,223],{},"Files"," Upload and download files",[189,226,227,230],{},[192,228,229],{},"Webhooks"," Send and receive data",[189,232,233,224],{},[192,234,235],{},"debugging",[189,237,238,241],{},[192,239,240],{},"Intergrations"," Get past turnstile",[86,243,245,249],{"className":244},[89,90,136,91],[21,246,248],{"id":247},"code-hero","Code hero",[26,250,143,251,148],{},[145,252,147],{},[254,255],"hero-code",{":activeLanguage":256,":languages":257,"caption":258,"className":259,"code":261,"description":262,"filename":263,"min-vh":264,"title":265},"0","[\"Node\",\"Python\",\"Go\"]","One `connect()` call. Works with Playwright or any CDP client.",[260],"bg-bg-dark","const browser = await puppeteer.connect({\n  browserWSEndpoint: \"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=YOUR_KEY\"\n});\n\nconst page = await browser.newPage();\nawait page.goto(\"https:\u002F\u002Faxiom.ai\");\n\nawait browser.close();\n","Drop axiom into your stack with one connect call.","scrape.js","80","Build with code",[86,267,269,273],{"className":268},[89,90,91],[107,270,272],{"id":271},"content","Content",[112,274],{},[86,276,278,282],{"className":277},[89,90,136,91],[21,279,281],{"id":280},"vertical-card-grid","Vertical card grid",[26,283,143,284,148],{},[145,285,286],{},"{class=\"gray\"}",[288,289],"infrastructure-triggers",{":items":290,"className":291,"cols":293,"description":294,"eyebrow":295,"title":296},"[{\"icon\":\"schedule\",\"title\":\"Scheduler\",\"description\":\"Cron, intervals.\",\"code\":\"0 9 * * 1-5\"},{\"icon\":\"code\",\"title\":\"API\",\"description\":\"One HTTP call.\",\"code\":\"POST \u002Fv1\u002Fruns\",\"highlight\":true},{\"icon\":\"auto_awesome\",\"title\":\"Agent\",\"description\":\"Hand it to Claude.\"},{\"icon\":\"auto_awesome\",\"title\":\"Agent\",\"description\":\"Hand it to Claude.\"},{\"icon\":\"auto_awesome\",\"title\":\"Agent\",\"description\":\"Hand it to Claude.\"},{\"icon\":\"auto_awesome\",\"title\":\"Agent\",\"description\":\"Hand it to Claude.\"}]",[292],"white",5,"Pick the path that fits your stack.","How it runs","Trigger anywhere.",[86,298,300,304],{"className":299},[89,90,136,91],[21,301,303],{"id":302},"box-grid","box grid",[26,305,143,306,148],{},[145,307,286],{},[309,310],"infrastructure-configure",{":sections":311,"className":312,"description":313,"eyebrow":314,"title":315},"[{\"eyebrow\":\"EXECUTION\",\"heading\":\"How it runs.\",\"items\":[\"Schedule by cron\",\"Parallel runs\",\"Headless or headed\"]},{\"eyebrow\":\"NETWORK\",\"heading\":\"How it connects.\",\"items\":[\"Proxy rotation\",\"Block resources\",\"Cookie storage\"]},{\"eyebrow\":\"IDENTITY\",\"heading\":\"Who it runs as.\",\"items\":[\"Chrome profiles\",\"Incognito\",\"Custom extensions\"]},{\"eyebrow\":\"RELIABILITY\",\"heading\":\"When things break.\",\"items\":[\"Continue or fail fast\",\"iframe support\",\"Custom hooks\"]}]",[35],"Most automation tools give you a run button and a prayer. This one gives you the dials.","Configuration","A browser you can actually configure.",[86,317,319,322],{"className":318},[89,90,136,91],[21,320,248],{"id":321},"code-hero-1",[26,323,324,325,148],{},"{:showDefaultLogos=\"false\"} - Pass in a value to set background and vh of the component ",[145,326,286],{},[328,329],"ask-claude",{":chat":330,":examples":331,"className":332,"description":333,"eyebrow":334,"primaryText":335,"primaryTo":336,"secondaryText":337,"secondaryTo":338,"title":339},"[{\"from\":\"user\",\"name\":\"You\",\"text\":\"Build me a bot that monitors competitor pricing daily.\"},{\"from\":\"claude\",\"name\":\"Claude\",\"text\":\"Scaffolded the bot: navigate, loop, extract, alert on changes.\"}]","[\"Pull every product price from this page\",\"Add a loop for every row in my sheet\",\"Fix this selector, it's not matching\"]",[35],"Describe what you want and Claude builds it.","Claude, built in","Open Claude in builder","\u002Fbuild-in-claude","See prompts","\u002Fguides","Stuck? Ask Claude.",[86,341,343,347],{"className":342},[89,90,136,91],[21,344,346],{"id":345},"feature-list","Feature list",[26,348,349,350,148],{},"Pass in a value to set background and spacing on this component ",[145,351,352],{},"{class=\"gray-to-white py-16\"}",[345,354],{":items":355,"className":356,"eyebrow":357,"title":358},"[{\"title\":\"Live editor\",\"description\":\"Write and run scripts in the browser. Test selectors, prototype flows, share runnable snippets with your team.\",\"to\":\"\u002Fplayground\"},{\"title\":\"Session recording\",\"description\":\"Every run is recorded. Replay step by step, scrub the timeline, see the DOM at any point.\"},{\"title\":\"Run reports\",\"description\":\"Logs, network requests, console output, errors, screenshots, all in one place per run.\"}]",[35],"Test and debug","Iterate fast. See exactly what happened.",[86,360,362,366],{"className":361},[89,90,136,91],[21,363,365],{"id":364},"feature-grid","Feature grid",[26,367,368,369,148],{},"Set grid, solid or transparent. Pass in a value to set background and spacing on this component ",[145,370,352],{},[364,372],{":items":373,"className":374,"cols":68,"description":67,"eyebrow":375,"title":376,"variant":377},"[{\"icon\":\"power\",\"title\":\"Connect Puppeteer or Playwright\",\"description\":\"Point your existing scripts at our WebSocket endpoint. Same API, no rewriting.\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\",\"linkText\":\"See the API\"},{\"icon\":\"terminal\",\"title\":\"Run JavaScript in the page\",\"description\":\"Execute arbitrary JS via `page.evaluate()`. Manipulate the DOM, scrape data.\"},{\"icon\":\"shield_lock\",\"title\":\"Configure proxies inline\",\"description\":\"Pass proxy type, region, viewport as connection params.\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fpuppeteer\"}]",[35],"What you can build","Run anything you'd run locally, at scale.","outline",[86,379,381,385],{"className":380},[89,90,136,91],[21,382,384],{"id":383},"faq","FAQ",[26,386,387,388,148],{},"Pass in data to set. Pass in a value to set background and spacing on this component ",[145,389,352],{},[57,391],{":faqs":392,"className":393,"title":61},"[{\"question\":\"I'm a paying customer and I'm stuck, will you help me complete my automation?\",\"answer\":\"Please share your automation with us, describing the issue in as much detail as possible. We'll respond with a clear solution and, when appropriate, a video walkthrough to guide you through completing your automation.\"},{\"question\":\"How do I get my Slack channel for support?\",\"answer\":\"Pro Max and Ultimate plans come with dedicated Slack support channel. We will set up the channel when you subscribe and send an invite to the email used for your subscription. If you do not receive the email, please raise a support ticket.\"},{\"question\":\"I need more concurrency?\",\"answer\":\"We can accommodate additional concurrency requirements. Please reach out to support with details of your needs, and we'll be in touch with pricing and a timeline.\"},{\"question\":\"Can I have multiple users on a single subscription?\",\"answer\":\"Yes. You can request a team account by emailing support. Team accounts are only available on the Ultimate tier.\"},{\"question\":\"I cannot log in to the payment portal?\",\"answer\":\"If you cannot log in to the payment portal, it's most likely that you used a different email address than your axiom.ai account to subscribe. Please try another email address.\"},{\"question\":\"How long will it take to get a response to my support request?\",\"answer\":\"For Pro Max and Ultimate customers, we strive to respond the same day whenever possible. For all other paid plans, our team aims to reply within two business days. Please note our office hours are UK-based.\"}]",[394],"gray-to-white",[86,396,398,402],{"className":397},[89,90,136,91],[21,399,401],{"id":400},"cross-links","Cross links",[26,403,404,405,148],{},"Vary amount of links. Pass in a value to set background and spacing on this component ",[145,406,352],{},[400,408],{":links":409,"className":410,"cols":68},"[{\"eyebrow\":\"Other ways to build\",\"title\":\"Build with no-code\",\"to\":\"\u002Fbuild-with-no-code\"},{\"eyebrow\":\"Other ways to build\",\"title\":\"Build with Claude\",\"to\":\"\u002Fbuild-in-claude\"},{\"eyebrow\":\"Related docs\",\"title\":\"Read the API guide\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\"}]",[35],[86,412,414],{"className":413},[89,90,136,91],[21,415,417],{"id":416},"integrations","Integrations",[416,419],{":integrations":420,"className":421,"description":422,"eyebrow":423,"linkText":424,"linkTo":425,"title":426},"[{\"name\":\"Zapier\",\"color\":\"#ff4a00\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fzapier\"},{\"name\":\"Make\",\"color\":\"#6d28d9\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fmake\"},{\"name\":\"Google Sheets\",\"color\":\"#0f9d58\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fgoogle-sheets\"},{\"name\":\"ChatGPT\",\"color\":\"#10a37f\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fchatgpt\"},{\"name\":\"Claude\",\"color\":\"#d97757\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fclaude\"}]",[35],"Drop axiom into Zapier, Make, n8n, or call the API directly.","Connect everything","Browse all integrations","\u002Fdocs\u002Fno-code-tool\u002Fintegrations","Your stack, your tools.",[86,428,430],{"className":429},[89,90,136,91],[21,431,433],{"id":432},"scroll-block","Scroll block",[435,436],"scroll-blocks",{":blocks":437,"className":438,"title":439},"[{\"headline\":\"1 \u002F Build workflows visually in the browser\",\"video\":\"\u002Flanding\u002F01-slide-index.mp4\",\"lines\":[\"Create automations step by step\",\"Click, type, navigate, scrape with no-code steps\",\"Fast to get started with \u003Ca href=\\\"\u002Fno-code-builder\\\" class=\\\"link\\\">No-code tool\u003C\u002Fa>\"],\"ctaHref\":\"\u002Fno-code-builder\",\"ctaLabel\":\"Explore No-code tool\"},{\"headline\":\"2 \u002F Run your automations where you work\",\"image\":\"\u002Flanding\u002Frun.png\",\"lines\":[\"Run from your browser or in the cloud\",\"Schedule or trigger on demand\"],\"ctaHref\":\"\u002Finfrastructure\",\"ctaLabel\":\"Explore runtime\"},{\"headline\":\"3 \u002F Scale as your work grows\",\"code\":\"curl -X POST https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger \\\\\\n  -H \\\"Content-Type: application\u002Fjson\\\" \\\\\\n  -d '{\\\"key\\\": \\\"$KEY\\\", \\\"name\\\": \\\"My Bot\\\"}'\\n\",\"lines\":[\"Run multiple bots at the same time\",\"Configurable concurrency, proxies, cookies\"],\"ctaHref\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\",\"ctaLabel\":\"Read the API docs\"}]",[35,91],"The complete browser automation toolkit.\naxiom.ai automates everything you can do on a web page.\n",[86,441,443,447],{"className":442},[89,90,91],[107,444,446],{"id":445},"fixed-content","Fixed content",[112,448],{},[86,450,452],{"className":451},[89,90,136,91],[21,453,455],{"id":454},"privacy","Privacy",[457,458],"infrastructure-privacy",{"className":459},[35],[86,461,463],{"className":462},[89,90,136,91],[21,464,466],{"id":465},"pricing","Pricing",[468,469],"infrastructure-pricing",{"className":470},[35],[86,472,474,478],{"className":473},[89,90,91],[107,475,477],{"id":476},"isometric-content","Isometric content",[112,479],{},[86,481,483,487],{"className":482},[89,90,136,91],[21,484,486],{"id":485},"three-col-cubes","three col cubes",[26,488,489,490,148],{},"Pass in a value to cards and isometric shapes used also set bg ",[145,491,352],{},[493,494,496,505,513],"three-col",{"className":495},[35,91],[183,497,498],{"v-slot:ColOne":67},[499,500],"docs-image-card",{"link":501,"shape":502,"text":503,"title":504},"\u002Fguides\u002Fworkflow","pyramid","Step by step guides for common automation tasks.","Workflows",[183,506,507],{"v-slot:ColTwo":67},[499,508],{"link":509,"shape":510,"text":511,"title":512},"\u002Fguides\u002Fpattern","cube","Techniques you can reuse across different workflows.","Patterns",[183,514,515],{"v-slot:ColThree":67},[499,516],{"link":517,"shape":510,"text":518,"title":519},"\u002Fguides\u002Fusecase","Real world examples of complete automations.","Use cases",[86,521,523,527],{"className":522},[89,90,136,91],[21,524,526],{"id":525},"two-col-cubes","Two col cubes",[26,528,489,529,148],{},[145,530,352],{},[532,533],"infrastructure-two-col-cards",{":cards":534,"className":535},"[{\"eyebrow\":\"Cloud\",\"title\":\"Run it on our infrastructure.\",\"description\":\"Hands-off, headless, always on.\",\"bullets\":[\"Schedules and cron\",\"Proxies and rotation\",\"Parallel runs\"],\"to\":\"\u002Finfrastructure\u002Fcloud\",\"shape\":\"cloud\"},{\"eyebrow\":\"Desktop\",\"title\":\"Or on your own machine.\",\"description\":\"Your network, your IP, your control.\",\"bullets\":[\"Saved logins\",\"Data stays local\",\"No quota burn\"],\"to\":\"\u002Finfrastructure\u002Fdesktop\",\"shape\":\"desktop\"}]",[394,91],[86,537,539,543],{"className":538},[89,90,91],[107,540,542],{"id":541},"social-proof","Social proof",[112,544],{},[86,546,548,551],{"className":547},[89,90,136,91],[21,549,550],{"id":53},"Chrome reviews",[26,552,553,554,148],{},"Pass in a value to set baground and spacing on this component ",[145,555,352],{},[53,557],{"className":558},[35,91],[86,560,562,565],{"className":561},[89,90,136,91],[21,563,564],{"id":47},"Customer Quote",[26,566,567,568,148],{},"Pass in text to set the qoute. Pass in a value to set background and spacing on this component ",[145,569,352],{},[47,571],{"author":572,"className":573,"quote":574},"Oliver Bovill",[35],"One of the best software I have tried.",[86,576,578,582],{"className":577},[89,90,91],[107,579,581],{"id":580},"data","Data",[112,583],{},[86,585,587,591],{"className":586},[89,90,136,91],[21,588,590],{"id":589},"data-bar","Data Bar",[26,592,593,594,148],{},"Pass in data. Pass in a value to set background and spacing on this component ",[145,595,352],{},[597,598],"infrastructure-stats",{":stats":599,"className":600},"[{\"value\":\"800,000\",\"suffix\":\"+\",\"label\":\"BOTS RUN\",\"description\":\"Total bots run\"},{\"value\":\"12.5M\",\"suffix\":\"+\",\"label\":\"RUNTIME MINS\",\"description\":\"Total runtime\"},{\"value\":\"300,000\",\"suffix\":\"+\",\"label\":\"BROWSER AUTOMATORS\",\"description\":\"Total users\"}]",[260],[86,602,604,608],{"className":603},[89,90,91],[107,605,607],{"id":606},"ctas","CTA's",[112,609],{},[86,611,613,617],{"className":612},[89,90,136,91],[21,614,616],{"id":615},"main-cta-block","Main CTA block",[26,618,593,619,148],{},[145,620,352],{},[63,622],{"className":623,"headline":624,"linkText":153,"linkTo":154,"text":625},[394,91],"Browser infrastructure, ready when you are.\n","Free to install. Free to try a cloud run. No card to start. Move to a paid tier when your workload does.",[86,627,629,633],{"className":628},[89,90,136,91],[21,630,632],{"id":631},"cta-panel","CTA panel",[26,634,593,635,148],{},[145,636,637],{},"{class=\"gray\" ctaBgColor=\"bg-white\"}",[631,639,643,649,654],{"className":640,"cta-bg-color":641,"ctaBgColor":642},[35],"bg-white","bg-amber-50",[183,644,645],{"v-slot:header":67},[21,646,648],{"id":647},"cannot-find-the-guide-you-need","Cannot find the guide you need?",[183,650,651],{"v-slot:content":67},[26,652,653],{},"Inspire us with a great idea if possible we will make a guide showing you how and share it with you. We will also publish it on our website.",[183,655,656],{"v-slot:actions":67},[26,657,658],{},[659,660,666],"a",{"className":661,"color":663,"href":664,"size":73,"variant":665},[662],"button","primary","\u002Fget-started","solid","Get Started",{"title":67,"searchDepth":68,"depth":68,"links":668},[669,671,676,687,691,695,699,702],{"id":109,"depth":670,"text":110},2,{"id":129,"depth":670,"text":130,"children":672},[673,674,675],{"id":139,"depth":68,"text":140},{"id":164,"depth":68,"text":165},{"id":247,"depth":68,"text":248},{"id":271,"depth":670,"text":272,"children":677},[678,679,680,681,682,683,684,685,686],{"id":280,"depth":68,"text":281},{"id":302,"depth":68,"text":303},{"id":321,"depth":68,"text":248},{"id":345,"depth":68,"text":346},{"id":364,"depth":68,"text":365},{"id":383,"depth":68,"text":384},{"id":400,"depth":68,"text":401},{"id":416,"depth":68,"text":417},{"id":432,"depth":68,"text":433},{"id":445,"depth":670,"text":446,"children":688},[689,690],{"id":454,"depth":68,"text":455},{"id":465,"depth":68,"text":466},{"id":476,"depth":670,"text":477,"children":692},[693,694],{"id":485,"depth":68,"text":486},{"id":525,"depth":68,"text":526},{"id":541,"depth":670,"text":542,"children":696},[697,698],{"id":53,"depth":68,"text":550},{"id":47,"depth":68,"text":564},{"id":580,"depth":670,"text":581,"children":700},[701],{"id":589,"depth":68,"text":590},{"id":606,"depth":670,"text":607,"children":703},[704,705,706],{"id":615,"depth":68,"text":616},{"id":631,"depth":68,"text":632},{"id":647,"depth":68,"text":648},"Build a web page",{},"\u002F_components",{"title":82,"description":707}," _components","oLgNMKYx4SD7pY4qllLlkhCp0Vo8zkO6t9p0eBtVxOs",{"id":714,"title":715,"body":716,"date":71,"description":757,"extension":73,"meta":758,"navigation":75,"order":71,"path":759,"seo":760,"stem":761,"__hash__":762},"content\u002F_code-dashboard.md","Code Dashboard for browser automations",{"type":8,"value":717,"toc":755},[718,724,735,744,748,751],[115,719],{"description":720,"primaryText":721,"primaryTo":722,"title":723},"Everything our code dashboard can do. Run an app from your stack on axiom infrastructure through our API, with SDKs, the development toolkit, and Claude Code assistance built in.\n","View API docs","\u002Fdocs\u002Fapi","Fully featured code dashboard for browser automation",[725,726],"feature-image-section",{":cards":727,":tags":728,"description":729,"eyebrow":730,"seeAllHref":731,"seeAllText":732,"tagsHeading":733,"title":734},"[{\"title\":\"Scrape\",\"description\":\"Pull tables, lists, articles from any page. Or [extract structured data with AI](\u002Fdocs\u002F...\u002Fai).\",\"image\":\"\u002Flanding\u002Fai-assistant-error.webp\",\"href\":\"\u002Fdocs\u002Fno-code-tool\u002Fsteps\u002Fscrape\"},{\"title\":\"AI\",\"description\":\"Extract structured data or generate copy mid-flow.\",\"image\":\"\u002Flanding\u002Fai-assistant-error.webp\",\"href\":\"\u002Fdocs\u002Fno-code-tool\u002Fsteps\u002Fai\"},{\"title\":\"Files\",\"description\":\"Upload, download, transform as part of one bot.\",\"image\":\"\u002Flanding\u002Fai-assistant-error.webp\",\"href\":\"\u002Fdocs\u002Fno-code-tool\u002Fsteps\u002Ffiles\"},{\"title\":\"Interact\",\"description\":\"Click, type, scroll, pick from dropdowns.\",\"image\":\"\u002Flanding\u002Fai-assistant-error.webp\",\"href\":\"\u002Fdocs\u002Fno-code-tool\u002Fsteps\u002Finteract\"},{\"title\":\"Read and write data\",\"description\":\"Sheets, Excel, in or out of any bot.\",\"image\":\"\u002Flanding\u002Fai-assistant-error.webp\",\"href\":\"\u002Fdocs\u002Fno-code-tool\u002Fsteps\u002Fdata\"},{\"title\":\"Webhook & API\",\"description\":\"Trigger your stack, call any HTTP endpoint.\",\"image\":\"\u002Flanding\u002Fai-assistant-error.webp\",\"href\":\"\u002Fdocs\u002Fno-code-tool\u002Fsteps\u002Fwebhook\"}]","[{\"label\":\"Navigate\",\"href\":\"\u002Fdocs\u002F...\u002Fnavigate\"},{\"label\":\"Loop\",\"href\":\"\u002Fdocs\u002F...\u002Floop\"},{\"label\":\"Control flow\",\"href\":\"\u002Fdocs\u002F...\u002Fcontrol-flow\"},{\"label\":\"Debug\",\"href\":\"\u002Fdocs\u002F...\u002Fdebug\"},{\"label\":\"Manipulate data\",\"href\":\"\u002Fdocs\u002F...\u002Fmanipulate\"},{\"label\":\"Email\",\"href\":\"\u002Fdocs\u002F...\u002Femail\"},{\"label\":\"Other\",\"href\":\"\u002Fdocs\u002F...\u002Fother\"}]","Scrape, click, write to Sheets, send a webhook, ask AI to extract or generate.","Steps","\u002Fdocs\u002Fno-code-tool\u002Fsteps","See the full step library","More step categories","A step for every browser action",[736,737,739],"grid-fade-wrap",{"bg":394,"color":738},"default",[47,740],{"author":741,"className":742,"quote":743},"john armstrong",[35],"Best in class and customer service couldn't be better!",[53,745],{"className":746},[35,747],"iso-grid-gray-100",[63,749],{"className":750},[35,747],[400,752],{":links":753,"className":754},"[{\"eyebrow\":\"Run remote\",\"title\":\"In the cloud\",\"to\":\"\u002Fbuild-with-no-code\"},{\"eyebrow\":\"Run local\",\"title\":\"On the desktop\",\"to\":\"\u002Fbuild-with-code\"}]",[35,747],{"title":67,"searchDepth":68,"depth":68,"links":756},[],"Write and run browser automations in code with the axiom.ai code dashboard. Use Puppeteer, Playwright, or Python; trigger runs via API.",{},"\u002F_code-dashboard",{"title":715,"description":757},"_code-dashboard","HcWqa1KIZ4GRY_-FLlZ4b5SVVxX8J1fhbtBP64dzbkw",{"id":764,"title":765,"body":766,"date":71,"description":861,"extension":73,"meta":862,"navigation":75,"order":71,"path":863,"seo":864,"stem":865,"__hash__":866},"content\u002F_integrations\u002F2captcha.md","Integrate your browser automations with 2Captcha",{"type":8,"value":767,"toc":859},[768,803,806,825,828,831,834,838,841,853,856],[171,769,775],{":features":173,"buttonPath":174,"buttonText":175,"description":770,"featurePath":771,"featurePathText":772,"featuresTitle":773,"header":774},"Connect 2Captcha directly to your automation. Utilize the service to automatically solve CAPTCHAs found on any webpage.","\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002F2captcha","Learn more...","2Captcha features","Integrate 2Captcha, with your browser automations",[183,776,777],{"v-slot:features":67},[186,778,779,785,791,797],{},[189,780,781,784],{},[192,782,783],{},"reCAPTCHA v2"," to Zapier",[189,786,787,790],{},[192,788,789],{},"reCAPTCHA v3"," from Zapier",[189,792,793,796],{},[192,794,795],{},"Invisible reCAPTCHA"," using Zapier",[189,798,799,802],{},[192,800,801],{},"Use own 2Captcha key\""," from your bot",[37,804],{"headline":805},"Just add the Solve captcha step to your workflow",[16,807,810,811,814,815,818,819],{"alt":808,"image":809},"use 2captcha in your browser automations to solve captcha","..\u002Flanding-captcha\u002Fcaptcha.png","  ",[26,812,813],{},"Easily connect your browser automations to a captcha solving service. Simply search for and add the \"Solve Captcha\" step, in your browser automation.","\n  ",[26,816,817],{},"With this integration, you can solve a range of captcha using the 2Captcha API, you will need to register for a 2Captcha account and there is a small charge per captcha successfully solved."," \n  ",[26,820,821,822,148],{},"Learn more about solving Captcha with ",[659,823,824],{"href":771},"2Captcha",[37,826],{"headline":827},"Automatically solve range of Captcha",[302,829],{":boxes":830},"[\"reCAPTCHA v2\",\"reCAPTCHA v3\",\"Invisible reCAPTCHA\"]",[37,832],{"headline":833},"Watch how easy it is to solve Captcha",[835,836],"you-tube-video",{"video":837},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRKzbfw7qna0?rel=0&start=19&end=49",[37,839],{"headline":840},"Start with our guides",[33,842,843],{"bg-class":394},[844,845,846],"card-grid",{},[847,848],"card",{"footer-text":849,"link":771,"text":850,"title":851,"type":852},"doc","Learn about intergrating axiom.ai with 2Captcha.","Working with 2Captcha","no-code",[53,854],{"className":855},[35,91],[63,857],{"className":858},[35],{"title":67,"searchDepth":68,"depth":68,"links":860},[],"Automatically solve CAPTCHAs on any webpage using 2Captcha during your bot runs.",{},"\u002F_integrations\u002F2captcha",{"title":765,"description":861},"_integrations\u002F2captcha","7FeazRSEEfipzfQToePud0YUPxSEljB39NqDZIqEuX4",{"id":868,"title":869,"body":870,"date":71,"description":67,"extension":73,"meta":933,"navigation":75,"order":71,"path":934,"seo":935,"stem":936,"__hash__":937},"content\u002F_integrations\u002Fexcel.md","Excel",{"type":8,"value":871,"toc":931},[872,879,882,896,902,908,912,918,923,928],[171,873],{":features":874,"buttonPath":174,"buttonText":175,"description":875,"featurePath":122,"featurePathText":876,"featuresTitle":877,"header":878},"[\"Write data\",\"Read data\"]","No API? No problem. Add axiom.ai to your stack for quick-to-build, scalable browser automation with outstanding support.","Learn more","Excel features","Integrate Microsoft Excel with the browser",[37,880],{"headline":881},"Read, write and delete data from Excel sheets",[16,883,810,886,814,889],{"alt":884,"image":885},"axiom.ai Google sheets integration being used to make a web scraper","google-sheets-integration.png",[26,887,888],{},"\n    Use our Microsoft Excel steps to read and write sheet data directly from your automation. Read specific ranges with first\u002Flast cell settings, then write results back using add to next row or clear before write options.\n  ",[26,890,891,892],{},"Learn more about our ",[659,893,895],{"href":894},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fexcel","Microsoft Excel integration",[37,897,899],{"headline":898},"Combine Microsoft Excel and browser automation to tackle any workflow",[26,900,901],{},"With axiom.ai, you can combine the power of our Microsoft Excel integration and browser automation to create seamless, end-to-end workflows. Whether you're extracting data from websites or sending it to Excel, axiom.ai can help your workflow.",[37,903,905],{"headline":904},"Select from a range of no-code Microsoft Excelsteps",[26,906,907],{},"Select the step you need from our library of steps, configure your sheet and options in seconds, its as simple as that. Steps can be used in combination with others to create more complex workflows.",[909,910],"steps",{"sections":911},"[{title: 'Spreadsheet', steps: [{link: '\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclear-data-from-a-google-sheet', icon: 'WidgetClearGoogleSheet.svg', title: 'Clear data from a Google Sheet', text: 'Clear the contents of the selected cell range while preserving formatting.'}, {link: '\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fexport-csv-file', icon: 'WidgetExportCSV.svg', title: 'Export to CSV', text: 'Export data to a CSV file. It will be downloaded to your Chrome downloads folder when the automation runs. Please note that the CSV will not download if triggered from an external service or API.'}]}]",[37,913,915],{"headline":914},"Data privacy and your Microsoft Excel spreadsheets",[26,916,917],{},"To access your Excel spreadsheets for reading, writing, and editing, we request access to your Excel work or school accounts. However, we do not access any Excel data outside of the extension. Data is only accessed when an Excel file, worksheet, or table is interacted with by a step. Even then, the information is processed in real time; no data is duplicated or extracted for later use by us or any third parties. No AI is running on your data, and your information is never used for training any AI models.",[47,919],{"author":920,"className":921,"quote":922},"Nathan Heidemann",[35],"Very useful tool, saved a ton of time.",[53,924],{"className":925},[926,927],"space-top-md","space-bottom-md",[63,929],{"className":930},[35],{"title":67,"searchDepth":68,"depth":68,"links":932},[],{},"\u002F_integrations\u002Fexcel",{"title":869,"description":67},"_integrations\u002Fexcel","jCsQzuxlafTYdjCZeP1QQ-NQOnS6OAFyVwNdlUcSh6c",{"id":939,"title":940,"body":941,"date":71,"description":1052,"extension":73,"meta":1053,"navigation":75,"order":71,"path":1054,"seo":1055,"stem":1056,"__hash__":1057},"content\u002F_integrations\u002Fgoogle-sheets.md","Intergrate Google sheets with your browser automations",{"type":8,"value":942,"toc":1050},[943,949,952,965,971,974,979,982,985,1037,1044,1047],[171,944],{":features":945,"buttonPath":174,"buttonText":175,"description":946,"featurePath":122,"featurePathText":876,"featuresTitle":947,"header":948},"[\"Read data from a Google Sheet\",\"Delete row from a Google Shee\",\"Find row in a Google Sheet\",\"Edit row in a Google Sheet\",\"Clear data from a Google Sheet\"]","Connect your Google Sheets directly to your browser automations. Create bots to automate form filling and inputting data into your Google Sheets.","Google Sheet features","Integrate Google Sheets with the browser",[37,950],{"headline":951},"Read, write and delete data from Google Sheets",[16,953,810,955,814,958],{"alt":884,"image":954},"..\u002Flanding-google-sheets\u002Fgoogle-sheets.png",[26,956,957],{},"\n    Select a Google Sheets step from our library of steps that suits your needs - read, write or edit rows within your Google Sheet, directly from your automation. Configure your steps to only use the rows you need.\n  ",[26,959,960,961],{},"Learn more about our integration with ",[659,962,964],{"href":963},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fgoogle-sheets","Google Sheets.",[37,966,968],{"headline":967},"Combine Google Sheets and browser automation to tackle any workflow",[26,969,970],{},"With axiom.ai, you can combine the power of our Google Sheets integration and browser automation to create seamless, end-to-end workflows. Whether you're extracting data from websites or sending it to Google Sheets, axiom.ai can help your workflow.",[302,972],{":boxes":973},"[\"Scrape links from web pages into a Google sheet\",\"Enter data from a Google Sheet into a webform\",\"Write scraped data into Google Sheets\",\"Extract reports from web apps into a Google Sheet\",\"Automate posting social media from a Google Sheet\",\"Upload product data from a Google sheet\",\"Track data and monitor prices with a Google Sheet\",\"Send direct messages from a Google Sheet\",\"Upload contacts into CRMs from a Google Sheet\"]",[37,975,977],{"headline":976},"Select from a range of no-code Google Sheet steps",[26,978,907],{},[909,980],{"sections":981},"[{title: 'Spreadsheet', steps: [{link: '\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclear-data-from-a-google-sheet', icon: 'WidgetClearGoogleSheet.svg', title: 'Clear data from a Google Sheet', text: 'Clear the contents of the selected cell range while preserving formatting.'}, {link: '\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fexport-csv-file', icon: 'WidgetExportCSV.svg', title: 'Export to CSV', text: 'Export data to a CSV file. It will be downloaded to your Chrome downloads folder when the automation runs. Please note that the CSV will not download if triggered from an external service or API.'}, {link: '\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-data-to-a-google-sheet-step', icon: 'WidgetWriteGoogleSheet.svg', title: 'Write data to a Google Sheet', text: ''}, {link: '\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdelete-rows-from-a-google-sheet', icon: 'WidgetDeleteRowsFromGoogleSheet.svg', title: 'Delete rows from a Google Sheet', text: ''}, {link: '\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fimport-csv-file', icon: 'WidgetImportCSV.svg', title: 'Import CSV File', text: 'Upload a CSV file from your computer. You can then use the data in other automation steps.'}, {link: 'docs\u002Freference\u002Fsteps\u002Fread-data-from-a-google-sheet-step', icon: 'WidgetReadGoogleSheet.svg', title: 'Read data from Google Sheet', text: ''}, {link: '\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcreate-a-new-google-sheet', icon: 'WidgetCreateGoogleSheet.svg', title: 'Create a new Google Sheet', text: ''}, {link: '\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Ffind-row', icon: 'WidgetFindRowGoogleSheet.svg', title: 'Find row in Google Sheet', text: 'Search for values in a Google Sheet and return the row number of the first cell matching the passed values.'}, {link: '\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fedit-row', icon: 'TemplateEditRowGoogleSheet.svg', title: 'Edit a row in a Google Sheet', text: 'Find a row in a Google Sheet then write to the found row.'}]}]",[37,983],{"headline":984},"Get started with our Google sheets guides and templates",[844,986,987,992,997,1002,1007,1012,1017,1022,1027,1032],{},[847,988],{"footer-text":849,"link":989,"text":990,"title":991,"type":852},"..\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fgoogle-sheets","How to integrate Google sheets with the bot you are making.","Working with Google Sheets",[847,993],{"footer-text":849,"link":994,"text":995,"title":996,"type":852},"..\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fget-data","Learn how to make no-code web scrapers.","How to extract data",[847,998],{"footer-text":849,"link":999,"text":1000,"title":1001,"type":852},"..\u002Fdocs\u002Ftutorials\u002Fwebforms","Learn how to automate data entry into we forms.","How to automate data entry",[847,1003],{"footer-text":849,"link":1004,"text":1005,"title":1006,"type":852},"..\u002Fdocs\u002Ftutorials\u002Fdata","Learn how to work with data inside your browser automations.","How to import, pass and transform data",[847,1008],{"footer-text":849,"link":1009,"text":1010,"title":1011,"type":852},"..\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Floop","How to loop your bot runs including through data from Google Sheets.","How to loop your automation",[847,1013],{"footer-text":183,"link":1014,"text":1015,"title":1016,"type":852},"\u002Fguides\u002Fdata-input-from-google-sheet","Automate data entry from a Google Sheet with this base template.","How to automate data entry from a google sheet",[847,1018],{"footer-text":183,"link":1019,"text":1020,"title":1021,"type":852},"\u002Fguides\u002Fscrape-links-from-a-website","Scrape links from webpages into a Google Sheet with this easy to use template.","How to scrape links from a website into a Google Sheet",[847,1023],{"footer-text":183,"link":1024,"text":1025,"title":1026,"type":852},"\u002Fguides\u002Fweb-scraping-looping-through-pages","Add a list of URLs into a Google Sheet and scrape them get started fast with this template.","How to scrape links in a Google Sheet",[847,1028],{"footer-text":183,"link":1029,"text":1030,"title":1031,"type":852},"\u002Fguides\u002Finstagram-dm-like","Send DMs on Instagram and like the newest post from a Google sheet","DM Instagram users from a Google Sheet",[847,1033],{"footer-text":183,"link":1034,"text":1035,"title":1036,"type":852},"\u002Fguides\u002Finstagram-post","Automate your IG posts from a Google Sheet with this template.","How to automate Instagram posts using Google Sheets",[37,1038,1041],{"headline":1039,"className":1040},"Data privacy and your Google Sheets",[926,927],[26,1042,1043],{},"To access your Google Sheets for reading, writing, and editing, we request access to your Google Sheets. However, we do not access any Google Sheets data outside of the extension. Data is only accessed when a Google Sheet is interacted with by a step. Even then, the data is processed in real-time; no data is duplicated or extracted for later use by us or any third parties. axiom.ai's Google authentication processes are audited yearly and certified as correctly implemented and secure.",[53,1045],{"className":1046},[926,927],[63,1048],{"className":1049},[35],{"title":67,"searchDepth":68,"depth":68,"links":1051},[],"Directly connect your Google Sheets to your browser automations to read, write, and delete data.",{},"\u002F_integrations\u002Fgoogle-sheets",{"title":940,"description":1052},"_integrations\u002Fgoogle-sheets","sxVsPBPRsOwacvW-_-u_9b-GgjvdBlCDbvDIlXuKQFk",{"id":1059,"title":1060,"body":1061,"date":71,"description":67,"extension":73,"meta":1070,"navigation":75,"order":71,"path":1072,"seo":1073,"stem":1074,"__hash__":1075},"content\u002F_integrations\u002Findex.md","The axiom.ai runner",{"type":8,"value":1062,"toc":1068},[1063],[150,1064],{"description":1065,"min-vh":1066,"title":1067},"CTF","60","intergrations",{"title":67,"searchDepth":68,"depth":68,"links":1069},[],{"layout":1071},"home","\u002F_integrations",{"title":1060,"description":67},"_integrations\u002Findex","YErH93npXDj78uN4zVl1_gtbM5Z40R_ksghgTgGf-Z8",{"id":1077,"title":1078,"body":1079,"date":71,"description":1225,"extension":73,"meta":1226,"navigation":75,"order":71,"path":1227,"seo":1228,"stem":1229,"__hash__":1230},"content\u002F_integrations\u002Fzap.md","Integrate your browser automations and web scrapers with Zapier in Chrome.",{"type":8,"value":1080,"toc":1221},[1081,1111,1114,1135,1138,1158,1164,1167,1170,1173,1176,1194,1196],[171,1082,1087],{":features":173,"buttonPath":174,"buttonText":175,"description":1083,"featurePath":1084,"featurePathText":772,"featuresTitle":1085,"header":1086},"Receive data from your Zaps to power your browser automations, such as form filling. Extract data with your bots and send it to your Zaps. Turn your browser into an API. ","\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fzapier","Zapier features","Integrate Zapier with your bots",[183,1088,1089],{"v-slot:features":67},[186,1090,1091,1096,1101,1106],{},[189,1092,1093,784],{},[192,1094,1095],{},"Post data",[189,1097,1098,790],{},[192,1099,1100],{},"Receive data",[189,1102,1103,796],{},[192,1104,1105],{},"Trigger bot runs",[189,1107,1108,802],{},[192,1109,1110],{},"Trigger Zaps",[37,1112],{"headline":1113},"Send data from Zapier",[16,1115,810,1118,814,1126,818,1129],{"alt":1116,"image":1117},"Sending data from Zapier to axiom.ai","..\u002Flanding-zapier\u002Fsend-data-from-zapier.png",[26,1119,1120,1121,1125],{},"Connect your Zaps to your axiom.ai automations and send data directly from Zapier to axiom.ai. Add the axiom.ai app in Zapier to get started, then include the ",[659,1122,1124],{"href":1123},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Ftrigger-webhook","trigger webhook"," step in your axiom.ai automation.",[26,1127,1128],{},"Trigger axiom.ai workflows from Zapier while accessing data from any of the 7,000+ services that Zapier supports.",[26,1130,1131,1132,148],{},"Learn how to send data from ",[659,1133,1134],{"href":1084},"Zapier",[37,1136],{"headline":1137},"Post data to Zapier",[1139,1140,810,1143,818,1149,814,1152],"text-image-right",{"alt":1141,"image":1142},"Posting data from axiom.ai to Zapier","..\u002Flanding-zapier\u002Fpost-data-to-zapier.png",[26,1144,1145,1146,1148],{},"Connect the data you extract from websites to your Zaps using axiom.ai. Use the ",[659,1147,1124],{"href":1123}," step to post the scraped data to Zapier. In your Zap, add the \"Webhooks by Zapier\" trigger, then configure it with your axiom.ai API key and endpoint. This allows you to send data to Zapier, such as data from scrape steps.",[26,1150,1151],{},"To further process the data, you can use additional actions such as \"Formatter by Zapier\" to parse it.",[26,1153,1154,1155,148],{},"Learn how to send data from axiom.ai to ",[659,1156,1134],{"href":1157},"..\u002Fguides\u002Fzapier-scraper",[37,1159,1161],{"headline":1160},"Combine API and browser automation to tackle any workflow",[26,1162,1163],{},"Unlock the full potential of your workflows by combining API and browser automation with axiom.ai and Zapier. Automate browser tasks that interact with websites while seamlessly integrating data from over 7,000 apps via Zapier's integration library.",[302,1165],{":boxes":1166},"[\"Run bots from new Google Sheets rows\",\"Process new Jotform submissions by running axioms\",\"Execute bot runs for new approved YoPrint orders\",\"Process new WPForms entries by running bots\",\"Automate Gravity Forms submissions by running bots automatically\",\"Process new or updated Airtable records with bots\",\"Process new involve.me submissions\",\"Automate data entry\",\"Trigger web scraper\"]",[37,1168],{"headline":1169},"Watch how easy it is to connect Zapier to the browser",[835,1171],{"video-id":1172},"V3I7w8fnO88",[37,1174],{"headline":1175},"Get started with our Zapier Guides and Templates",[844,1177,1178,1183,1188],{},[847,1179],{"footer-text":849,"link":1180,"text":1181,"title":1182,"type":852},"..\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fzapier#trigger-axiom-from-zapier","Learn how to trigger bot runs, pass data from and to Zapier.","How to use Zapier with axiom.ai",[847,1184],{"footer-text":183,"link":1185,"text":1186,"title":1187,"type":852},"\u002Fguides\u002Fzapier-forms","Learn how to post data from Zapier to axiom.ai, then enter that data into a webform","How to enter data with Zapier and axiom.ai",[847,1189],{"footer-text":1190,"link":1191,"text":1192,"title":1193,"type":852},"guide","\u002Fguides\u002Fzapier-scraper","How to post scraped data to your Zap from an axiom.ai.","How to connect your scrapers to Zapier via a webhook",[53,1195],{},[63,1197,1198,1211],{},[183,1199,1200],{"v-slot:headline":67},[21,1201,1203,1204,1207,1208,1210],{"id":1202},"fast-to-build-easy-to-run-and-scale-outstanding-support","Fast to build.",[1205,1206],"br",{}," Easy to run and scale.",[1205,1209],{}," Outstanding support.",[26,1212,1213,1214,1220],{},"(",[659,1215,1219],{"href":1216,"rel":1217},"https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Faxiom-browser-automation\u002Fcpgamigjcbffkaiciiepndmonbfdimbb)%7Bclass=%22button",[1218],"nofollow","https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Faxiom-browser-automation\u002Fcpgamigjcbffkaiciiepndmonbfdimbb){class=\"button"," primary\"}",{"title":67,"searchDepth":68,"depth":68,"links":1222},[1223],{"id":1202,"depth":68,"text":1224},"Fast to build. Easy to run and scale. Outstanding support.","See how you can use Zapier to connect axiom.ai to thousands of other web applications.",{},"\u002F_integrations\u002Fzap",{"title":1078,"description":1225},"_integrations\u002Fzap","c0XRXPHElBPXXz0Ky26mwQmnuUy6w46Sdmjv6658Fok",{"id":1232,"title":153,"body":1233,"date":71,"description":1240,"extension":73,"meta":1241,"navigation":75,"order":71,"path":1242,"seo":1243,"stem":1244,"__hash__":1245},"content\u002F_signup.md",{"type":8,"value":1234,"toc":1238},[1235],[11,1236],{"headline":1237},"Let’s get you set up. Pick your path.",{"title":67,"searchDepth":68,"depth":68,"links":1239},[],"Pick your path: install the Chrome extension for no-code automations, open the Code Dashboard for code-first runs, or use our Claude skill to build with AI.",{},"\u002F_signup",{"title":153,"description":1240},"_signup","FpksBfeBJpehT5ijX2oOw4EkgTNnwOw0i7JKub9oMd4",{"id":1247,"title":1248,"body":1249,"date":71,"description":1402,"extension":73,"meta":1403,"navigation":75,"order":71,"path":1404,"seo":1405,"stem":1406,"__hash__":1407},"content\u002Faffiliate-program.md","Affiliate program",{"type":8,"value":1250,"toc":1400},[1251,1291,1386,1390,1394,1397],[1252,1253,814,1260,814,1264,814,1269],"section",{"className":1254},[86,1255,1256,1257,1258,1259],"flex","flex-col","items-center","space-y-8","my-24",[93,1261,1263],{"id":1262},"join-our-affiliate-program","Join our affiliate program.",[26,1265,1268],{"className":1266},[1267],"text-2xl","Earn 15% commission for every payment by your referrals, for an entire subscription's lifetime!",[1270,1271,1274,1275,1274,1285,814],"div",{"className":1272},[1255,1273],"gap-4","\n    ",[659,1276,1284],{"className":1277,"color":663,"variant":665,"size":1278,"href":1279,"target":1280,"rel":1281},[662],"lg","https:\u002F\u002Faxiom.leaddyno.com","_blank",[1282,1283],"noopener","noreferrer","\n      Join program\n    ",[659,1286,1290],{"className":1287,"color":1288,"variant":377,"size":1278,"href":1279,"target":1280,"rel":1289},[662],"secondary",[1282,1283],"\n      Login\n    ",[1252,1292,814,1295],{"className":1293},[86,1294],"mt-32",[1270,1296,1274,1303,1274,1367,814],{"className":1297},[1255,1256,1298,1299,1300,1301,1302],"lg:flex-row","rounded-3xl","border","border-border","p-1",[1270,1304,1309,1310,1274],{"className":1305},[1255,1306,1307,1308],"justify-center","min-w-[360px]","lg:shrink-0","\n      ",[1270,1311,1318,1319,1318,1324,1309],{"className":1312},[1313,1314,1315,1258,1316,1317],"rounded-2xl","p-10","bg-bg-light","w-full","lg:w-auto","\n        ",[1320,1321,1323],"h6",{"id":1322},"program-benefits","Program benefits",[186,1325,1326,1327,1326,1339,1326,1346,1326,1353,1326,1360,1318],{},"\n          ",[189,1328,1331,1338],{"className":1329},[1255,1330],"gap-2",[1332,1333,1337],"span",{"className":1334},[1335,1336],"material-symbols-rounded","text-primary","check"," 15% commission",[189,1340,1342,1345],{"className":1341},[1255,1330],[1332,1343,1337],{"className":1344},[1335,1336]," Monthly payments for a subscription's lifetime",[189,1347,1349,1352],{"className":1348},[1255,1330],[1332,1350,1337],{"className":1351},[1335,1336]," Payments via PayPal",[189,1354,1356,1359],{"className":1355},[1255,1330],[1332,1357,1337],{"className":1358},[1335,1336]," A Slack Channel for support",[189,1361,1363,1366],{"className":1362},[1255,1330],[1332,1364,1337],{"className":1365},[1335,1336]," A Dashboard to track leads & commission",[1270,1368,1309,1371,1309,1377,1309,1380,1309,1383,1274],{"className":1369},[1370,1314],"my-auto",[107,1372,1376],{"className":1373,"id":1375},[1374],"mb-4","how-it-works","How it works",[26,1378,1379],{},"\n        Once you register using our affiliate portal, you will receive a unique referral link. Share this link on social media, and you can see the number of clicks and signups in your dashboard.\n      ",[26,1381,1382],{},"If a user signs up, you'll receive 15% of their payments for a subscription's entire lifetime.",[26,1384,1385],{},"Payments are made monthly via PayPal, so you'll need a PayPal account.",[57,1387],{":faqs":1388,"title":1389},"[{\"question\":\"How do I sign up?\",\"answer\":\"You can sign up on the link above: https:\u002F\u002Faxiom.leaddyno.com.\"},{\"question\":\"How do I track my referrals and payments?\",\"answer\":\"We provide an affiliate dashboard where you can track your referrals and payments.\"},{\"question\":\"How long to my first payment?\",\"answer\":\"We pay out 30 days after the first payment from your referral.\"},{\"question\":\"What happens if a user asks for a refund?\",\"answer\":\"If a user asks for a refund, we will refund the user and deduct the commission from your next payment.\"},{\"question\":\"How do I get paid?\",\"answer\":\"We pay out monthly via PayPal. You will need a PayPal account to receive payments.\"},{\"question\":\"Can I earn more than 15% commission?\",\"answer\":\"If the signups are your clients, and you handle all customer support directly, we can increase your commission. Email support@axiom.ai\"}]","Frequently Asked Questions?",[736,1391,1392],{"bg":394,"color":738},[47,1393],{"author":572,"quote":574},[53,1395],{"className":1396},[35,747],[63,1398],{"className":1399},[35,747],{"title":67,"searchDepth":68,"depth":68,"links":1401},[],"Earn 15% commission on every referral payment for the lifetime of their subscription. Join the axiom.ai affiliate program.",{},"\u002Faffiliate-program",{"title":1248,"description":1402},"affiliate-program","9dZvIE27e5vEDObggulp3CWxG17y8t9NB_0nqjKC7mE",{"id":1409,"title":1410,"body":1411,"date":71,"description":1451,"extension":73,"meta":1452,"navigation":75,"order":71,"path":1454,"seo":1455,"stem":1456,"__hash__":1457},"content\u002Fai-assistant.md","Connect browser automation to Claude, ChatGPT, Gemini, and more | axiom.ai",{"type":8,"value":1412,"toc":1449},[1413,1422,1424,1432,1435,1441,1444],[115,1414],{":images":1415,"description":1416,"primaryText":1417,"primaryTo":1418,"secondaryText":1419,"secondaryTo":1420,"title":1421},"[{\"src\":\"\u002Flogos\u002Fclaude-logo.webp\",\"alt\":\"Claude\",\"style\":\"height: 60px\"},{\"src\":\"\u002Flogos\u002Faxiom-logo-icon-color.svg\",\"alt\":\"axiom\",\"style\":\"height: 60px\"}]","Our no-code AI assistant is baked right into the axiom Chrome extension. It's completely optional, but if you're inclined to use AI, it can help you build, configure, and troubleshoot your automations.","Install the extension","https:\u002F\u002Fchromewebstore.google.com\u002Fpublisher\u002Faxiom-ai-limited\u002Fua54e34c34593ff636a68f4f695dc7e5c","Learn to build by description","\u002Fbuild-with-no-code\u002Fdescription","No-code AI assistant, powered by Claude.",[736,1423],{"bg":394,"color":738},[1425,1426],"decision-table",{":rows":1427,"eyebrow":1428,"headline":1429,"leftHeader":1430,"rightHeader":1431},"[{\"text\":\"Build\",\"lines\":[\"**loop steps** - loop steps 1.1 and 1.2\",\"**Add step** - Step name for example Enter text\",\"**Webhook** - Add a trigger webhook\",\"**File** - help uploading or downloading\"]},{\"text\":\"Configuration\",\"lines\":[\"**Schedule** - Example schedule 20 08 26 daily 4pm\",\"**Disable schedule** - Deactivate a scheduled automation\",\"**Cookie** - Store cookie in cloud or desktop\",\"**Proxy** - Insert your proxy details\",\"**Cloudflare** - Bypass bot detection\",\"**Resource blocking** - block images and stylesheets on .example.com\",\"**Notifications** - Notify when a run fails by email me@example.com\"]},{\"text\":\"Debug\",\"lines\":[\"**Troubleshooting** - Get help setting up steps\"]},{\"text\":\"Docs\",\"lines\":[\"**Docs** - Docs how do I click an element?\"]},{\"text\":\"Problem solvers\",\"lines\":[\"**Slow scraper** - Help speeding up web scraper\",\"**Couldn't find element** - Get help fixing selectors\",\"**Running out of runtime** - Upgrade\"]},{\"text\":\"Other\",\"lines\":[\"**Cancel** - Cancels action\",\"**help** - Select new mode\"]}]","Prompts to use","What can the AI do?","Task","Prompt",[26,1433,1434],{},"::",[736,1436,1437],{"bg":394,"color":738},[47,1438],{"author":1439,"quote":1440},"Andrew Osborne","Works a charm and really flexible for any use-case you'd have.",[53,1442],{"className":1443},[35,747],[63,1445],{"className":1446,"headline":1447,"linkText":119,"linkTo":174,"text":1448},[35,747],"Ready to use AI to help make automations?\n","Free to start. No credit card.",{"title":67,"searchDepth":68,"depth":68,"links":1450},[],"Plug Claude, ChatGPT, Gemini, Grok, DeepSeek, or Perplexity Sonar into a bot to extract data and generate text on the fly.",{"pageClass":1453},"blocks-layout","\u002Fai-assistant",{"title":1410,"description":1451},"ai-assistant","KDRfLE_JC3c1BmHFL3_r36r-Gddv08yJZBgzTQtCVlQ",{"id":1459,"title":1460,"body":1461,"date":71,"description":1522,"extension":73,"meta":1523,"navigation":75,"order":71,"path":336,"seo":1524,"stem":1525,"__hash__":1526},"content\u002Fbuild-in-claude.md","Build browser automations with Claude",{"type":8,"value":1462,"toc":1520},[1463,1469,1474,1483,1491,1498,1503,1511,1516],[115,1464],{":images":1415,"description":1465,"primaryText":1466,"primaryTo":1467,"title":1468},"Use our skill to generate no-code or coded browser automations you can run on axiom.ai infrastructure in minutes. Choose the type of bot you want to build and follow the instructions.","Install the skill","#install","Build browser automations in Claude Code.",[1470,1471],"captioned-image",{"alt":1472,"url":1473},"Build and run coded and no-code browser bots with axiom.ai","\u002Flanding\u002Fvs-code-claude.webp",[1475,1476],"feature-grid-staggered",{":items":1477,"cols":1478,"description":1479,"eyebrow":1480,"section-id":1481,"title":1482,"variant":665},"[{\"icon\":\"person_add\",\"title\":\"Sign me up\",\"description\":\"Tell Claude you need an Axiom account and it signs you up and gets you ready to go.\"},{\"icon\":\"deployed_code\",\"title\":\"Build a no-code axiom\",\"description\":\"Describe the bot you want in plain English and Claude builds a no-code axiom you can drop straight into the Chrome extension.\"},{\"icon\":\"code\",\"title\":\"Build a coded axiom\",\"description\":\"Describe the automation you want and Claude writes a ready-to-run Node script you can drop into your stack.\"},{\"icon\":\"play_arrow\",\"title\":\"Run a saved axiom\",\"description\":\"Ask Claude to launch one of your saved bots by name and get a link to watch it work in real time.\"}]",4,"Tell Claude what you need in plain English and the skill picks the right workflow for you, no commands or setup required.","What the Skill does","what-it-does","Just describe what you want.",[345,1484],{":items":1485,"codeBg":1486,"description":1487,"eyebrow":153,"section-id":1488,"title":1489,"className":1490},"[{\"eyebrow\":\"Step 1\",\"title\":\"Install Claude Code\",\"description\":\"See Anthropic's installation guide. The CLI is required for these install steps. `\u002Fplugin` slash-commands aren't available in the VS Code extension yet, but day-to-day building works in VS Code once the plugin is installed.\",\"to\":\"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Foverview\",\"linkText\":\"See Anthropic's install guide\"},{\"eyebrow\":\"Step 2\",\"title\":\"Add the axiom skill\",\"description\":\"Open a Claude Code session and submit each command as its own message. Pasting more than one at a time concatenates them and git rejects the URL. Requires GitHub SSH access to the axiom-browser-automation org.\",\"code\":\"\u002Fplugin marketplace add git@github.com:axiom-browser-automation\u002Fclaude-skill.git\\n\u002Fplugin install axiom@axiom-skills\\n\u002Freload-plugins\\n\"},{\"eyebrow\":\"Step 3 (optional)\",\"title\":\"Switch to VS Code\",\"description\":\"Once installed, the plugin and your settings are shared with the Claude extension for VS Code. Day-to-day building is smoother there. Sign in with the same account and the skill activates automatically when you ask Claude to build an axiom in any project.\",\"to\":\"https:\u002F\u002Fwww.anthropic.com\u002Fnews\u002Fclaude-code-vs-code-extension\",\"linkText\":\"Claude for VS Code\"},{\"image\":\"\u002Flanding\u002Fnew-account-claude-vs-code.webp\",\"imageAlt\":\"Create account\",\"eyebrow\":\"Step 4\",\"title\":\"Create an account\",\"description\":\"No account? No problem. Create one right in the CLI as you build. We mint a fresh API key and set you up automatically.\",\"linkText\":\"Learn about accounts\"},{\"image\":\"\u002Flanding\u002Fvs-code-claude.webp\",\"imageAlt\":\"Choose to build a coded or no-code bot\",\"eyebrow\":\"Step 5\",\"title\":\"Select bot type\",\"description\":\"Code a bot in VS Code or any other tool, or let the skill craft a no-code bot you can upload to our platform.\",\"linkText\":\"See bot types\"},{\"image\":\"\u002Flanding\u002Fcreate-bo-vs-code-skill.webp\",\"imageAlt\":\"Prompt the AI to build your automation\",\"eyebrow\":\"Step 6\",\"title\":\"Prompt the AI\",\"description\":\"Tell the AI what you want to automate and follow the prompts until your bot is ready to run.\",\"to\":\"\u002Finfrastructure\",\"linkText\":\"Run cloud or desktop\"}]","bg-white dark:bg-gray-900","Set up Claude Code with the axiom skill, then build and run your first bot. Same flow whether you're going no-code or code.","install","From install to your first bot in six steps.",[35,747],[345,1492],{":items":1493,"codeBg":1486,"description":1494,"eyebrow":1495,"section-id":1496,"title":1497},"[{\"eyebrow\":\"Prompt\",\"title\":\"Paste this into Claude select no-code\",\"description\":\"Simply answser the AI's questions, then upload the JSON file it generates to our chrome extension in order to run. Upload API end point coming soon. \",\"code\":\"Build me an axiom that visits https:\u002F\u002Fnews.ycombinator.com every morning at 9am,\\nscrapes the top 5 stories, and writes them to my Google Sheet.\\n\"}]","Create a simple no-code bot in as little as 30 seconds, then upload it to our Chrome extension to run.","Quickstart","quickstart","A first automation in 30 seconds.",[1470,1499],{"alt":1500,"url":1501,"caption":1502},"Claude creating a web scraper using axiom","\u002Flanding\u002Fhn-scraper-claude.webp","Web scraper made in under 30 seconds",[736,1504,1505],{"bg":394,"color":738},[364,1506],{":items":1507,"className":1508,"cols":670,"description":67,"eyebrow":1509,"title":1510,"variant":377},"[{\"shape\":\"cloud-scale3\",\"title\":\"Run in our infrastructure.\",\"description\":\"Hands-off, headless, always on. Schedules, parallel runs, proxies, monitoring, all built in. Nothing to babysit.\",\"to\":\"\u002Finfrastructure\u002Fcloud\",\"linkText\":\"Read more about cloud\"},{\"shape\":\"desktop-large\",\"title\":\"Run on your machine\",\"description\":\"Run on your computer with our desktop app in complete privacy. Schedule runs and run unlimited automations with no concurrency limits.\",\"to\":\"\u002Finfrastructure\u002Fdesktop\",\"linkText\":\"Read more about desktop\"}]",[91],"Run anywhere","In our cloud. Or on your machine.",[63,1512],{"className":1513,"headline":1514,"linkText":1515,"linkTo":174,"text":1448},[35,747],"Ready to install the skill \nand make automations in Claude Code?\n","Download the skill",[400,1517],{":links":1518,"className":1519},"[{\"eyebrow\":\"Other ways to build\",\"title\":\"Build with no-code\",\"to\":\"\u002Fbuild-with-no-code\"},{\"eyebrow\":\"Other ways to build\",\"title\":\"Build with code\",\"to\":\"\u002Fbuild-with-code\"}]",[35,747],{"title":67,"searchDepth":68,"depth":68,"links":1521},[],"Describe a bot in plain English. Claude builds, configures, and runs it on your axiom infrastructure. Edit later in the visual builder or as Puppeteer code.",{},{"title":1460,"description":1522},"build-in-claude","3gyuSsjT6owToDGIqCCSoTW7xdDg9iAKg1A-Cr--hZ8",{"id":1528,"title":1529,"body":1530,"date":71,"description":1589,"extension":73,"meta":1590,"navigation":75,"order":71,"path":1591,"seo":1592,"stem":1593,"__hash__":1594},"content\u002Fbuild-with-code.md","Build browser automations with code",{"type":8,"value":1531,"toc":1587},[1532,1540,1545,1553,1556,1565,1571,1577,1583],[115,1533],{"description":1534,"primaryText":1535,"primaryTo":1536,"secondaryText":1537,"secondaryTo":1538,"title":1539},"Connect your code to a real Chromium browser. Drop our WebSocket URL into Puppeteer, Playwright, or any CDP client. Your scripts run as-is. No servers, no Chrome to install.","Try code dashboard","https:\u002F\u002Fcode.axiom.ai","Read the docs","\u002Fdocs\u002Fdeveloper-hub","Build with code.",[1470,1541],{"alt":1542,"caption":1543,"url":1544},"run code in your browser with our CDP based api","run code form your stack in a real browser.","\u002Flanding\u002Fvscode-playwright.webp",[1475,1546],{":items":1547,":reverse-stagger":1548,"description":1549,"eyebrow":1550,"link":1538,"linkText":1551,"title":1552,"variant":665},"[{\"image\":\"\u002Flanding\u002Fvs-code-cdp-api.webp\",\"imageAlt\":\"Drive a real Chromium from your code over CDP\",\"title\":\"Chrome API\",\"description\":\"Open a WebSocket to a real Chromium and drive it with Puppeteer, Playwright, or any CDP client. Full DevTools Protocol access, no rewriting your scripts.\",\"bullets\":[\"Connect from Puppeteer or Playwright\",\"Execute arbitrary JavaScript in the page\",\"Manipulate the DOM, scrape data, drive UIs\",\"Per-session proxies, viewport, user agent\"],\"link\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fcdp\",\"linkText\":\"Read Chrome API docs\",\"recommended\":true},{\"image\":\"\u002Flanding\u002Fvs-code-steps-api.webp\",\"imageAlt\":\"Call high-level browser actions as Node functions with the axiom-api package\",\"title\":\"Step API\",\"description\":\"Skip the CDP boilerplate. Call high-level browser actions as Node functions. The same step library that powers the no-code builder, available as code.\",\"bullets\":[\"High-level browser actions in Node\",\"Available via the axiom-api package\",\"Same steps as the no-code builder\",\"Mix with raw Chrome API calls\"],\"link\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\",\"linkText\":\"Read Step API docs\"},{\"image\":\"\u002Flanding\u002Fcurl-command-line.webp\",\"imageAlt\":\"Trigger saved bots over REST and manage runs from your stack\",\"title\":\"Orchestrate API\",\"description\":\"Trigger your saved bots from anywhere over REST. Combine code and no-code in one workflow. Manage runs, retries, and schedules from your stack.\",\"bullets\":[\"Trigger from CLI, cron, queue, serverless, or CI\",\"Mix code steps and no-code workflows\",\"Webhooks, schedules, retries\",\"Get results streamed back synchronously\"],\"link\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\",\"linkText\":\"Read Orchestrate API docs\"}]","true","Start with the Chrome API and your existing Puppeteer or Playwright scripts. Reach for the Step API when you want higher-level Node functions, or the Orchestrate API to trigger saved bots over REST. Mix layers, or stick to one.","Getting started","See docs","Three ways to build, one runtime underneath.",[345,1554],{":items":1555,"eyebrow":357,"title":358},"[{\"title\":\"Live editor\",\"description\":\"Write and run scripts in the browser. Test selectors, prototype flows, share runnable snippets with your team.\"},{\"title\":\"Session recording\",\"description\":\"Every run is recorded. Replay step by step, scrub the timeline, see the DOM at any point.\"},{\"title\":\"Run reports\",\"description\":\"Logs, network requests, console output, errors, screenshots, all in one place per run.\"}]",[328,1557],{"description":1558,"eyebrow":1559,"image":1560,"imageAlt":1561,"primaryText":1562,"primaryTo":336,"secondaryText":1563,"secondaryTo":1536,"title":1564},"Use Claude Code to scaffold a script, fix a flaky selector, or generate a whole bot from a description. Get back working Puppeteer or Playwright code you own and can edit.","Code in Claude","\u002Flanding\u002Fcreate-bo-vs-code-skill.webp","build in claude no-code or code","Build in Claude Code","Try our code dashboard","Build bots in Claude Code. Run them on axiom.ai.",[736,1566,1567],{"bg":394,"color":738},[364,1568],{":items":1569,"className":1570,"cols":670,"description":67,"eyebrow":1509,"title":1510,"variant":377},"[{\"shape\":\"cloud-scale3\",\"title\":\"Run in our infrastructure\",\"description\":\"Hands-off, headless, always on. Schedules, parallel runs, proxies, monitoring, all built in. Nothing to babysit.\",\"to\":\"\u002Finfrastructure\u002Fcloud\",\"linkText\":\"Read more about cloud\"},{\"shape\":\"desktop-large\",\"title\":\"Run on your machine\",\"description\":\"Run on your computer with our desktop app in complete privacy. Schedule runs and run unlimited automations with no concurrency limits.\",\"to\":\"\u002Finfrastructure\u002Fdesktop\",\"linkText\":\"Read more about desktop\"}]",[91],[63,1572],{"className":1573,"headline":1574,"linkText":1575,"linkTo":1536,"text":1576},[35,747],"Ready to code an automation?\n","Code dashboard","Then get started running in our cloud for free.",[1470,1578],{"alt":1579,"caption":1580,"url":1581,"className":1582},"code.axom.ai build and run code in our cloud test in our playground.","Build a browser automation in code run on our infrastructure.","\u002Flanding\u002Fcode-tool-playground.webp",[35,747],[400,1584],{":links":1585,"className":1586},"[{\"eyebrow\":\"Other ways to build\",\"title\":\"Build with no-code\",\"to\":\"\u002Fbuild-with-no-code\"},{\"eyebrow\":\"Other ways to build\",\"title\":\"Build in Claude Code\",\"to\":\"\u002Fbuild-in-claude\"}]",[35,747],{"title":67,"searchDepth":68,"depth":68,"links":1588},[],"Connect Puppeteer, Playwright, or any CDP-speaking library to axiom. Run browsers on our cloud straight from your stack with no servers to manage and no Chrome to install.",{},"\u002Fbuild-with-code",{"title":1529,"description":1589},"build-with-code","AtMSMUH73qGoqF4v2-SIPAxr7byQy540PhcfYF4znp0",{"id":1596,"title":1562,"body":1597,"date":71,"description":1642,"extension":73,"meta":1643,"navigation":75,"order":71,"path":1645,"seo":1646,"stem":1647,"__hash__":1648},"content\u002Fbuild-with-no-code\u002Fclaude.md",{"type":8,"value":1598,"toc":1640},[1599,1603,1607,1614,1619,1622,1625,1629,1632,1636],[115,1600],{"description":1601,"primaryText":119,"primaryTo":174,"title":1602},"A guided skill builds your bot through a few questions.\nExport the workflow, upload it to the Chrome extension, and run it. No code, no manual setup.\n","Build no-code bots in Claude Code.",[1470,1604],{"alt":1605,"url":1606},"Create your account and build no-code automation in claude code with axiom.ai","\u002Flanding\u002Fnew-account-claude-vs-code.webp",[345,1608],{":items":1609,"description":1610,"eyebrow":1376,"link":1611,"linkText":1612,"title":1613},"[{\"image\":\"\u002Flanding\u002Fvs-code-claude.webp\",\"imageAlt\":\"Choose to build a no-code bot in Claude\",\"eyebrow\":\"Step 1\",\"title\":\"Select no-code\",\"description\":\"Tell Claude you want to build a no-code bot. The skill picks the right workflow and starts asking the questions it needs.\"},{\"image\":\"\u002Flanding\u002Fcreate-bo-vs-code-skill.webp\",\"imageAlt\":\"Prompt Claude with what you want your bot to do\",\"eyebrow\":\"Step 2\",\"title\":\"Prompt\",\"description\":\"Describe what you want the bot to do, one action at a time. Claude asks follow-up questions to fill in the gaps.\"},{\"image\":\"\u002Flanding\u002Fexport-import.webp\",\"imageAlt\":\"Claude exports your bot as a JSON file to import into axiom chrome extension\",\"eyebrow\":\"Step 3\",\"title\":\"Import to the extension\",\"description\":\"Claude generates the bot and hands you a file. Open the Chrome extension and import it in a click. API direct import coming soon.\"},{\"image\":\"\u002Flanding\u002Frun-bots.webp\",\"imageAlt\":\"Upload the bot to the Chrome extension and run a test\",\"eyebrow\":\"Step 4\",\"title\":\"Run and test\",\"description\":\"Upload the JSON to the Chrome extension and run it once. Watch each step fire and check the output.\"},{\"image\":\"\u002Flanding\u002Fai-assistant-schedule-2.webp\",\"imageAlt\":\"Schedule the bot to run on cloud or desktop\",\"eyebrow\":\"Step 5\",\"title\":\"Schedule\",\"description\":\"When you're happy, schedule it to run on cloud or desktop. Set the cadence, hit save, and it runs without you.\",\"to\":\"\u002Fbuild-in-claude#install\",\"linkText\":\"Install Claude skill\"}]","Use the Claude skill to build no-code bots from a prompt. Same flow whether you're new to axiom or already set up.","\u002Fbuild-in-claude#install","Set up the Claude skill","Answer a few questions in Claude, then run your bot.",[364,1615],{":items":1616,"cols":68,"eyebrow":1617,"title":1618,"variant":665},"[{\"title\":\"Web scraping\",\"description\":\"Extract product prices, listings, articles, and search results from any page.\"},{\"title\":\"Data entry\",\"description\":\"Push spreadsheet rows into web forms for CRM updates and batch submissions.\"},{\"title\":\"Reporting\",\"description\":\"Collect dashboard data and exports on a schedule for your team.\"}]","What you can automate","Anything you'd do in a browser. Faster, repeatedly, on a schedule.",[364,1620],{":items":1569,"cols":670,"eyebrow":1509,"title":1510,"variant":377,"className":1621,"description":67},[91],[597,1623],{":stats":1624},"[{\"value\":\"25,000\",\"suffix\":\"+\",\"label\":\"BOTS RUN\",\"description\":\"Total bots run in the cloud.\"},{\"value\":\"12.5M\",\"label\":\"RUNTIME MINS\",\"description\":\"Total cloud runtime, in minutes.\"},{\"value\":\"8M\",\"suffix\":\"+\",\"label\":\"PAGES VISITED\",\"description\":\"Total webpages visited.\"}]",[736,1626,1627],{"bg":394,"color":738},[47,1628],{"author":1439,"quote":1440},[53,1630],{"className":1631},[35,747],[63,1633],{"className":1634,"headline":1635,"linkText":119,"linkTo":174,"text":1448},[35,747],"Ready to build a no-code bot \nwith Claude?\n",[400,1637],{":links":1638,"className":1639},"[{\"eyebrow\":\"No-code ways to build\",\"title\":\"Step by step\",\"to\":\"\u002Fbuild-with-no-code\u002Fstep-by-step\"},{\"eyebrow\":\"No-code ways to build\",\"title\":\"Build by description\",\"to\":\"\u002Fbuild-with-no-code\u002Fdescription\"}]",[35,747],{"title":67,"searchDepth":68,"depth":68,"links":1641},[],"A guided skill builds your no-code bot through a few questions. Export the workflow and upload it straight into the extension, then run it. No code, no manual setup.",{"metaTitle":1644},"Build no-code browser bots in Claude Code","\u002Fbuild-with-no-code\u002Fclaude",{"title":1562,"description":1642},"build-with-no-code\u002Fclaude","0buTzrEmgeqUOc3NLJvT2Sse3Q_Q0qrS-xTqXxHBcL8",{"id":1650,"title":265,"body":1651,"date":71,"description":1589,"extension":73,"meta":1707,"navigation":75,"order":71,"path":1420,"seo":1708,"stem":1709,"__hash__":1710},"content\u002Fbuild-with-no-code\u002Fdescription.md",{"type":8,"value":1652,"toc":1705},[1653,1657,1661,1666,1668,1677,1679,1682,1684,1688,1691,1695,1701],[115,1654],{"description":1655,"primaryText":119,"primaryTo":174,"title":1656},"Describe what you want in plain English and AI assembles the bot for you.\nReview it, hit run, and you're done. **Coming soon.**\n","Build no-code bots by describing them.",[1470,1658],{"alt":1659,"url":1660},"Describe the type of bot you want to build and the ai will build it, axiom.ai","\u002Flanding\u002Fbuild-by-description-start.webp",[345,1662],{":items":1663,"description":1664,"eyebrow":1376,"title":1665},"[{\"image\":\"\u002Flanding\u002Fbuild-by-description-large.webp\",\"imageAlt\":\"Describe the bot you want to build\",\"eyebrow\":\"Step 1\",\"title\":\"Describe\",\"description\":\"Tell the bot what you want, one action at a time. Break your task into simple instructions, each line replicating a single step you'd take.\",\"linkText\":\"See example prompts\"},{\"image\":\"\u002Flanding\u002Fai-assistant-merge.webp\",\"imageAlt\":\"AI walks you through configuring each step\",\"eyebrow\":\"Step 2\",\"title\":\"Configure\",\"description\":\"The AI walks you through configuring each step. Selecting an element, entering text, whatever the step needs. Settings vary by step.\",\"linkText\":\"See the builder\"},{\"image\":\"\u002Flanding\u002Frun-bots.webp\",\"imageAlt\":\"Test the bot before going live\",\"eyebrow\":\"Step 3\",\"title\":\"Test run\",\"description\":\"Run the bot once to see it work. Watch each step fire, check the output, fix anything that's off.\",\"linkText\":\"See test runs\"},{\"image\":\"\u002Flanding\u002Fai-assistant-schedule-2.webp\",\"imageAlt\":\"Run on demand or schedule on cloud or desktop\",\"eyebrow\":\"Step 4\",\"title\":\"Schedule\",\"description\":\"When you're happy, run on demand or schedule it on cloud or desktop. Set it and forget it.\",\"to\":\"\u002Finfrastructure\",\"linkText\":\"Run cloud or desktop\"}]","Describe what you want, let the AI guide setup, test, then run or schedule.","Four steps from idea to running bot.",[416,1667],{},[328,1669],{"description":1670,"eyebrow":1671,"image":1672,"imageAlt":1673,"primaryText":1674,"primaryTo":1675,"secondaryText":876,"secondaryTo":1454,"title":1676},"Extend your automation with help from the AI assistant, for example filling in forms. It can handle other tasks too, like adding proxies, setting up schedules, and solving issues.","Claude, built-in assistant","\u002Flanding\u002Fai-assistant-merge.webp","ai assistant can fix errors or tell you how to in steps","Install extension","https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Faxiom-browser-automation\u002Fcpgamigjcbffkaiciiepndmonbfdimbb?hl=en-GB","Need to extend your bot? Just ask Claude.",[364,1678],{":items":1616,"cols":68,"eyebrow":1617,"title":1618,"variant":665},[364,1680],{":items":1569,"cols":670,"eyebrow":1509,"title":1510,"variant":377,"className":1681,"description":67},[91],[597,1683],{":stats":1624},[736,1685,1686],{"bg":394,"color":738},[47,1687],{"author":1439,"quote":1440},[53,1689],{"className":1690},[35,747],[63,1692],{"className":1693,"headline":1694,"linkText":119,"linkTo":174,"text":1448},[35,747],"Ready to describe your first bot?\n",[1470,1696],{"alt":1697,"url":1698,"caption":1699,"className":1700},"axom.ai build by description interface","\u002Flanding\u002Fbuild-by-description-large.webp","Build a browser automation by describing it.",[35,747],[400,1702],{":links":1703,"className":1704},"[{\"eyebrow\":\"No-code ways to build\",\"title\":\"Step by step\",\"to\":\"\u002Fbuild-with-no-code\u002Fstep-by-step\"},{\"eyebrow\":\"No-code ways to build\",\"title\":\"Build in Claude Code\",\"to\":\"\u002Fbuild-with-no-code\u002Fclaude\"}]",[35,747],{"title":67,"searchDepth":68,"depth":68,"links":1706},[],{"metaTitle":1529},{"title":265,"description":1589},"build-with-no-code\u002Fdescription","Q9RAuJ8WHCfKI2iT5HOJtxPfQ-A8HWMSMa5iiVynX1I",{"id":1712,"title":1713,"body":1714,"date":71,"description":1766,"extension":73,"meta":1767,"navigation":75,"order":71,"path":1768,"seo":1769,"stem":1770,"__hash__":1771},"content\u002Fbuild-with-no-code\u002Findex.md","Build no-code browser bots by describing them to AI",{"type":8,"value":1715,"toc":1764},[1716,1719,1721,1727,1735,1737,1743,1746,1749,1753,1756,1760],[115,1717],{"description":1718,"primaryText":119,"primaryTo":174,"title":123},"The no-code way. Same automations, three ways to get started.",[1470,1720],{"alt":1659,"url":1660},[1475,1722],{":items":1723,":reverse-stagger":1548,"description":1724,"eyebrow":1550,"link":1725,"linkText":1551,"title":1726,"variant":665},"[{\"image\":\"\u002Flanding\u002Fbuild-by-description-large.webp\",\"imageAlt\":\"start building automations by describing them to our ai - axiom.ai\",\"title\":\"By description\",\"description\":\"Describe what you want and AI assembles the bot in the builder. Fastest way to start.\",\"link\":\"\u002Fbuild-with-no-code\u002Fdescription\",\"linkText\":\"Build by description\",\"comingSoon\":true},{\"image\":\"\u002Flanding\u002Fcombine-steps.webp\",\"imageAlt\":\"Old school no ai, build automations step by step - axiom.ai\",\"title\":\"Step by step\",\"description\":\"Place each action yourself. The hands-on way, best for precise logic and fine-tuning.\",\"link\":\"\u002Fbuild-with-no-code\u002Fstep-by-step\",\"linkText\":\"Build step-by-step\"},{\"image\":\"\u002Flanding\u002Fvs-code-claude.webp\",\"imageAlt\":\"Use our Claude skill to create bots with no-code\",\"title\":\"In Claude Code\",\"description\":\"A guided skill builds your bot through a few questions. Export, upload to the extension, run.\",\"link\":\"\u002Fbuild-with-no-code\u002Fclaude\",\"linkText\":\"Build in Claude Code\"}]","Every method builds a bot that runs in the extension. Pick how you'd rather make it.","\u002Fdocs\u002Fno-code-tool\u002Fthe-builder","Three different ways. Same no-code builder.",[1475,1728],{":items":1729,":reverse-stagger":1548,"description":1730,"eyebrow":1731,"link":1732,"linkText":1733,"title":1734,"variant":665},"[{\"image\":\"\u002Flanding\u002Fcombine-steps.webp\",\"imageAlt\":\"choose steps and assemble your automation - axiom.ai\",\"title\":\"The step finder\",\"description\":\"Search the step library to find the right step for whatever you want your bot to do.\",\"linkText\":\"See docs\"},{\"image\":\"\u002Flanding\u002Ftoolbar.webp\",\"imageAlt\":\"The step toolbar in axiom.ai\",\"title\":\"Step toolbar\",\"description\":\"Move, copy, duplicate, or delete steps as you build.\",\"linkText\":\"See docs\"},{\"image\":\"\u002Flanding\u002Fselector-tool-landing.webp\",\"imageAlt\":\"Pick any element on the page with the selector tool - axiom.ai\",\"title\":\"Selector tool\",\"description\":\"Point at any element and axiom builds the selector for you. No CSS or XPath required.\",\"linkText\":\"See docs\"},{\"image\":\"\u002Flanding\u002Fsetting-landing.webp\",\"imageAlt\":\"Configure each step on the page - axiom.ai\",\"title\":\"Configuration\",\"description\":\"Set targets, values, and options for each step right on the page as you build.\",\"linkText\":\"See docs\"},{\"image\":\"\u002Flanding\u002Frun-test.webp\",\"imageAlt\":\"Click run to test as you build, watch the bot in the extension - axiom.ai\",\"title\":\"Test as you run\",\"description\":\"Run a single step or the whole bot from inside the builder and watch it go.\",\"linkText\":\"See docs\"},{\"image\":\"\u002Flanding\u002Fexport-import.webp\",\"imageAlt\":\"Export and share the automations you make in axiom.ai with your team\",\"title\":\"Share your bots\",\"description\":\"Export and share your automation with others.\",\"linkText\":\"See docs\"}]","Everything you need to assemble a bot visually. Add steps, configure them on the page, test as you build.","The builder","\u002Fno-code-tool","See builder","Build in the page, whilst using your app.",[416,1736],{},[328,1738],{"description":1739,"eyebrow":1671,"image":1740,"imageAlt":1741,"primaryText":1674,"primaryTo":1675,"secondaryText":876,"secondaryTo":1454,"title":1742},"We've built in an AI assistant to help you assemble no-code automations right in the browser. While you're in the builder, Claude can suggest next steps, fix an issue with a step, or even scaffold a whole bot for you.","\u002Flanding\u002Fai-assistant-error.webp","AI assistant can fix errors, or tell you how to in your steps","Stuck mid-build? Just Ask Claude.",[364,1744],{":items":1745,"cols":68,"eyebrow":1617,"title":1618,"variant":665},"[{\"title\":\"Web scraping\",\"description\":\"Extract product prices, listings, articles, and search results from any page.\"},{\"title\":\"Data entry\",\"description\":\"Push spreadsheet rows into web forms for CRM updates and batch submissions.\"},{\"title\":\"Reporting\",\"description\":\"Collect dashboard data and exports on a schedule for your team.\"},{\"title\":\"File workflows\",\"description\":\"Download, upload, and transform files as part of one repeatable bot.\"},{\"title\":\"Lead generation\",\"description\":\"Find prospects, enrich records, and push them into your CRM automatically.\"},{\"title\":\"Monitoring\",\"description\":\"Watch pages for changes and alert your team when key values update.\"}]",[364,1747],{":items":1569,"cols":670,"eyebrow":1509,"title":1510,"variant":377,"className":1748,"description":67},[91],[736,1750,1751],{"bg":394,"color":738},[47,1752],{"author":1439,"quote":1440},[53,1754],{"className":1755},[35,747],[63,1757],{"className":1758,"headline":1759,"linkText":119,"linkTo":174,"text":1448},[35,747],"Start automating today\n",[400,1761],{":links":1762,"className":1763},"[{\"eyebrow\":\"No-code ways to build\",\"title\":\"Build step-by-step\",\"to\":\"\u002Fbuild-with-no-code\u002Fstep-by-step\"},{\"eyebrow\":\"No-code ways to build\",\"title\":\"Build by description\",\"to\":\"\u002Fbuild-with-no-code\u002Fdescription\"},{\"eyebrow\":\"No-code ways to build\",\"title\":\"Build in Claude Code\",\"to\":\"\u002Fbuild-with-no-code\u002Fclaude\"}]",[35,747],{"title":67,"searchDepth":68,"depth":68,"links":1765},[],"Describe what you want in plain English and AI assembles the bot for you. Review, run, and schedule it inside the Chrome extension. No code, no setup.",{},"\u002Fbuild-with-no-code",{"title":1713,"description":1766},"build-with-no-code\u002Findex","BeMaoISzhh2ew9dJxXvkAoEHTSBnin5X3rg2sVYHOLk",{"id":1773,"title":1774,"body":1775,"date":71,"description":1824,"extension":73,"meta":1825,"navigation":75,"order":71,"path":1827,"seo":1828,"stem":1829,"__hash__":1830},"content\u002Fbuild-with-no-code\u002Fstep-by-step.md","Build no-code bots step by step",{"type":8,"value":1776,"toc":1822},[1777,1781,1787,1792,1794,1800,1802,1805,1807,1811,1814,1818],[115,1778],{"description":1779,"primaryText":119,"primaryTo":174,"title":1780},"Place each action yourself in the visual builder. Total control, no-code, right inside your Chrome extension.\n","Build no-code bots step by step.",[835,1782],{"className":1783,"id":1785,"video-id":1786},[1784],"space-bottom-lg","demo","RKzbfw7qna0?si=2JGefCZRQiAlyVAU",[345,1788],{":items":1789,"eyebrow":1376,"link":1732,"linkText":1790,"title":1791},"[{\"image\":\"\u002Flanding\u002Fcombine-steps.webp\",\"imageAlt\":\"Use axioms visual builder to create browser automations\",\"eyebrow\":\"Step 1\",\"title\":\"Combine steps to build\",\"description\":\"Replicate your automation by combining steps that mirror your actions. Steps for entering text, scraping data, even interacting with AI.\",\"to\":\"\u002Fno-code-tool\",\"linkText\":\"See builder\"},{\"image\":\"\u002Flanding\u002Frun-cloud-desktop.webp\",\"imageAlt\":\"Just click run on desktop or cloud from the extension\",\"eyebrow\":\"Step 2\",\"title\":\"Click run to test\",\"description\":\"Run on cloud or desktop straight from the extension. Watch it work and check the output.\",\"to\":\"\u002Finfrastructure\",\"linkText\":\"Run cloud or desktop\"},{\"image\":\"\u002Flanding\u002Fai-assistant-schedule-2.webp\",\"imageAlt\":\"Use ai to help build browser automations in axiom.ai\",\"eyebrow\":\"Step 3\",\"title\":\"Optimise and schedule when done\",\"description\":\"Configure runtime options like scheduling and proxies, then set it to run on autopilot. Trigger from webhooks or AI when you need to.\",\"linkText\":\"Learn more\"}]","the no-code tool","Place each step, then run it.",[416,1793],{},[328,1795],{"description":1796,"eyebrow":1797,"image":1798,"imageAlt":1673,"primaryText":1674,"primaryTo":1675,"secondaryText":876,"secondaryTo":1454,"title":1799},"Tell Claude when your bot should run, like 'every morning at 9am', and it sets up the schedule for you. It can also wire up webhooks and solve issues.","Claude, built in assitant","\u002Flanding\u002Fai-assistant-schedule-2.webp","Schedule a run? Just Ask Claude.",[364,1801],{":items":1616,"cols":68,"eyebrow":1617,"title":1618,"variant":665},[364,1803],{":items":1569,"cols":670,"eyebrow":1509,"title":1510,"variant":377,"className":1804,"description":67},[91],[597,1806],{":stats":1624},[736,1808,1809],{"bg":394,"color":738},[47,1810],{"author":1439,"quote":1440},[53,1812],{"className":1813},[35,747],[63,1815],{"className":1816,"headline":1817,"linkText":119,"linkTo":174,"text":1448},[35,747],"Ready to build your first bot,\nstep by step?\n",[400,1819],{":links":1820,"className":1821},"[{\"eyebrow\":\"No-code ways to build\",\"title\":\"Build by description\",\"to\":\"\u002Fbuild-with-no-code\u002Fdescription\"},{\"eyebrow\":\"No-code ways to build\",\"title\":\"Build in Claude Code\",\"to\":\"\u002Fbuild-with-no-code\u002Fclaude\"}]",[35,747],{"title":67,"searchDepth":68,"depth":68,"links":1823},[],"Place each action yourself in the axiom.ai visual builder. Total control, no code, right inside your Chrome extension. Free to start.",{"metaTitle":1826},"Build no-code browser bots step by step","\u002Fbuild-with-no-code\u002Fstep-by-step",{"title":1774,"description":1824},"build-with-no-code\u002Fstep-by-step","Tf--Y2RzWdK-9lDc718L_v_mm-1NDUX-waAgOQGuXWk",{"id":1832,"title":1833,"body":1834,"date":71,"description":1885,"extension":73,"meta":1886,"navigation":75,"order":71,"path":1887,"seo":1888,"stem":1889,"__hash__":1890},"content\u002Fcustomer-support.md","Customer support — docs, AI help, or talk to a human",{"type":8,"value":1835,"toc":1883},[1836,1845,1854,1863,1873,1880],[115,1837],{"description":1838,"primaryText":1839,"primaryTo":1840,"secondaryText":200,"secondaryTo":1841,"tertiaryText":1842,"tertiaryTo":1843,"title":1844},"Three ways to get unstuck. Most answers are in the docs. AI can fix or build for you. Real humans answer too, Monday to Friday.","Docs","#docs","#ai","Human","#human","Need help? Docs, AI, or a human?",[736,1846,1847],{"bg":394,"color":738},[1475,1848],{":flat":1548,":items":1849,"description":1850,"eyebrow":1851,"section-id":1852,"title":1853,"variant":377},"[{\"shape\":\"cube\",\"title\":\"Docs\",\"description\":\"Learn how to use the no-code tool.\",\"link\":\"\u002Fdocs\u002Fno-code-tool\",\"linkText\":\"See docs\"},{\"shape\":\"staircase\",\"title\":\"Guides\",\"description\":\"Design patterns to solve issues.\",\"link\":\"\u002Fguides\",\"linkText\":\"See guides\"},{\"shape\":\"integration\",\"title\":\"Troubleshooting\",\"description\":\"Troubleshoot your automations like a pro.\",\"link\":\"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\",\"linkText\":\"See troubleshooting\"}]","Three places to look depending on what you're stuck on.","Learn","docs","Find an answer fast.",[328,1855],{"className":1856,"description":1857,"eyebrow":1858,"image":1560,"imageAlt":1859,"primaryText":1466,"primaryTo":1611,"secondaryText":1860,"secondaryTo":336,"section-id":1861,"title":1862},[35,747],"Add our Claude skill and describe what you want. Claude asks a few questions, then generates a working axiom bot, no-code or code, that you can run, edit, and schedule on our infrastructure.","Claude skill","Build axiom bots inside Claude Code using the axiom Claude skill","How the skill works","ai","Build axiom bots inside Claude Code.",[1864,1865],"uninstall-feedback",{":paragraphs":1866,"className":1867,"description":1868,"eyebrow":1869,"section-id":1870,"title":1871,"typeformUrl":1872},"[\"\u003Ch4 class='!mb-2'>Speed up your wait\u003C\u002Fh4>\",\"Following these steps before you submit helps us get back to you faster. Paid plans get priority, and your ticket is created automatically when you hit submit.\",\"\u003Cul class='list-disc pl-5 space-y-1'>\u003Cli>Share your automation, \u003Ca class='text-primary underline' href='#'>see how here\u003C\u002Fa>\u003C\u002Fli>\u003Cli>If you're using a Google Sheet, share it with \u003Cstrong>support@axiom.ai\u003C\u002Fstrong> with editor permissions\u003C\u002Fli>\u003Cli>Share a screen recording walking us through the use case\u003C\u002Fli>\u003Cli>Export the target webpage using Axiom's built-in page exporter\u003C\u002Fli>\u003C\u002Ful>\",\"Our team is available Monday to Friday, 9am–5pm GMT. Pro Max and Ultimate plans receive priority support; for all other paid plans, we aim to reply within two business days.\"]",[35,747],"To help you quickly, please share the following: your automation, the page you are stuck on, and a description of the issue as a screen recording or text.","Ask a human","human","Need help? Share your automation.","https:\u002F\u002Fytjdgf7ld1k.typeform.com\u002Fto\u002FS52oDsji?disable-auto-focus=true",[57,1874],{":faqs":392,"className":1875,"description":1876,"eyebrow":384,"link":1877,"linkText":1878,"title":1879},[35,747],"Common things our users ask about no-code, code, AI, and running automations on our infrastructure.","\u002Fdocs\u002Ffaq","See FAQ","Frequent questions",[63,1881],{"className":1882},[35,747],{"title":67,"searchDepth":68,"depth":68,"links":1884},[],"Stuck on a browser automation? Search the docs, use our Claude skill, or talk to a human. UK office hours, real humans, Monday to Friday.",{},"\u002Fcustomer-support",{"title":1833,"description":1885},"customer-support","mjVBrGKktG4sgBr6fBCmnuaBgSrpwloKqxP3oMnWUMw",{"id":1892,"title":1893,"body":1894,"date":71,"description":2129,"extension":73,"meta":2130,"navigation":75,"order":2131,"path":2132,"seo":2133,"stem":2134,"__hash__":2135},"content\u002Fdocs\u002Faccount\u002Faccount.md","Manage your account",{"type":8,"value":1895,"toc":2121},[1896,1903,1910,1914,1916,1919,1922,1944,1947,1953,1957,1959,1982,1988,1992,1994,2030,2036,2040,2042,2063,2067,2069,2086,2090,2092,2101,2115],[26,1897,1898,1899,1902],{},"Open the axiom.ai extension, go to the dashboard, and click the burger menu in the top-right. Select ",[192,1900,1901],{},"My account"," to open your account settings.",[26,1904,1905],{},[1906,1907],"img",{"alt":1908,"src":1909},"The axiom.ai account menu opened from the dashboard","\u002Fdocs\u002Ftutorials\u002Faxiom-account-menu.jpg",[107,1911,1913],{"id":1912},"set-up-a-team-account","Set up a team account",[112,1915],{},[26,1917,1918],{},"A team account shares a single subscription and runtime allocation between everyone in the team. Team accounts are available on the Ultimate plan only, and we set them up manually within 1 to 2 business days of receiving the request.",[26,1920,1921],{},"To request a team account:",[1923,1924,1925,1932,1939],"ol",{},[189,1926,1927,1928,1931],{},"Click ",[192,1929,1930],{},"Account"," in the main menu, accessed from the top-left of the dashboard.",[189,1933,1934,1935,1938],{},"In the ",[192,1936,1937],{},"Typeform",", enter the email address of every account you want included in the team plan.",[189,1940,1927,1941,148],{},[192,1942,1943],{},"Submit",[26,1945,1946],{},"A team will be in touch within 1 to 2 business days to finish the setup.",[26,1948,1949],{},[1906,1950],{"alt":1951,"src":1952},"The team account request form in axiom.ai","\u002Fdocs\u002Fteam-account-axiom-ai.webp",[107,1954,1956],{"id":1955},"change-email","Change email",[112,1958],{},[1923,1960,1961,1965,1970,1977],{},[189,1962,1927,1963,1931],{},[192,1964,1930],{},[189,1966,1927,1967,148],{},[192,1968,1969],{},"Email & password",[189,1971,1972,1973,1976],{},"Replace the value in ",[145,1974,1975],{},"Email"," with the new email address.",[189,1978,1927,1979,148],{},[192,1980,1981],{},"Update account",[26,1983,1984],{},[1906,1985],{"alt":1986,"src":1987},"The email address field in the axiom.ai account settings","\u002Fdocs\u002Ftutorials\u002Faxiom-email-account.jpg",[107,1989,1991],{"id":1990},"change-password","Change password",[112,1993],{},[1923,1995,1996,2000,2004,2010,2016,2026],{},[189,1997,1927,1998,1931],{},[192,1999,1930],{},[189,2001,1927,2002,148],{},[192,2003,1969],{},[189,2005,2006,2007,148],{},"Enter your existing password in ",[145,2008,2009],{},"Current password",[189,2011,2012,2013,148],{},"Enter your new password in ",[145,2014,2015],{},"New password",[189,2017,2018,2019,2022,2023,2025],{},"Re-enter the new password in ",[145,2020,2021],{},"Retype new password",". This must match ",[145,2024,2015],{}," exactly.",[189,2027,1927,2028,148],{},[192,2029,1991],{},[26,2031,2032],{},[1906,2033],{"alt":2034,"src":2035},"The change password form in the axiom.ai account settings","\u002Fdocs\u002Ftutorials\u002Fchange-paasword.jpg",[107,2037,2039],{"id":2038},"change-company-name-and-role","Change company name and role",[112,2041],{},[1923,2043,2044,2048,2054,2059],{},[189,2045,1927,2046,1931],{},[192,2047,1930],{},[189,2049,2050,2051,148],{},"Enter the new value in ",[145,2052,2053],{},"Enter company name",[189,2055,2050,2056,148],{},[145,2057,2058],{},"Enter company role",[189,2060,1927,2061,148],{},[192,2062,1981],{},[107,2064,2066],{"id":2065},"change-your-country","Change your country",[112,2068],{},[1923,2070,2071,2076,2082],{},[189,2072,1927,2073,2075],{},[192,2074,1930],{}," in the right-side menu.",[189,2077,2078,2079,148],{},"Select your country from ",[145,2080,2081],{},"Select country",[189,2083,1927,2084,148],{},[192,2085,1981],{},[107,2087,2089],{"id":2088},"delete-your-account","Delete your account",[112,2091],{},[2093,2094,2095],"blockquote",{},[26,2096,2097,2100],{},[192,2098,2099],{},"Warning:"," Account deletion is permanent. Once an account is deleted, it can't be recovered.",[1923,2102,2103,2110],{},[189,2104,2105,2106,148],{},"If you have an active plan, ",[659,2107,2109],{"href":2108},"\u002Fdocs\u002Faccount\u002Fsubscription","unsubscribe first",[189,2111,1927,2112,148],{},[192,2113,2114],{},"Delete my account",[26,2116,2117],{},[1906,2118],{"alt":2119,"src":2120},"The delete account section in the axiom.ai account settings","\u002Fdocs\u002Ftutorials\u002Fdelete-account.jpg",{"title":67,"searchDepth":68,"depth":68,"links":2122},[2123,2124,2125,2126,2127,2128],{"id":1912,"depth":670,"text":1913},{"id":1955,"depth":670,"text":1956},{"id":1990,"depth":670,"text":1991},{"id":2038,"depth":670,"text":2039},{"id":2065,"depth":670,"text":2066},{"id":2088,"depth":670,"text":2089},"Update your axiom.ai email, password, company information, country, and team membership, or delete your account permanently.",{},1,"\u002Fdocs\u002Faccount\u002Faccount",{"title":1893,"description":2129},"docs\u002Faccount\u002Faccount","4X_2b5d_zgID_5-PUFr5pUcF0EPzF7LggvU6VPNqgK4",{"id":2137,"title":2138,"body":2139,"date":71,"description":2184,"extension":73,"meta":2185,"navigation":75,"order":293,"path":2186,"seo":2187,"stem":2188,"__hash__":2189},"content\u002Fdocs\u002Faccount\u002Fcreate-account.md","Create an account",{"type":8,"value":2140,"toc":2180},[2141,2144,2148,2150,2155,2159,2161,2166],[26,2142,2143],{},"Every new account gets 120 minutes of free runtime. Open the axiom.ai Chrome extension to get started. The extension prompts you to either create a new account or sign in to an existing one. You can sign up with a Google account, or with an email address and password.",[107,2145,2147],{"id":2146},"sign-up-with-google","Sign up with Google",[112,2149],{},[26,2151,1927,2152,2154],{},[192,2153,2147],{}," to use a Google account to create your axiom.ai account. This is the quickest option, and Google handles the password and security side. Follow the prompts in the Google sign-in window to finish.",[107,2156,2158],{"id":2157},"sign-up-with-email-and-password","Sign up with email and password",[112,2160],{},[26,2162,2163,2164,148],{},"Click the email sign-up option and follow the prompts to enter your details. When you're done, click ",[192,2165,153],{},[2093,2167,2168],{},[26,2169,2170,2173,2174,2179],{},[192,2171,2172],{},"Tip:"," For advice on choosing a strong password, see CISA's ",[659,2175,2178],{"href":2176,"rel":2177},"https:\u002F\u002Fwww.cisa.gov\u002Fsecure-our-world\u002Fuse-strong-passwords",[1218],"Use Strong Passwords"," guidance.",{"title":67,"searchDepth":68,"depth":68,"links":2181},[2182,2183],{"id":2146,"depth":670,"text":2147},{"id":2157,"depth":670,"text":2158},"Create an axiom.ai account with Google or an email address to get 120 minutes of free runtime to start building automations.",{},"\u002Fdocs\u002Faccount\u002Fcreate-account",{"title":2138,"description":2184},"docs\u002Faccount\u002Fcreate-account","GwuDFOJVCNkcwqnh8GlS4oieieV3VrJvzi9OBwA-g9g",{"id":2191,"title":1930,"body":2192,"date":71,"description":2235,"extension":73,"meta":2236,"navigation":75,"order":2237,"path":2238,"seo":2239,"stem":2240,"__hash__":2241},"content\u002Fdocs\u002Faccount\u002Findex.md",{"type":8,"value":2193,"toc":2232},[2194,2208,2212,2214,2217,2220],[26,2195,2196,2197,2199,2200,2203,2204,2207],{},"New to axiom.ai? ",[659,2198,2138],{"href":2186}," and get 120 minutes of free runtime. Once you're up and running, ",[659,2201,2202],{"href":2132},"manage your account"," settings from the dashboard, or ",[659,2205,2206],{"href":2108},"manage your subscription"," to upgrade your plan, add more runtime, or download invoices.",[107,2209,2211],{"id":2210},"account-pages","Account pages",[112,2213],{},[26,2215,2216],{},"Start with creating an account if you haven't already. Move on to managing your account for changes to email, password, company details, country, team membership, or account deletion. Use the subscription page to change plan, update payment details, or download invoices.",[2218,2219],"docs-cards",{},[26,2221,2222,2223,2226,2227,148],{},"Need help? Contact ",[659,2224,2225],{"href":1887},"support"," or ask a question in our ",[659,2228,2231],{"href":2229,"rel":2230},"https:\u002F\u002Fwww.reddit.com\u002Fr\u002Faxiom_ai",[1218],"Reddit community",{"title":67,"searchDepth":68,"depth":68,"links":2233},[2234],{"id":2210,"depth":670,"text":2211},"Create an account to get 120 minutes of free runtime, manage account settings from the dashboard, and manage your subscription, billing, and invoices.",{},6,"\u002Fdocs\u002Faccount",{"title":1930,"description":2235},"docs\u002Faccount\u002Findex","OFdoQs4f9WsxslOdn6tCe5LMF6nMc3OzsrveKwgYlcQ",{"id":2243,"title":2244,"body":2245,"date":71,"description":2422,"extension":73,"meta":2423,"navigation":75,"order":670,"path":2108,"seo":2425,"stem":2426,"__hash__":2427},"content\u002Fdocs\u002Faccount\u002Fsubscription.md","Manage your subscription",{"type":8,"value":2246,"toc":2415},[2247,2252,2256,2258,2265,2271,2280,2286,2290,2292,2307,2313,2321,2325,2327,2330,2353,2365,2369,2371,2374,2389,2393,2395,2398],[26,2248,2249,2250,148],{},"Manage your axiom.ai subscription to upgrade your plan, add runtime, update billing details, or download invoices. For account settings outside billing, see ",[659,2251,2202],{"href":2132},[107,2253,2255],{"id":2254},"change-your-plan","Change your plan",[112,2257],{},[26,2259,2260,2261,2264],{},"Open the axiom.ai Chrome extension and navigate to the ",[192,2262,2263],{},"Change plan"," section.",[26,2266,2267],{},[1906,2268],{"alt":2269,"src":2270},"The Change plan button in the axiom.ai extension","\u002Fdocs\u002Ftutorials\u002Fchnage-plan-button.jpg",[26,2272,2273,2274,2276,2277,2279],{},"The ",[192,2275,2263],{}," section shows every plan we offer. Click ",[192,2278,2263],{}," on the plan you want to switch to.",[26,2281,2282],{},[1906,2283],{"alt":2284,"src":2285},"Selecting a new plan from the change plan list","\u002Fdocs\u002Ftutorials\u002Fchnage-plans-select.jpg",[107,2287,2289],{"id":2288},"manage-billing-in-the-payment-portal","Manage billing in the payment portal",[112,2291],{},[26,2293,2294,2295,2300,2301,2306],{},"Update your payment method, billing information, and download invoices from the ",[659,2296,2299],{"href":2297,"rel":2298},"https:\u002F\u002Fbilling.stripe.com\u002Fp\u002Flogin\u002F5kA16u1uibP19bO6oo",[1218],"payment portal",". The portal is provided by ",[659,2302,2305],{"href":2303,"rel":2304},"https:\u002F\u002Fstripe.com",[1218],"Stripe",", our payment partner.",[26,2308,2309],{},[1906,2310],{"alt":2311,"src":2312},"The Stripe payment portal opened from axiom.ai","\u002Fdocs\u002Ftutorials\u002Fstripe-portal.jpg",[26,2314,2315,2316,2320],{},"To open the portal, follow the ",[659,2317,2319],{"href":2297,"rel":2318},[1218],"payment portal link"," and enter the email address you used to create your axiom.ai account. Stripe sends a one-time link to that address; click the link in the email to enter the portal.",[107,2322,2324],{"id":2323},"update-your-payment-method","Update your payment method",[112,2326],{},[26,2328,2329],{},"You can add or update payment methods on your account at any time.",[1923,2331,2332,2338,2348],{},[189,2333,2334,2335,148],{},"In the payment portal, click ",[192,2336,2337],{},"Add payment method",[189,2339,2340,2341,2344,2345,148],{},"Choose ",[192,2342,2343],{},"Card"," or ",[192,2346,2347],{},"Google Pay",[189,2349,1927,2350,148],{},[192,2351,2352],{},"Add",[2093,2354,2355],{},[26,2356,2357,2360,2361,148],{},[192,2358,2359],{},"Note:"," If you'd prefer to pay by invoice, contact ",[659,2362,2364],{"href":2363},"mailto:support@axiom.ai","support@axiom.ai",[107,2366,2368],{"id":2367},"update-your-billing-information","Update your billing information",[112,2370],{},[26,2372,2373],{},"Update your billing information at any time. This is useful for changes to billing name, address, or VAT details.",[1923,2375,2376,2381,2384],{},[189,2377,2334,2378,148],{},[192,2379,2380],{},"Update information",[189,2382,2383],{},"Edit the fields you need to change.",[189,2385,1927,2386,148],{},[192,2387,2388],{},"Save",[107,2390,2392],{"id":2391},"download-invoices","Download invoices",[112,2394],{},[26,2396,2397],{},"Past invoices and receipts are available in the payment portal.",[1923,2399,2400,2406,2409],{},[189,2401,2402,2403,2264],{},"In the payment portal, find the ",[192,2404,2405],{},"Invoice history",[189,2407,2408],{},"Click the date of the invoice you want.",[189,2410,1927,2411,2414],{},[192,2412,2413],{},"Download"," to download the invoice, the receipt, or both.",{"title":67,"searchDepth":68,"depth":68,"links":2416},[2417,2418,2419,2420,2421],{"id":2254,"depth":670,"text":2255},{"id":2288,"depth":670,"text":2289},{"id":2323,"depth":670,"text":2324},{"id":2367,"depth":670,"text":2368},{"id":2391,"depth":670,"text":2392},"Change plan, update payment method and billing details, and download invoices from the Stripe payment portal connected to your axiom.ai account.",{"metaTitle":2424},"Upgrade an axiom.ai plan, update billing, and download invoices",{"title":2244,"description":2422},"docs\u002Faccount\u002Fsubscription","Y0OcJiHJm877-xvqCspiLFOXkCq9ZeMSc7ydeOCZsEs",{"id":2429,"title":2430,"body":2431,"date":71,"description":2827,"extension":73,"meta":2828,"navigation":75,"order":68,"path":2830,"seo":2831,"stem":2832,"__hash__":2833},"content\u002Fdocs\u002Fcode\u002Fcreate-scripts.md","Create scripts",{"type":8,"value":2432,"toc":2822},[2433,2436,2440,2442,2445,2467,2479,2483,2485,2496,2543,2550,2554,2556,2563,2803,2818],[26,2434,2435],{},"Write Puppeteer scripts in your own local environment, then connect them to axiom.ai's hosted browser through a single WebSocket endpoint. This lets you develop and version scripts however you like (your editor, your linters, your AI tooling) and run them on infrastructure that doesn't need any local browser setup.",[107,2437,2439],{"id":2438},"set-up-puppeteer-locally","Set up Puppeteer locally",[112,2441],{},[26,2443,2444],{},"Write your script the same way you would with Puppeteer anywhere else. If you're running locally, install Puppeteer in your project:",[2446,2447,2451],"pre",{"className":2448,"code":2449,"language":2450,"meta":67,"style":67},"language-bash shiki shiki-themes github-light-default github-dark-default","npm i puppeteer\n","bash",[145,2452,2453],{"__ignoreMap":67},[1332,2454,2456,2460,2464],{"class":2455,"line":2131},"line",[1332,2457,2459],{"class":2458},"sTDnQ","npm",[1332,2461,2463],{"class":2462},"sSVrQ"," i",[1332,2465,2466],{"class":2462}," puppeteer\n",[2093,2468,2469],{},[26,2470,2471,2473,2474,2478],{},[192,2472,2359],{}," If you're testing in the ",[659,2475,2477],{"href":2476},"\u002Fdocs\u002Fcode\u002Flive-editor","Live editor",", you don't need to install Puppeteer. The Live editor includes it by default.",[107,2480,2482],{"id":2481},"connect-to-axiomai","Connect to axiom.ai",[112,2484],{},[26,2486,2487,2488,2491,2492,148],{},"Use ",[145,2489,2490],{},"puppeteer.connect"," with axiom.ai's WebSocket endpoint. Generate your API key first; see ",[659,2493,2495],{"href":2494},"\u002Fdocs\u002Fcode\u002Ftoken-generation","generate an API key",[2446,2497,2501],{"className":2498,"code":2499,"language":2500,"meta":67,"style":67},"language-js shiki shiki-themes github-light-default github-dark-default","const browser = await puppeteer.connect({\n    browserWSEndpoint: \"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=API_TOKEN\"\n});\n","js",[145,2502,2503,2530,2538],{"__ignoreMap":67},[1332,2504,2505,2509,2513,2516,2519,2523,2527],{"class":2455,"line":2131},[1332,2506,2508],{"class":2507},"sjeE4","const",[1332,2510,2512],{"class":2511},"sHrmB"," browser",[1332,2514,2515],{"class":2507}," =",[1332,2517,2518],{"class":2507}," await",[1332,2520,2522],{"class":2521},"s4rv2"," puppeteer.",[1332,2524,2526],{"class":2525},"sbjLL","connect",[1332,2528,2529],{"class":2521},"({\n",[1332,2531,2532,2535],{"class":2455,"line":670},[1332,2533,2534],{"class":2521},"    browserWSEndpoint: ",[1332,2536,2537],{"class":2462},"\"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=API_TOKEN\"\n",[1332,2539,2540],{"class":2455,"line":68},[1332,2541,2542],{"class":2521},"});\n",[26,2544,2545,2546,2549],{},"Replace ",[145,2547,2548],{},"API_TOKEN"," with your API key.",[107,2551,2553],{"id":2552},"worked-example","Worked example",[112,2555],{},[26,2557,2558,2559,2562],{},"Connect to axiom.ai before any other Puppeteer browser interactions. The script below opens ",[145,2560,2561],{},"https:\u002F\u002Faxiom.ai",", waits 5 seconds, and closes the browser:",[2446,2564,2566],{"className":2498,"code":2565,"language":2500,"meta":67,"style":67},"console.log(\"start\");\n\nconst browser = await puppeteer.connect({\n    \u002F\u002F Replace API_TOKEN with your API key.\n    browserWSEndpoint: \"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=API_TOKEN\"\n});\nconsole.log(\"browser connected\");\n\ntry {\n    const page = await browser.newPage();\n    await page.goto(\"https:\u002F\u002Faxiom.ai\");\n    await new Promise((resolve) => setTimeout(resolve, 5000));\n    await page.close();\n    await browser.close();\n    console.log(\"browser closed\");\n} catch (e) {\n    console.error(e.message);\n    await browser.close();\n}\n",[145,2567,2568,2584,2589,2605,2611,2617,2621,2635,2640,2649,2671,2690,2725,2737,2748,2763,2775,2786,2797],{"__ignoreMap":67},[1332,2569,2570,2573,2576,2578,2581],{"class":2455,"line":2131},[1332,2571,2572],{"class":2521},"console.",[1332,2574,2575],{"class":2525},"log",[1332,2577,1213],{"class":2521},[1332,2579,2580],{"class":2462},"\"start\"",[1332,2582,2583],{"class":2521},");\n",[1332,2585,2586],{"class":2455,"line":670},[1332,2587,2588],{"emptyLinePlaceholder":75},"\n",[1332,2590,2591,2593,2595,2597,2599,2601,2603],{"class":2455,"line":68},[1332,2592,2508],{"class":2507},[1332,2594,2512],{"class":2511},[1332,2596,2515],{"class":2507},[1332,2598,2518],{"class":2507},[1332,2600,2522],{"class":2521},[1332,2602,2526],{"class":2525},[1332,2604,2529],{"class":2521},[1332,2606,2607],{"class":2455,"line":1478},[1332,2608,2610],{"class":2609},"sU953","    \u002F\u002F Replace API_TOKEN with your API key.\n",[1332,2612,2613,2615],{"class":2455,"line":293},[1332,2614,2534],{"class":2521},[1332,2616,2537],{"class":2462},[1332,2618,2619],{"class":2455,"line":2237},[1332,2620,2542],{"class":2521},[1332,2622,2624,2626,2628,2630,2633],{"class":2455,"line":2623},7,[1332,2625,2572],{"class":2521},[1332,2627,2575],{"class":2525},[1332,2629,1213],{"class":2521},[1332,2631,2632],{"class":2462},"\"browser connected\"",[1332,2634,2583],{"class":2521},[1332,2636,2638],{"class":2455,"line":2637},8,[1332,2639,2588],{"emptyLinePlaceholder":75},[1332,2641,2643,2646],{"class":2455,"line":2642},9,[1332,2644,2645],{"class":2507},"try",[1332,2647,2648],{"class":2521}," {\n",[1332,2650,2652,2655,2658,2660,2662,2665,2668],{"class":2455,"line":2651},10,[1332,2653,2654],{"class":2507},"    const",[1332,2656,2657],{"class":2511}," page",[1332,2659,2515],{"class":2507},[1332,2661,2518],{"class":2507},[1332,2663,2664],{"class":2521}," browser.",[1332,2666,2667],{"class":2525},"newPage",[1332,2669,2670],{"class":2521},"();\n",[1332,2672,2674,2677,2680,2683,2685,2688],{"class":2455,"line":2673},11,[1332,2675,2676],{"class":2507},"    await",[1332,2678,2679],{"class":2521}," page.",[1332,2681,2682],{"class":2525},"goto",[1332,2684,1213],{"class":2521},[1332,2686,2687],{"class":2462},"\"https:\u002F\u002Faxiom.ai\"",[1332,2689,2583],{"class":2521},[1332,2691,2693,2695,2698,2701,2704,2707,2710,2713,2716,2719,2722],{"class":2455,"line":2692},12,[1332,2694,2676],{"class":2507},[1332,2696,2697],{"class":2507}," new",[1332,2699,2700],{"class":2511}," Promise",[1332,2702,2703],{"class":2521},"((",[1332,2705,2706],{"class":2458},"resolve",[1332,2708,2709],{"class":2521},") ",[1332,2711,2712],{"class":2507},"=>",[1332,2714,2715],{"class":2525}," setTimeout",[1332,2717,2718],{"class":2521},"(resolve, ",[1332,2720,2721],{"class":2511},"5000",[1332,2723,2724],{"class":2521},"));\n",[1332,2726,2728,2730,2732,2735],{"class":2455,"line":2727},13,[1332,2729,2676],{"class":2507},[1332,2731,2679],{"class":2521},[1332,2733,2734],{"class":2525},"close",[1332,2736,2670],{"class":2521},[1332,2738,2740,2742,2744,2746],{"class":2455,"line":2739},14,[1332,2741,2676],{"class":2507},[1332,2743,2664],{"class":2521},[1332,2745,2734],{"class":2525},[1332,2747,2670],{"class":2521},[1332,2749,2751,2754,2756,2758,2761],{"class":2455,"line":2750},15,[1332,2752,2753],{"class":2521},"    console.",[1332,2755,2575],{"class":2525},[1332,2757,1213],{"class":2521},[1332,2759,2760],{"class":2462},"\"browser closed\"",[1332,2762,2583],{"class":2521},[1332,2764,2766,2769,2772],{"class":2455,"line":2765},16,[1332,2767,2768],{"class":2521},"} ",[1332,2770,2771],{"class":2507},"catch",[1332,2773,2774],{"class":2521}," (e) {\n",[1332,2776,2778,2780,2783],{"class":2455,"line":2777},17,[1332,2779,2753],{"class":2521},[1332,2781,2782],{"class":2525},"error",[1332,2784,2785],{"class":2521},"(e.message);\n",[1332,2787,2789,2791,2793,2795],{"class":2455,"line":2788},18,[1332,2790,2676],{"class":2507},[1332,2792,2664],{"class":2521},[1332,2794,2734],{"class":2525},[1332,2796,2670],{"class":2521},[1332,2798,2800],{"class":2455,"line":2799},19,[1332,2801,2802],{"class":2521},"}\n",[2093,2804,2805],{},[26,2806,2807,2809,2810,2813,2814,2817],{},[192,2808,2172],{}," Wrap browser interactions in a ",[145,2811,2812],{},"try...catch"," block (as shown above) and call ",[145,2815,2816],{},"browser.close()"," from the catch path. Without this, a failed run can leave the hosted browser open and counting against your runtime allowance until it times out.",[2819,2820,2821],"style",{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}",{"title":67,"searchDepth":68,"depth":68,"links":2823},[2824,2825,2826],{"id":2438,"depth":670,"text":2439},{"id":2481,"depth":670,"text":2482},{"id":2552,"depth":670,"text":2553},"Write Puppeteer scripts in your local environment and connect them to axiom.ai's hosted browser using your API key.",{"metaTitle":2829},"Write Puppeteer scripts and connect them to axiom.ai","\u002Fdocs\u002Fcode\u002Fcreate-scripts",{"title":2430,"description":2827},"docs\u002Fcode\u002Fcreate-scripts","wjMo2tSJxtdz1Rkb1qoYF9ONgTjy7mdZaoOZgQXo3W0",{"id":2835,"title":2836,"body":2837,"date":71,"description":2914,"extension":73,"meta":2915,"navigation":75,"order":2131,"path":2917,"seo":2918,"stem":2919,"__hash__":2920},"content\u002Fdocs\u002Fcode\u002Fdashboard.md","Dashboard",{"type":8,"value":2838,"toc":2910},[2839,2842,2848,2852,2854,2857,2897,2901,2903],[26,2840,2841],{},"The Code Dashboard is your hub for running scripts on axiom.ai's cloud. From here you can navigate to the Live editor, view run reports, manage settings, and check your remaining runtime.",[26,2843,2844],{},[1906,2845],{"alt":2846,"src":2847},"The axiom.ai Code Dashboard","\u002Fdocs\u002Fcode\u002Fgetting-started\u002Fdashboard.png",[107,2849,2851],{"id":2850},"navigation","Navigation",[112,2853],{},[26,2855,2856],{},"The left navigation has the following items:",[186,2858,2859,2865,2875,2883,2891],{},[189,2860,2861,2864],{},[192,2862,2863],{},"Home."," The default landing tab when you sign in.",[189,2866,2867,2870,2871,148],{},[192,2868,2869],{},"Run reports."," Lists your recent run reports. For details, see ",[659,2872,2874],{"href":2873},"\u002Fdocs\u002Fcode\u002Frun-reports","run reports",[189,2876,2877,2880,2881,148],{},[192,2878,2879],{},"Live editor."," Test and run scripts in the web app. See ",[659,2882,2477],{"href":2476},[189,2884,2885,2888,2889,148],{},[192,2886,2887],{},"Settings."," Account and API key settings. See ",[659,2890,2495],{"href":2494},[189,2892,2893,2896],{},[192,2894,2895],{},"Color theme."," Toggle dark mode for the dashboard.",[107,2898,2900],{"id":2899},"runtime","Runtime",[112,2902],{},[26,2904,2905,2906,2909],{},"Your remaining runtime appears at the top-left of the dashboard, shown as ",[145,2907,2908],{},"used minutes \u002F total minutes",". Runtime resets at the start of each billing period; it doesn't carry over.",{"title":67,"searchDepth":68,"depth":68,"links":2911},[2912,2913],{"id":2850,"depth":670,"text":2851},{"id":2899,"depth":670,"text":2900},"Navigate the Code Dashboard, including Home, run reports, the Live editor, settings, theme, and remaining runtime.",{"metaTitle":2916},"Navigate the axiom.ai Code Dashboard","\u002Fdocs\u002Fcode\u002Fdashboard",{"title":2836,"description":2914},"docs\u002Fcode\u002Fdashboard","3zkkStZgBi0Pxxgu8efUOnyqLtor7k26AyBdYReTBiI",{"id":2922,"title":2923,"body":2924,"date":71,"description":3106,"extension":73,"meta":3107,"navigation":75,"order":670,"path":3109,"seo":3110,"stem":3111,"__hash__":3112},"content\u002Fdocs\u002Fcode\u002Findex.md","Code Dashboard",{"type":8,"value":2925,"toc":3103},[2926,2940,2944,2947,2960,3074,3100],[26,2927,2928,2929,2931,2932,2936,2937,148],{},"The Code Dashboard runs your own Puppeteer scripts on axiom.ai's cloud. Use the ",[659,2930,2836],{"href":2917}," to create and manage scripts, ",[659,2933,2935],{"href":2934},"\u002Fdocs\u002Fcode\u002Frunning-scripts","run them from your own stack",", and ",[659,2938,2939],{"href":2873},"monitor every execution",[107,2941,2943],{"id":2942},"quick-start","Quick start",[26,2945,2946],{},"To get a script running, create an account, then connect to axiom.ai using your API key. New accounts get 3 hours of free runtime.",[1923,2948,2949,2954,2957],{},[189,2950,2951,2952,148],{},"Create an account, log in, and copy your API key from the ",[192,2953,2836],{},[189,2955,2956],{},"Add the code below to your script and paste in your API key.",[189,2958,2959],{},"Open the endpoint URL in your browser to watch the run.",[2446,2961,2965],{"className":2962,"code":2963,"language":2964,"meta":67,"style":67},"language-javascript shiki shiki-themes github-light-default github-dark-default","const browser = await puppeteer.connect({\n  \u002F\u002F Insert your API key in place of [HIDDEN_KEY]\n  browserWSEndpoint: \"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=[HIDDEN_KEY]\"\n});\nconst page = await browser.newPage();\nawait page.setViewport({ width: 1960, height: 1080 });\n\n\u002F\u002F Your script here\n\nawait page.close();\nawait browser.close();\n","javascript",[145,2966,2967,2983,2988,2996,3000,3016,3041,3045,3050,3054,3064],{"__ignoreMap":67},[1332,2968,2969,2971,2973,2975,2977,2979,2981],{"class":2455,"line":2131},[1332,2970,2508],{"class":2507},[1332,2972,2512],{"class":2511},[1332,2974,2515],{"class":2507},[1332,2976,2518],{"class":2507},[1332,2978,2522],{"class":2521},[1332,2980,2526],{"class":2525},[1332,2982,2529],{"class":2521},[1332,2984,2985],{"class":2455,"line":670},[1332,2986,2987],{"class":2609},"  \u002F\u002F Insert your API key in place of [HIDDEN_KEY]\n",[1332,2989,2990,2993],{"class":2455,"line":68},[1332,2991,2992],{"class":2521},"  browserWSEndpoint: ",[1332,2994,2995],{"class":2462},"\"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=[HIDDEN_KEY]\"\n",[1332,2997,2998],{"class":2455,"line":1478},[1332,2999,2542],{"class":2521},[1332,3001,3002,3004,3006,3008,3010,3012,3014],{"class":2455,"line":293},[1332,3003,2508],{"class":2507},[1332,3005,2657],{"class":2511},[1332,3007,2515],{"class":2507},[1332,3009,2518],{"class":2507},[1332,3011,2664],{"class":2521},[1332,3013,2667],{"class":2525},[1332,3015,2670],{"class":2521},[1332,3017,3018,3021,3023,3026,3029,3032,3035,3038],{"class":2455,"line":2237},[1332,3019,3020],{"class":2507},"await",[1332,3022,2679],{"class":2521},[1332,3024,3025],{"class":2525},"setViewport",[1332,3027,3028],{"class":2521},"({ width: ",[1332,3030,3031],{"class":2511},"1960",[1332,3033,3034],{"class":2521},", height: ",[1332,3036,3037],{"class":2511},"1080",[1332,3039,3040],{"class":2521}," });\n",[1332,3042,3043],{"class":2455,"line":2623},[1332,3044,2588],{"emptyLinePlaceholder":75},[1332,3046,3047],{"class":2455,"line":2637},[1332,3048,3049],{"class":2609},"\u002F\u002F Your script here\n",[1332,3051,3052],{"class":2455,"line":2642},[1332,3053,2588],{"emptyLinePlaceholder":75},[1332,3055,3056,3058,3060,3062],{"class":2455,"line":2651},[1332,3057,3020],{"class":2507},[1332,3059,2679],{"class":2521},[1332,3061,2734],{"class":2525},[1332,3063,2670],{"class":2521},[1332,3065,3066,3068,3070,3072],{"class":2455,"line":2673},[1332,3067,3020],{"class":2507},[1332,3069,2664],{"class":2521},[1332,3071,2734],{"class":2525},[1332,3073,2670],{"class":2521},[3075,3076,3078,3081,3084,3087,3091,3095],"docs-card-grid",{"cols":68,"gap":3077},"6",[499,3079],{"link":2917,"mode":145,"shape":502,"text":3080,"title":2836},"Navigate the Code Dashboard, access Live editor and Monitoring runs, and check your remaining runtime.",[499,3082],{"link":2476,"mode":145,"shape":510,"text":3083,"title":2477},"Test and experiment with scripts in the web app and watch them run in real time.",[499,3085],{"link":2830,"mode":145,"shape":502,"text":3086,"title":2430},"Write Puppeteer scripts locally and connect them to the axiom.ai hosted browser.",[499,3088],{"link":2934,"mode":145,"shape":510,"text":3089,"title":3090},"Run scripts from your own development environment or test them in the Live editor.","Run from code",[499,3092],{"link":2873,"mode":145,"shape":502,"text":3093,"title":3094},"See in-progress and completed runs, durations, and results in Run Reports.","Monitoring runs",[499,3096],{"link":3097,"mode":145,"shape":510,"text":3098,"title":3099},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fkeys","Fetch your API key from the Dashboard and store it securely.","Keys and API",[2819,3101,3102],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":67,"searchDepth":68,"depth":68,"links":3104},[3105],{"id":2942,"depth":670,"text":2943},"The Code Dashboard runs your own Puppeteer scripts on axiom.ai's cloud. Use the Dashboard to create and manage scripts, run them from your own stack, and monitor every execution.",{"metaTitle":3108},"Code Dashboard — run your scripts on axiom.ai's cloud","\u002Fdocs\u002Fcode",{"title":2923,"description":3106},"docs\u002Fcode\u002Findex","Rz1RVRvyEu9-kJDX5nGuztkqBPym9nV4FazEU6NXZ_s",{"id":3114,"title":2477,"body":3115,"date":71,"description":3158,"extension":73,"meta":3159,"navigation":75,"order":670,"path":2476,"seo":3161,"stem":3162,"__hash__":3163},"content\u002Fdocs\u002Fcode\u002Flive-editor.md",{"type":8,"value":3116,"toc":3154},[3117,3120,3126,3130,3132,3139,3143,3145,3151],[26,3118,3119],{},"The Live editor lets you test scripts on axiom.ai's hosted infrastructure without setting up a local Node.js environment. The page splits into two panels: a code editor on one side and a live browser on the other.",[26,3121,3122],{},[1906,3123],{"alt":3124,"src":3125},"The axiom.ai Live editor","\u002Fdocs\u002Fcode\u002Fgetting-started\u002Fplayground.png",[107,3127,3129],{"id":3128},"code-editor","Code editor",[112,3131],{},[26,3133,3134,3135,3138],{},"The code editor includes sample scripts that show what's possible with axiom.ai and Puppeteer, and you can paste in your own scripts to run them on the hosted infrastructure. Click ",[192,3136,3137],{},"Run"," to execute the script.",[107,3140,3142],{"id":3141},"browser","Browser",[112,3144],{},[26,3146,3147,3148,3150],{},"The browser panel opens automatically when you click ",[192,3149,3137],{},". It shows the hosted browser executing your script, so you can watch each action in real time. Use it to confirm the script behaves as expected and to spot pages that load differently than your script assumed.",[26,3152,3153],{},"To move the browser panel to fill the bottom half of the screen, click the three-column button to the left of the close button.",{"title":67,"searchDepth":68,"depth":68,"links":3155},[3156,3157],{"id":3128,"depth":670,"text":3129},{"id":3141,"depth":670,"text":3142},"The Live editor lets you test scripts and watch them run in a hosted browser, without setting up a local Node.js environment.",{"metaTitle":3160},"Test scripts in the axiom.ai Live editor",{"title":2477,"description":3158},"docs\u002Fcode\u002Flive-editor","S4nm4XKPMfzzzrbie2_zo_3RWRTE0M9r-9ub6EX03iA",{"id":3165,"title":3166,"body":3167,"date":71,"description":3245,"extension":73,"meta":3246,"navigation":75,"order":293,"path":2873,"seo":3248,"stem":3249,"__hash__":3250},"content\u002Fdocs\u002Fcode\u002Frun-reports.md","Run reports",{"type":8,"value":3168,"toc":3240},[3169,3172,3176,3178,3183,3200,3204,3206,3213,3217,3219,3225,3233],[26,3170,3171],{},"Run reports show every Code Dashboard run you've started, alongside any in-progress runs. Use them to track how long scripts take, watch live runs, and inspect errors after a run fails.",[107,3173,3175],{"id":3174},"open-run-reports","Open run reports",[112,3177],{},[26,3179,1927,3180,3182],{},[192,3181,3166],{}," in the dashboard navigation. You'll see a list of completed and in-progress runs. Each row shows:",[186,3184,3185,3188,3191,3194,3197],{},[189,3186,3187],{},"The run's status.",[189,3189,3190],{},"A unique run identifier.",[189,3192,3193],{},"The start date and time.",[189,3195,3196],{},"The runtime in seconds.",[189,3198,3199],{},"A details link.",[107,3201,3203],{"id":3202},"watch-a-live-run","Watch a live run",[112,3205],{},[26,3207,3208,3209,3212],{},"While a run is in progress, the row includes a ",[192,3210,3211],{},"Watch"," link. Click it to open a live view of the hosted browser executing your script. This is the same view as the Live editor browser panel, but for a script running outside the Live editor.",[107,3214,3216],{"id":3215},"view-run-details","View run details",[112,3218],{},[26,3220,1927,3221,3224],{},[192,3222,3223],{},"Details"," on a row to open the full report for that run. The details view shows:",[186,3226,3227,3230],{},[189,3228,3229],{},"The version of axiom.ai used to execute the script.",[189,3231,3232],{},"Any errors thrown during execution, with stack traces where available.",[26,3234,3235,3236,148],{},"For background on debugging script errors, see ",[659,3237,3239],{"href":3238},"\u002Fdocs\u002Fdeveloper-hub\u002Ftroubleshooting\u002Fdebug","debug developer features",{"title":67,"searchDepth":68,"depth":68,"links":3241},[3242,3243,3244],{"id":3174,"depth":670,"text":3175},{"id":3202,"depth":670,"text":3203},{"id":3215,"depth":670,"text":3216},"View in-progress and completed Code Dashboard runs, watch live runs, check durations, and inspect errors and run details from the dashboard.",{"metaTitle":3247},"Monitor Code Dashboard script runs in the dashboard",{"title":3166,"description":3245},"docs\u002Fcode\u002Frun-reports","XuVbMgYp1DJ2JBUOexE3UAT8Zkupo5mUHkTiKbkBs_g",{"id":3252,"title":3253,"body":3254,"date":71,"description":3504,"extension":73,"meta":3505,"navigation":75,"order":1478,"path":2934,"seo":3507,"stem":3508,"__hash__":3509},"content\u002Fdocs\u002Fcode\u002Frunning-scripts.md","Run scripts",{"type":8,"value":3255,"toc":3500},[3256,3259,3263,3265,3272,3451,3458,3471,3475,3477,3482,3497],[26,3257,3258],{},"There are two ways to run a Code Dashboard script: from your own local environment, or from the axiom.ai Live editor.",[107,3260,3262],{"id":3261},"run-a-script-locally","Run a script locally",[112,3264],{},[26,3266,3267,3268,3271],{},"Once your script is connected to axiom.ai (see ",[659,3269,3270],{"href":2830},"create scripts","), run it from your local environment with Node.js.",[1923,3273,3274,3292,3435],{},[189,3275,3276,3277],{},"Install Puppeteer in your project:",[2446,3278,3280],{"className":2448,"code":3279,"language":2450,"meta":67,"style":67},"npm install puppeteer-core\n",[145,3281,3282],{"__ignoreMap":67},[1332,3283,3284,3286,3289],{"class":2455,"line":2131},[1332,3285,2459],{"class":2458},[1332,3287,3288],{"class":2462}," install",[1332,3290,3291],{"class":2462}," puppeteer-core\n",[189,3293,3294,3295,3297,3298],{},"Save your script. For example, ",[145,3296,263],{},":",[2446,3299,3301],{"className":2962,"code":3300,"language":2964,"meta":67,"style":67},"const puppeteer = require('puppeteer-core');\n\n(async () => {\n  const browser = await puppeteer.connect({\n    browserWSEndpoint: 'wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=YOUR_API_KEY'\n  });\n  const page = await browser.newPage();\n  await page.goto('https:\u002F\u002Faxiom.ai');\n  console.log(await page.title());\n  await browser.close();\n})();\n",[145,3302,3303,3322,3326,3340,3357,3364,3369,3385,3401,3420,3430],{"__ignoreMap":67},[1332,3304,3305,3307,3310,3312,3315,3317,3320],{"class":2455,"line":2131},[1332,3306,2508],{"class":2507},[1332,3308,3309],{"class":2511}," puppeteer",[1332,3311,2515],{"class":2507},[1332,3313,3314],{"class":2525}," require",[1332,3316,1213],{"class":2521},[1332,3318,3319],{"class":2462},"'puppeteer-core'",[1332,3321,2583],{"class":2521},[1332,3323,3324],{"class":2455,"line":670},[1332,3325,2588],{"emptyLinePlaceholder":75},[1332,3327,3328,3330,3333,3336,3338],{"class":2455,"line":68},[1332,3329,1213],{"class":2521},[1332,3331,3332],{"class":2507},"async",[1332,3334,3335],{"class":2521}," () ",[1332,3337,2712],{"class":2507},[1332,3339,2648],{"class":2521},[1332,3341,3342,3345,3347,3349,3351,3353,3355],{"class":2455,"line":1478},[1332,3343,3344],{"class":2507},"  const",[1332,3346,2512],{"class":2511},[1332,3348,2515],{"class":2507},[1332,3350,2518],{"class":2507},[1332,3352,2522],{"class":2521},[1332,3354,2526],{"class":2525},[1332,3356,2529],{"class":2521},[1332,3358,3359,3361],{"class":2455,"line":293},[1332,3360,2534],{"class":2521},[1332,3362,3363],{"class":2462},"'wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=YOUR_API_KEY'\n",[1332,3365,3366],{"class":2455,"line":2237},[1332,3367,3368],{"class":2521},"  });\n",[1332,3370,3371,3373,3375,3377,3379,3381,3383],{"class":2455,"line":2623},[1332,3372,3344],{"class":2507},[1332,3374,2657],{"class":2511},[1332,3376,2515],{"class":2507},[1332,3378,2518],{"class":2507},[1332,3380,2664],{"class":2521},[1332,3382,2667],{"class":2525},[1332,3384,2670],{"class":2521},[1332,3386,3387,3390,3392,3394,3396,3399],{"class":2455,"line":2637},[1332,3388,3389],{"class":2507},"  await",[1332,3391,2679],{"class":2521},[1332,3393,2682],{"class":2525},[1332,3395,1213],{"class":2521},[1332,3397,3398],{"class":2462},"'https:\u002F\u002Faxiom.ai'",[1332,3400,2583],{"class":2521},[1332,3402,3403,3406,3408,3410,3412,3414,3417],{"class":2455,"line":2642},[1332,3404,3405],{"class":2521},"  console.",[1332,3407,2575],{"class":2525},[1332,3409,1213],{"class":2521},[1332,3411,3020],{"class":2507},[1332,3413,2679],{"class":2521},[1332,3415,3416],{"class":2525},"title",[1332,3418,3419],{"class":2521},"());\n",[1332,3421,3422,3424,3426,3428],{"class":2455,"line":2651},[1332,3423,3389],{"class":2507},[1332,3425,2664],{"class":2521},[1332,3427,2734],{"class":2525},[1332,3429,2670],{"class":2521},[1332,3431,3432],{"class":2455,"line":2673},[1332,3433,3434],{"class":2521},"})();\n",[189,3436,3437,3438],{},"Run it with Node:",[2446,3439,3441],{"className":2448,"code":3440,"language":2450,"meta":67,"style":67},"node scrape.js\n",[145,3442,3443],{"__ignoreMap":67},[1332,3444,3445,3448],{"class":2455,"line":2131},[1332,3446,3447],{"class":2458},"node",[1332,3449,3450],{"class":2462}," scrape.js\n",[26,3452,3453,3454,3457],{},"The script connects to axiom.ai's hosted browser and runs against it. Sprinkle ",[145,3455,3456],{},"console.log()"," calls through your script while you're developing so you can monitor progress and catch issues from the terminal.",[2093,3459,3460],{},[26,3461,3462,3464,3465,3467,3468,3470],{},[192,3463,2172],{}," To watch the script in action, open ",[659,3466,2874],{"href":2873}," in the dashboard. Each in-progress run has a ",[192,3469,3211],{}," link that opens a live view of the hosted browser.",[107,3472,3474],{"id":3473},"run-a-script-in-the-live-editor","Run a script in the Live editor",[112,3476],{},[26,3478,2273,3479,3481],{},[659,3480,2477],{"href":2476}," lets you run scripts without any local setup, so it's useful for quick experiments and for sharing a script with someone who doesn't have Node.js installed.",[1923,3483,3484,3487,3490,3494],{},[189,3485,3486],{},"Open the Live editor from the dashboard.",[189,3488,3489],{},"Paste the script into the code editor.",[189,3491,1927,3492,148],{},[192,3493,3137],{},[189,3495,3496],{},"Open the browser panel to watch the run.",[2819,3498,3499],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}",{"title":67,"searchDepth":68,"depth":68,"links":3501},[3502,3503],{"id":3261,"depth":670,"text":3262},{"id":3473,"depth":670,"text":3474},"Run Code Dashboard scripts from your own development environment using Node.js, or test them in the axiom.ai Live editor without any local setup.",{"metaTitle":3506},"Run Code Dashboard scripts locally or in the Live editor",{"title":3253,"description":3504},"docs\u002Fcode\u002Frunning-scripts","UPKMF95kS1P1D38_m7S-knjMxfwRyl0BHF1HWwglEHM",{"id":3511,"title":3512,"body":3513,"date":71,"description":3867,"extension":73,"meta":3868,"navigation":75,"order":670,"path":3870,"seo":3871,"stem":3872,"__hash__":3873},"content\u002Fdocs\u002Fcode\u002Fsamples\u002Fdata-entry.md","Enter data into a page",{"type":8,"value":3514,"toc":3865},[3515,3518,3521,3541,3830,3847,3862],[26,3516,3517],{},"This sample script connects to axiom.ai, opens Google, fills the search bar with a query, waits 5 seconds, and closes the browser.",[26,3519,3520],{},"What it does:",[1923,3522,3523,3526,3532,3535,3538],{},[189,3524,3525],{},"Connect to the axiom.ai hosted browser.",[189,3527,3528,3529,148],{},"Open ",[145,3530,3531],{},"https:\u002F\u002Fgoogle.com",[189,3533,3534],{},"Enter a search query into the search bar.",[189,3536,3537],{},"Wait 5 seconds.",[189,3539,3540],{},"Close the browser.",[2446,3542,3544],{"className":2498,"code":3543,"language":2500,"meta":67,"style":67},"const start = async () => {\n    console.log('start');\n\n    const browser = await puppeteer.connect({\n        \u002F\u002F Replace [HIDDEN_KEY] with your API key.\n        browserWSEndpoint: \"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=[HIDDEN_KEY]\"\n    });\n    console.log('browser connected');\n\n    try {\n        const page = await browser.newPage();\n        await page.goto(\"https:\u002F\u002Fgoogle.com\u002F\");\n\n        \u002F\u002F Locate the search bar and fill it.\n        await page.locator('aria\u002FSearch').fill('Testing axiom.ai');\n\n        await new Promise((resolve) => setTimeout(resolve, 5000));\n\n        await page.close();\n        await browser.close();\n        console.log('browser closed');\n    } catch (e) {\n        console.error(e.message);\n        await browser.close();\n    }\n};\n\nstart();\n",[145,3545,3546,3564,3577,3581,3597,3602,3609,3614,3627,3631,3638,3655,3671,3675,3680,3707,3711,3735,3739,3749,3760,3775,3785,3794,3805,3811,3817,3822],{"__ignoreMap":67},[1332,3547,3548,3550,3553,3555,3558,3560,3562],{"class":2455,"line":2131},[1332,3549,2508],{"class":2507},[1332,3551,3552],{"class":2525}," start",[1332,3554,2515],{"class":2507},[1332,3556,3557],{"class":2507}," async",[1332,3559,3335],{"class":2521},[1332,3561,2712],{"class":2507},[1332,3563,2648],{"class":2521},[1332,3565,3566,3568,3570,3572,3575],{"class":2455,"line":670},[1332,3567,2753],{"class":2521},[1332,3569,2575],{"class":2525},[1332,3571,1213],{"class":2521},[1332,3573,3574],{"class":2462},"'start'",[1332,3576,2583],{"class":2521},[1332,3578,3579],{"class":2455,"line":68},[1332,3580,2588],{"emptyLinePlaceholder":75},[1332,3582,3583,3585,3587,3589,3591,3593,3595],{"class":2455,"line":1478},[1332,3584,2654],{"class":2507},[1332,3586,2512],{"class":2511},[1332,3588,2515],{"class":2507},[1332,3590,2518],{"class":2507},[1332,3592,2522],{"class":2521},[1332,3594,2526],{"class":2525},[1332,3596,2529],{"class":2521},[1332,3598,3599],{"class":2455,"line":293},[1332,3600,3601],{"class":2609},"        \u002F\u002F Replace [HIDDEN_KEY] with your API key.\n",[1332,3603,3604,3607],{"class":2455,"line":2237},[1332,3605,3606],{"class":2521},"        browserWSEndpoint: ",[1332,3608,2995],{"class":2462},[1332,3610,3611],{"class":2455,"line":2623},[1332,3612,3613],{"class":2521},"    });\n",[1332,3615,3616,3618,3620,3622,3625],{"class":2455,"line":2637},[1332,3617,2753],{"class":2521},[1332,3619,2575],{"class":2525},[1332,3621,1213],{"class":2521},[1332,3623,3624],{"class":2462},"'browser connected'",[1332,3626,2583],{"class":2521},[1332,3628,3629],{"class":2455,"line":2642},[1332,3630,2588],{"emptyLinePlaceholder":75},[1332,3632,3633,3636],{"class":2455,"line":2651},[1332,3634,3635],{"class":2507},"    try",[1332,3637,2648],{"class":2521},[1332,3639,3640,3643,3645,3647,3649,3651,3653],{"class":2455,"line":2673},[1332,3641,3642],{"class":2507},"        const",[1332,3644,2657],{"class":2511},[1332,3646,2515],{"class":2507},[1332,3648,2518],{"class":2507},[1332,3650,2664],{"class":2521},[1332,3652,2667],{"class":2525},[1332,3654,2670],{"class":2521},[1332,3656,3657,3660,3662,3664,3666,3669],{"class":2455,"line":2692},[1332,3658,3659],{"class":2507},"        await",[1332,3661,2679],{"class":2521},[1332,3663,2682],{"class":2525},[1332,3665,1213],{"class":2521},[1332,3667,3668],{"class":2462},"\"https:\u002F\u002Fgoogle.com\u002F\"",[1332,3670,2583],{"class":2521},[1332,3672,3673],{"class":2455,"line":2727},[1332,3674,2588],{"emptyLinePlaceholder":75},[1332,3676,3677],{"class":2455,"line":2739},[1332,3678,3679],{"class":2609},"        \u002F\u002F Locate the search bar and fill it.\n",[1332,3681,3682,3684,3686,3689,3691,3694,3697,3700,3702,3705],{"class":2455,"line":2750},[1332,3683,3659],{"class":2507},[1332,3685,2679],{"class":2521},[1332,3687,3688],{"class":2525},"locator",[1332,3690,1213],{"class":2521},[1332,3692,3693],{"class":2462},"'aria\u002FSearch'",[1332,3695,3696],{"class":2521},").",[1332,3698,3699],{"class":2525},"fill",[1332,3701,1213],{"class":2521},[1332,3703,3704],{"class":2462},"'Testing axiom.ai'",[1332,3706,2583],{"class":2521},[1332,3708,3709],{"class":2455,"line":2765},[1332,3710,2588],{"emptyLinePlaceholder":75},[1332,3712,3713,3715,3717,3719,3721,3723,3725,3727,3729,3731,3733],{"class":2455,"line":2777},[1332,3714,3659],{"class":2507},[1332,3716,2697],{"class":2507},[1332,3718,2700],{"class":2511},[1332,3720,2703],{"class":2521},[1332,3722,2706],{"class":2458},[1332,3724,2709],{"class":2521},[1332,3726,2712],{"class":2507},[1332,3728,2715],{"class":2525},[1332,3730,2718],{"class":2521},[1332,3732,2721],{"class":2511},[1332,3734,2724],{"class":2521},[1332,3736,3737],{"class":2455,"line":2788},[1332,3738,2588],{"emptyLinePlaceholder":75},[1332,3740,3741,3743,3745,3747],{"class":2455,"line":2799},[1332,3742,3659],{"class":2507},[1332,3744,2679],{"class":2521},[1332,3746,2734],{"class":2525},[1332,3748,2670],{"class":2521},[1332,3750,3752,3754,3756,3758],{"class":2455,"line":3751},20,[1332,3753,3659],{"class":2507},[1332,3755,2664],{"class":2521},[1332,3757,2734],{"class":2525},[1332,3759,2670],{"class":2521},[1332,3761,3763,3766,3768,3770,3773],{"class":2455,"line":3762},21,[1332,3764,3765],{"class":2521},"        console.",[1332,3767,2575],{"class":2525},[1332,3769,1213],{"class":2521},[1332,3771,3772],{"class":2462},"'browser closed'",[1332,3774,2583],{"class":2521},[1332,3776,3778,3781,3783],{"class":2455,"line":3777},22,[1332,3779,3780],{"class":2521},"    } ",[1332,3782,2771],{"class":2507},[1332,3784,2774],{"class":2521},[1332,3786,3788,3790,3792],{"class":2455,"line":3787},23,[1332,3789,3765],{"class":2521},[1332,3791,2782],{"class":2525},[1332,3793,2785],{"class":2521},[1332,3795,3797,3799,3801,3803],{"class":2455,"line":3796},24,[1332,3798,3659],{"class":2507},[1332,3800,2664],{"class":2521},[1332,3802,2734],{"class":2525},[1332,3804,2670],{"class":2521},[1332,3806,3808],{"class":2455,"line":3807},25,[1332,3809,3810],{"class":2521},"    }\n",[1332,3812,3814],{"class":2455,"line":3813},26,[1332,3815,3816],{"class":2521},"};\n",[1332,3818,3820],{"class":2455,"line":3819},27,[1332,3821,2588],{"emptyLinePlaceholder":75},[1332,3823,3825,3828],{"class":2455,"line":3824},28,[1332,3826,3827],{"class":2525},"start",[1332,3829,2670],{"class":2521},[2093,3831,3832],{},[26,3833,3834,3836,3837,3842,3843,3846],{},[192,3835,2359],{}," The search bar selector uses Puppeteer's ",[659,3838,3841],{"href":3839,"rel":3840},"https:\u002F\u002Fpptr.dev\u002Fguides\u002Fpage-interactions#aria-selectors",[1218],"ARIA selectors"," (",[145,3844,3845],{},"aria\u002FSearch","), which match elements by their accessible name. This is more resilient than CSS selectors when a site changes its markup but keeps its accessibility labels.",[2093,3848,3849],{},[26,3850,3851,3853,3854,3856,3857,3859,3860,148],{},[192,3852,2172],{}," This sample is also available in the ",[659,3855,2477],{"href":2476},". Open the Live editor, paste in your API key, and click ",[192,3858,3137],{},". To generate an API key, see ",[659,3861,2495],{"href":2494},[2819,3863,3864],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":67,"searchDepth":68,"depth":68,"links":3866},[],"Sample Puppeteer script for the axiom.ai Code Dashboard that connects to the hosted browser, fills a search field on Google, waits, and closes cleanly.",{"metaTitle":3869},"Sample Puppeteer script for entering data into a page","\u002Fdocs\u002Fcode\u002Fsamples\u002Fdata-entry",{"title":3512,"description":3867},"docs\u002Fcode\u002Fsamples\u002Fdata-entry","w6mYwUljoVRnlVTt4STTXtgyxwC9wVasGjPYXi1_FUE",{"id":3875,"title":3876,"body":3877,"date":71,"description":3910,"extension":73,"meta":3911,"navigation":75,"order":1478,"path":3913,"seo":3914,"stem":3915,"__hash__":3916},"content\u002Fdocs\u002Fcode\u002Fsamples\u002Findex.md","Sample scripts",{"type":8,"value":3878,"toc":3907},[3879,3882,3886,3888,3900],[26,3880,3881],{},"These sample scripts run in the axiom.ai Live editor or your local environment. Use them as a starting point for your own scripts; each one connects to axiom.ai's hosted browser, performs a small task, and exits cleanly.",[107,3883,3885],{"id":3884},"available-samples","Available samples",[112,3887],{},[186,3889,3890,3896],{},[189,3891,3892],{},[659,3893,3895],{"href":3894},"\u002Fdocs\u002Fcode\u002Fsamples\u002Fnavigate-to-page","Navigate to a page",[189,3897,3898],{},[659,3899,3512],{"href":3870},[26,3901,2222,3902,2226,3904,148],{},[659,3903,2225],{"href":1887},[659,3905,2231],{"href":2229,"rel":3906},[1218],{"title":67,"searchDepth":68,"depth":68,"links":3908},[3909],{"id":3884,"depth":670,"text":3885},"Sample Puppeteer scripts you can run in the axiom.ai Live editor or adapt for your own automations, covering navigation and data entry.",{"metaTitle":3912},"Sample Puppeteer scripts for the axiom.ai Code Dashboard","\u002Fdocs\u002Fcode\u002Fsamples",{"title":3876,"description":3910},"docs\u002Fcode\u002Fsamples\u002Findex","H2Y9-obTtK88apPd7wELKiVd0r33ISn9XiroZVYTxN4",{"id":3918,"title":3895,"body":3919,"date":71,"description":4145,"extension":73,"meta":4146,"navigation":75,"order":2131,"path":3894,"seo":4148,"stem":4149,"__hash__":4150},"content\u002Fdocs\u002Fcode\u002Fsamples\u002Fnavigate-to-page.md",{"type":8,"value":3920,"toc":4143},[3921,3924,3926,3938,4128,4140],[26,3922,3923],{},"This sample script connects to axiom.ai, opens the axiom.ai homepage, waits 5 seconds, and closes the browser.",[26,3925,3520],{},[1923,3927,3928,3930,3934,3936],{},[189,3929,3525],{},[189,3931,3528,3932,148],{},[145,3933,2561],{},[189,3935,3537],{},[189,3937,3540],{},[2446,3939,3941],{"className":2498,"code":3940,"language":2500,"meta":67,"style":67},"console.log('start');\n\nconst browser = await puppeteer.connect({\n    \u002F\u002F Replace [HIDDEN_KEY] with your API key.\n    browserWSEndpoint: \"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=[HIDDEN_KEY]\"\n});\nconsole.log('browser connected');\n\ntry {\n    const page = await browser.newPage();\n    await page.goto(\"https:\u002F\u002Faxiom.ai\");\n    await new Promise((resolve) => setTimeout(resolve, 5000));\n    await page.close();\n    await browser.close();\n    console.log('browser closed');\n} catch (e) {\n    console.error(e.message);\n    await browser.close();\n}\n",[145,3942,3943,3955,3959,3975,3980,3986,3990,4002,4006,4012,4028,4042,4066,4076,4086,4098,4106,4114,4124],{"__ignoreMap":67},[1332,3944,3945,3947,3949,3951,3953],{"class":2455,"line":2131},[1332,3946,2572],{"class":2521},[1332,3948,2575],{"class":2525},[1332,3950,1213],{"class":2521},[1332,3952,3574],{"class":2462},[1332,3954,2583],{"class":2521},[1332,3956,3957],{"class":2455,"line":670},[1332,3958,2588],{"emptyLinePlaceholder":75},[1332,3960,3961,3963,3965,3967,3969,3971,3973],{"class":2455,"line":68},[1332,3962,2508],{"class":2507},[1332,3964,2512],{"class":2511},[1332,3966,2515],{"class":2507},[1332,3968,2518],{"class":2507},[1332,3970,2522],{"class":2521},[1332,3972,2526],{"class":2525},[1332,3974,2529],{"class":2521},[1332,3976,3977],{"class":2455,"line":1478},[1332,3978,3979],{"class":2609},"    \u002F\u002F Replace [HIDDEN_KEY] with your API key.\n",[1332,3981,3982,3984],{"class":2455,"line":293},[1332,3983,2534],{"class":2521},[1332,3985,2995],{"class":2462},[1332,3987,3988],{"class":2455,"line":2237},[1332,3989,2542],{"class":2521},[1332,3991,3992,3994,3996,3998,4000],{"class":2455,"line":2623},[1332,3993,2572],{"class":2521},[1332,3995,2575],{"class":2525},[1332,3997,1213],{"class":2521},[1332,3999,3624],{"class":2462},[1332,4001,2583],{"class":2521},[1332,4003,4004],{"class":2455,"line":2637},[1332,4005,2588],{"emptyLinePlaceholder":75},[1332,4007,4008,4010],{"class":2455,"line":2642},[1332,4009,2645],{"class":2507},[1332,4011,2648],{"class":2521},[1332,4013,4014,4016,4018,4020,4022,4024,4026],{"class":2455,"line":2651},[1332,4015,2654],{"class":2507},[1332,4017,2657],{"class":2511},[1332,4019,2515],{"class":2507},[1332,4021,2518],{"class":2507},[1332,4023,2664],{"class":2521},[1332,4025,2667],{"class":2525},[1332,4027,2670],{"class":2521},[1332,4029,4030,4032,4034,4036,4038,4040],{"class":2455,"line":2673},[1332,4031,2676],{"class":2507},[1332,4033,2679],{"class":2521},[1332,4035,2682],{"class":2525},[1332,4037,1213],{"class":2521},[1332,4039,2687],{"class":2462},[1332,4041,2583],{"class":2521},[1332,4043,4044,4046,4048,4050,4052,4054,4056,4058,4060,4062,4064],{"class":2455,"line":2692},[1332,4045,2676],{"class":2507},[1332,4047,2697],{"class":2507},[1332,4049,2700],{"class":2511},[1332,4051,2703],{"class":2521},[1332,4053,2706],{"class":2458},[1332,4055,2709],{"class":2521},[1332,4057,2712],{"class":2507},[1332,4059,2715],{"class":2525},[1332,4061,2718],{"class":2521},[1332,4063,2721],{"class":2511},[1332,4065,2724],{"class":2521},[1332,4067,4068,4070,4072,4074],{"class":2455,"line":2727},[1332,4069,2676],{"class":2507},[1332,4071,2679],{"class":2521},[1332,4073,2734],{"class":2525},[1332,4075,2670],{"class":2521},[1332,4077,4078,4080,4082,4084],{"class":2455,"line":2739},[1332,4079,2676],{"class":2507},[1332,4081,2664],{"class":2521},[1332,4083,2734],{"class":2525},[1332,4085,2670],{"class":2521},[1332,4087,4088,4090,4092,4094,4096],{"class":2455,"line":2750},[1332,4089,2753],{"class":2521},[1332,4091,2575],{"class":2525},[1332,4093,1213],{"class":2521},[1332,4095,3772],{"class":2462},[1332,4097,2583],{"class":2521},[1332,4099,4100,4102,4104],{"class":2455,"line":2765},[1332,4101,2768],{"class":2521},[1332,4103,2771],{"class":2507},[1332,4105,2774],{"class":2521},[1332,4107,4108,4110,4112],{"class":2455,"line":2777},[1332,4109,2753],{"class":2521},[1332,4111,2782],{"class":2525},[1332,4113,2785],{"class":2521},[1332,4115,4116,4118,4120,4122],{"class":2455,"line":2788},[1332,4117,2676],{"class":2507},[1332,4119,2664],{"class":2521},[1332,4121,2734],{"class":2525},[1332,4123,2670],{"class":2521},[1332,4125,4126],{"class":2455,"line":2799},[1332,4127,2802],{"class":2521},[2093,4129,4130],{},[26,4131,4132,3853,4134,3856,4136,3859,4138,148],{},[192,4133,2172],{},[659,4135,2477],{"href":2476},[192,4137,3137],{},[659,4139,2495],{"href":2494},[2819,4141,4142],{},"html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":67,"searchDepth":68,"depth":68,"links":4144},[],"Sample Puppeteer script for the axiom.ai Code Dashboard that connects to the hosted browser, opens a page, waits, and closes the browser cleanly.",{"metaTitle":4147},"Sample Puppeteer script for navigating to a page",{"title":3895,"description":4145},"docs\u002Fcode\u002Fsamples\u002Fnavigate-to-page","lgeoNQ0oYw9Pwr-sesOXHN1-aaBbG3ZAUQVs4eEbefU",{"id":4152,"title":4153,"body":4154,"date":71,"description":4203,"extension":73,"meta":4204,"navigation":75,"order":2237,"path":2494,"seo":4206,"stem":4207,"__hash__":4208},"content\u002Fdocs\u002Fcode\u002Ftoken-generation.md","Generate an API key",{"type":8,"value":4155,"toc":4200},[4156,4159,4162,4164,4187,4194],[26,4157,4158],{},"Every Code Dashboard script needs an API key to authenticate to axiom.ai's hosted browser. Generate the key once and reuse it across your scripts.",[107,4160,4153],{"id":4161},"generate-an-api-key",[112,4163],{},[1923,4165,4166,4176,4181,4184],{},[189,4167,4168,4169,4172,4173,148],{},"In the Code Dashboard, navigate to ",[192,4170,4171],{},"Settings"," > ",[192,4174,4175],{},"API key",[189,4177,1927,4178,148],{},[192,4179,4180],{},"Create API key",[189,4182,4183],{},"Wait a few seconds while the key is generated.",[189,4185,4186],{},"Copy the key and store it securely.",[2093,4188,4189],{},[26,4190,4191,4193],{},[192,4192,2099],{}," The key is shown once and can't be retrieved again. If you lose it, you'll need to generate a new one. We recommend storing it in a password manager or environment variable file before closing the dialog.",[26,4195,4196,4197,148],{},"For an example of using the API key in a Puppeteer script, see ",[659,4198,3270],{"href":4199},"\u002Fdocs\u002Fcode\u002Fcreate-scripts#connect-to-axiom-ai",{"title":67,"searchDepth":68,"depth":68,"links":4201},[4202],{"id":4161,"depth":670,"text":4153},"Generate the API key used to authenticate Code Dashboard scripts to axiom.ai's hosted browser, with guidance on storing it securely.",{"metaTitle":4205},"Generate and manage your axiom.ai Code Dashboard API key",{"title":4153,"description":4203},"docs\u002Fcode\u002Ftoken-generation","BsmsZMHbmtTjaT-1jgANe3Swx55n13ghjMtHADPLXg4",{"id":4210,"title":4211,"body":4212,"date":71,"description":4555,"extension":73,"meta":4556,"navigation":75,"order":68,"path":4558,"seo":4559,"stem":4560,"__hash__":4561},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fauthentication.md","Authentication",{"type":8,"value":4213,"toc":4544},[4214,4217,4219,4221,4224,4237,4241,4273,4277,4301,4305,4310,4334,4341,4348,4352,4354,4361,4401,4412,4419,4451,4455,4457,4460,4484,4487,4491,4493,4496,4510,4514,4516,4541],[26,4215,4216],{},"API requests are authenticated with an API key. The same key authenticates the full API surface, REST endpoints and cloud browser sessions, so you only need to generate one.",[107,4218,4153],{"id":4161},[112,4220],{},[26,4222,4223],{},"You can generate a key from three places. They all create the same account-scoped key, use whichever surface you already have open.",[2093,4225,4226],{},[26,4227,4228,4231,4232,4236],{},[192,4229,4230],{},"Signing up from code?"," If you're writing an agent, a Claude skill, or any tool that needs to onboard its own users without sending them to the dashboard first, see ",[659,4233,4235],{"href":4234},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fprogrammatic-signup","Programmatic signup"," for the three-call REST flow that creates an account and mints a key end-to-end.",[21,4238,4240],{"id":4239},"from-the-chrome-extension","From the Chrome extension",[1923,4242,4243,4248,4254,4260,4270],{},[189,4244,4245,4246,148],{},"Open the ",[192,4247,2836],{},[189,4249,4250,4251,148],{},"In the left sidebar, click ",[192,4252,4253],{},"Credentials and API key",[189,4255,4256,4257,148],{},"Scroll to ",[192,4258,4259],{},"Generate Axiom API token",[189,4261,1927,4262,4265,4266,4269],{},[192,4263,4264],{},"Show API Token"," to reveal an existing key, or ",[192,4267,4268],{},"Refresh API Token"," to generate a new one.",[189,4271,4272],{},"Copy the value.",[21,4274,4276],{"id":4275},"from-the-code-dashboard","From the Code Dashboard",[1923,4278,4279,4283,4289,4294,4299],{},[189,4280,4245,4281,148],{},[192,4282,1575],{},[189,4284,4285,4286,4288],{},"Click the ",[192,4287,4171],{}," cog in the left sidebar.",[189,4290,4291,4292,148],{},"Select ",[192,4293,4175],{},[189,4295,1927,4296,148],{},[192,4297,4298],{},"Delete and re-generate API key",[189,4300,4272],{},[21,4302,4304],{"id":4303},"from-the-live-editor","From the Live editor",[26,4306,2273,4307,4309],{},[192,4308,2477],{}," has a shortcut so you can paste a key (or generate one) without leaving the script you're testing.",[1923,4311,4312,4316,4324],{},[189,4313,4245,4314,148],{},[192,4315,1575],{},[189,4317,1927,4318,4320,4321,148],{},[192,4319,2477],{},", then ",[192,4322,4323],{},"Test Puppeteer scripts",[189,4325,4326,4327,4329,4330,4333],{},"Paste your key into the ",[192,4328,4175],{}," field, or click ",[192,4331,4332],{},"Generate key"," to create a new one.",[26,4335,4336,4337,4340],{},"The key is automatically substituted into the ",[145,4338,4339],{},"[HIDDEN_KEY]"," placeholder in the example script, so you can run it immediately.",[2093,4342,4343],{},[26,4344,4345,4347],{},[192,4346,2099],{}," generating a new key immediately invalidates the previous one. Any external integration using the old key (Zapier, Make, custom scripts, MCP servers, Puppeteer connections) stops working until you update it.",[107,4349,4351],{"id":4350},"use-the-key-in-a-request","Use the key in a request",[112,4353],{},[26,4355,4356,4357,4360],{},"For REST endpoints, pass the key in the JSON body, in the ",[145,4358,4359],{},"key"," field.",[2446,4362,4364],{"className":2448,"code":4363,"language":2450,"meta":67,"style":67},"curl -X POST https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Fremaining-runtime \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"key\": \"your-api-key-here\"}'\n",[145,4365,4366,4383,4393],{"__ignoreMap":67},[1332,4367,4368,4371,4374,4377,4380],{"class":2455,"line":2131},[1332,4369,4370],{"class":2458},"curl",[1332,4372,4373],{"class":2511}," -X",[1332,4375,4376],{"class":2462}," POST",[1332,4378,4379],{"class":2462}," https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Fremaining-runtime",[1332,4381,4382],{"class":2507}," \\\n",[1332,4384,4385,4388,4391],{"class":2455,"line":670},[1332,4386,4387],{"class":2511},"  -H",[1332,4389,4390],{"class":2462}," \"Content-Type: application\u002Fjson\"",[1332,4392,4382],{"class":2507},[1332,4394,4395,4398],{"class":2455,"line":68},[1332,4396,4397],{"class":2511},"  -d",[1332,4399,4400],{"class":2462}," '{\"key\": \"your-api-key-here\"}'\n",[2093,4402,4403],{},[26,4404,4405,4407,4408,4411],{},[192,4406,2359],{}," the key goes in the request body, not in an ",[145,4409,4410],{},"Authorization"," header. This is unusual for REST APIs, watch for it when porting code from other services.",[26,4413,4414,4415,4418],{},"For cloud browser sessions, the same key is passed as the ",[145,4416,4417],{},"token"," query parameter on the CDP WebSocket endpoint.",[2446,4420,4422],{"className":2962,"code":4421,"language":2964,"meta":67,"style":67},"const browser = await puppeteer.connect({\n  browserWSEndpoint: \"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=your-api-key-here\"\n});\n",[145,4423,4424,4440,4447],{"__ignoreMap":67},[1332,4425,4426,4428,4430,4432,4434,4436,4438],{"class":2455,"line":2131},[1332,4427,2508],{"class":2507},[1332,4429,2512],{"class":2511},[1332,4431,2515],{"class":2507},[1332,4433,2518],{"class":2507},[1332,4435,2522],{"class":2521},[1332,4437,2526],{"class":2525},[1332,4439,2529],{"class":2521},[1332,4441,4442,4444],{"class":2455,"line":670},[1332,4443,2992],{"class":2521},[1332,4445,4446],{"class":2462},"\"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=your-api-key-here\"\n",[1332,4448,4449],{"class":2455,"line":68},[1332,4450,2542],{"class":2521},[107,4452,4454],{"id":4453},"what-the-key-authenticates","What the key authenticates",[112,4456],{},[26,4458,4459],{},"A single key authenticates the full API surface:",[186,4461,4462,4475,4481],{},[189,4463,4464,4465,4468,4469,4468,4472,3696],{},"Trigger and manage cloud automation runs (",[145,4466,4467],{},"\u002Ftrigger",", ",[145,4470,4471],{},"\u002Fstop",[145,4473,4474],{},"\u002Frun-data",[189,4476,4477,4478,3696],{},"Check account quota (",[145,4479,4480],{},"\u002Fremaining-runtime",[189,4482,4483],{},"Drive cloud browser sessions over CDP (Puppeteer, Playwright, or the imperative session functions).",[26,4485,4486],{},"Keys are account-scoped: there is no per-automation, per-team, or per-integration key today, and only one active key per account at a time.",[107,4488,4490],{"id":4489},"security-best-practices","Security best practices",[112,4492],{},[26,4494,4495],{},"Treat your API key like a password.",[186,4497,4498,4501,4504,4507],{},[189,4499,4500],{},"Don't commit it to git, even in private repos.",[189,4502,4503],{},"Store it in environment variables or a secrets manager, not in client-side code. A key in client-side JavaScript is a key the world has.",[189,4505,4506],{},"Rotate the key if you suspect it's been exposed. Remember to update every integration immediately afterwards, the old key stops working as soon as the new one is generated.",[189,4508,4509],{},"When sharing automations or scripts with teammates, share the source, not the key. Each developer can generate their own.",[107,4511,4513],{"id":4512},"related","Related",[112,4515],{},[186,4517,4518,4523,4529,4535],{},[189,4519,4520,4522],{},[659,4521,4235],{"href":4234}," — sign up + mint a key from code",[189,4524,4525],{},[659,4526,4528],{"href":4527},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Ftrigger-an-automation","Trigger an automation",[189,4530,4531],{},[659,4532,4534],{"href":4533},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fstart-a-session","Start a browser session",[189,4536,4537],{},[659,4538,4540],{"href":4539},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fusage-and-limits\u002Fremaining-runtime","Check remaining runtime",[2819,4542,4543],{},"html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}",{"title":67,"searchDepth":68,"depth":68,"links":4545},[4546,4551,4552,4553,4554],{"id":4161,"depth":670,"text":4153,"children":4547},[4548,4549,4550],{"id":4239,"depth":68,"text":4240},{"id":4275,"depth":68,"text":4276},{"id":4303,"depth":68,"text":4304},{"id":4350,"depth":670,"text":4351},{"id":4453,"depth":670,"text":4454},{"id":4489,"depth":670,"text":4490},{"id":4512,"depth":670,"text":4513},"Generate an axiom.ai API key from the Chrome extension or Code Dashboard and use it to authenticate every API request.",{"metaTitle":4557},"Authenticate axiom.ai API requests with an API key","\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fauthentication",{"title":4211,"description":4555},"docs\u002Fdeveloper-hub\u002Fapi\u002Fauthentication","VYCXFrCbo8WNjr1iDHSEV3Rmes9BKx4GpP-2BwtK6og",{"id":4563,"title":4564,"body":4565,"date":71,"description":5336,"extension":73,"meta":5337,"navigation":75,"order":68,"path":5339,"seo":5340,"stem":5341,"__hash__":5342},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fcdp\u002Findex.md","Chrome API",{"type":8,"value":4566,"toc":5327},[4567,4570,4582,4586,4588,4620,4629,4636,4640,4642,4652,4807,4810,4822,4826,4828,4837,5018,5025,5029,5031,5054,5194,5198,5200,5203,5232,5238,5242,5244,5247,5288,5290,5292,5317,5324],[26,4568,4569],{},"The Chrome API is a Chrome DevTools Protocol WebSocket pointed at a fresh cloud browser. Connect a CDP-speaking client (Puppeteer, Playwright, or any raw CDP library) to drive the browser exactly as you would locally — except it runs on our infrastructure, with no Chromium to install or maintain.",[26,4571,4572,4573,4577,4578,148],{},"This is the right layer when you want full control of every browser action from your own stack, in any language. If you'd rather call high-level actions in Node without writing CDP, see the ",[659,4574,4576],{"href":4575},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions","Step API",". If the workflow already exists in the No-Code Tool and you just want to fire it, see the ",[659,4579,4581],{"href":4580},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations","Orchestrate API",[107,4583,4585],{"id":4584},"endpoint","Endpoint",[112,4587],{},[4589,4590,4591,4604],"table",{},[4592,4593,4594],"thead",{},[4595,4596,4597,4601],"tr",{},[4598,4599,4600],"th",{},"Protocol",[4598,4602,4603],{},"URL",[4605,4606,4607],"tbody",{},[4595,4608,4609,4615],{},[4610,4611,4612],"td",{},[145,4613,4614],{},"wss",[4610,4616,4617],{},[145,4618,4619],{},"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=YOUR_API_KEY",[26,4621,4622,4623,4625,4626,4628],{},"Pass your API key as the ",[145,4624,4417],{}," query parameter. See ",[659,4627,4211],{"href":4558}," to generate one.",[2093,4630,4631],{},[26,4632,4633,4635],{},[192,4634,2359],{}," never log the connection URL. The token is the same secret as the REST API key — treat the full URL as a credential.",[107,4637,4639],{"id":4638},"connect-with-puppeteer","Connect with Puppeteer",[112,4641],{},[26,4643,4644,4647,4648,4651],{},[145,4645,4646],{},"npm i puppeteer",", then point ",[145,4649,4650],{},"puppeteer.connect()"," at the endpoint:",[2446,4653,4655],{"className":2962,"code":4654,"language":2964,"meta":67,"style":67},"import puppeteer from \"puppeteer\";\n\nconst browser = await puppeteer.connect({\n  browserWSEndpoint: `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n});\n\ntry {\n  const page = await browser.newPage();\n  await page.goto(\"https:\u002F\u002Fexample.com\");\n  await page.screenshot({ path: \"out.png\", fullPage: true });\n} finally {\n  await browser.close();\n}\n",[145,4656,4657,4674,4678,4694,4717,4721,4725,4731,4747,4762,4784,4793,4803],{"__ignoreMap":67},[1332,4658,4659,4662,4665,4668,4671],{"class":2455,"line":2131},[1332,4660,4661],{"class":2507},"import",[1332,4663,4664],{"class":2521}," puppeteer ",[1332,4666,4667],{"class":2507},"from",[1332,4669,4670],{"class":2462}," \"puppeteer\"",[1332,4672,4673],{"class":2521},";\n",[1332,4675,4676],{"class":2455,"line":670},[1332,4677,2588],{"emptyLinePlaceholder":75},[1332,4679,4680,4682,4684,4686,4688,4690,4692],{"class":2455,"line":68},[1332,4681,2508],{"class":2507},[1332,4683,2512],{"class":2511},[1332,4685,2515],{"class":2507},[1332,4687,2518],{"class":2507},[1332,4689,2522],{"class":2521},[1332,4691,2526],{"class":2525},[1332,4693,2529],{"class":2521},[1332,4695,4696,4698,4701,4704,4706,4709,4711,4714],{"class":2455,"line":1478},[1332,4697,2992],{"class":2521},[1332,4699,4700],{"class":2462},"`wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${",[1332,4702,4703],{"class":2521},"process",[1332,4705,148],{"class":2462},[1332,4707,4708],{"class":2521},"env",[1332,4710,148],{"class":2462},[1332,4712,4713],{"class":2511},"AXIOM_API_KEY",[1332,4715,4716],{"class":2462},"}`\n",[1332,4718,4719],{"class":2455,"line":293},[1332,4720,2542],{"class":2521},[1332,4722,4723],{"class":2455,"line":2237},[1332,4724,2588],{"emptyLinePlaceholder":75},[1332,4726,4727,4729],{"class":2455,"line":2623},[1332,4728,2645],{"class":2507},[1332,4730,2648],{"class":2521},[1332,4732,4733,4735,4737,4739,4741,4743,4745],{"class":2455,"line":2637},[1332,4734,3344],{"class":2507},[1332,4736,2657],{"class":2511},[1332,4738,2515],{"class":2507},[1332,4740,2518],{"class":2507},[1332,4742,2664],{"class":2521},[1332,4744,2667],{"class":2525},[1332,4746,2670],{"class":2521},[1332,4748,4749,4751,4753,4755,4757,4760],{"class":2455,"line":2642},[1332,4750,3389],{"class":2507},[1332,4752,2679],{"class":2521},[1332,4754,2682],{"class":2525},[1332,4756,1213],{"class":2521},[1332,4758,4759],{"class":2462},"\"https:\u002F\u002Fexample.com\"",[1332,4761,2583],{"class":2521},[1332,4763,4764,4766,4768,4771,4774,4777,4780,4782],{"class":2455,"line":2651},[1332,4765,3389],{"class":2507},[1332,4767,2679],{"class":2521},[1332,4769,4770],{"class":2525},"screenshot",[1332,4772,4773],{"class":2521},"({ path: ",[1332,4775,4776],{"class":2462},"\"out.png\"",[1332,4778,4779],{"class":2521},", fullPage: ",[1332,4781,1548],{"class":2511},[1332,4783,3040],{"class":2521},[1332,4785,4786,4788,4791],{"class":2455,"line":2673},[1332,4787,2768],{"class":2521},[1332,4789,4790],{"class":2507},"finally",[1332,4792,2648],{"class":2521},[1332,4794,4795,4797,4799,4801],{"class":2455,"line":2692},[1332,4796,3389],{"class":2507},[1332,4798,2664],{"class":2521},[1332,4800,2734],{"class":2525},[1332,4802,2670],{"class":2521},[1332,4804,4805],{"class":2455,"line":2727},[1332,4806,2802],{"class":2521},[26,4808,4809],{},"The cloud browser handles the heavy lifting (a real Chromium with networking, fonts, and resources). Your stack just sends commands and reads results. Drop this into anywhere code runs: a Node service, a serverless function, a cron job, a test suite.",[26,4811,4812,4813,122,4815,4817,4818,4821],{},"Wrap the work in ",[145,4814,2645],{},[145,4816,4790],{}," so the session always closes, even on errors. A leaked session continues to count against your ",[659,4819,4820],{"href":4539},"remaining runtime"," until the server reaps it.",[107,4823,4825],{"id":4824},"connect-with-playwright","Connect with Playwright",[112,4827],{},[26,4829,4830,4833,4834,3297],{},[145,4831,4832],{},"npm i playwright",", then use ",[145,4835,4836],{},"chromium.connectOverCDP()",[2446,4838,4840],{"className":2962,"code":4839,"language":2964,"meta":67,"style":67},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n  await page.goto(\"https:\u002F\u002Fexample.com\");\n  await page.screenshot({ path: \"out.png\", fullPage: true });\n} finally {\n  await browser.close();\n}\n",[145,4841,4842,4856,4860,4879,4896,4900,4904,4910,4932,4964,4978,4996,5004,5014],{"__ignoreMap":67},[1332,4843,4844,4846,4849,4851,4854],{"class":2455,"line":2131},[1332,4845,4661],{"class":2507},[1332,4847,4848],{"class":2521}," { chromium } ",[1332,4850,4667],{"class":2507},[1332,4852,4853],{"class":2462}," \"playwright\"",[1332,4855,4673],{"class":2521},[1332,4857,4858],{"class":2455,"line":670},[1332,4859,2588],{"emptyLinePlaceholder":75},[1332,4861,4862,4864,4866,4868,4870,4873,4876],{"class":2455,"line":68},[1332,4863,2508],{"class":2507},[1332,4865,2512],{"class":2511},[1332,4867,2515],{"class":2507},[1332,4869,2518],{"class":2507},[1332,4871,4872],{"class":2521}," chromium.",[1332,4874,4875],{"class":2525},"connectOverCDP",[1332,4877,4878],{"class":2521},"(\n",[1332,4880,4881,4884,4886,4888,4890,4892,4894],{"class":2455,"line":1478},[1332,4882,4883],{"class":2462},"  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${",[1332,4885,4703],{"class":2521},[1332,4887,148],{"class":2462},[1332,4889,4708],{"class":2521},[1332,4891,148],{"class":2462},[1332,4893,4713],{"class":2511},[1332,4895,4716],{"class":2462},[1332,4897,4898],{"class":2455,"line":293},[1332,4899,2583],{"class":2521},[1332,4901,4902],{"class":2455,"line":2237},[1332,4903,2588],{"emptyLinePlaceholder":75},[1332,4905,4906,4908],{"class":2455,"line":2623},[1332,4907,2645],{"class":2507},[1332,4909,2648],{"class":2521},[1332,4911,4912,4914,4917,4919,4921,4924,4927,4929],{"class":2455,"line":2637},[1332,4913,3344],{"class":2507},[1332,4915,4916],{"class":2511}," context",[1332,4918,2515],{"class":2507},[1332,4920,2664],{"class":2521},[1332,4922,4923],{"class":2525},"contexts",[1332,4925,4926],{"class":2521},"()[",[1332,4928,256],{"class":2511},[1332,4930,4931],{"class":2521},"];\n",[1332,4933,4934,4936,4938,4940,4943,4946,4948,4950,4953,4956,4958,4960,4962],{"class":2455,"line":2642},[1332,4935,3344],{"class":2507},[1332,4937,2657],{"class":2511},[1332,4939,2515],{"class":2507},[1332,4941,4942],{"class":2521}," context.",[1332,4944,4945],{"class":2525},"pages",[1332,4947,4926],{"class":2521},[1332,4949,256],{"class":2511},[1332,4951,4952],{"class":2521},"] ",[1332,4954,4955],{"class":2507},"??",[1332,4957,2518],{"class":2507},[1332,4959,4942],{"class":2521},[1332,4961,2667],{"class":2525},[1332,4963,2670],{"class":2521},[1332,4965,4966,4968,4970,4972,4974,4976],{"class":2455,"line":2651},[1332,4967,3389],{"class":2507},[1332,4969,2679],{"class":2521},[1332,4971,2682],{"class":2525},[1332,4973,1213],{"class":2521},[1332,4975,4759],{"class":2462},[1332,4977,2583],{"class":2521},[1332,4979,4980,4982,4984,4986,4988,4990,4992,4994],{"class":2455,"line":2673},[1332,4981,3389],{"class":2507},[1332,4983,2679],{"class":2521},[1332,4985,4770],{"class":2525},[1332,4987,4773],{"class":2521},[1332,4989,4776],{"class":2462},[1332,4991,4779],{"class":2521},[1332,4993,1548],{"class":2511},[1332,4995,3040],{"class":2521},[1332,4997,4998,5000,5002],{"class":2455,"line":2692},[1332,4999,2768],{"class":2521},[1332,5001,4790],{"class":2507},[1332,5003,2648],{"class":2521},[1332,5005,5006,5008,5010,5012],{"class":2455,"line":2727},[1332,5007,3389],{"class":2507},[1332,5009,2664],{"class":2521},[1332,5011,2734],{"class":2525},[1332,5013,2670],{"class":2521},[1332,5015,5016],{"class":2455,"line":2739},[1332,5017,2802],{"class":2521},[26,5019,5020,5021,5024],{},"Playwright surfaces the connected browser as an existing context. Use the first context's first page (or create one) rather than calling ",[145,5022,5023],{},"browser.newContext()",", which is not supported over CDP.",[107,5026,5028],{"id":5027},"connect-with-raw-cdp-or-other-languages","Connect with raw CDP or other languages",[112,5030],{},[26,5032,5033,5034,4468,5037,5040,5041,5044,5045,5048,5049,148],{},"The endpoint is plain CDP, so any client that speaks the protocol works — including Python (",[145,5035,5036],{},"pyppeteer",[145,5038,5039],{},"playwright","), Go (",[145,5042,5043],{},"chromedp","), Ruby (",[145,5046,5047],{},"ferrum","), or a raw WebSocket library. For raw CDP, open a WebSocket to the endpoint and exchange JSON-RPC messages following the ",[659,5050,5053],{"href":5051,"rel":5052},"https:\u002F\u002Fchromedevtools.github.io\u002Fdevtools-protocol\u002F",[1218],"Chrome DevTools Protocol spec",[2446,5055,5059],{"className":5056,"code":5057,"language":5058,"meta":67,"style":67},"language-python shiki shiki-themes github-light-default github-dark-default","# Python example using playwright\nfrom playwright.sync_api import sync_playwright\nimport os\n\nwith sync_playwright() as p:\n    browser = p.chromium.connect_over_cdp(\n        f\"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token={os.environ['AXIOM_API_KEY']}\"\n    )\n    page = browser.contexts[0].pages[0]\n    page.goto(\"https:\u002F\u002Fexample.com\")\n    page.screenshot(path=\"out.png\")\n    browser.close()\n","python",[145,5060,5061,5066,5078,5085,5089,5103,5114,5140,5145,5165,5175,5189],{"__ignoreMap":67},[1332,5062,5063],{"class":2455,"line":2131},[1332,5064,5065],{"class":2609},"# Python example using playwright\n",[1332,5067,5068,5070,5073,5075],{"class":2455,"line":670},[1332,5069,4667],{"class":2507},[1332,5071,5072],{"class":2521}," playwright.sync_api ",[1332,5074,4661],{"class":2507},[1332,5076,5077],{"class":2521}," sync_playwright\n",[1332,5079,5080,5082],{"class":2455,"line":68},[1332,5081,4661],{"class":2507},[1332,5083,5084],{"class":2521}," os\n",[1332,5086,5087],{"class":2455,"line":1478},[1332,5088,2588],{"emptyLinePlaceholder":75},[1332,5090,5091,5094,5097,5100],{"class":2455,"line":293},[1332,5092,5093],{"class":2507},"with",[1332,5095,5096],{"class":2521}," sync_playwright() ",[1332,5098,5099],{"class":2507},"as",[1332,5101,5102],{"class":2521}," p:\n",[1332,5104,5105,5108,5111],{"class":2455,"line":2237},[1332,5106,5107],{"class":2521},"    browser ",[1332,5109,5110],{"class":2507},"=",[1332,5112,5113],{"class":2521}," p.chromium.connect_over_cdp(\n",[1332,5115,5116,5119,5122,5125,5128,5131,5134,5137],{"class":2455,"line":2623},[1332,5117,5118],{"class":2507},"        f",[1332,5120,5121],{"class":2462},"\"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=",[1332,5123,5124],{"class":2507},"{",[1332,5126,5127],{"class":2521},"os.environ[",[1332,5129,5130],{"class":2462},"'AXIOM_API_KEY'",[1332,5132,5133],{"class":2521},"]",[1332,5135,5136],{"class":2507},"}",[1332,5138,5139],{"class":2462},"\"\n",[1332,5141,5142],{"class":2455,"line":2637},[1332,5143,5144],{"class":2521},"    )\n",[1332,5146,5147,5150,5152,5155,5157,5160,5162],{"class":2455,"line":2642},[1332,5148,5149],{"class":2521},"    page ",[1332,5151,5110],{"class":2507},[1332,5153,5154],{"class":2521}," browser.contexts[",[1332,5156,256],{"class":2511},[1332,5158,5159],{"class":2521},"].pages[",[1332,5161,256],{"class":2511},[1332,5163,5164],{"class":2521},"]\n",[1332,5166,5167,5170,5172],{"class":2455,"line":2651},[1332,5168,5169],{"class":2521},"    page.goto(",[1332,5171,4759],{"class":2462},[1332,5173,5174],{"class":2521},")\n",[1332,5176,5177,5180,5183,5185,5187],{"class":2455,"line":2673},[1332,5178,5179],{"class":2521},"    page.screenshot(",[1332,5181,5182],{"class":2458},"path",[1332,5184,5110],{"class":2507},[1332,5186,4776],{"class":2462},[1332,5188,5174],{"class":2521},[1332,5190,5191],{"class":2455,"line":2692},[1332,5192,5193],{"class":2521},"    browser.close()\n",[107,5195,5197],{"id":5196},"session-lifecycle","Session lifecycle",[112,5199],{},[26,5201,5202],{},"Each successful connection opens a fresh, isolated cloud browser. Sessions consume runtime quota for their entire open lifetime, not just while actively executing commands. Always close the connection when you're done:",[186,5204,5205,5219,5226],{},[189,5206,5207,5210,5211,5214,5215,5218],{},[192,5208,5209],{},"Puppeteer:"," ",[145,5212,5213],{},"await browser.close()",". Use ",[145,5216,5217],{},"browser.disconnect()"," only if you want to leave the cloud browser running — it keeps consuming runtime until the server reaps it.",[189,5220,5221,5210,5224,148],{},[192,5222,5223],{},"Playwright:",[145,5225,5213],{},[189,5227,5228,5231],{},[192,5229,5230],{},"Raw CDP:"," close the WebSocket. The server reaps the browser shortly after.",[26,5233,5234,5235,5237],{},"Idle sessions are eventually timed out by the server, but this is not immediate — a leaked session can rack up several minutes of runtime before being reaped. Check ",[659,5236,4820],{"href":4539}," if a script seems to drain quota unexpectedly.",[107,5239,5241],{"id":5240},"how-it-differs-from-local-puppeteer","How it differs from local Puppeteer",[112,5243],{},[26,5245,5246],{},"The cloud browser behaves like a local Chromium with a few practical differences worth knowing up front:",[186,5248,5249,5255,5269,5278],{},[189,5250,5251,5254],{},[192,5252,5253],{},"Datacentre IP",": some sites detect and block known datacentre ranges. Expect this on a subset of targets.",[189,5256,5257,5260,5261,5264,5265,5268],{},[192,5258,5259],{},"No local filesystem",": ",[145,5262,5263],{},"file:\u002F\u002F"," URLs, ",[145,5266,5267],{},"--user-data-dir"," mounts, and similar local-only features aren't usable. Use page-side downloads or upload buffers through your code instead.",[189,5270,5271,5274,5275,5277],{},[192,5272,5273],{},"No persistent state across sessions",": each ",[145,5276,4650],{}," opens a fresh browser. Cookies, localStorage, and other in-memory state vanish on disconnect. To persist, capture and re-apply in your own code.",[189,5279,5280,5283,5284,148],{},[192,5281,5282],{},"Concurrency per API key",": the number of concurrent open sessions is capped by your plan tier. See ",[659,5285,5287],{"href":5286},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fusage-and-limits\u002Fqueue-and-concurrency","Queue and concurrency",[107,5289,4513],{"id":4512},[112,5291],{},[186,5293,5294,5300,5306,5312],{},[189,5295,5296],{},[659,5297,5299],{"href":5298},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fquickstart","Quickstart — drive a cloud browser from your code",[189,5301,5302],{},[659,5303,5305],{"href":5304},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Freference\u002Fendpoints","Endpoints reference",[189,5307,5308],{},[659,5309,5311],{"href":5310},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Freference\u002Ferrorcodes","Error codes",[189,5313,5314,5316],{},[659,5315,4576],{"href":4575}," — high-level browser actions wrapped around the Chrome API",[26,5318,2222,5319,2226,5321,148],{},[659,5320,2225],{"href":1887},[659,5322,2231],{"href":2229,"rel":5323},[1218],[2819,5325,5326],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}",{"title":67,"searchDepth":68,"depth":68,"links":5328},[5329,5330,5331,5332,5333,5334,5335],{"id":4584,"depth":670,"text":4585},{"id":4638,"depth":670,"text":4639},{"id":4824,"depth":670,"text":4825},{"id":5027,"depth":670,"text":5028},{"id":5196,"depth":670,"text":5197},{"id":5240,"depth":670,"text":5241},{"id":4512,"depth":670,"text":4513},"Drive a cloud browser from your own code over a Chrome DevTools Protocol WebSocket. Works with Puppeteer, Playwright, raw CDP libraries, or anything else that speaks the protocol.",{"metaTitle":5338},"Chrome API — connect Puppeteer, Playwright, or any CDP client to axiom.ai cloud browsers","\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fcdp",{"title":4564,"description":5336},"docs\u002Fdeveloper-hub\u002Fapi\u002Fcdp\u002Findex","sjo13tPAAKWnAPUHgY9bA3AgXCMIPCraTm6awV9i1XQ",{"id":5344,"title":5345,"body":5346,"date":71,"description":5559,"extension":73,"meta":5560,"navigation":75,"order":2131,"path":5562,"seo":5563,"stem":5564,"__hash__":5565},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Findex.md","API",{"type":8,"value":5347,"toc":5551},[5348,5351,5374,5386,5397,5405,5410,5413,5445,5450,5455,5488,5491,5496,5499,5502,5508,5514,5517,5524,5527,5529,5536,5539,5541,5548],[26,5349,5350],{},"The axiom.ai API has three layers. They can be used together or individually:",[1923,5352,5353,5360,5367],{},[189,5354,5355,5359],{},[192,5356,5357],{},[659,5358,4564],{"href":5339}," — a long-lived WebSocket to a cloud browser, drivable from Puppeteer, Playwright, or any CDP-speaking client.",[189,5361,5362,5366],{},[192,5363,5364],{},[659,5365,4576],{"href":4575}," — our library of step functions wraps the Chrome API with high-level browser actions in Node.",[189,5368,5369,5373],{},[192,5370,5371],{},[659,5372,4581],{"href":4580}," — trigger any pre-built automation, code or no-code, and manage its runs over REST.",[26,5375,5376,5377,5381,5382,4320,5384,148],{},"All three layers are reachable from your own code or from an ",[659,5378,5380],{"href":5379},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fmcp","MCP client",". Start with the ",[659,5383,1496],{"href":5298},[659,5385,2495],{"href":4558},[3075,5387,5388,5391,5394],{"cols":68,"gap":3077},[499,5389],{"link":5339,"shape":510,"text":5390,"title":4564},"Open a WebSocket to a cloud browser and drive it from Puppeteer, Playwright, or any CDP client.",[499,5392],{"link":4575,"shape":502,"text":5393,"title":4576},"Our library of step functions removes the CDP boilerplate — high-level browser actions in Node via the axiom-api package.",[499,5395],{"link":4580,"shape":502,"text":5396,"title":4581},"Trigger any pre-built automation — code or no-code — and manage its runs over REST. For Zapier, Make, a backend service, or an MCP client.",[2446,5398,5403],{"className":5399,"code":5401,"language":5402},[5400],"language-text","                                                YOUR CODE\n                                                    │\n                                                [API key]\n                                                    │\n                            ╔═══════════════════════════════════════════════╗\n                            ║                 axiom.ai API                  ║\n                            ╚═══════════════════════════════════════════════╝\n                                                    │\n            ┌───────────────────────────────────────┼───────────────────────────────────────┐\n            │                                       │                                       │\n            ▼                                       ▼                                       ▼\n\n   ╔══════════════════════╗               ╔══════════════════════╗               ╔══════════════════════╗\n   ║      Chrome API      ║               ║       Step API       ║               ║   Orchestrate API    ║\n   ╚══════════════════════╝               ╚══════════════════════╝               ╚══════════════════════╝\n\n   Long-lived WebSocket.                  Node library calling                   REST. Fire pre-built\n   Connect Puppeteer,                     \u002Fapi\u002Fv5\u002Fstep. High-level               automations and\n   Playwright, or any                     browser step functions.                manage their runs.\n   CDP-speaking client.\n\n   wss:\u002F\u002Fcdp-lb.axiom.ai\u002F                 npm install @axiom_ai\u002Fapi              POST \u002Ftrigger\n     ?token=API_KEY                         │                                    POST \u002Frun-data\n                                          new AxiomApi(key)                      POST \u002Frun-reports\n                                            │                                    POST \u002Flist-automations\n                                          browserOpen()                          POST \u002Fstop\n                                            │\n                                          goto(url)\n                                          click(selector)\n                                          enterText(sel, text)\n                                          scrape()\n                                          wait(ms)\n                                            │\n                                          browserClose()\n","text",[145,5404,5401],{"__ignoreMap":67},[107,5406,5408],{"id":5407},"chrome-api",[659,5409,4564],{"href":5339},[26,5411,5412],{},"A long-lived Chrome DevTools Protocol WebSocket pointed at a fresh cloud browser. Connect Puppeteer, Playwright, or any CDP-speaking library and drive it exactly as you would locally — except it runs on our infrastructure, with no Chromium to install or maintain. Best when you want full control of every browser action from your own stack, in any language.",[2446,5414,5416],{"className":2962,"code":5415,"language":2964,"meta":67,"style":67},"const browser = await puppeteer.connect({\n  browserWSEndpoint: \"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=YOUR_API_KEY\"\n});\n",[145,5417,5418,5434,5441],{"__ignoreMap":67},[1332,5419,5420,5422,5424,5426,5428,5430,5432],{"class":2455,"line":2131},[1332,5421,2508],{"class":2507},[1332,5423,2512],{"class":2511},[1332,5425,2515],{"class":2507},[1332,5427,2518],{"class":2507},[1332,5429,2522],{"class":2521},[1332,5431,2526],{"class":2525},[1332,5433,2529],{"class":2521},[1332,5435,5436,5438],{"class":2455,"line":670},[1332,5437,2992],{"class":2521},[1332,5439,5440],{"class":2462},"\"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=YOUR_API_KEY\"\n",[1332,5442,5443],{"class":2455,"line":68},[1332,5444,2542],{"class":2521},[26,5446,5447],{},[659,5448,5449],{"href":5339},"Read the full Chrome API guide →",[107,5451,5453],{"id":5452},"step-api",[659,5454,4576],{"href":4575},[26,5456,2273,5457,5460,5461,5464,5465,5468,5469,4468,5471,4468,5474,4468,5477,4468,5480,5483,5484,5487],{},[145,5458,5459],{},"@axiom_ai\u002Fapi"," Node package gives you high-level browser actions over our ",[145,5462,5463],{},"\u002Fapi\u002Fv5\u002Fstep"," REST endpoint — call named step functions instead of speaking CDP yourself. Open a session with ",[145,5466,5467],{},"browserOpen()",", drive it with actions like ",[145,5470,2682],{},[145,5472,5473],{},"click",[145,5475,5476],{},"enterText",[145,5478,5479],{},"scrape",[145,5481,5482],{},"wait",", …, close with ",[145,5485,5486],{},"browserClose()",". The Step API is a separate surface from the Chrome API above — pick whichever fits your stack. Best when you want code-driven flows in Node but don't want to write Puppeteer or wire up CDP yourself.",[2218,5489],{"path":5490},"step-functions",[107,5492,5494],{"id":5493},"orchestrate-api",[659,5495,4581],{"href":4580},[26,5497,5498],{},"Trigger any pre-built automation — code or no-code — and manage its runs over REST. Pass inputs at trigger time, poll status, fetch run history, stop in-flight runs. Best when the automation is already authored in the No-Code Tool or Code Dashboard and you want to wire it into Zapier, Make, a backend service, a cron job, or an MCP client.",[2218,5500],{"path":5501},"run-automations",[107,5503,5505],{"id":5504},"use-from-an-mcp-client",[659,5506,5507],{"href":5379},"Use from an MCP client",[26,5509,5510,5511,5513],{},"All three layers above are reachable from MCP-aware clients (Claude Desktop, Claude Code, Cursor, and others). Use the built-in server in the axiom.ai desktop app, or build your own in Python or TypeScript to expose the Chrome API, the Step API, or the Orchestrate API's ",[145,5512,4467],{}," as tools.",[2218,5515],{"path":5516},"mcp",[107,5518,5520],{"id":5519},"usage-and-limits",[659,5521,5523],{"href":5522},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fusage-and-limits","Usage and limits",[26,5525,5526],{},"Check how much cloud runtime your account has left, see how runs are queued when you hit your concurrency limit, and stay inside the per-minute rate limits.",[2218,5528],{"path":5519},[107,5530,5532],{"id":5531},"reference",[659,5533,5535],{"href":5534},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Freference","Reference",[26,5537,5538],{},"Endpoint summaries, request and response payloads, and error codes for the full API surface.",[2218,5540],{"path":5531},[26,5542,2222,5543,2226,5545,148],{},[659,5544,2225],{"href":1887},[659,5546,2231],{"href":2229,"rel":5547},[1218],[2819,5549,5550],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":67,"searchDepth":68,"depth":68,"links":5552},[5553,5554,5555,5556,5557,5558],{"id":5407,"depth":670,"text":4564},{"id":5452,"depth":670,"text":4576},{"id":5493,"depth":670,"text":4581},{"id":5504,"depth":670,"text":5507},{"id":5519,"depth":670,"text":5523},{"id":5531,"depth":670,"text":5535},"Three layered APIs with one key. Chrome API for low-level browser control, Step API for high-level browser actions, and Orchestrate API to trigger any automation — code or no-code.",{"metaTitle":5561},"axiom.ai API — Chrome API, Step API, and Orchestrate API","\u002Fdocs\u002Fdeveloper-hub\u002Fapi",{"title":5345,"description":5559},"docs\u002Fdeveloper-hub\u002Fapi\u002Findex","NyxUM4y0gEMB5LRi6bTAaGGkFOcskbZ6twt0hWi3gn4",{"id":5567,"title":5568,"body":5569,"date":71,"description":6313,"extension":73,"meta":6314,"navigation":75,"order":670,"path":6316,"seo":6317,"stem":6318,"__hash__":6319},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Fbuild-your-own-server-python.md","Build your own server (Python)",{"type":8,"value":5570,"toc":6305},[5571,5574,5578,5580,5583,5603,5607,5609,5629,5634,5649,5653,5655,5661,6093,6096,6100,6102,6110,6199,6210,6214,6216,6219,6270,6273,6277,6279,6302],[26,5572,5573],{},"Build a small Python MCP server that wraps the axiom.ai REST API. The result is a tool any MCP-aware client (Claude Desktop, Claude Code, Cursor) can call to trigger automations and check their status from inside a conversation.",[107,5575,5577],{"id":5576},"before-you-begin","Before you begin",[112,5579],{},[26,5581,5582],{},"You need:",[186,5584,5585,5588,5598],{},[189,5586,5587],{},"Python 3.10 or later.",[189,5589,5590,5593,5594,5597],{},[145,5591,5592],{},"uv"," (recommended) or ",[145,5595,5596],{},"pip"," for dependency management.",[189,5599,5600,5601,148],{},"An axiom.ai API key. See ",[659,5602,4211],{"href":4558},[107,5604,5606],{"id":5605},"step-1-install-dependencies","Step 1: install dependencies",[112,5608],{},[2446,5610,5612],{"className":2448,"code":5611,"language":2450,"meta":67,"style":67},"uv pip install \"mcp[cli]\" httpx\n",[145,5613,5614],{"__ignoreMap":67},[1332,5615,5616,5618,5621,5623,5626],{"class":2455,"line":2131},[1332,5617,5592],{"class":2458},[1332,5619,5620],{"class":2462}," pip",[1332,5622,3288],{"class":2462},[1332,5624,5625],{"class":2462}," \"mcp[cli]\"",[1332,5627,5628],{"class":2462}," httpx\n",[26,5630,5631,5632,3297],{},"Or with ",[145,5633,5596],{},[2446,5635,5637],{"className":2448,"code":5636,"language":2450,"meta":67,"style":67},"pip install \"mcp[cli]\" httpx\n",[145,5638,5639],{"__ignoreMap":67},[1332,5640,5641,5643,5645,5647],{"class":2455,"line":2131},[1332,5642,5596],{"class":2458},[1332,5644,3288],{"class":2462},[1332,5646,5625],{"class":2462},[1332,5648,5628],{"class":2462},[107,5650,5652],{"id":5651},"step-2-write-the-server","Step 2: write the server",[112,5654],{},[26,5656,5657,5658,3297],{},"Create a file called ",[145,5659,5660],{},"axiom_mcp.py",[2446,5662,5664],{"className":5056,"code":5663,"language":5058,"meta":67,"style":67},"import os\nimport httpx\nfrom mcp.server.fastmcp import FastMCP\n\nmcp = FastMCP(\"axiom\")\nAXIOM_BASE = \"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\"\nKEY = os.environ[\"AXIOM_API_KEY\"]\n\n@mcp.tool()\nasync def trigger_automation(name: str, data: list | None = None) -> dict:\n    \"\"\"Trigger an axiom.ai cloud automation by exact name.\n\n    Optional `data` is a 3-D array of [tables][rows][cells] passed as\n    the automation's input.\n    \"\"\"\n    body = {\"key\": KEY, \"name\": name}\n    if data is not None:\n        body[\"data\"] = data\n    async with httpx.AsyncClient(timeout=30) as c:\n        r = await c.post(f\"{AXIOM_BASE}\u002Ftrigger\", json=body)\n        return r.json()\n\n@mcp.tool()\nasync def run_status(run_id: str) -> dict:\n    \"\"\"Check the status of a triggered axiom.ai automation run.\"\"\"\n    async with httpx.AsyncClient(timeout=30) as c:\n        r = await c.post(\n            f\"{AXIOM_BASE}\u002Frun-data\",\n            json={\"key\": KEY, \"run_id\": run_id},\n        )\n        return r.json()\n\nif __name__ == \"__main__\":\n    mcp.run()  # stdio transport by default\n",[145,5665,5666,5672,5678,5690,5694,5709,5719,5734,5738,5746,5787,5792,5796,5801,5806,5811,5836,5854,5869,5895,5932,5940,5944,5950,5970,5975,5995,6006,6025,6049,6055,6062,6067,6084],{"__ignoreMap":67},[1332,5667,5668,5670],{"class":2455,"line":2131},[1332,5669,4661],{"class":2507},[1332,5671,5084],{"class":2521},[1332,5673,5674,5676],{"class":2455,"line":670},[1332,5675,4661],{"class":2507},[1332,5677,5628],{"class":2521},[1332,5679,5680,5682,5685,5687],{"class":2455,"line":68},[1332,5681,4667],{"class":2507},[1332,5683,5684],{"class":2521}," mcp.server.fastmcp ",[1332,5686,4661],{"class":2507},[1332,5688,5689],{"class":2521}," FastMCP\n",[1332,5691,5692],{"class":2455,"line":1478},[1332,5693,2588],{"emptyLinePlaceholder":75},[1332,5695,5696,5699,5701,5704,5707],{"class":2455,"line":293},[1332,5697,5698],{"class":2521},"mcp ",[1332,5700,5110],{"class":2507},[1332,5702,5703],{"class":2521}," FastMCP(",[1332,5705,5706],{"class":2462},"\"axiom\"",[1332,5708,5174],{"class":2521},[1332,5710,5711,5714,5716],{"class":2455,"line":2237},[1332,5712,5713],{"class":2511},"AXIOM_BASE",[1332,5715,2515],{"class":2507},[1332,5717,5718],{"class":2462}," \"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\"\n",[1332,5720,5721,5724,5726,5729,5732],{"class":2455,"line":2623},[1332,5722,5723],{"class":2511},"KEY",[1332,5725,2515],{"class":2507},[1332,5727,5728],{"class":2521}," os.environ[",[1332,5730,5731],{"class":2462},"\"AXIOM_API_KEY\"",[1332,5733,5164],{"class":2521},[1332,5735,5736],{"class":2455,"line":2637},[1332,5737,2588],{"emptyLinePlaceholder":75},[1332,5739,5740,5743],{"class":2455,"line":2642},[1332,5741,5742],{"class":2525},"@mcp.tool",[1332,5744,5745],{"class":2521},"()\n",[1332,5747,5748,5750,5753,5756,5759,5762,5765,5768,5771,5774,5776,5778,5781,5784],{"class":2455,"line":2651},[1332,5749,3332],{"class":2507},[1332,5751,5752],{"class":2507}," def",[1332,5754,5755],{"class":2525}," trigger_automation",[1332,5757,5758],{"class":2521},"(name: ",[1332,5760,5761],{"class":2511},"str",[1332,5763,5764],{"class":2521},", data: ",[1332,5766,5767],{"class":2511},"list",[1332,5769,5770],{"class":2507}," |",[1332,5772,5773],{"class":2511}," None",[1332,5775,2515],{"class":2507},[1332,5777,5773],{"class":2511},[1332,5779,5780],{"class":2521},") -> ",[1332,5782,5783],{"class":2511},"dict",[1332,5785,5786],{"class":2521},":\n",[1332,5788,5789],{"class":2455,"line":2673},[1332,5790,5791],{"class":2462},"    \"\"\"Trigger an axiom.ai cloud automation by exact name.\n",[1332,5793,5794],{"class":2455,"line":2692},[1332,5795,2588],{"emptyLinePlaceholder":75},[1332,5797,5798],{"class":2455,"line":2727},[1332,5799,5800],{"class":2462},"    Optional `data` is a 3-D array of [tables][rows][cells] passed as\n",[1332,5802,5803],{"class":2455,"line":2739},[1332,5804,5805],{"class":2462},"    the automation's input.\n",[1332,5807,5808],{"class":2455,"line":2750},[1332,5809,5810],{"class":2462},"    \"\"\"\n",[1332,5812,5813,5816,5818,5821,5824,5826,5828,5830,5833],{"class":2455,"line":2765},[1332,5814,5815],{"class":2521},"    body ",[1332,5817,5110],{"class":2507},[1332,5819,5820],{"class":2521}," {",[1332,5822,5823],{"class":2462},"\"key\"",[1332,5825,5260],{"class":2521},[1332,5827,5723],{"class":2511},[1332,5829,4468],{"class":2521},[1332,5831,5832],{"class":2462},"\"name\"",[1332,5834,5835],{"class":2521},": name}\n",[1332,5837,5838,5841,5844,5847,5850,5852],{"class":2455,"line":2777},[1332,5839,5840],{"class":2507},"    if",[1332,5842,5843],{"class":2521}," data ",[1332,5845,5846],{"class":2507},"is",[1332,5848,5849],{"class":2507}," not",[1332,5851,5773],{"class":2511},[1332,5853,5786],{"class":2521},[1332,5855,5856,5859,5862,5864,5866],{"class":2455,"line":2788},[1332,5857,5858],{"class":2521},"        body[",[1332,5860,5861],{"class":2462},"\"data\"",[1332,5863,4952],{"class":2521},[1332,5865,5110],{"class":2507},[1332,5867,5868],{"class":2521}," data\n",[1332,5870,5871,5874,5877,5880,5883,5885,5888,5890,5892],{"class":2455,"line":2799},[1332,5872,5873],{"class":2507},"    async",[1332,5875,5876],{"class":2507}," with",[1332,5878,5879],{"class":2521}," httpx.AsyncClient(",[1332,5881,5882],{"class":2458},"timeout",[1332,5884,5110],{"class":2507},[1332,5886,5887],{"class":2511},"30",[1332,5889,2709],{"class":2521},[1332,5891,5099],{"class":2507},[1332,5893,5894],{"class":2521}," c:\n",[1332,5896,5897,5900,5902,5904,5907,5910,5913,5915,5917,5919,5922,5924,5927,5929],{"class":2455,"line":3751},[1332,5898,5899],{"class":2521},"        r ",[1332,5901,5110],{"class":2507},[1332,5903,2518],{"class":2507},[1332,5905,5906],{"class":2521}," c.post(",[1332,5908,5909],{"class":2507},"f",[1332,5911,5912],{"class":2462},"\"",[1332,5914,5124],{"class":2507},[1332,5916,5713],{"class":2511},[1332,5918,5136],{"class":2507},[1332,5920,5921],{"class":2462},"\u002Ftrigger\"",[1332,5923,4468],{"class":2521},[1332,5925,5926],{"class":2458},"json",[1332,5928,5110],{"class":2507},[1332,5930,5931],{"class":2521},"body)\n",[1332,5933,5934,5937],{"class":2455,"line":3762},[1332,5935,5936],{"class":2507},"        return",[1332,5938,5939],{"class":2521}," r.json()\n",[1332,5941,5942],{"class":2455,"line":3777},[1332,5943,2588],{"emptyLinePlaceholder":75},[1332,5945,5946,5948],{"class":2455,"line":3787},[1332,5947,5742],{"class":2525},[1332,5949,5745],{"class":2521},[1332,5951,5952,5954,5956,5959,5962,5964,5966,5968],{"class":2455,"line":3796},[1332,5953,3332],{"class":2507},[1332,5955,5752],{"class":2507},[1332,5957,5958],{"class":2525}," run_status",[1332,5960,5961],{"class":2521},"(run_id: ",[1332,5963,5761],{"class":2511},[1332,5965,5780],{"class":2521},[1332,5967,5783],{"class":2511},[1332,5969,5786],{"class":2521},[1332,5971,5972],{"class":2455,"line":3807},[1332,5973,5974],{"class":2462},"    \"\"\"Check the status of a triggered axiom.ai automation run.\"\"\"\n",[1332,5976,5977,5979,5981,5983,5985,5987,5989,5991,5993],{"class":2455,"line":3813},[1332,5978,5873],{"class":2507},[1332,5980,5876],{"class":2507},[1332,5982,5879],{"class":2521},[1332,5984,5882],{"class":2458},[1332,5986,5110],{"class":2507},[1332,5988,5887],{"class":2511},[1332,5990,2709],{"class":2521},[1332,5992,5099],{"class":2507},[1332,5994,5894],{"class":2521},[1332,5996,5997,5999,6001,6003],{"class":2455,"line":3819},[1332,5998,5899],{"class":2521},[1332,6000,5110],{"class":2507},[1332,6002,2518],{"class":2507},[1332,6004,6005],{"class":2521}," c.post(\n",[1332,6007,6008,6011,6013,6015,6017,6019,6022],{"class":2455,"line":3824},[1332,6009,6010],{"class":2507},"            f",[1332,6012,5912],{"class":2462},[1332,6014,5124],{"class":2507},[1332,6016,5713],{"class":2511},[1332,6018,5136],{"class":2507},[1332,6020,6021],{"class":2462},"\u002Frun-data\"",[1332,6023,6024],{"class":2521},",\n",[1332,6026,6028,6031,6033,6035,6037,6039,6041,6043,6046],{"class":2455,"line":6027},29,[1332,6029,6030],{"class":2458},"            json",[1332,6032,5110],{"class":2507},[1332,6034,5124],{"class":2521},[1332,6036,5823],{"class":2462},[1332,6038,5260],{"class":2521},[1332,6040,5723],{"class":2511},[1332,6042,4468],{"class":2521},[1332,6044,6045],{"class":2462},"\"run_id\"",[1332,6047,6048],{"class":2521},": run_id},\n",[1332,6050,6052],{"class":2455,"line":6051},30,[1332,6053,6054],{"class":2521},"        )\n",[1332,6056,6058,6060],{"class":2455,"line":6057},31,[1332,6059,5936],{"class":2507},[1332,6061,5939],{"class":2521},[1332,6063,6065],{"class":2455,"line":6064},32,[1332,6066,2588],{"emptyLinePlaceholder":75},[1332,6068,6070,6073,6076,6079,6082],{"class":2455,"line":6069},33,[1332,6071,6072],{"class":2507},"if",[1332,6074,6075],{"class":2511}," __name__",[1332,6077,6078],{"class":2507}," ==",[1332,6080,6081],{"class":2462}," \"__main__\"",[1332,6083,5786],{"class":2521},[1332,6085,6087,6090],{"class":2455,"line":6086},34,[1332,6088,6089],{"class":2521},"    mcp.run()  ",[1332,6091,6092],{"class":2609},"# stdio transport by default\n",[26,6094,6095],{},"That's the whole server. Tool descriptions in the docstrings are what the LLM sees when deciding whether to call a tool, write them clearly.",[107,6097,6099],{"id":6098},"step-3-register-it-with-a-client","Step 3: register it with a client",[112,6101],{},[26,6103,6104,6105,6109],{},"See ",[659,6106,6108],{"href":6107},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Fregister-with-clients","Register with Claude clients"," for the full configuration snippets. The shortest version, for Claude Desktop:",[2446,6111,6114],{"className":6112,"code":6113,"language":5926,"meta":67,"style":67},"language-json shiki shiki-themes github-light-default github-dark-default","{\n  \"mcpServers\": {\n    \"axiom\": {\n      \"command\": \"uv\",\n      \"args\": [\"run\", \"\u002Fabsolute\u002Fpath\u002Fto\u002Faxiom_mcp.py\"],\n      \"env\": { \"AXIOM_API_KEY\": \"your-api-key-here\" }\n    }\n  }\n}\n",[145,6115,6116,6121,6130,6137,6149,6168,6186,6190,6195],{"__ignoreMap":67},[1332,6117,6118],{"class":2455,"line":2131},[1332,6119,6120],{"class":2521},"{\n",[1332,6122,6123,6127],{"class":2455,"line":670},[1332,6124,6126],{"class":6125},"sjgCt","  \"mcpServers\"",[1332,6128,6129],{"class":2521},": {\n",[1332,6131,6132,6135],{"class":2455,"line":68},[1332,6133,6134],{"class":6125},"    \"axiom\"",[1332,6136,6129],{"class":2521},[1332,6138,6139,6142,6144,6147],{"class":2455,"line":1478},[1332,6140,6141],{"class":6125},"      \"command\"",[1332,6143,5260],{"class":2521},[1332,6145,6146],{"class":2462},"\"uv\"",[1332,6148,6024],{"class":2521},[1332,6150,6151,6154,6157,6160,6162,6165],{"class":2455,"line":293},[1332,6152,6153],{"class":6125},"      \"args\"",[1332,6155,6156],{"class":2521},": [",[1332,6158,6159],{"class":2462},"\"run\"",[1332,6161,4468],{"class":2521},[1332,6163,6164],{"class":2462},"\"\u002Fabsolute\u002Fpath\u002Fto\u002Faxiom_mcp.py\"",[1332,6166,6167],{"class":2521},"],\n",[1332,6169,6170,6173,6176,6178,6180,6183],{"class":2455,"line":2237},[1332,6171,6172],{"class":6125},"      \"env\"",[1332,6174,6175],{"class":2521},": { ",[1332,6177,5731],{"class":6125},[1332,6179,5260],{"class":2521},[1332,6181,6182],{"class":2462},"\"your-api-key-here\"",[1332,6184,6185],{"class":2521}," }\n",[1332,6187,6188],{"class":2455,"line":2623},[1332,6189,3810],{"class":2521},[1332,6191,6192],{"class":2455,"line":2637},[1332,6193,6194],{"class":2521},"  }\n",[1332,6196,6197],{"class":2455,"line":2642},[1332,6198,2802],{"class":2521},[26,6200,6201,6202,6205,6206,6209],{},"Restart the client. Your ",[145,6203,6204],{},"trigger_automation"," and ",[145,6207,6208],{},"run_status"," tools appear and the LLM can call them in conversation.",[107,6211,6213],{"id":6212},"step-4-extend-it","Step 4: extend it",[112,6215],{},[26,6217,6218],{},"The minimal server above is intentionally tiny. Real custom servers usually add:",[186,6220,6221,6229,6237,6251,6261],{},[189,6222,6223,6228],{},[192,6224,6225],{},[145,6226,6227],{},"stop_run"," to cancel misbehaving runs.",[189,6230,6231,6236],{},[192,6232,6233],{},[145,6234,6235],{},"remaining_runtime"," so the LLM can check quota before triggering expensive runs.",[189,6238,6239,6242,6243,6246,6247,6250],{},[192,6240,6241],{},"Domain-specific wrappers",", for example ",[145,6244,6245],{},"scrape_amazon_asin(asin: str)"," that internally calls ",[145,6248,6249],{},"trigger_automation(\"Amazon ASIN template\", data=[[[asin]]])"," and waits for completion. This is where the real value is, the LLM gets a clean, typed tool instead of having to learn each automation's input shape.",[189,6252,6253,6256,6257,6260],{},[192,6254,6255],{},"Polling and completion handling",", so the tool returns a finished result rather than a ",[145,6258,6259],{},"run_id"," the LLM has to poll itself.",[189,6262,6263,6266,6267,6269],{},[192,6264,6265],{},"Step-function tools",", mirroring the ",[659,6268,4576],{"href":4575}," if you want the LLM to drive a session step by step instead of just triggering pre-built automations.",[26,6271,6272],{},"A typical extended server is 100 to 200 lines and covers the most common workflows for the team using it.",[107,6274,6276],{"id":6275},"notes","Notes",[112,6278],{},[186,6280,6281,6291,6294],{},[189,6282,6283,6284,6286,6287,6290],{},"Treat your ",[145,6285,4713],{}," like any other secret. Don't commit the env value into the config you check into version control, use a secrets manager or a ",[145,6288,6289],{},".env"," file the client loads.",[189,6292,6293],{},"The server runs as a child process of the MCP client. If it crashes, the client restarts it on the next tool call, so transient errors are usually fine.",[189,6295,6296,6297,148],{},"For production, consider switching from stdio to streamable HTTP transport so the server can run remotely. See the ",[659,6298,6301],{"href":6299,"rel":6300},"https:\u002F\u002Fmodelcontextprotocol.io\u002Fdocs\u002Fdevelop\u002Fbuild-server",[1218],"Anthropic build-a-server guide",[2819,6303,6304],{},"html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}",{"title":67,"searchDepth":68,"depth":68,"links":6306},[6307,6308,6309,6310,6311,6312],{"id":5576,"depth":670,"text":5577},{"id":5605,"depth":670,"text":5606},{"id":5651,"depth":670,"text":5652},{"id":6098,"depth":670,"text":6099},{"id":6212,"depth":670,"text":6213},{"id":6275,"depth":670,"text":6276},"Build a minimal Model Context Protocol server in Python that exposes axiom.ai automation triggers as tools for any MCP client.",{"metaTitle":6315},"Build a Python MCP server that wraps the axiom.ai API","\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Fbuild-your-own-server-python",{"title":5568,"description":6313},"docs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Fbuild-your-own-server-python","7JbKttH-fEwHKrEGbpSYm6iqPTQXmIJKUE6rRMW6u6E",{"id":6321,"title":6322,"body":6323,"date":71,"description":7310,"extension":73,"meta":7311,"navigation":75,"order":68,"path":7313,"seo":7314,"stem":7315,"__hash__":7316},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Fbuild-your-own-typescript.md","Build your own server (TypeScript)",{"type":8,"value":6324,"toc":7300},[6325,6328,6330,6332,6334,6343,6345,6347,6364,6367,6369,6371,6385,7060,7062,7064,7068,7137,7143,7147,7149,7159,7184,7188,7190,7193,7226,7228,7230,7232,7270,7272,7274,7297],[26,6326,6327],{},"Build a small Node MCP server that wraps the axiom.ai REST API. Use this if your team is already on a Node stack and would rather extend an existing TypeScript codebase than maintain a Python one.",[107,6329,5577],{"id":5576},[112,6331],{},[26,6333,5582],{},[186,6335,6336,6339],{},[189,6337,6338],{},"Node 18 or later.",[189,6340,5600,6341,148],{},[659,6342,4211],{"href":4558},[107,6344,5606],{"id":5605},[112,6346],{},[2446,6348,6350],{"className":2448,"code":6349,"language":2450,"meta":67,"style":67},"npm install @modelcontextprotocol\u002Fsdk zod\n",[145,6351,6352],{"__ignoreMap":67},[1332,6353,6354,6356,6358,6361],{"class":2455,"line":2131},[1332,6355,2459],{"class":2458},[1332,6357,3288],{"class":2462},[1332,6359,6360],{"class":2462}," @modelcontextprotocol\u002Fsdk",[1332,6362,6363],{"class":2462}," zod\n",[26,6365,6366],{},"The SDK is dual-published as both ESM and CJS, so the same install works for either module style.",[107,6368,5652],{"id":5651},[112,6370],{},[26,6372,5657,6373,6376,6377,6380,6381,6384],{},[145,6374,6375],{},"axiom_mcp.cjs",". Using a ",[145,6378,6379],{},".cjs"," extension and dynamic ",[145,6382,6383],{},"import()"," keeps the file working across every Node 18+ runtime, regardless of how exports get resolved.",[2446,6386,6388],{"className":2962,"code":6387,"language":2964,"meta":67,"style":67},"const AXIOM_BASE = \"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\";\nconst KEY = process.env.AXIOM_API_KEY;\nif (!KEY) throw new Error(\"AXIOM_API_KEY env var is required\");\n\nasync function postJson(path, body) {\n  const res = await fetch(`${AXIOM_BASE}${path}`, {\n    method: \"POST\",\n    headers: { \"content-type\": \"application\u002Fjson\" },\n    body: JSON.stringify(body),\n  });\n  return res.json();\n}\n\n(async () => {\n  \u002F\u002F Dynamic import so this CJS file can consume the dual-published SDK.\n  const { McpServer } = await import(\"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fmcp.js\");\n  const { StdioServerTransport } = await import(\n    \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fstdio.js\"\n  );\n  const { z } = await import(\"zod\");\n\n  const server = new McpServer({ name: \"axiom\", version: \"0.1.0\" });\n\n  server.registerTool(\n    \"trigger_automation\",\n    {\n      description:\n        \"Trigger an axiom.ai cloud automation by exact name. Optional `data` is a 3-D array of [tables][rows][cells] passed as the automation's input.\",\n      inputSchema: {\n        name: z.string(),\n        data: z.array(z.array(z.array(z.string()))).optional(),\n      },\n    },\n    async ({ name, data }) => {\n      const body = { key: KEY, name, ...(data ? { data } : {}) };\n      const result = await postJson(\"\u002Ftrigger\", body);\n      return { content: [{ type: \"text\", text: JSON.stringify(result) }] };\n    },\n  );\n\n  server.registerTool(\n    \"run_status\",\n    {\n      description: \"Check the status of a triggered axiom.ai automation run.\",\n      inputSchema: { run_id: z.string() },\n    },\n    async ({ run_id }) => {\n      const result = await postJson(\"\u002Frun-data\", { key: KEY, run_id });\n      return { content: [{ type: \"text\", text: JSON.stringify(result) }] };\n    },\n  );\n\n  await server.connect(new StdioServerTransport());\n})();\n",[145,6389,6390,6404,6420,6448,6452,6474,6506,6516,6532,6548,6552,6564,6568,6572,6584,6589,6616,6635,6640,6645,6669,6673,6700,6704,6714,6721,6726,6731,6738,6743,6754,6783,6788,6793,6814,6850,6872,6896,6901,6906,6911,6920,6928,6933,6944,6955,6960,6975,7001,7020,7025,7030,7035,7055],{"__ignoreMap":67},[1332,6391,6392,6394,6397,6399,6402],{"class":2455,"line":2131},[1332,6393,2508],{"class":2507},[1332,6395,6396],{"class":2511}," AXIOM_BASE",[1332,6398,2515],{"class":2507},[1332,6400,6401],{"class":2462}," \"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\"",[1332,6403,4673],{"class":2521},[1332,6405,6406,6408,6411,6413,6416,6418],{"class":2455,"line":670},[1332,6407,2508],{"class":2507},[1332,6409,6410],{"class":2511}," KEY",[1332,6412,2515],{"class":2507},[1332,6414,6415],{"class":2521}," process.env.",[1332,6417,4713],{"class":2511},[1332,6419,4673],{"class":2521},[1332,6421,6422,6424,6426,6429,6431,6433,6436,6438,6441,6443,6446],{"class":2455,"line":68},[1332,6423,6072],{"class":2507},[1332,6425,3842],{"class":2521},[1332,6427,6428],{"class":2507},"!",[1332,6430,5723],{"class":2511},[1332,6432,2709],{"class":2521},[1332,6434,6435],{"class":2507},"throw",[1332,6437,2697],{"class":2507},[1332,6439,6440],{"class":2525}," Error",[1332,6442,1213],{"class":2521},[1332,6444,6445],{"class":2462},"\"AXIOM_API_KEY env var is required\"",[1332,6447,2583],{"class":2521},[1332,6449,6450],{"class":2455,"line":1478},[1332,6451,2588],{"emptyLinePlaceholder":75},[1332,6453,6454,6456,6459,6462,6464,6466,6468,6471],{"class":2455,"line":293},[1332,6455,3332],{"class":2507},[1332,6457,6458],{"class":2507}," function",[1332,6460,6461],{"class":2525}," postJson",[1332,6463,1213],{"class":2521},[1332,6465,5182],{"class":2458},[1332,6467,4468],{"class":2521},[1332,6469,6470],{"class":2458},"body",[1332,6472,6473],{"class":2521},") {\n",[1332,6475,6476,6478,6481,6483,6485,6488,6490,6493,6495,6498,6500,6503],{"class":2455,"line":2237},[1332,6477,3344],{"class":2507},[1332,6479,6480],{"class":2511}," res",[1332,6482,2515],{"class":2507},[1332,6484,2518],{"class":2507},[1332,6486,6487],{"class":2525}," fetch",[1332,6489,1213],{"class":2521},[1332,6491,6492],{"class":2462},"`${",[1332,6494,5713],{"class":2511},[1332,6496,6497],{"class":2462},"}${",[1332,6499,5182],{"class":2521},[1332,6501,6502],{"class":2462},"}`",[1332,6504,6505],{"class":2521},", {\n",[1332,6507,6508,6511,6514],{"class":2455,"line":2623},[1332,6509,6510],{"class":2521},"    method: ",[1332,6512,6513],{"class":2462},"\"POST\"",[1332,6515,6024],{"class":2521},[1332,6517,6518,6521,6524,6526,6529],{"class":2455,"line":2637},[1332,6519,6520],{"class":2521},"    headers: { ",[1332,6522,6523],{"class":2462},"\"content-type\"",[1332,6525,5260],{"class":2521},[1332,6527,6528],{"class":2462},"\"application\u002Fjson\"",[1332,6530,6531],{"class":2521}," },\n",[1332,6533,6534,6537,6540,6542,6545],{"class":2455,"line":2642},[1332,6535,6536],{"class":2521},"    body: ",[1332,6538,6539],{"class":2511},"JSON",[1332,6541,148],{"class":2521},[1332,6543,6544],{"class":2525},"stringify",[1332,6546,6547],{"class":2521},"(body),\n",[1332,6549,6550],{"class":2455,"line":2651},[1332,6551,3368],{"class":2521},[1332,6553,6554,6557,6560,6562],{"class":2455,"line":2673},[1332,6555,6556],{"class":2507},"  return",[1332,6558,6559],{"class":2521}," res.",[1332,6561,5926],{"class":2525},[1332,6563,2670],{"class":2521},[1332,6565,6566],{"class":2455,"line":2692},[1332,6567,2802],{"class":2521},[1332,6569,6570],{"class":2455,"line":2727},[1332,6571,2588],{"emptyLinePlaceholder":75},[1332,6573,6574,6576,6578,6580,6582],{"class":2455,"line":2739},[1332,6575,1213],{"class":2521},[1332,6577,3332],{"class":2507},[1332,6579,3335],{"class":2521},[1332,6581,2712],{"class":2507},[1332,6583,2648],{"class":2521},[1332,6585,6586],{"class":2455,"line":2750},[1332,6587,6588],{"class":2609},"  \u002F\u002F Dynamic import so this CJS file can consume the dual-published SDK.\n",[1332,6590,6591,6593,6596,6599,6602,6604,6606,6609,6611,6614],{"class":2455,"line":2765},[1332,6592,3344],{"class":2507},[1332,6594,6595],{"class":2521}," { ",[1332,6597,6598],{"class":2511},"McpServer",[1332,6600,6601],{"class":2521}," } ",[1332,6603,5110],{"class":2507},[1332,6605,2518],{"class":2507},[1332,6607,6608],{"class":2507}," import",[1332,6610,1213],{"class":2521},[1332,6612,6613],{"class":2462},"\"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fmcp.js\"",[1332,6615,2583],{"class":2521},[1332,6617,6618,6620,6622,6625,6627,6629,6631,6633],{"class":2455,"line":2777},[1332,6619,3344],{"class":2507},[1332,6621,6595],{"class":2521},[1332,6623,6624],{"class":2511},"StdioServerTransport",[1332,6626,6601],{"class":2521},[1332,6628,5110],{"class":2507},[1332,6630,2518],{"class":2507},[1332,6632,6608],{"class":2525},[1332,6634,4878],{"class":2521},[1332,6636,6637],{"class":2455,"line":2788},[1332,6638,6639],{"class":2462},"    \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fstdio.js\"\n",[1332,6641,6642],{"class":2455,"line":2799},[1332,6643,6644],{"class":2521},"  );\n",[1332,6646,6647,6649,6651,6654,6656,6658,6660,6662,6664,6667],{"class":2455,"line":3751},[1332,6648,3344],{"class":2507},[1332,6650,6595],{"class":2521},[1332,6652,6653],{"class":2511},"z",[1332,6655,6601],{"class":2521},[1332,6657,5110],{"class":2507},[1332,6659,2518],{"class":2507},[1332,6661,6608],{"class":2507},[1332,6663,1213],{"class":2521},[1332,6665,6666],{"class":2462},"\"zod\"",[1332,6668,2583],{"class":2521},[1332,6670,6671],{"class":2455,"line":3762},[1332,6672,2588],{"emptyLinePlaceholder":75},[1332,6674,6675,6677,6680,6682,6684,6687,6690,6692,6695,6698],{"class":2455,"line":3777},[1332,6676,3344],{"class":2507},[1332,6678,6679],{"class":2511}," server",[1332,6681,2515],{"class":2507},[1332,6683,2697],{"class":2507},[1332,6685,6686],{"class":2525}," McpServer",[1332,6688,6689],{"class":2521},"({ name: ",[1332,6691,5706],{"class":2462},[1332,6693,6694],{"class":2521},", version: ",[1332,6696,6697],{"class":2462},"\"0.1.0\"",[1332,6699,3040],{"class":2521},[1332,6701,6702],{"class":2455,"line":3787},[1332,6703,2588],{"emptyLinePlaceholder":75},[1332,6705,6706,6709,6712],{"class":2455,"line":3796},[1332,6707,6708],{"class":2521},"  server.",[1332,6710,6711],{"class":2525},"registerTool",[1332,6713,4878],{"class":2521},[1332,6715,6716,6719],{"class":2455,"line":3807},[1332,6717,6718],{"class":2462},"    \"trigger_automation\"",[1332,6720,6024],{"class":2521},[1332,6722,6723],{"class":2455,"line":3813},[1332,6724,6725],{"class":2521},"    {\n",[1332,6727,6728],{"class":2455,"line":3819},[1332,6729,6730],{"class":2521},"      description:\n",[1332,6732,6733,6736],{"class":2455,"line":3824},[1332,6734,6735],{"class":2462},"        \"Trigger an axiom.ai cloud automation by exact name. Optional `data` is a 3-D array of [tables][rows][cells] passed as the automation's input.\"",[1332,6737,6024],{"class":2521},[1332,6739,6740],{"class":2455,"line":6027},[1332,6741,6742],{"class":2521},"      inputSchema: {\n",[1332,6744,6745,6748,6751],{"class":2455,"line":6051},[1332,6746,6747],{"class":2521},"        name: z.",[1332,6749,6750],{"class":2525},"string",[1332,6752,6753],{"class":2521},"(),\n",[1332,6755,6756,6759,6762,6765,6767,6769,6771,6773,6775,6778,6781],{"class":2455,"line":6057},[1332,6757,6758],{"class":2521},"        data: z.",[1332,6760,6761],{"class":2525},"array",[1332,6763,6764],{"class":2521},"(z.",[1332,6766,6761],{"class":2525},[1332,6768,6764],{"class":2521},[1332,6770,6761],{"class":2525},[1332,6772,6764],{"class":2521},[1332,6774,6750],{"class":2525},[1332,6776,6777],{"class":2521},"()))).",[1332,6779,6780],{"class":2525},"optional",[1332,6782,6753],{"class":2521},[1332,6784,6785],{"class":2455,"line":6064},[1332,6786,6787],{"class":2521},"      },\n",[1332,6789,6790],{"class":2455,"line":6069},[1332,6791,6792],{"class":2521},"    },\n",[1332,6794,6795,6797,6800,6803,6805,6807,6810,6812],{"class":2455,"line":6086},[1332,6796,5873],{"class":2507},[1332,6798,6799],{"class":2521}," ({ ",[1332,6801,6802],{"class":2458},"name",[1332,6804,4468],{"class":2521},[1332,6806,580],{"class":2458},[1332,6808,6809],{"class":2521}," }) ",[1332,6811,2712],{"class":2507},[1332,6813,2648],{"class":2521},[1332,6815,6817,6820,6823,6825,6828,6830,6833,6836,6839,6842,6845,6847],{"class":2455,"line":6816},35,[1332,6818,6819],{"class":2507},"      const",[1332,6821,6822],{"class":2511}," body",[1332,6824,2515],{"class":2507},[1332,6826,6827],{"class":2521}," { key: ",[1332,6829,5723],{"class":2511},[1332,6831,6832],{"class":2521},", name, ",[1332,6834,6835],{"class":2507},"...",[1332,6837,6838],{"class":2521},"(data ",[1332,6840,6841],{"class":2507},"?",[1332,6843,6844],{"class":2521}," { data } ",[1332,6846,3297],{"class":2507},[1332,6848,6849],{"class":2521}," {}) };\n",[1332,6851,6853,6855,6858,6860,6862,6864,6866,6869],{"class":2455,"line":6852},36,[1332,6854,6819],{"class":2507},[1332,6856,6857],{"class":2511}," result",[1332,6859,2515],{"class":2507},[1332,6861,2518],{"class":2507},[1332,6863,6461],{"class":2525},[1332,6865,1213],{"class":2521},[1332,6867,6868],{"class":2462},"\"\u002Ftrigger\"",[1332,6870,6871],{"class":2521},", body);\n",[1332,6873,6875,6878,6881,6884,6887,6889,6891,6893],{"class":2455,"line":6874},37,[1332,6876,6877],{"class":2507},"      return",[1332,6879,6880],{"class":2521}," { content: [{ type: ",[1332,6882,6883],{"class":2462},"\"text\"",[1332,6885,6886],{"class":2521},", text: ",[1332,6888,6539],{"class":2511},[1332,6890,148],{"class":2521},[1332,6892,6544],{"class":2525},[1332,6894,6895],{"class":2521},"(result) }] };\n",[1332,6897,6899],{"class":2455,"line":6898},38,[1332,6900,6792],{"class":2521},[1332,6902,6904],{"class":2455,"line":6903},39,[1332,6905,6644],{"class":2521},[1332,6907,6909],{"class":2455,"line":6908},40,[1332,6910,2588],{"emptyLinePlaceholder":75},[1332,6912,6914,6916,6918],{"class":2455,"line":6913},41,[1332,6915,6708],{"class":2521},[1332,6917,6711],{"class":2525},[1332,6919,4878],{"class":2521},[1332,6921,6923,6926],{"class":2455,"line":6922},42,[1332,6924,6925],{"class":2462},"    \"run_status\"",[1332,6927,6024],{"class":2521},[1332,6929,6931],{"class":2455,"line":6930},43,[1332,6932,6725],{"class":2521},[1332,6934,6936,6939,6942],{"class":2455,"line":6935},44,[1332,6937,6938],{"class":2521},"      description: ",[1332,6940,6941],{"class":2462},"\"Check the status of a triggered axiom.ai automation run.\"",[1332,6943,6024],{"class":2521},[1332,6945,6947,6950,6952],{"class":2455,"line":6946},45,[1332,6948,6949],{"class":2521},"      inputSchema: { run_id: z.",[1332,6951,6750],{"class":2525},[1332,6953,6954],{"class":2521},"() },\n",[1332,6956,6958],{"class":2455,"line":6957},46,[1332,6959,6792],{"class":2521},[1332,6961,6963,6965,6967,6969,6971,6973],{"class":2455,"line":6962},47,[1332,6964,5873],{"class":2507},[1332,6966,6799],{"class":2521},[1332,6968,6259],{"class":2458},[1332,6970,6809],{"class":2521},[1332,6972,2712],{"class":2507},[1332,6974,2648],{"class":2521},[1332,6976,6978,6980,6982,6984,6986,6988,6990,6993,6996,6998],{"class":2455,"line":6977},48,[1332,6979,6819],{"class":2507},[1332,6981,6857],{"class":2511},[1332,6983,2515],{"class":2507},[1332,6985,2518],{"class":2507},[1332,6987,6461],{"class":2525},[1332,6989,1213],{"class":2521},[1332,6991,6992],{"class":2462},"\"\u002Frun-data\"",[1332,6994,6995],{"class":2521},", { key: ",[1332,6997,5723],{"class":2511},[1332,6999,7000],{"class":2521},", run_id });\n",[1332,7002,7004,7006,7008,7010,7012,7014,7016,7018],{"class":2455,"line":7003},49,[1332,7005,6877],{"class":2507},[1332,7007,6880],{"class":2521},[1332,7009,6883],{"class":2462},[1332,7011,6886],{"class":2521},[1332,7013,6539],{"class":2511},[1332,7015,148],{"class":2521},[1332,7017,6544],{"class":2525},[1332,7019,6895],{"class":2521},[1332,7021,7023],{"class":2455,"line":7022},50,[1332,7024,6792],{"class":2521},[1332,7026,7028],{"class":2455,"line":7027},51,[1332,7029,6644],{"class":2521},[1332,7031,7033],{"class":2455,"line":7032},52,[1332,7034,2588],{"emptyLinePlaceholder":75},[1332,7036,7038,7040,7043,7045,7047,7050,7053],{"class":2455,"line":7037},53,[1332,7039,3389],{"class":2507},[1332,7041,7042],{"class":2521}," server.",[1332,7044,2526],{"class":2525},[1332,7046,1213],{"class":2521},[1332,7048,7049],{"class":2507},"new",[1332,7051,7052],{"class":2525}," StdioServerTransport",[1332,7054,3419],{"class":2521},[1332,7056,7058],{"class":2455,"line":7057},54,[1332,7059,3434],{"class":2521},[107,7061,6099],{"id":6098},[112,7063],{},[26,7065,6104,7066,6109],{},[659,7067,6108],{"href":6107},[2446,7069,7071],{"className":6112,"code":7070,"language":5926,"meta":67,"style":67},"{\n  \"mcpServers\": {\n    \"axiom\": {\n      \"command\": \"node\",\n      \"args\": [\"\u002Fabsolute\u002Fpath\u002Fto\u002Faxiom_mcp.cjs\"],\n      \"env\": { \"AXIOM_API_KEY\": \"your-api-key-here\" }\n    }\n  }\n}\n",[145,7072,7073,7077,7083,7089,7100,7111,7125,7129,7133],{"__ignoreMap":67},[1332,7074,7075],{"class":2455,"line":2131},[1332,7076,6120],{"class":2521},[1332,7078,7079,7081],{"class":2455,"line":670},[1332,7080,6126],{"class":6125},[1332,7082,6129],{"class":2521},[1332,7084,7085,7087],{"class":2455,"line":68},[1332,7086,6134],{"class":6125},[1332,7088,6129],{"class":2521},[1332,7090,7091,7093,7095,7098],{"class":2455,"line":1478},[1332,7092,6141],{"class":6125},[1332,7094,5260],{"class":2521},[1332,7096,7097],{"class":2462},"\"node\"",[1332,7099,6024],{"class":2521},[1332,7101,7102,7104,7106,7109],{"class":2455,"line":293},[1332,7103,6153],{"class":6125},[1332,7105,6156],{"class":2521},[1332,7107,7108],{"class":2462},"\"\u002Fabsolute\u002Fpath\u002Fto\u002Faxiom_mcp.cjs\"",[1332,7110,6167],{"class":2521},[1332,7112,7113,7115,7117,7119,7121,7123],{"class":2455,"line":2237},[1332,7114,6172],{"class":6125},[1332,7116,6175],{"class":2521},[1332,7118,5731],{"class":6125},[1332,7120,5260],{"class":2521},[1332,7122,6182],{"class":2462},[1332,7124,6185],{"class":2521},[1332,7126,7127],{"class":2455,"line":2623},[1332,7128,3810],{"class":2521},[1332,7130,7131],{"class":2455,"line":2637},[1332,7132,6194],{"class":2521},[1332,7134,7135],{"class":2455,"line":2642},[1332,7136,2802],{"class":2521},[26,7138,6201,7139,6205,7141,6209],{},[145,7140,6204],{},[145,7142,6208],{},[107,7144,7146],{"id":7145},"why-the-dynamic-import","Why the dynamic import",[112,7148],{},[26,7150,7151,7152,7155,7156,7158],{},"The MCP SDK ships ESM as primary with a CJS build alongside. A top-level ",[145,7153,7154],{},"require(\"@modelcontextprotocol\u002Fsdk\u002F...\")"," works in some Node versions and breaks in others depending on how exports are resolved. A top-level ",[145,7157,4661],{}," forces the file to be ESM and is fine if your project is ESM, but breaks in CJS projects.",[26,7160,7161,7162,7165,7166,7168,7169,7172,7173,7176,7177,7180,7181,7183],{},"Using ",[145,7163,7164],{},"await import()"," from a ",[145,7167,6379],{}," file (or a ",[145,7170,7171],{},".js"," file with ",[145,7174,7175],{},"\"type\": \"commonjs\""," in ",[145,7178,7179],{},"package.json",") sidesteps the whole issue and works on every Node 18+ runtime. If your project is ESM, you can use top-level ",[145,7182,4661],{}," instead and drop the dynamic loader.",[107,7185,7187],{"id":7186},"audit-the-sdk-before-pinning","Audit the SDK before pinning",[112,7189],{},[26,7191,7192],{},"Worth a five-minute check for anything you're shipping to users:",[186,7194,7195,7204,7216,7223],{},[189,7196,7197,7198,7203],{},"Source: ",[659,7199,7202],{"href":7200,"rel":7201},"https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Ftypescript-sdk",[1218],"github.com\u002Fmodelcontextprotocol\u002Ftypescript-sdk",", MIT-licensed, published by Anthropic.",[189,7205,7206,7207,2344,7209,7212,7213,3696],{},"No ",[145,7208,1488],{},[145,7210,7211],{},"postinstall"," scripts (verify with ",[145,7214,7215],{},"npm view @modelcontextprotocol\u002Fsdk@\u003Cversion> scripts",[189,7217,7218,7219,7222],{},"Has SLSA provenance attestations on recent releases (verify with ",[145,7220,7221],{},"npm audit signatures"," or the npm web UI).",[189,7224,7225],{},"Pin to an exact reviewed version in your lockfile rather than floating, re-audit when bumping.",[107,7227,6213],{"id":6212},[112,7229],{},[26,7231,6218],{},[186,7233,7234,7240,7246,7256,7263],{},[189,7235,7236,6228],{},[192,7237,7238],{},[145,7239,6227],{},[189,7241,7242,6236],{},[192,7243,7244],{},[145,7245,6235],{},[189,7247,7248,6242,7250,6246,7253,7255],{},[192,7249,6241],{},[145,7251,7252],{},"scrape_amazon_asin(asin)",[145,7254,6204],{}," and waits for completion. The LLM gets a clean, typed tool instead of having to learn each automation's input shape.",[189,7257,7258,7260,7261,6260],{},[192,7259,6255],{}," so the tool returns a finished result rather than a ",[145,7262,6259],{},[189,7264,7265,6266,7267,7269],{},[192,7266,6265],{},[659,7268,4576],{"href":4575}," if you want the LLM to drive a session step by step.",[107,7271,6276],{"id":6275},[112,7273],{},[186,7275,7276,7281,7292],{},[189,7277,6283,7278,7280],{},[145,7279,4713],{}," like any other secret. Don't commit it to source control.",[189,7282,7283,7284,7287,7288,7291],{},"The server runs as a child process of the MCP client, so its stdout is the protocol channel. Don't ",[145,7285,7286],{},"console.log"," debug messages, write them to a file or use ",[145,7289,7290],{},"console.error"," (stderr is safe).",[189,7293,6296,7294,148],{},[659,7295,6301],{"href":6299,"rel":7296},[1218],[2819,7298,7299],{},"html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}",{"title":67,"searchDepth":68,"depth":68,"links":7301},[7302,7303,7304,7305,7306,7307,7308,7309],{"id":5576,"depth":670,"text":5577},{"id":5605,"depth":670,"text":5606},{"id":5651,"depth":670,"text":5652},{"id":6098,"depth":670,"text":6099},{"id":7145,"depth":670,"text":7146},{"id":7186,"depth":670,"text":7187},{"id":6212,"depth":670,"text":6213},{"id":6275,"depth":670,"text":6276},"Build a minimal Model Context Protocol server in Node and TypeScript that exposes axiom.ai automation triggers as tools for any MCP client.",{"metaTitle":7312},"Build a TypeScript MCP server that wraps the axiom.ai API","\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Fbuild-your-own-typescript",{"title":6322,"description":7310},"docs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Fbuild-your-own-typescript","yp7HFPno1lfYHXoidRFU7rDw15OHIujGC5ndT-gsKXU",{"id":7318,"title":7319,"body":7320,"date":71,"description":7626,"extension":73,"meta":7627,"navigation":75,"order":2131,"path":7629,"seo":7630,"stem":7631,"__hash__":7632},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Fdesktop-app-server.md","Desktop app MCP server",{"type":8,"value":7321,"toc":7617},[7322,7325,7332,7336,7338,7341,7394,7397,7399,7401,7403,7439,7443,7445,7476,7483,7487,7489,7492,7527,7530,7534,7536,7539,7545,7551,7557,7566,7570,7572,7580,7587,7589,7591],[26,7323,7324],{},"The axiom.ai desktop app ships with a built-in MCP server. Once it's switched on, any MCP-aware LLM client running on the same machine can call your axiom.ai API: trigger automations, drive a cloud browser through step functions, check remaining runtime, and stop runs. The server speaks the standard Model Context Protocol, so Claude Desktop, Claude Code, Cursor, and every other MCP-compatible client work with it out of the box.",[26,7326,7327,7328,7331],{},"This is the easiest way to put axiom.ai inside an LLM. Skip ahead to ",[659,7329,5577],{"href":7330},"#before-you-begin"," to enable it.",[107,7333,7335],{"id":7334},"what-it-gives-you","What it gives you",[112,7337],{},[26,7339,7340],{},"With the desktop app's MCP server enabled, an LLM client can:",[186,7342,7343,7354,7360,7372,7382,7388],{},[189,7344,7345,7348,7349,7353],{},[192,7346,7347],{},"Trigger automations by name."," Ask Claude to run \"Scrape today's leads\", and it calls ",[659,7350,7351],{"href":4527},[145,7352,4467],{}," under the hood.",[189,7355,7356,7359],{},[192,7357,7358],{},"Pass input data."," The LLM can format rows of input and send them in the same call.",[189,7361,7362,7365,7366,7371],{},[192,7363,7364],{},"Check run status."," The LLM polls ",[659,7367,7369],{"href":7368},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Fcheck-run-status",[145,7370,4474],{}," and reports back when the run finishes.",[189,7373,7374,7377,7378,7381],{},[192,7375,7376],{},"Drive a cloud browser step by step."," The LLM can call ",[659,7379,7380],{"href":4575},"step functions"," (goto, click, enterText, scrape, wait) directly, choosing each action based on what the previous one returned.",[189,7383,7384,7387],{},[192,7385,7386],{},"Read remaining runtime"," before kicking off expensive runs.",[189,7389,7390,7393],{},[192,7391,7392],{},"Stop runs"," if a conversation needs to abort one early.",[26,7395,7396],{},"No CLI, no SDK installation, no MCP server to write yourself. The desktop app handles the protocol; the LLM handles the conversation.",[107,7398,5577],{"id":5576},[112,7400],{},[26,7402,5582],{},[186,7404,7405,7417,7427],{},[189,7406,7407,7408,7411,7412,7416],{},"A ",[192,7409,7410],{},"paid axiom.ai account",". API access is gated to paid plans. See the ",[659,7413,7415],{"href":7414},"\u002Fpricing","pricing page"," for plans that include the API.",[189,7418,2273,7419,7422,7423,148],{},[192,7420,7421],{},"axiom.ai desktop app",", installed and running on the same machine as your LLM client. Download from the ",[659,7424,7426],{"href":7425},"\u002Finstall-desktop-app","desktop app page",[189,7428,7429,7430,7433,7434,7436,7437,148],{},"An ",[192,7431,7432],{},"axiom.ai API key",", generated from the ",[192,7435,2836],{},". See ",[659,7438,4211],{"href":4558},[107,7440,7442],{"id":7441},"enable-the-mcp-server","Enable the MCP server",[112,7444],{},[1923,7446,7447,7451,7457,7463,7469],{},[189,7448,4245,7449,148],{},[192,7450,7421],{},[189,7452,4245,7453,7456],{},[192,7454,7455],{},"Claude MCP server"," panel from the desktop app's settings.",[189,7458,7459,7460,148],{},"Toggle the server ",[192,7461,7462],{},"on",[189,7464,7465,7466,7468],{},"Paste your axiom.ai API key into the ",[145,7467,4175],{}," field. The key is stored locally on your machine; the desktop app never sends it anywhere else.",[189,7470,7471,7472,7475],{},"Confirm the panel reads ",[192,7473,7474],{},"Connected",". Claude (or another MCP client) can now reach the server.",[26,7477,7478,7479,7482],{},"To rotate the key later, click ",[192,7480,7481],{},"Remove and reset"," and paste a new key. To turn the server off entirely, toggle it back off.",[107,7484,7486],{"id":7485},"use-it-from-your-llm-client","Use it from your LLM client",[112,7488],{},[26,7490,7491],{},"The built-in server speaks standard MCP, so any MCP-aware client can talk to it. The most common clients today:",[186,7493,7494,7505,7515,7521],{},[189,7495,7496,7499,7500,7504],{},[192,7497,7498],{},"Claude Desktop."," Anthropic's official desktop app for the Claude chat experience. Once the axiom.ai desktop app's MCP server is on, Claude Desktop discovers it as a tool source. See ",[659,7501,7503],{"href":7502},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Fregister-with-claude","Register with Claude"," for the connection details.",[189,7506,7507,7510,7511,7514],{},[192,7508,7509],{},"Claude Code."," Anthropic's terminal-native coding agent. Run ",[145,7512,7513],{},"claude"," in a project and the agent picks up the MCP server automatically.",[189,7516,7517,7520],{},[192,7518,7519],{},"Cursor."," Cursor's chat panel speaks MCP and treats the axiom.ai server like any other tool source.",[189,7522,7523,7526],{},[192,7524,7525],{},"Any other MCP client."," The protocol is open, so Cline, Cowork, Continue, Zed's AI panel, and others all work the same way.",[26,7528,7529],{},"You don't need to install anything client-side beyond the LLM client itself. Once both the axiom.ai desktop app and the LLM client are running, the LLM can see and call axiom.ai tools.",[107,7531,7533],{"id":7532},"example-conversations","Example conversations",[112,7535],{},[26,7537,7538],{},"A few prompts to try once the server is enabled:",[2446,7540,7543],{"className":7541,"code":7542,"language":5402},[5400],"\"Run my 'Daily competitor prices' automation and tell me when it's done.\"\n",[145,7544,7542],{"__ignoreMap":67},[2446,7546,7549],{"className":7547,"code":7548,"language":5402},[5400],"\"Open a browser session, go to news.ycombinator.com, scrape the front-page titles, and summarise the top three.\"\n",[145,7550,7548],{"__ignoreMap":67},[2446,7552,7555],{"className":7553,"code":7554,"language":5402},[5400],"\"How much axiom runtime do I have left this month?\"\n",[145,7556,7554],{"__ignoreMap":67},[26,7558,7559,7560,7562,7563,7565],{},"Claude picks the right MCP tool for each task: ",[145,7561,4467],{}," for the first, a sequence of step functions for the second, and ",[145,7564,4480],{}," for the third.",[107,7567,7569],{"id":7568},"whats-under-the-hood","What's under the hood",[112,7571],{},[26,7573,7574,7575,7579],{},"The built-in server is implemented with Anthropic's official ",[659,7576,7578],{"href":7200,"rel":7577},[1218],"TypeScript MCP SDK"," and embedded in the axiom.ai desktop app. The same SDK powers Claude Desktop's own tool integrations, so the server behaves identically to any other MCP server an LLM might encounter.",[26,7581,7582,7583,7586],{},"If you want to extend or customise the tool surface, see ",[659,7584,7585],{"href":7313},"Build your own (TypeScript)"," for a standalone server you can fork. The built-in server is the recommended path for almost everyone; the build-your-own pages exist for edge cases (headless servers, non-Anthropic SDKs, custom tool wrappers).",[107,7588,6276],{"id":6275},[112,7590],{},[186,7592,7593,7596,7611,7614],{},[189,7594,7595],{},"The MCP server only runs while the axiom.ai desktop app is open. Quitting the app stops the server.",[189,7597,7598,7599,6205,7603,7606,7607,7610],{},"Each API call from the LLM counts against the standard ",[659,7600,7602],{"href":7601},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fusage-and-limits\u002Frate-limits","rate limits",[659,7604,7605],{"href":4539},"runtime allowance",". LLMs that poll aggressively can trip rate limits; if you see ",[145,7608,7609],{},"429"," errors in the desktop app logs, tell the LLM to slow down.",[189,7612,7613],{},"The MCP server is local-only. It listens on a port on your machine and isn't reachable from the public internet.",[189,7615,7616],{},"API keys are stored in the desktop app's encrypted local config, not in plaintext on disk.",{"title":67,"searchDepth":68,"depth":68,"links":7618},[7619,7620,7621,7622,7623,7624,7625],{"id":7334,"depth":670,"text":7335},{"id":5576,"depth":670,"text":5577},{"id":7441,"depth":670,"text":7442},{"id":7485,"depth":670,"text":7486},{"id":7532,"depth":670,"text":7533},{"id":7568,"depth":670,"text":7569},{"id":6275,"depth":670,"text":6276},"The axiom.ai desktop app ships with a built-in MCP server. Toggle it on, paste your API key, and Claude Desktop, Claude Code, Cursor, or any MCP client can trigger axiom.ai automations and step functions in conversation.",{"metaTitle":7628},"Use the axiom.ai desktop app's built-in Claude MCP server","\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Fdesktop-app-server",{"title":7319,"description":7626},"docs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Fdesktop-app-server","NjQHScVK4xIFNvmHIJa7hXuI2ntisTYgnCH6llH4CaU",{"id":7634,"title":7635,"body":7636,"date":71,"description":7745,"extension":73,"meta":7746,"navigation":75,"order":2623,"path":5379,"seo":7748,"stem":7749,"__hash__":7750},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Findex.md","MCP",{"type":8,"value":7637,"toc":7737},[7638,7641,7645,7647,7651,7656,7659,7663,7671,7675,7677,7680,7722,7726,7728,7730],[26,7639,7640],{},"The Model Context Protocol (MCP) is an open standard from Anthropic that lets LLM clients call external tools. With an MCP server in front of the axiom.ai API, Claude Desktop, Claude Code, Cursor, or any other MCP-aware client can trigger your automations and drive cloud browsers in conversation.",[107,7642,7644],{"id":7643},"two-ways-to-set-this-up","Two ways to set this up",[112,7646],{},[21,7648,7650],{"id":7649},"_1-the-built-in-desktop-app-server-recommended","1. The built-in desktop app server (recommended)",[26,7652,2273,7653,7655],{},[659,7654,7421],{"href":7629}," ships with a Claude MCP server. Toggle it on, paste your API key, and any MCP client on your machine (Claude Desktop, Claude Code, Cursor, and others) can immediately trigger automations and call step functions. No code, no setup, no server to maintain.",[26,7657,7658],{},"This is the right path for almost everyone. You'll need a paid axiom.ai account to generate the API key.",[21,7660,7662],{"id":7661},"_2-build-your-own-server","2. Build your own server",[26,7664,7665,7666,6205,7668,7670],{},"If the built-in server doesn't fit (you want a headless server, a custom tool surface, a different SDK, or you're not running the desktop app), wrap the axiom.ai API yourself. The minimal version is around 30 lines. The pages below walk through ",[145,7667,4467],{},[145,7669,4474],{}," wrappers in Python and TypeScript, then how to register the result with the major MCP clients.",[107,7672,7674],{"id":7673},"anthropics-mcp-resources","Anthropic's MCP resources",[112,7676],{},[26,7678,7679],{},"Useful reading regardless of which path you take. The protocol overview, capability model, and SDK quickstarts will save debugging time later.",[186,7681,7682,7689,7695,7701,7708,7714],{},[189,7683,7684],{},[659,7685,7688],{"href":7686,"rel":7687},"https:\u002F\u002Fmodelcontextprotocol.io",[1218],"Spec and docs",[189,7690,7691],{},[659,7692,7694],{"href":6299,"rel":7693},[1218],"Build a server guide",[189,7696,7697],{},[659,7698,1495],{"href":7699,"rel":7700},"https:\u002F\u002Fmodelcontextprotocol.io\u002Fquickstart",[1218],[189,7702,7703],{},[659,7704,7707],{"href":7705,"rel":7706},"https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fpython-sdk",[1218],"Python SDK",[189,7709,7710],{},[659,7711,7713],{"href":7200,"rel":7712},[1218],"TypeScript SDK",[189,7715,7716,7721],{},[659,7717,7720],{"href":7718,"rel":7719},"https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers",[1218],"Reference servers"," (good templates to clone)",[107,7723,7725],{"id":7724},"in-this-section","In this section",[112,7727],{},[2218,7729],{":by-order":1548},[26,7731,2222,7732,2226,7734,148],{},[659,7733,2225],{"href":1887},[659,7735,2231],{"href":2229,"rel":7736},[1218],{"title":67,"searchDepth":68,"depth":68,"links":7738},[7739,7743,7744],{"id":7643,"depth":670,"text":7644,"children":7740},[7741,7742],{"id":7649,"depth":68,"text":7650},{"id":7661,"depth":68,"text":7662},{"id":7673,"depth":670,"text":7674},{"id":7724,"depth":670,"text":7725},"Drive axiom.ai from Claude, Cursor, or any MCP client. The axiom.ai desktop app ships with a built-in MCP server; alternatively, build your own in Python or TypeScript.",{"metaTitle":7747},"Use axiom.ai with Claude and other MCP clients",{"title":7635,"description":7745},"docs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Findex","bB05_NrAxkIPncQmi2je0r_HhAlx9ratq0hSDSB7MRQ",{"id":7752,"title":6108,"body":7753,"date":71,"description":8253,"extension":73,"meta":8254,"navigation":75,"order":1478,"path":7502,"seo":8256,"stem":8257,"__hash__":8258},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Fregister-with-claude.md",{"type":8,"value":7754,"toc":8244},[7755,7766,7770,7772,7779,7813,7816,7886,7889,7955,7958,7962,7964,7971,8037,8040,8044,8046,8053,8119,8122,8126,8128,8131,8148,8151,8155,8157,8160,8165,8173,8196,8200,8202,8205,8222,8224,8226,8241],[26,7756,7757,7758,2344,7761,7765],{},"Once you've built an MCP server (in ",[659,7759,7760],{"href":6316},"Python",[659,7762,7764],{"href":7763},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Fbuild-your-own-server-typescript","TypeScript","), point your MCP client at it. The configuration is similar across clients but the file location and field names differ. This page shows the snippet for each.",[107,7767,7769],{"id":7768},"claude-desktop","Claude Desktop",[112,7771],{},[26,7773,7774,7775,7778],{},"Edit the ",[145,7776,7777],{},"claude_desktop_config.json"," file in the platform-specific location:",[4589,7780,7781,7791],{},[4592,7782,7783],{},[4595,7784,7785,7788],{},[4598,7786,7787],{},"Platform",[4598,7789,7790],{},"Path",[4605,7792,7793,7803],{},[4595,7794,7795,7798],{},[4610,7796,7797],{},"macOS",[4610,7799,7800],{},[145,7801,7802],{},"~\u002FLibrary\u002FApplication Support\u002FClaude\u002Fclaude_desktop_config.json",[4595,7804,7805,7808],{},[4610,7806,7807],{},"Windows",[4610,7809,7810],{},[145,7811,7812],{},"%APPDATA%\\Claude\\claude_desktop_config.json",[26,7814,7815],{},"For the Python server:",[2446,7817,7818],{"className":6112,"code":6113,"language":5926,"meta":67,"style":67},[145,7819,7820,7824,7830,7836,7846,7860,7874,7878,7882],{"__ignoreMap":67},[1332,7821,7822],{"class":2455,"line":2131},[1332,7823,6120],{"class":2521},[1332,7825,7826,7828],{"class":2455,"line":670},[1332,7827,6126],{"class":6125},[1332,7829,6129],{"class":2521},[1332,7831,7832,7834],{"class":2455,"line":68},[1332,7833,6134],{"class":6125},[1332,7835,6129],{"class":2521},[1332,7837,7838,7840,7842,7844],{"class":2455,"line":1478},[1332,7839,6141],{"class":6125},[1332,7841,5260],{"class":2521},[1332,7843,6146],{"class":2462},[1332,7845,6024],{"class":2521},[1332,7847,7848,7850,7852,7854,7856,7858],{"class":2455,"line":293},[1332,7849,6153],{"class":6125},[1332,7851,6156],{"class":2521},[1332,7853,6159],{"class":2462},[1332,7855,4468],{"class":2521},[1332,7857,6164],{"class":2462},[1332,7859,6167],{"class":2521},[1332,7861,7862,7864,7866,7868,7870,7872],{"class":2455,"line":2237},[1332,7863,6172],{"class":6125},[1332,7865,6175],{"class":2521},[1332,7867,5731],{"class":6125},[1332,7869,5260],{"class":2521},[1332,7871,6182],{"class":2462},[1332,7873,6185],{"class":2521},[1332,7875,7876],{"class":2455,"line":2623},[1332,7877,3810],{"class":2521},[1332,7879,7880],{"class":2455,"line":2637},[1332,7881,6194],{"class":2521},[1332,7883,7884],{"class":2455,"line":2642},[1332,7885,2802],{"class":2521},[26,7887,7888],{},"For the Node server:",[2446,7890,7891],{"className":6112,"code":7070,"language":5926,"meta":67,"style":67},[145,7892,7893,7897,7903,7909,7919,7929,7943,7947,7951],{"__ignoreMap":67},[1332,7894,7895],{"class":2455,"line":2131},[1332,7896,6120],{"class":2521},[1332,7898,7899,7901],{"class":2455,"line":670},[1332,7900,6126],{"class":6125},[1332,7902,6129],{"class":2521},[1332,7904,7905,7907],{"class":2455,"line":68},[1332,7906,6134],{"class":6125},[1332,7908,6129],{"class":2521},[1332,7910,7911,7913,7915,7917],{"class":2455,"line":1478},[1332,7912,6141],{"class":6125},[1332,7914,5260],{"class":2521},[1332,7916,7097],{"class":2462},[1332,7918,6024],{"class":2521},[1332,7920,7921,7923,7925,7927],{"class":2455,"line":293},[1332,7922,6153],{"class":6125},[1332,7924,6156],{"class":2521},[1332,7926,7108],{"class":2462},[1332,7928,6167],{"class":2521},[1332,7930,7931,7933,7935,7937,7939,7941],{"class":2455,"line":2237},[1332,7932,6172],{"class":6125},[1332,7934,6175],{"class":2521},[1332,7936,5731],{"class":6125},[1332,7938,5260],{"class":2521},[1332,7940,6182],{"class":2462},[1332,7942,6185],{"class":2521},[1332,7944,7945],{"class":2455,"line":2623},[1332,7946,3810],{"class":2521},[1332,7948,7949],{"class":2455,"line":2637},[1332,7950,6194],{"class":2521},[1332,7952,7953],{"class":2455,"line":2642},[1332,7954,2802],{"class":2521},[26,7956,7957],{},"Restart Claude Desktop. Your tools appear in the tool list and the LLM can call them.",[107,7959,7961],{"id":7960},"claude-code","Claude Code",[112,7963],{},[26,7965,7966,7967,7970],{},"Claude Code reads MCP servers from a project-level ",[145,7968,7969],{},".mcp.json"," file or from a global config. The simplest setup is a per-project file:",[2446,7972,7973],{"className":6112,"code":7070,"language":5926,"meta":67,"style":67},[145,7974,7975,7979,7985,7991,8001,8011,8025,8029,8033],{"__ignoreMap":67},[1332,7976,7977],{"class":2455,"line":2131},[1332,7978,6120],{"class":2521},[1332,7980,7981,7983],{"class":2455,"line":670},[1332,7982,6126],{"class":6125},[1332,7984,6129],{"class":2521},[1332,7986,7987,7989],{"class":2455,"line":68},[1332,7988,6134],{"class":6125},[1332,7990,6129],{"class":2521},[1332,7992,7993,7995,7997,7999],{"class":2455,"line":1478},[1332,7994,6141],{"class":6125},[1332,7996,5260],{"class":2521},[1332,7998,7097],{"class":2462},[1332,8000,6024],{"class":2521},[1332,8002,8003,8005,8007,8009],{"class":2455,"line":293},[1332,8004,6153],{"class":6125},[1332,8006,6156],{"class":2521},[1332,8008,7108],{"class":2462},[1332,8010,6167],{"class":2521},[1332,8012,8013,8015,8017,8019,8021,8023],{"class":2455,"line":2237},[1332,8014,6172],{"class":6125},[1332,8016,6175],{"class":2521},[1332,8018,5731],{"class":6125},[1332,8020,5260],{"class":2521},[1332,8022,6182],{"class":2462},[1332,8024,6185],{"class":2521},[1332,8026,8027],{"class":2455,"line":2623},[1332,8028,3810],{"class":2521},[1332,8030,8031],{"class":2455,"line":2637},[1332,8032,6194],{"class":2521},[1332,8034,8035],{"class":2455,"line":2642},[1332,8036,2802],{"class":2521},[26,8038,8039],{},"Place this at the root of the project and Claude Code picks it up automatically.",[107,8041,8043],{"id":8042},"cursor","Cursor",[112,8045],{},[26,8047,8048,8049,8052],{},"Cursor uses a per-project or global ",[145,8050,8051],{},"mcp.json"," file. The schema is the same as Claude Desktop's:",[2446,8054,8055],{"className":6112,"code":7070,"language":5926,"meta":67,"style":67},[145,8056,8057,8061,8067,8073,8083,8093,8107,8111,8115],{"__ignoreMap":67},[1332,8058,8059],{"class":2455,"line":2131},[1332,8060,6120],{"class":2521},[1332,8062,8063,8065],{"class":2455,"line":670},[1332,8064,6126],{"class":6125},[1332,8066,6129],{"class":2521},[1332,8068,8069,8071],{"class":2455,"line":68},[1332,8070,6134],{"class":6125},[1332,8072,6129],{"class":2521},[1332,8074,8075,8077,8079,8081],{"class":2455,"line":1478},[1332,8076,6141],{"class":6125},[1332,8078,5260],{"class":2521},[1332,8080,7097],{"class":2462},[1332,8082,6024],{"class":2521},[1332,8084,8085,8087,8089,8091],{"class":2455,"line":293},[1332,8086,6153],{"class":6125},[1332,8088,6156],{"class":2521},[1332,8090,7108],{"class":2462},[1332,8092,6167],{"class":2521},[1332,8094,8095,8097,8099,8101,8103,8105],{"class":2455,"line":2237},[1332,8096,6172],{"class":6125},[1332,8098,6175],{"class":2521},[1332,8100,5731],{"class":6125},[1332,8102,5260],{"class":2521},[1332,8104,6182],{"class":2462},[1332,8106,6185],{"class":2521},[1332,8108,8109],{"class":2455,"line":2623},[1332,8110,3810],{"class":2521},[1332,8112,8113],{"class":2455,"line":2637},[1332,8114,6194],{"class":2521},[1332,8116,8117],{"class":2455,"line":2642},[1332,8118,2802],{"class":2521},[26,8120,8121],{},"Restart Cursor. Tools appear in the chat side panel.",[107,8123,8125],{"id":8124},"cowork","Cowork",[112,8127],{},[26,8129,8130],{},"Cowork registers MCP servers via its plugin marketplace or via direct config in the desktop app. For a custom server:",[1923,8132,8133,8136,8142],{},[189,8134,8135],{},"Open Cowork settings.",[189,8137,8138,8139,148],{},"Go to ",[192,8140,8141],{},"MCP servers",[189,8143,1927,8144,8147],{},[192,8145,8146],{},"Add server"," and paste the same config object as above.",[26,8149,8150],{},"Cowork hot-reloads the server, no restart needed.",[107,8152,8154],{"id":8153},"verify-the-registration-worked","Verify the registration worked",[112,8156],{},[26,8158,8159],{},"After adding the config and restarting, ask the LLM:",[2093,8161,8162],{},[26,8163,8164],{},"What tools do you have available?",[26,8166,8167,8168,6205,8170,8172],{},"It should list ",[145,8169,6204],{},[145,8171,6208],{}," (or whatever names you chose). If they don't appear:",[186,8174,8175,8181,8190],{},[189,8176,8177,8180],{},[192,8178,8179],{},"Check the path is absolute."," Relative paths break because the client runs the server from its own working directory.",[189,8182,8183,8186,8187,8189],{},[192,8184,8185],{},"Check the env var is set."," Most failures come from a missing ",[145,8188,4713],{},". Restart the client after adding it.",[189,8191,8192,8195],{},[192,8193,8194],{},"Check the client logs."," Each client surfaces server stdout\u002Fstderr somewhere, look for connection errors or missing dependencies.",[107,8197,8199],{"id":8198},"security","Security",[112,8201],{},[26,8203,8204],{},"The MCP config file holds your API key in plain text. A few precautions:",[186,8206,8207,8210,8216],{},[189,8208,8209],{},"Don't commit the config file to a public repo.",[189,8211,8212,8213,8215],{},"Use a secrets manager or a ",[145,8214,6289],{}," file the server reads, rather than hard-coding the key in the config, if your client supports it.",[189,8217,8218,8219,8221],{},"Rotate your axiom.ai API key (see ",[659,8220,4211],{"href":4558},") if you suspect the config has been exposed.",[107,8223,6276],{"id":6275},[112,8225],{},[186,8227,8228,8231,8238],{},[189,8229,8230],{},"Each client uses the stdio transport by default for local servers. For a server running on another machine, use streamable HTTP and update the config to point at the URL instead of a command.",[189,8232,8233,8234,8237],{},"Multiple ",[145,8235,8236],{},"mcpServers"," entries can coexist in a single config, your axiom.ai server can sit alongside servers for filesystem, GitHub, Slack, and so on.",[189,8239,8240],{},"Restart the client after editing the config. Most clients don't watch the config file for changes.",[2819,8242,8243],{},"html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":67,"searchDepth":68,"depth":68,"links":8245},[8246,8247,8248,8249,8250,8251,8252],{"id":7768,"depth":670,"text":7769},{"id":7960,"depth":670,"text":7961},{"id":8042,"depth":670,"text":8043},{"id":8124,"depth":670,"text":8125},{"id":8153,"depth":670,"text":8154},{"id":8198,"depth":670,"text":8199},{"id":6275,"depth":670,"text":6276},"Configure Claude Desktop, Claude Code, Cursor, and Cowork to load your custom axiom.ai MCP server.",{"metaTitle":8255},"Register an axiom.ai MCP server with Claude Desktop, Code, Cursor, or Cowork",{"title":6108,"description":8253},"docs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Fregister-with-claude","d8_HimBumUjpUNxiSzkpRDhRm0hIGlrJu3Him7idWTA",{"id":8260,"title":4235,"body":8261,"date":71,"description":9828,"extension":73,"meta":9829,"navigation":75,"order":1478,"path":4234,"seo":9831,"stem":9832,"__hash__":9833},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fprogrammatic-signup.md",{"type":8,"value":8262,"toc":9817},[8263,8273,8284,8292,8296,8298,8304,8310,8314,8392,8513,8519,8612,8628,8648,8666,8684,8687,8691,8724,8728,8793,8798,8802,8836,8840,8861,8866,8885,8895,8918,8922,8924,9566,9570,9572,9575,9741,9747,9751,9753,9793,9795,9797,9814],[26,8264,8265,8266,8268,8269,8272],{},"For most users, the right path is to sign up in the browser and copy your API key from the dashboard — see ",[659,8267,4211],{"href":4558},". This page is for ",[192,8270,8271],{},"code that needs to sign up its own user",", typically:",[186,8274,8275,8278,8281],{},[189,8276,8277],{},"Agents and Claude skills that onboard a new caller automatically.",[189,8279,8280],{},"CI \u002F test harnesses that mint throwaway accounts.",[189,8282,8283],{},"Wrapper tools that abstract the dashboard away from end users.",[26,8285,8286,8287,8291],{},"The same three endpoints power the ",[659,8288,8290],{"href":1536,"rel":8289},[1218],"Code Dashboard's"," sign-up form, so anything you do here matches what a normal user would do in the browser.",[107,8293,8295],{"id":8294},"the-three-step-flow","The three-step flow",[112,8297],{},[2446,8299,8302],{"className":8300,"code":8301,"language":5402},[5400],"POST \u002Fapi\u002Fuser\u002Fcreate   →   creates the account (no token yet)\n        │\n        ▼\nPOST \u002Fapi\u002Fuser\u002Flogin    →   returns a Bearer JWT\n        │\n        ▼\nGET  \u002Fapi\u002Fuser\u002Fkey\u002Fcreate   →   returns the long-lived API key\n",[145,8303,8301],{"__ignoreMap":67},[26,8305,8306,8307,148],{},"All requests go to ",[145,8308,8309],{},"https:\u002F\u002Flar.axiom.ai",[21,8311,8313],{"id":8312},"step-1-create-the-account","Step 1 — Create the account",[2446,8315,8317],{"className":2448,"code":8316,"language":2450,"meta":67,"style":67},"curl -X POST https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fuser\u002Fcreate \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\":     \"Ada Lovelace\",\n    \"email\":    \"ada@example.com\",\n    \"password\": \"\u003Cstrong-password>\",\n    \"company\":  \"\",\n    \"country\":  \"\",\n    \"role\":     \"\",\n    \"campaign\": \"programmatic-signup\",\n    \"language\": \"en-GB\"\n  }'\n",[145,8318,8319,8332,8340,8347,8352,8357,8362,8367,8372,8377,8382,8387],{"__ignoreMap":67},[1332,8320,8321,8323,8325,8327,8330],{"class":2455,"line":2131},[1332,8322,4370],{"class":2458},[1332,8324,4373],{"class":2511},[1332,8326,4376],{"class":2462},[1332,8328,8329],{"class":2462}," https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fuser\u002Fcreate",[1332,8331,4382],{"class":2507},[1332,8333,8334,8336,8338],{"class":2455,"line":670},[1332,8335,4387],{"class":2511},[1332,8337,4390],{"class":2462},[1332,8339,4382],{"class":2507},[1332,8341,8342,8344],{"class":2455,"line":68},[1332,8343,4397],{"class":2511},[1332,8345,8346],{"class":2462}," '{\n",[1332,8348,8349],{"class":2455,"line":1478},[1332,8350,8351],{"class":2462},"    \"name\":     \"Ada Lovelace\",\n",[1332,8353,8354],{"class":2455,"line":293},[1332,8355,8356],{"class":2462},"    \"email\":    \"ada@example.com\",\n",[1332,8358,8359],{"class":2455,"line":2237},[1332,8360,8361],{"class":2462},"    \"password\": \"\u003Cstrong-password>\",\n",[1332,8363,8364],{"class":2455,"line":2623},[1332,8365,8366],{"class":2462},"    \"company\":  \"\",\n",[1332,8368,8369],{"class":2455,"line":2637},[1332,8370,8371],{"class":2462},"    \"country\":  \"\",\n",[1332,8373,8374],{"class":2455,"line":2642},[1332,8375,8376],{"class":2462},"    \"role\":     \"\",\n",[1332,8378,8379],{"class":2455,"line":2651},[1332,8380,8381],{"class":2462},"    \"campaign\": \"programmatic-signup\",\n",[1332,8383,8384],{"class":2455,"line":2673},[1332,8385,8386],{"class":2462},"    \"language\": \"en-GB\"\n",[1332,8388,8389],{"class":2455,"line":2692},[1332,8390,8391],{"class":2462},"  }'\n",[4589,8393,8394,8406],{},[4592,8395,8396],{},[4595,8397,8398,8401,8404],{},[4598,8399,8400],{},"Field",[4598,8402,8403],{},"Required",[4598,8405,6276],{},[4605,8407,8408,8424,8444,8456,8475,8494],{},[4595,8409,8410,8414,8417],{},[4610,8411,8412],{},[145,8413,6802],{},[4610,8415,8416],{},"yes",[4610,8418,8419,8420,8423],{},"Free text. Rejected if it looks like a URL or email address — the server matches ",[145,8421,8422],{},"[a-z0-9@:%._+~#=]{1,256}\\.[a-z0-9()]{1,6}"," and bails. Keep names plain.",[4595,8425,8426,8431,8433],{},[4610,8427,8428],{},[145,8429,8430],{},"email",[4610,8432,8416],{},[4610,8434,8435,8436,8439,8440,8443],{},"Must not be from a disposable-email provider (the server runs an ",[145,8437,8438],{},"isDisposable()"," check and returns ",[145,8441,8442],{},"{\"status\": \"To prevent abuse of our free plan, please do not register with an anonymous email provider.\"}"," on failure).",[4595,8445,8446,8451,8453],{},[4610,8447,8448],{},[145,8449,8450],{},"password",[4610,8452,8416],{},[4610,8454,8455],{},"No length minimum enforced server-side at the moment; use something sensible.",[4595,8457,8458,8469,8472],{},[4610,8459,8460,4468,8463,4468,8466],{},[145,8461,8462],{},"company",[145,8464,8465],{},"country",[145,8467,8468],{},"role",[4610,8470,8471],{},"no",[4610,8473,8474],{},"Free text. Used for analytics; pass empty strings if unknown.",[4595,8476,8477,8482,8484],{},[4610,8478,8479],{},[145,8480,8481],{},"campaign",[4610,8483,8471],{},[4610,8485,8486,8487,4468,8490,8493],{},"Free text. Use this to mark where the signup came from (",[145,8488,8489],{},"code-dashboard-signup",[145,8491,8492],{},"claude-skill",", your tool name) so the team can attribute traffic.",[4595,8495,8496,8501,8503],{},[4610,8497,8498],{},[145,8499,8500],{},"language",[4610,8502,8471],{},[4610,8504,8505,8506,4468,8509,8512],{},"BCP 47 tag (e.g. ",[145,8507,8508],{},"en-GB",[145,8510,8511],{},"de-DE","). Defaults to whatever the browser sends; in headless code, pass it explicitly.",[26,8514,8515,8518],{},[192,8516,8517],{},"Response (success):"," the new user object.",[2446,8520,8522],{"className":6112,"code":8521,"language":5926,"meta":67,"style":67},"{\n  \"id\": 12345,\n  \"name\": \"Ada Lovelace\",\n  \"email\": \"ada@example.com\",\n  \"company\": \"\",\n  \"role\": \"\",\n  \"country\": \"\",\n  \"language\": \"en-GB\"\n}\n",[145,8523,8524,8528,8540,8552,8564,8576,8587,8598,8608],{"__ignoreMap":67},[1332,8525,8526],{"class":2455,"line":2131},[1332,8527,6120],{"class":2521},[1332,8529,8530,8533,8535,8538],{"class":2455,"line":670},[1332,8531,8532],{"class":6125},"  \"id\"",[1332,8534,5260],{"class":2521},[1332,8536,8537],{"class":2511},"12345",[1332,8539,6024],{"class":2521},[1332,8541,8542,8545,8547,8550],{"class":2455,"line":68},[1332,8543,8544],{"class":6125},"  \"name\"",[1332,8546,5260],{"class":2521},[1332,8548,8549],{"class":2462},"\"Ada Lovelace\"",[1332,8551,6024],{"class":2521},[1332,8553,8554,8557,8559,8562],{"class":2455,"line":1478},[1332,8555,8556],{"class":6125},"  \"email\"",[1332,8558,5260],{"class":2521},[1332,8560,8561],{"class":2462},"\"ada@example.com\"",[1332,8563,6024],{"class":2521},[1332,8565,8566,8569,8571,8574],{"class":2455,"line":293},[1332,8567,8568],{"class":6125},"  \"company\"",[1332,8570,5260],{"class":2521},[1332,8572,8573],{"class":2462},"\"\"",[1332,8575,6024],{"class":2521},[1332,8577,8578,8581,8583,8585],{"class":2455,"line":2237},[1332,8579,8580],{"class":6125},"  \"role\"",[1332,8582,5260],{"class":2521},[1332,8584,8573],{"class":2462},[1332,8586,6024],{"class":2521},[1332,8588,8589,8592,8594,8596],{"class":2455,"line":2623},[1332,8590,8591],{"class":6125},"  \"country\"",[1332,8593,5260],{"class":2521},[1332,8595,8573],{"class":2462},[1332,8597,6024],{"class":2521},[1332,8599,8600,8603,8605],{"class":2455,"line":2637},[1332,8601,8602],{"class":6125},"  \"language\"",[1332,8604,5260],{"class":2521},[1332,8606,8607],{"class":2462},"\"en-GB\"\n",[1332,8609,8610],{"class":2455,"line":2642},[1332,8611,2802],{"class":2521},[26,8613,8614,8617,8618,8621,8622,8625,8626,4360],{},[192,8615,8616],{},"Response (failure):"," a ",[145,8619,8620],{},"200 OK"," with a ",[145,8623,8624],{},"status"," field describing what went wrong. The endpoint doesn't use HTTP status codes for these cases — watch the ",[145,8627,8624],{},[2446,8629,8631],{"className":6112,"code":8630,"language":5926,"meta":67,"style":67},"{ \"status\": \"email_exists\" }\n",[145,8632,8633],{"__ignoreMap":67},[1332,8634,8635,8638,8641,8643,8646],{"class":2455,"line":2131},[1332,8636,8637],{"class":2521},"{ ",[1332,8639,8640],{"class":6125},"\"status\"",[1332,8642,5260],{"class":2521},[1332,8644,8645],{"class":2462},"\"email_exists\"",[1332,8647,6185],{"class":2521},[2446,8649,8651],{"className":6112,"code":8650,"language":5926,"meta":67,"style":67},"{ \"status\": \"Could not create an account, name field contains a URL or email address\" }\n",[145,8652,8653],{"__ignoreMap":67},[1332,8654,8655,8657,8659,8661,8664],{"class":2455,"line":2131},[1332,8656,8637],{"class":2521},[1332,8658,8640],{"class":6125},[1332,8660,5260],{"class":2521},[1332,8662,8663],{"class":2462},"\"Could not create an account, name field contains a URL or email address\"",[1332,8665,6185],{"class":2521},[2446,8667,8669],{"className":6112,"code":8668,"language":5926,"meta":67,"style":67},"{ \"status\": \"To prevent abuse of our free plan, please do not register with an anonymous email provider.\" }\n",[145,8670,8671],{"__ignoreMap":67},[1332,8672,8673,8675,8677,8679,8682],{"class":2455,"line":2131},[1332,8674,8637],{"class":2521},[1332,8676,8640],{"class":6125},[1332,8678,5260],{"class":2521},[1332,8680,8681],{"class":2462},"\"To prevent abuse of our free plan, please do not register with an anonymous email provider.\"",[1332,8683,6185],{"class":2521},[26,8685,8686],{},"Welcome email is sent automatically on success.",[21,8688,8690],{"id":8689},"step-2-log-in","Step 2 — Log in",[2446,8692,8694],{"className":2448,"code":8693,"language":2450,"meta":67,"style":67},"curl -X POST https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fuser\u002Flogin \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"email\": \"ada@example.com\", \"password\": \"\u003Cstrong-password>\"}'\n",[145,8695,8696,8709,8717],{"__ignoreMap":67},[1332,8697,8698,8700,8702,8704,8707],{"class":2455,"line":2131},[1332,8699,4370],{"class":2458},[1332,8701,4373],{"class":2511},[1332,8703,4376],{"class":2462},[1332,8705,8706],{"class":2462}," https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fuser\u002Flogin",[1332,8708,4382],{"class":2507},[1332,8710,8711,8713,8715],{"class":2455,"line":670},[1332,8712,4387],{"class":2511},[1332,8714,4390],{"class":2462},[1332,8716,4382],{"class":2507},[1332,8718,8719,8721],{"class":2455,"line":68},[1332,8720,4397],{"class":2511},[1332,8722,8723],{"class":2462}," '{\"email\": \"ada@example.com\", \"password\": \"\u003Cstrong-password>\"}'\n",[26,8725,8726],{},[192,8727,8517],{},[2446,8729,8731],{"className":6112,"code":8730,"language":5926,"meta":67,"style":67},"{\n  \"id\": 12345,\n  \"name\": \"Ada Lovelace\",\n  \"email\": \"ada@example.com\",\n  \"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOi...\",\n  \"refresh_token\": \"def502009b...\"\n}\n",[145,8732,8733,8737,8747,8757,8767,8779,8789],{"__ignoreMap":67},[1332,8734,8735],{"class":2455,"line":2131},[1332,8736,6120],{"class":2521},[1332,8738,8739,8741,8743,8745],{"class":2455,"line":670},[1332,8740,8532],{"class":6125},[1332,8742,5260],{"class":2521},[1332,8744,8537],{"class":2511},[1332,8746,6024],{"class":2521},[1332,8748,8749,8751,8753,8755],{"class":2455,"line":68},[1332,8750,8544],{"class":6125},[1332,8752,5260],{"class":2521},[1332,8754,8549],{"class":2462},[1332,8756,6024],{"class":2521},[1332,8758,8759,8761,8763,8765],{"class":2455,"line":1478},[1332,8760,8556],{"class":6125},[1332,8762,5260],{"class":2521},[1332,8764,8561],{"class":2462},[1332,8766,6024],{"class":2521},[1332,8768,8769,8772,8774,8777],{"class":2455,"line":293},[1332,8770,8771],{"class":6125},"  \"token\"",[1332,8773,5260],{"class":2521},[1332,8775,8776],{"class":2462},"\"eyJ0eXAiOiJKV1QiLCJhbGciOi...\"",[1332,8778,6024],{"class":2521},[1332,8780,8781,8784,8786],{"class":2455,"line":2237},[1332,8782,8783],{"class":6125},"  \"refresh_token\"",[1332,8785,5260],{"class":2521},[1332,8787,8788],{"class":2462},"\"def502009b...\"\n",[1332,8790,8791],{"class":2455,"line":2623},[1332,8792,2802],{"class":2521},[26,8794,8795,8797],{},[145,8796,4417],{}," is an OAuth2 access token (Bearer JWT) you'll use to authenticate the next call. It's not the long-lived API key yet — that's step 3.",[26,8799,8800],{},[192,8801,8616],{},[4589,8803,8804,8814],{},[4592,8805,8806],{},[4595,8807,8808,8811],{},[4598,8809,8810],{},"Body",[4598,8812,8813],{},"Meaning",[4605,8815,8816,8826],{},[4595,8817,8818,8823],{},[4610,8819,8820],{},[145,8821,8822],{},"null",[4610,8824,8825],{},"Email doesn't exist on the platform, or password is wrong. The endpoint deliberately collapses these into one signal to avoid leaking which case applies.",[4595,8827,8828,8833],{},[4610,8829,8830],{},[145,8831,8832],{},"\"blocked\"",[4610,8834,8835],{},"Account is locked out after 29 failed login attempts. Will stay locked until contact support to reset. Don't loop on this.",[21,8837,8839],{"id":8838},"step-3-mint-the-long-lived-api-key","Step 3 — Mint the long-lived API key",[2446,8841,8843],{"className":2448,"code":8842,"language":2450,"meta":67,"style":67},"curl https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fuser\u002Fkey\u002Fcreate \\\n  -H \"Authorization: Bearer \u003CJWT_FROM_STEP_2>\"\n",[145,8844,8845,8854],{"__ignoreMap":67},[1332,8846,8847,8849,8852],{"class":2455,"line":2131},[1332,8848,4370],{"class":2458},[1332,8850,8851],{"class":2462}," https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fuser\u002Fkey\u002Fcreate",[1332,8853,4382],{"class":2507},[1332,8855,8856,8858],{"class":2455,"line":670},[1332,8857,4387],{"class":2511},[1332,8859,8860],{"class":2462}," \"Authorization: Bearer \u003CJWT_FROM_STEP_2>\"\n",[26,8862,8863],{},[192,8864,8865],{},"Response:",[2446,8867,8869],{"className":6112,"code":8868,"language":5926,"meta":67,"style":67},"{ \"token\": \"axm_...\" }\n",[145,8870,8871],{"__ignoreMap":67},[1332,8872,8873,8875,8878,8880,8883],{"class":2455,"line":2131},[1332,8874,8637],{"class":2521},[1332,8876,8877],{"class":6125},"\"token\"",[1332,8879,5260],{"class":2521},[1332,8881,8882],{"class":2462},"\"axm_...\"",[1332,8884,6185],{"class":2521},[26,8886,8887,8888,8890,8891,8894],{},"This ",[145,8889,4417],{}," is the long-lived API key you use everywhere else in the API — see ",[659,8892,4211],{"href":8893},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fauthentication#use-the-key-in-a-request"," for how it's passed.",[2093,8896,8897],{},[26,8898,8899,8902,8903,8906,8907,8910,8911,8914,8915,148],{},[192,8900,8901],{},"One key per account."," Calling ",[145,8904,8905],{},"GET \u002Fapi\u002Fuser\u002Fkey\u002Fcreate"," on an account that already has a key ",[192,8908,8909],{},"invalidates the old one and returns a new one",". Any existing integration using the old key stops working immediately. To check if an account already has a key without invalidating it, call ",[145,8912,8913],{},"GET \u002Fapi\u002Fuser\u002Fkey\u002Fhas-existing"," (same Bearer JWT auth) and inspect ",[145,8916,8917],{},"{\"result\": true|false}",[107,8919,8921],{"id":8920},"end-to-end-example-nodejs","End-to-end example (Node.js)",[112,8923],{},[2446,8925,8927],{"className":2962,"code":8926,"language":2964,"meta":67,"style":67},"const BASE = 'https:\u002F\u002Flar.axiom.ai';\n\nasync function signUpAndMintKey({ name, email, password, campaign = 'programmatic' }) {\n  \u002F\u002F Step 1 — create\n  const createRes = await fetch(`${BASE}\u002Fapi\u002Fuser\u002Fcreate`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application\u002Fjson' },\n    body: JSON.stringify({\n      name, email, password,\n      company: '', country: '', role: '',\n      campaign,\n      language: process.env.LANG?.split('.')[0]?.replace('_', '-') ?? 'en-GB',\n    }),\n  });\n  const createJson = await createRes.json();\n  if (createJson.status) {\n    \u002F\u002F status field present = an error case (email_exists, disposable, name-looks-like-url, ...)\n    throw new Error(`signup failed: ${createJson.status}`);\n  }\n\n  \u002F\u002F Step 2 — log in\n  const loginRes = await fetch(`${BASE}\u002Fapi\u002Fuser\u002Flogin`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application\u002Fjson' },\n    body: JSON.stringify({ email, password }),\n  });\n  const loginJson = await loginRes.json();\n  if (loginJson === null) throw new Error('login failed: bad credentials');\n  if (loginJson === 'blocked') throw new Error('login failed: account locked (too many failed attempts)');\n\n  \u002F\u002F Step 3 — mint API key (uses the JWT from step 2)\n  const keyRes = await fetch(`${BASE}\u002Fapi\u002Fuser\u002Fkey\u002Fcreate`, {\n    headers: { 'Authorization': `Bearer ${loginJson.token}` },\n  });\n  const keyJson = await keyRes.json();\n\n  return { user: createJson, apiKey: keyJson.token };\n}\n\n\u002F\u002F Usage\nconst { user, apiKey } = await signUpAndMintKey({\n  name: 'Ada Lovelace',\n  email: `ada+${Date.now()}@example.com`,  \u002F\u002F unique email avoids `email_exists`\n  password: process.env.NEW_ACCOUNT_PASSWORD,\n  campaign: 'my-tool-headless-signup',\n});\nconsole.log(`Provisioned ${user.email} with API key (last 6: ${apiKey.slice(-6)})`);\n",[145,8928,8929,8943,8947,8981,8986,9011,9020,9034,9046,9051,9071,9076,9125,9130,9134,9152,9160,9165,9190,9194,9198,9203,9227,9235,9247,9260,9264,9282,9310,9336,9340,9345,9369,9392,9396,9414,9418,9425,9429,9433,9438,9462,9472,9500,9510,9520,9524],{"__ignoreMap":67},[1332,8930,8931,8933,8936,8938,8941],{"class":2455,"line":2131},[1332,8932,2508],{"class":2507},[1332,8934,8935],{"class":2511}," BASE",[1332,8937,2515],{"class":2507},[1332,8939,8940],{"class":2462}," 'https:\u002F\u002Flar.axiom.ai'",[1332,8942,4673],{"class":2521},[1332,8944,8945],{"class":2455,"line":670},[1332,8946,2588],{"emptyLinePlaceholder":75},[1332,8948,8949,8951,8953,8956,8959,8961,8963,8965,8967,8969,8971,8973,8975,8978],{"class":2455,"line":68},[1332,8950,3332],{"class":2507},[1332,8952,6458],{"class":2507},[1332,8954,8955],{"class":2525}," signUpAndMintKey",[1332,8957,8958],{"class":2521},"({ ",[1332,8960,6802],{"class":2458},[1332,8962,4468],{"class":2521},[1332,8964,8430],{"class":2458},[1332,8966,4468],{"class":2521},[1332,8968,8450],{"class":2458},[1332,8970,4468],{"class":2521},[1332,8972,8481],{"class":2458},[1332,8974,2515],{"class":2507},[1332,8976,8977],{"class":2462}," 'programmatic'",[1332,8979,8980],{"class":2521}," }) {\n",[1332,8982,8983],{"class":2455,"line":1478},[1332,8984,8985],{"class":2609},"  \u002F\u002F Step 1 — create\n",[1332,8987,8988,8990,8993,8995,8997,8999,9001,9003,9006,9009],{"class":2455,"line":293},[1332,8989,3344],{"class":2507},[1332,8991,8992],{"class":2511}," createRes",[1332,8994,2515],{"class":2507},[1332,8996,2518],{"class":2507},[1332,8998,6487],{"class":2525},[1332,9000,1213],{"class":2521},[1332,9002,6492],{"class":2462},[1332,9004,9005],{"class":2511},"BASE",[1332,9007,9008],{"class":2462},"}\u002Fapi\u002Fuser\u002Fcreate`",[1332,9010,6505],{"class":2521},[1332,9012,9013,9015,9018],{"class":2455,"line":2237},[1332,9014,6510],{"class":2521},[1332,9016,9017],{"class":2462},"'POST'",[1332,9019,6024],{"class":2521},[1332,9021,9022,9024,9027,9029,9032],{"class":2455,"line":2623},[1332,9023,6520],{"class":2521},[1332,9025,9026],{"class":2462},"'Content-Type'",[1332,9028,5260],{"class":2521},[1332,9030,9031],{"class":2462},"'application\u002Fjson'",[1332,9033,6531],{"class":2521},[1332,9035,9036,9038,9040,9042,9044],{"class":2455,"line":2637},[1332,9037,6536],{"class":2521},[1332,9039,6539],{"class":2511},[1332,9041,148],{"class":2521},[1332,9043,6544],{"class":2525},[1332,9045,2529],{"class":2521},[1332,9047,9048],{"class":2455,"line":2642},[1332,9049,9050],{"class":2521},"      name, email, password,\n",[1332,9052,9053,9056,9059,9062,9064,9067,9069],{"class":2455,"line":2651},[1332,9054,9055],{"class":2521},"      company: ",[1332,9057,9058],{"class":2462},"''",[1332,9060,9061],{"class":2521},", country: ",[1332,9063,9058],{"class":2462},[1332,9065,9066],{"class":2521},", role: ",[1332,9068,9058],{"class":2462},[1332,9070,6024],{"class":2521},[1332,9072,9073],{"class":2455,"line":2673},[1332,9074,9075],{"class":2521},"      campaign,\n",[1332,9077,9078,9081,9084,9087,9090,9092,9095,9098,9100,9103,9106,9108,9111,9113,9116,9118,9120,9123],{"class":2455,"line":2692},[1332,9079,9080],{"class":2521},"      language: process.env.",[1332,9082,9083],{"class":2511},"LANG",[1332,9085,9086],{"class":2521},"?.",[1332,9088,9089],{"class":2525},"split",[1332,9091,1213],{"class":2521},[1332,9093,9094],{"class":2462},"'.'",[1332,9096,9097],{"class":2521},")[",[1332,9099,256],{"class":2511},[1332,9101,9102],{"class":2521},"]?.",[1332,9104,9105],{"class":2525},"replace",[1332,9107,1213],{"class":2521},[1332,9109,9110],{"class":2462},"'_'",[1332,9112,4468],{"class":2521},[1332,9114,9115],{"class":2462},"'-'",[1332,9117,2709],{"class":2521},[1332,9119,4955],{"class":2507},[1332,9121,9122],{"class":2462}," 'en-GB'",[1332,9124,6024],{"class":2521},[1332,9126,9127],{"class":2455,"line":2727},[1332,9128,9129],{"class":2521},"    }),\n",[1332,9131,9132],{"class":2455,"line":2739},[1332,9133,3368],{"class":2521},[1332,9135,9136,9138,9141,9143,9145,9148,9150],{"class":2455,"line":2750},[1332,9137,3344],{"class":2507},[1332,9139,9140],{"class":2511}," createJson",[1332,9142,2515],{"class":2507},[1332,9144,2518],{"class":2507},[1332,9146,9147],{"class":2521}," createRes.",[1332,9149,5926],{"class":2525},[1332,9151,2670],{"class":2521},[1332,9153,9154,9157],{"class":2455,"line":2765},[1332,9155,9156],{"class":2507},"  if",[1332,9158,9159],{"class":2521}," (createJson.status) {\n",[1332,9161,9162],{"class":2455,"line":2777},[1332,9163,9164],{"class":2609},"    \u002F\u002F status field present = an error case (email_exists, disposable, name-looks-like-url, ...)\n",[1332,9166,9167,9170,9172,9174,9176,9179,9182,9184,9186,9188],{"class":2455,"line":2788},[1332,9168,9169],{"class":2507},"    throw",[1332,9171,2697],{"class":2507},[1332,9173,6440],{"class":2525},[1332,9175,1213],{"class":2521},[1332,9177,9178],{"class":2462},"`signup failed: ${",[1332,9180,9181],{"class":2521},"createJson",[1332,9183,148],{"class":2462},[1332,9185,8624],{"class":2521},[1332,9187,6502],{"class":2462},[1332,9189,2583],{"class":2521},[1332,9191,9192],{"class":2455,"line":2799},[1332,9193,6194],{"class":2521},[1332,9195,9196],{"class":2455,"line":3751},[1332,9197,2588],{"emptyLinePlaceholder":75},[1332,9199,9200],{"class":2455,"line":3762},[1332,9201,9202],{"class":2609},"  \u002F\u002F Step 2 — log in\n",[1332,9204,9205,9207,9210,9212,9214,9216,9218,9220,9222,9225],{"class":2455,"line":3777},[1332,9206,3344],{"class":2507},[1332,9208,9209],{"class":2511}," loginRes",[1332,9211,2515],{"class":2507},[1332,9213,2518],{"class":2507},[1332,9215,6487],{"class":2525},[1332,9217,1213],{"class":2521},[1332,9219,6492],{"class":2462},[1332,9221,9005],{"class":2511},[1332,9223,9224],{"class":2462},"}\u002Fapi\u002Fuser\u002Flogin`",[1332,9226,6505],{"class":2521},[1332,9228,9229,9231,9233],{"class":2455,"line":3787},[1332,9230,6510],{"class":2521},[1332,9232,9017],{"class":2462},[1332,9234,6024],{"class":2521},[1332,9236,9237,9239,9241,9243,9245],{"class":2455,"line":3796},[1332,9238,6520],{"class":2521},[1332,9240,9026],{"class":2462},[1332,9242,5260],{"class":2521},[1332,9244,9031],{"class":2462},[1332,9246,6531],{"class":2521},[1332,9248,9249,9251,9253,9255,9257],{"class":2455,"line":3807},[1332,9250,6536],{"class":2521},[1332,9252,6539],{"class":2511},[1332,9254,148],{"class":2521},[1332,9256,6544],{"class":2525},[1332,9258,9259],{"class":2521},"({ email, password }),\n",[1332,9261,9262],{"class":2455,"line":3813},[1332,9263,3368],{"class":2521},[1332,9265,9266,9268,9271,9273,9275,9278,9280],{"class":2455,"line":3819},[1332,9267,3344],{"class":2507},[1332,9269,9270],{"class":2511}," loginJson",[1332,9272,2515],{"class":2507},[1332,9274,2518],{"class":2507},[1332,9276,9277],{"class":2521}," loginRes.",[1332,9279,5926],{"class":2525},[1332,9281,2670],{"class":2521},[1332,9283,9284,9286,9289,9292,9295,9297,9299,9301,9303,9305,9308],{"class":2455,"line":3824},[1332,9285,9156],{"class":2507},[1332,9287,9288],{"class":2521}," (loginJson ",[1332,9290,9291],{"class":2507},"===",[1332,9293,9294],{"class":2511}," null",[1332,9296,2709],{"class":2521},[1332,9298,6435],{"class":2507},[1332,9300,2697],{"class":2507},[1332,9302,6440],{"class":2525},[1332,9304,1213],{"class":2521},[1332,9306,9307],{"class":2462},"'login failed: bad credentials'",[1332,9309,2583],{"class":2521},[1332,9311,9312,9314,9316,9318,9321,9323,9325,9327,9329,9331,9334],{"class":2455,"line":6027},[1332,9313,9156],{"class":2507},[1332,9315,9288],{"class":2521},[1332,9317,9291],{"class":2507},[1332,9319,9320],{"class":2462}," 'blocked'",[1332,9322,2709],{"class":2521},[1332,9324,6435],{"class":2507},[1332,9326,2697],{"class":2507},[1332,9328,6440],{"class":2525},[1332,9330,1213],{"class":2521},[1332,9332,9333],{"class":2462},"'login failed: account locked (too many failed attempts)'",[1332,9335,2583],{"class":2521},[1332,9337,9338],{"class":2455,"line":6051},[1332,9339,2588],{"emptyLinePlaceholder":75},[1332,9341,9342],{"class":2455,"line":6057},[1332,9343,9344],{"class":2609},"  \u002F\u002F Step 3 — mint API key (uses the JWT from step 2)\n",[1332,9346,9347,9349,9352,9354,9356,9358,9360,9362,9364,9367],{"class":2455,"line":6064},[1332,9348,3344],{"class":2507},[1332,9350,9351],{"class":2511}," keyRes",[1332,9353,2515],{"class":2507},[1332,9355,2518],{"class":2507},[1332,9357,6487],{"class":2525},[1332,9359,1213],{"class":2521},[1332,9361,6492],{"class":2462},[1332,9363,9005],{"class":2511},[1332,9365,9366],{"class":2462},"}\u002Fapi\u002Fuser\u002Fkey\u002Fcreate`",[1332,9368,6505],{"class":2521},[1332,9370,9371,9373,9376,9378,9381,9384,9386,9388,9390],{"class":2455,"line":6069},[1332,9372,6520],{"class":2521},[1332,9374,9375],{"class":2462},"'Authorization'",[1332,9377,5260],{"class":2521},[1332,9379,9380],{"class":2462},"`Bearer ${",[1332,9382,9383],{"class":2521},"loginJson",[1332,9385,148],{"class":2462},[1332,9387,4417],{"class":2521},[1332,9389,6502],{"class":2462},[1332,9391,6531],{"class":2521},[1332,9393,9394],{"class":2455,"line":6086},[1332,9395,3368],{"class":2521},[1332,9397,9398,9400,9403,9405,9407,9410,9412],{"class":2455,"line":6816},[1332,9399,3344],{"class":2507},[1332,9401,9402],{"class":2511}," keyJson",[1332,9404,2515],{"class":2507},[1332,9406,2518],{"class":2507},[1332,9408,9409],{"class":2521}," keyRes.",[1332,9411,5926],{"class":2525},[1332,9413,2670],{"class":2521},[1332,9415,9416],{"class":2455,"line":6852},[1332,9417,2588],{"emptyLinePlaceholder":75},[1332,9419,9420,9422],{"class":2455,"line":6874},[1332,9421,6556],{"class":2507},[1332,9423,9424],{"class":2521}," { user: createJson, apiKey: keyJson.token };\n",[1332,9426,9427],{"class":2455,"line":6898},[1332,9428,2802],{"class":2521},[1332,9430,9431],{"class":2455,"line":6903},[1332,9432,2588],{"emptyLinePlaceholder":75},[1332,9434,9435],{"class":2455,"line":6908},[1332,9436,9437],{"class":2609},"\u002F\u002F Usage\n",[1332,9439,9440,9442,9444,9447,9449,9452,9454,9456,9458,9460],{"class":2455,"line":6913},[1332,9441,2508],{"class":2507},[1332,9443,6595],{"class":2521},[1332,9445,9446],{"class":2511},"user",[1332,9448,4468],{"class":2521},[1332,9450,9451],{"class":2511},"apiKey",[1332,9453,6601],{"class":2521},[1332,9455,5110],{"class":2507},[1332,9457,2518],{"class":2507},[1332,9459,8955],{"class":2525},[1332,9461,2529],{"class":2521},[1332,9463,9464,9467,9470],{"class":2455,"line":6922},[1332,9465,9466],{"class":2521},"  name: ",[1332,9468,9469],{"class":2462},"'Ada Lovelace'",[1332,9471,6024],{"class":2521},[1332,9473,9474,9477,9480,9483,9485,9488,9491,9494,9497],{"class":2455,"line":6930},[1332,9475,9476],{"class":2521},"  email: ",[1332,9478,9479],{"class":2462},"`ada+${",[1332,9481,9482],{"class":2521},"Date",[1332,9484,148],{"class":2462},[1332,9486,9487],{"class":2525},"now",[1332,9489,9490],{"class":2462},"()",[1332,9492,9493],{"class":2462},"}@example.com`",[1332,9495,9496],{"class":2521},",  ",[1332,9498,9499],{"class":2609},"\u002F\u002F unique email avoids `email_exists`\n",[1332,9501,9502,9505,9508],{"class":2455,"line":6935},[1332,9503,9504],{"class":2521},"  password: process.env.",[1332,9506,9507],{"class":2511},"NEW_ACCOUNT_PASSWORD",[1332,9509,6024],{"class":2521},[1332,9511,9512,9515,9518],{"class":2455,"line":6946},[1332,9513,9514],{"class":2521},"  campaign: ",[1332,9516,9517],{"class":2462},"'my-tool-headless-signup'",[1332,9519,6024],{"class":2521},[1332,9521,9522],{"class":2455,"line":6957},[1332,9523,2542],{"class":2521},[1332,9525,9526,9528,9530,9532,9535,9537,9539,9541,9544,9546,9548,9551,9553,9556,9558,9561,9564],{"class":2455,"line":6962},[1332,9527,2572],{"class":2521},[1332,9529,2575],{"class":2525},[1332,9531,1213],{"class":2521},[1332,9533,9534],{"class":2462},"`Provisioned ${",[1332,9536,9446],{"class":2521},[1332,9538,148],{"class":2462},[1332,9540,8430],{"class":2521},[1332,9542,9543],{"class":2462},"} with API key (last 6: ${",[1332,9545,9451],{"class":2521},[1332,9547,148],{"class":2462},[1332,9549,9550],{"class":2525},"slice",[1332,9552,1213],{"class":2462},[1332,9554,9555],{"class":2507},"-",[1332,9557,3077],{"class":2511},[1332,9559,9560],{"class":2462},")",[1332,9562,9563],{"class":2462},"})`",[1332,9565,2583],{"class":2521},[107,9567,9569],{"id":9568},"if-the-account-already-exists","If the account already exists",[112,9571],{},[26,9573,9574],{},"Skip step 1 and just do steps 2-3:",[2446,9576,9578],{"className":2962,"code":9577,"language":2964,"meta":67,"style":67},"\u002F\u002F existing email + password → JWT → API key\nconst loginRes = await fetch(`${BASE}\u002Fapi\u002Fuser\u002Flogin`, {\n  method: 'POST',\n  headers: { 'Content-Type': 'application\u002Fjson' },\n  body: JSON.stringify({ email, password }),\n});\nconst { token: jwt } = await loginRes.json();\n\nconst keyRes = await fetch(`${BASE}\u002Fapi\u002Fuser\u002Fkey\u002Fcreate`, {\n  headers: { 'Authorization': `Bearer ${jwt}` },\n});\nconst { token: apiKey } = await keyRes.json();\n",[145,9579,9580,9585,9607,9616,9629,9642,9646,9671,9675,9697,9713,9717],{"__ignoreMap":67},[1332,9581,9582],{"class":2455,"line":2131},[1332,9583,9584],{"class":2609},"\u002F\u002F existing email + password → JWT → API key\n",[1332,9586,9587,9589,9591,9593,9595,9597,9599,9601,9603,9605],{"class":2455,"line":670},[1332,9588,2508],{"class":2507},[1332,9590,9209],{"class":2511},[1332,9592,2515],{"class":2507},[1332,9594,2518],{"class":2507},[1332,9596,6487],{"class":2525},[1332,9598,1213],{"class":2521},[1332,9600,6492],{"class":2462},[1332,9602,9005],{"class":2511},[1332,9604,9224],{"class":2462},[1332,9606,6505],{"class":2521},[1332,9608,9609,9612,9614],{"class":2455,"line":68},[1332,9610,9611],{"class":2521},"  method: ",[1332,9613,9017],{"class":2462},[1332,9615,6024],{"class":2521},[1332,9617,9618,9621,9623,9625,9627],{"class":2455,"line":1478},[1332,9619,9620],{"class":2521},"  headers: { ",[1332,9622,9026],{"class":2462},[1332,9624,5260],{"class":2521},[1332,9626,9031],{"class":2462},[1332,9628,6531],{"class":2521},[1332,9630,9631,9634,9636,9638,9640],{"class":2455,"line":293},[1332,9632,9633],{"class":2521},"  body: ",[1332,9635,6539],{"class":2511},[1332,9637,148],{"class":2521},[1332,9639,6544],{"class":2525},[1332,9641,9259],{"class":2521},[1332,9643,9644],{"class":2455,"line":2237},[1332,9645,2542],{"class":2521},[1332,9647,9648,9650,9652,9654,9656,9659,9661,9663,9665,9667,9669],{"class":2455,"line":2623},[1332,9649,2508],{"class":2507},[1332,9651,6595],{"class":2521},[1332,9653,4417],{"class":2458},[1332,9655,5260],{"class":2521},[1332,9657,9658],{"class":2511},"jwt",[1332,9660,6601],{"class":2521},[1332,9662,5110],{"class":2507},[1332,9664,2518],{"class":2507},[1332,9666,9277],{"class":2521},[1332,9668,5926],{"class":2525},[1332,9670,2670],{"class":2521},[1332,9672,9673],{"class":2455,"line":2637},[1332,9674,2588],{"emptyLinePlaceholder":75},[1332,9676,9677,9679,9681,9683,9685,9687,9689,9691,9693,9695],{"class":2455,"line":2642},[1332,9678,2508],{"class":2507},[1332,9680,9351],{"class":2511},[1332,9682,2515],{"class":2507},[1332,9684,2518],{"class":2507},[1332,9686,6487],{"class":2525},[1332,9688,1213],{"class":2521},[1332,9690,6492],{"class":2462},[1332,9692,9005],{"class":2511},[1332,9694,9366],{"class":2462},[1332,9696,6505],{"class":2521},[1332,9698,9699,9701,9703,9705,9707,9709,9711],{"class":2455,"line":2651},[1332,9700,9620],{"class":2521},[1332,9702,9375],{"class":2462},[1332,9704,5260],{"class":2521},[1332,9706,9380],{"class":2462},[1332,9708,9658],{"class":2521},[1332,9710,6502],{"class":2462},[1332,9712,6531],{"class":2521},[1332,9714,9715],{"class":2455,"line":2673},[1332,9716,2542],{"class":2521},[1332,9718,9719,9721,9723,9725,9727,9729,9731,9733,9735,9737,9739],{"class":2455,"line":2692},[1332,9720,2508],{"class":2507},[1332,9722,6595],{"class":2521},[1332,9724,4417],{"class":2458},[1332,9726,5260],{"class":2521},[1332,9728,9451],{"class":2511},[1332,9730,6601],{"class":2521},[1332,9732,5110],{"class":2507},[1332,9734,2518],{"class":2507},[1332,9736,9409],{"class":2521},[1332,9738,5926],{"class":2525},[1332,9740,2670],{"class":2521},[26,9742,9743,9744,9746],{},"Remember: step 3 invalidates the previous API key. If the user already had integrations wired up, you'll break them. Use ",[145,9745,8913],{}," first to avoid surprising them.",[107,9748,9750],{"id":9749},"abuse-rate-limit-considerations","Abuse & rate-limit considerations",[112,9752],{},[186,9754,9755,9768,9777,9783],{},[189,9756,9757,9760,9761,4468,9764,9767],{},[192,9758,9759],{},"Disposable-email check."," Step 1 blocks signups from anonymous email providers (",[145,9762,9763],{},"mailinator.com",[145,9765,9766],{},"10minutemail.com",", etc.). If your tool legitimately needs to onboard high volumes, work with the team to whitelist your domain rather than trying to bypass the check.",[189,9769,9770,9773,9774,9776],{},[192,9771,9772],{},"Login lockout."," 29 failed login attempts puts the account into ",[145,9775,8832],{}," state. The lockout is not auto-cleared — the user has to email support. So loops that retry login on a bad password are dangerous.",[189,9778,9779,9782],{},[192,9780,9781],{},"No bulk-create endpoint."," If you find yourself signing up thousands of accounts programmatically, talk to the team first — at that point a different account model (team API key, multi-tenant scoping) is the right answer.",[189,9784,9785,9788,9789,9792],{},[192,9786,9787],{},"Welcome email is sent on success."," Every successful ",[145,9790,9791],{},"POST \u002Fapi\u002Fuser\u002Fcreate"," sends a registered-with-Axiom email. Don't use this flow for ephemeral test accounts at scale without coordinating with the team — it's a deliverability liability.",[107,9794,4513],{"id":4512},[112,9796],{},[186,9798,9799,9804,9809],{},[189,9800,9801,9803],{},[659,9802,4211],{"href":4558}," — the manual flow + how the API key is used in subsequent requests",[189,9805,9806,9808],{},[659,9807,1495],{"href":5298}," — your first run after you have a key",[189,9810,9811,9813],{},[659,9812,4534],{"href":4533}," — what to do with the key",[2819,9815,9816],{},"html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}",{"title":67,"searchDepth":68,"depth":68,"links":9818},[9819,9824,9825,9826,9827],{"id":8294,"depth":670,"text":8295,"children":9820},[9821,9822,9823],{"id":8312,"depth":68,"text":8313},{"id":8689,"depth":68,"text":8690},{"id":8838,"depth":68,"text":8839},{"id":8920,"depth":670,"text":8921},{"id":9568,"depth":670,"text":9569},{"id":9749,"depth":670,"text":9750},{"id":4512,"depth":670,"text":4513},"Three-call REST flow for code that needs to sign up its own user, log in, and mint an API key — useful for agents, Claude skills, and headless onboarding.",{"metaTitle":9830},"Create an axiom.ai account and mint an API key from code",{"title":4235,"description":9828},"docs\u002Fdeveloper-hub\u002Fapi\u002Fprogrammatic-signup","RJActz4zRgq1quJdEVEpTplT1mrvfTjxIXO8UggT6uQ",{"id":9835,"title":1495,"body":9836,"date":71,"description":10417,"extension":73,"meta":10418,"navigation":75,"order":670,"path":5298,"seo":10420,"stem":10421,"__hash__":10422},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fquickstart.md",{"type":8,"value":9837,"toc":10408},[9838,9841,9843,9845,9847,9860,9864,9866,9869,9873,9883,9929,9939,9963,9966,9989,9992,9995,10030,10033,10066,10076,10080,10091,10135,10155,10161,10165,10167,10170,10304,10309,10312,10322,10329,10335,10339,10341,10344,10350,10374,10379,10394,10397,10405],[26,9839,9840],{},"There are two ways to use the axiom.ai API: trigger a pre-built No-Code Tool automation end-to-end, or connect to a cloud browser and drive it from your own code. Pick whichever matches how you want to work, the same API key authenticates both.",[107,9842,5577],{"id":5576},[112,9844],{},[26,9846,5582],{},[186,9848,9849,9854,9857],{},[189,9850,9851,9852,4628],{},"An API key. See ",[659,9853,4211],{"href":4558},[189,9855,9856],{},"For option 1: a No-Code Tool automation already saved to your account.",[189,9858,9859],{},"For option 2: any environment that can open a WebSocket. Examples below use Puppeteer in Node, but Playwright, raw CDP, or any other client works the same way.",[107,9861,9863],{"id":9862},"option-1-trigger-a-no-code-tool-automation","Option 1: trigger a No-Code Tool automation",[112,9865],{},[26,9867,9868],{},"Use this when you've built an automation in the No-Code Tool and want to run it from outside the Chrome extension, for example from Zapier, a backend service, or a cron job.",[21,9870,9872],{"id":9871},"trigger-the-run","Trigger the run",[26,9874,9875,9876,9879,9880,9882],{},"Send a ",[145,9877,9878],{},"POST"," to ",[145,9881,4467],{}," with your key and the exact name of your saved automation.",[2446,9884,9886],{"className":2448,"code":9885,"language":2450,"meta":67,"style":67},"curl -X POST https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"key\": \"your-api-key-here\",\n    \"name\": \"My First Automation\"\n  }'\n",[145,9887,9888,9901,9909,9915,9920,9925],{"__ignoreMap":67},[1332,9889,9890,9892,9894,9896,9899],{"class":2455,"line":2131},[1332,9891,4370],{"class":2458},[1332,9893,4373],{"class":2511},[1332,9895,4376],{"class":2462},[1332,9897,9898],{"class":2462}," https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger",[1332,9900,4382],{"class":2507},[1332,9902,9903,9905,9907],{"class":2455,"line":670},[1332,9904,4387],{"class":2511},[1332,9906,4390],{"class":2462},[1332,9908,4382],{"class":2507},[1332,9910,9911,9913],{"class":2455,"line":68},[1332,9912,4397],{"class":2511},[1332,9914,8346],{"class":2462},[1332,9916,9917],{"class":2455,"line":1478},[1332,9918,9919],{"class":2462},"    \"key\": \"your-api-key-here\",\n",[1332,9921,9922],{"class":2455,"line":293},[1332,9923,9924],{"class":2462},"    \"name\": \"My First Automation\"\n",[1332,9926,9927],{"class":2455,"line":2237},[1332,9928,8391],{"class":2462},[26,9930,2545,9931,9934,9935,9938],{},[145,9932,9933],{},"your-api-key-here"," with your API key, and ",[145,9936,9937],{},"My First Automation"," with the exact name of your automation.",[2093,9940,9941],{},[26,9942,9943,9945,9946,4468,9949,2936,9952,9955,9956,9959,9960,9962],{},[192,9944,2359],{}," automation names are case-sensitive and whitespace-sensitive. ",[145,9947,9948],{},"My Automation",[145,9950,9951],{},"my automation",[145,9953,9954],{},"My  Automation"," (two spaces) are three different names. If you get ",[145,9957,9958],{},"Task not found",", check the name in the ",[192,9961,2836],{}," matches exactly.",[26,9964,9965],{},"A successful response looks like this:",[2446,9967,9969],{"className":6112,"code":9968,"language":5926,"meta":67,"style":67},"{\n  \"OPEN LINK IN BROWSER\": \"\u003CLINK_TO_RUN_VIEWER>\"\n}\n",[145,9970,9971,9975,9985],{"__ignoreMap":67},[1332,9972,9973],{"class":2455,"line":2131},[1332,9974,6120],{"class":2521},[1332,9976,9977,9980,9982],{"class":2455,"line":670},[1332,9978,9979],{"class":6125},"  \"OPEN LINK IN BROWSER\"",[1332,9981,5260],{"class":2521},[1332,9983,9984],{"class":2462},"\"\u003CLINK_TO_RUN_VIEWER>\"\n",[1332,9986,9987],{"class":2455,"line":68},[1332,9988,2802],{"class":2521},[26,9990,9991],{},"Open the link to watch the automation run live in a noVNC view of the cloud browser. The trigger call returns as soon as the run starts; it doesn't wait for the run to finish.",[26,9993,9994],{},"If your account is at its concurrency limit, the run is queued instead and the response looks like this:",[2446,9996,9998],{"className":6112,"code":9997,"language":5926,"meta":67,"style":67},"{\n  \"status\": \"queued\",\n  \"message\": \"Axiom could not start due to a lack of available resources. The task has been queued and will retry in five minutes.\"\n}\n",[145,9999,10000,10004,10016,10026],{"__ignoreMap":67},[1332,10001,10002],{"class":2455,"line":2131},[1332,10003,6120],{"class":2521},[1332,10005,10006,10009,10011,10014],{"class":2455,"line":670},[1332,10007,10008],{"class":6125},"  \"status\"",[1332,10010,5260],{"class":2521},[1332,10012,10013],{"class":2462},"\"queued\"",[1332,10015,6024],{"class":2521},[1332,10017,10018,10021,10023],{"class":2455,"line":68},[1332,10019,10020],{"class":6125},"  \"message\"",[1332,10022,5260],{"class":2521},[1332,10024,10025],{"class":2462},"\"Axiom could not start due to a lack of available resources. The task has been queued and will retry in five minutes.\"\n",[1332,10027,10028],{"class":2455,"line":1478},[1332,10029,2802],{"class":2521},[26,10031,10032],{},"If something else goes wrong (the automation name doesn't exist, the key is wrong, your quota is exhausted), the response looks like this:",[2446,10034,10036],{"className":6112,"code":10035,"language":5926,"meta":67,"style":67},"{\n  \"status\": \"error\",\n  \"message\": \"Task not found, please check the name and try again.\"\n}\n",[145,10037,10038,10042,10053,10062],{"__ignoreMap":67},[1332,10039,10040],{"class":2455,"line":2131},[1332,10041,6120],{"class":2521},[1332,10043,10044,10046,10048,10051],{"class":2455,"line":670},[1332,10045,10008],{"class":6125},[1332,10047,5260],{"class":2521},[1332,10049,10050],{"class":2462},"\"error\"",[1332,10052,6024],{"class":2521},[1332,10054,10055,10057,10059],{"class":2455,"line":68},[1332,10056,10020],{"class":6125},[1332,10058,5260],{"class":2521},[1332,10060,10061],{"class":2462},"\"Task not found, please check the name and try again.\"\n",[1332,10063,10064],{"class":2455,"line":1478},[1332,10065,2802],{"class":2521},[26,10067,6104,10068,10072,10073,10075],{},[659,10069,10071],{"href":10070},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Freference\u002Fresponses","API responses"," for every response shape and ",[659,10074,5311],{"href":5310}," for the full list of error messages.",[21,10077,10079],{"id":10078},"check-the-status","Check the status",[26,10081,10082,10083,10087,10088,10090],{},"Poll ",[659,10084,10085],{"href":7368},[145,10086,4474],{}," with the same ",[145,10089,6802],{}," you triggered. It returns the current status of that automation's most recent run, plus any data the run has written out so far.",[2446,10092,10094],{"className":2448,"code":10093,"language":2450,"meta":67,"style":67},"curl -X POST https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Frun-data \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"key\": \"your-api-key-here\",\n    \"name\": \"My First Automation\"\n  }'\n",[145,10095,10096,10109,10117,10123,10127,10131],{"__ignoreMap":67},[1332,10097,10098,10100,10102,10104,10107],{"class":2455,"line":2131},[1332,10099,4370],{"class":2458},[1332,10101,4373],{"class":2511},[1332,10103,4376],{"class":2462},[1332,10105,10106],{"class":2462}," https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Frun-data",[1332,10108,4382],{"class":2507},[1332,10110,10111,10113,10115],{"class":2455,"line":670},[1332,10112,4387],{"class":2511},[1332,10114,4390],{"class":2462},[1332,10116,4382],{"class":2507},[1332,10118,10119,10121],{"class":2455,"line":68},[1332,10120,4397],{"class":2511},[1332,10122,8346],{"class":2462},[1332,10124,10125],{"class":2455,"line":1478},[1332,10126,9919],{"class":2462},[1332,10128,10129],{"class":2455,"line":293},[1332,10130,9924],{"class":2462},[1332,10132,10133],{"class":2455,"line":2237},[1332,10134,8391],{"class":2462},[26,10136,10137,10138,10140,10141,4468,10144,10147,10148,10151,10152,10154],{},"The response includes a ",[145,10139,8624],{}," field with one of three values: ",[145,10142,10143],{},"Running",[145,10145,10146],{},"Success",", or ",[145,10149,10150],{},"Failure",". If it's still ",[145,10153,10143],{},", wait a few seconds and poll again. Every 5 to 15 seconds is plenty for most automations and avoids rate limits.",[26,10156,10157,10158,10160],{},"When the status reaches ",[145,10159,10146],{},", the response also includes any data the automation wrote out (rows added to a Google Sheet, values returned from a custom JavaScript step, and so on).",[107,10162,10164],{"id":10163},"option-2-drive-a-cloud-browser-from-your-code","Option 2: drive a cloud browser from your code",[112,10166],{},[26,10168,10169],{},"Use this when you'd rather write the automation in code than build it in the No-Code Tool. Point any Chrome DevTools Protocol client at the axiom.ai endpoint and drive the cloud browser exactly like a local one. There's nothing to install on the axiom.ai side, the endpoint is the API.",[2446,10171,10173],{"className":2962,"code":10172,"language":2964,"meta":67,"style":67},"const browser = await puppeteer.connect({\n  browserWSEndpoint: \"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=your-api-key-here\"\n});\n\nconst page = await browser.newPage();\nawait page.setViewport({ width: 1960, height: 1080 });\nawait page.goto(\"https:\u002F\u002Faxiom.ai\");\n\nawait new Promise(resolve => setTimeout(resolve, 5000));\n\nawait page.close();\nawait browser.close();\n",[145,10174,10175,10191,10197,10201,10205,10221,10239,10253,10257,10280,10284,10294],{"__ignoreMap":67},[1332,10176,10177,10179,10181,10183,10185,10187,10189],{"class":2455,"line":2131},[1332,10178,2508],{"class":2507},[1332,10180,2512],{"class":2511},[1332,10182,2515],{"class":2507},[1332,10184,2518],{"class":2507},[1332,10186,2522],{"class":2521},[1332,10188,2526],{"class":2525},[1332,10190,2529],{"class":2521},[1332,10192,10193,10195],{"class":2455,"line":670},[1332,10194,2992],{"class":2521},[1332,10196,4446],{"class":2462},[1332,10198,10199],{"class":2455,"line":68},[1332,10200,2542],{"class":2521},[1332,10202,10203],{"class":2455,"line":1478},[1332,10204,2588],{"emptyLinePlaceholder":75},[1332,10206,10207,10209,10211,10213,10215,10217,10219],{"class":2455,"line":293},[1332,10208,2508],{"class":2507},[1332,10210,2657],{"class":2511},[1332,10212,2515],{"class":2507},[1332,10214,2518],{"class":2507},[1332,10216,2664],{"class":2521},[1332,10218,2667],{"class":2525},[1332,10220,2670],{"class":2521},[1332,10222,10223,10225,10227,10229,10231,10233,10235,10237],{"class":2455,"line":2237},[1332,10224,3020],{"class":2507},[1332,10226,2679],{"class":2521},[1332,10228,3025],{"class":2525},[1332,10230,3028],{"class":2521},[1332,10232,3031],{"class":2511},[1332,10234,3034],{"class":2521},[1332,10236,3037],{"class":2511},[1332,10238,3040],{"class":2521},[1332,10240,10241,10243,10245,10247,10249,10251],{"class":2455,"line":2623},[1332,10242,3020],{"class":2507},[1332,10244,2679],{"class":2521},[1332,10246,2682],{"class":2525},[1332,10248,1213],{"class":2521},[1332,10250,2687],{"class":2462},[1332,10252,2583],{"class":2521},[1332,10254,10255],{"class":2455,"line":2637},[1332,10256,2588],{"emptyLinePlaceholder":75},[1332,10258,10259,10261,10263,10265,10267,10269,10272,10274,10276,10278],{"class":2455,"line":2642},[1332,10260,3020],{"class":2507},[1332,10262,2697],{"class":2507},[1332,10264,2700],{"class":2511},[1332,10266,1213],{"class":2521},[1332,10268,2706],{"class":2458},[1332,10270,10271],{"class":2507}," =>",[1332,10273,2715],{"class":2525},[1332,10275,2718],{"class":2521},[1332,10277,2721],{"class":2511},[1332,10279,2724],{"class":2521},[1332,10281,10282],{"class":2455,"line":2651},[1332,10283,2588],{"emptyLinePlaceholder":75},[1332,10285,10286,10288,10290,10292],{"class":2455,"line":2673},[1332,10287,3020],{"class":2507},[1332,10289,2679],{"class":2521},[1332,10291,2734],{"class":2525},[1332,10293,2670],{"class":2521},[1332,10295,10296,10298,10300,10302],{"class":2455,"line":2692},[1332,10297,3020],{"class":2507},[1332,10299,2664],{"class":2521},[1332,10301,2734],{"class":2525},[1332,10303,2670],{"class":2521},[26,10305,2545,10306,10308],{},[145,10307,9933],{}," with your API key. The script connects to a fresh cloud browser, navigates to a URL, waits five seconds, and tears the session down.",[26,10310,10311],{},"Drop this into whatever you already use to run code: a Node service, a serverless function, a cron job, an existing test suite. The cloud browser handles the heavy lifting (a real Chromium with networking, fonts, and resources) so your stack just sends commands and reads results.",[2093,10313,10314],{},[26,10315,10316,10318,10319,10321],{},[192,10317,2359],{}," the API key is passed as the ",[145,10320,4417],{}," query parameter on the WebSocket URL, not in a header. Don't log this URL, treat it like a secret.",[26,10323,10324,10325,10328],{},"The same endpoint works with Playwright (",[145,10326,10327],{},"chromium.connectOverCDP(\"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=...\")","), with raw CDP libraries in Python, Go, or Ruby, or with anything else that speaks the protocol.",[26,10330,10331,10332,10334],{},"If you just want to poke at a script before wiring it into your stack, the ",[192,10333,2477],{}," in the Code Dashboard runs Puppeteer code in-browser with the key auto-injected, no setup needed. It's a sandbox, not the production path.",[107,10336,10338],{"id":10337},"next-steps","Next steps",[112,10340],{},[26,10342,10343],{},"Now that you've made your first call, here's where to go next.",[26,10345,10346,10347,3297],{},"If you used ",[192,10348,10349],{},"Option 1",[186,10351,10352,10359,10366],{},[189,10353,10354,10358],{},[659,10355,10357],{"href":10356},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Fpass-input-data","Pass input data into a run"," so the same automation can act on different inputs.",[189,10360,10361,10365],{},[659,10362,10364],{"href":10363},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Fstop-a-run","Stop a running automation"," if it's misbehaving.",[189,10367,10368,10369,10373],{},"Wrap the API in ",[659,10370,10372],{"href":10371},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets","Zapier, Make, or Apps Script"," for no-code integrations.",[26,10375,10346,10376,3297],{},[192,10377,10378],{},"Option 2",[186,10380,10381,10388],{},[189,10382,10383,10384,10387],{},"See the ",[659,10385,10386],{"href":4575},"Step API reference"," for axiom.ai's higher-level wrappers around the Chrome API.",[189,10389,10390,10391,10393],{},"Check ",[659,10392,4820],{"href":4539}," so long-running scripts don't run out of quota mid-task.",[26,10395,10396],{},"For everyone:",[186,10398,10399],{},[189,10400,10401,10404],{},[659,10402,10403],{"href":5379},"Build your own MCP server"," so Claude or another LLM client can use axiom.ai as a tool.",[2819,10406,10407],{},"html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}",{"title":67,"searchDepth":68,"depth":68,"links":10409},[10410,10411,10415,10416],{"id":5576,"depth":670,"text":5577},{"id":9862,"depth":670,"text":9863,"children":10412},[10413,10414],{"id":9871,"depth":68,"text":9872},{"id":10078,"depth":68,"text":10079},{"id":10163,"depth":670,"text":10164},{"id":10337,"depth":670,"text":10338},"Trigger a pre-built No-Code Tool automation with cURL, or drive a cloud browser from your own code with Puppeteer.",{"metaTitle":10419},"Run your first axiom.ai automation from cURL or code",{"title":1495,"description":10417},"docs\u002Fdeveloper-hub\u002Fapi\u002Fquickstart","CmlWeGrIOcQ-pqHCW6D6ugUQOfJ9kqP0Kz8HAYtnt6c",{"id":10424,"title":10425,"body":10426,"date":71,"description":10840,"extension":73,"meta":10841,"navigation":75,"order":68,"path":10843,"seo":10844,"stem":10845,"__hash__":10846},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Freference\u002Fdata-payload.md","Data payload format",{"type":8,"value":10427,"toc":10831},[10428,10440,10444,10446,10483,10486,10490,10492,10495,10550,10554,10556,10655,10659,10661,10664,10732,10735,10739,10741,10744,10780,10787,10791,10793,10813,10815,10817,10828],[26,10429,10430,10431,10433,10434,10436,10437,148],{},"The canonical reference for the ",[145,10432,580],{}," field in ",[145,10435,4467],{}," requests. For tutorials, examples, and common patterns, see ",[659,10438,10439],{"href":10356},"Pass input data",[107,10441,10443],{"id":10442},"schema","Schema",[112,10445],{},[2446,10447,10449],{"className":6112,"code":10448,"language":5926,"meta":67,"style":67},"data: array\u003Ctable>\n\ntable: array\u003Crow>\n\nrow: array\u003Ccell>\n\ncell: string\n",[145,10450,10451,10456,10460,10465,10469,10474,10478],{"__ignoreMap":67},[1332,10452,10453],{"class":2455,"line":2131},[1332,10454,10455],{"class":2521},"data: array\u003Ctable>\n",[1332,10457,10458],{"class":2455,"line":670},[1332,10459,2588],{"emptyLinePlaceholder":75},[1332,10461,10462],{"class":2455,"line":68},[1332,10463,10464],{"class":2521},"table: array\u003Crow>\n",[1332,10466,10467],{"class":2455,"line":1478},[1332,10468,2588],{"emptyLinePlaceholder":75},[1332,10470,10471],{"class":2455,"line":293},[1332,10472,10473],{"class":2521},"row: array\u003Ccell>\n",[1332,10475,10476],{"class":2455,"line":2237},[1332,10477,2588],{"emptyLinePlaceholder":75},[1332,10479,10480],{"class":2455,"line":2623},[1332,10481,10482],{"class":2521},"cell: string\n",[26,10484,10485],{},"Three levels deep, all arrays. The outermost array holds tables, each table holds rows, each row holds cells. Cells are strings.",[107,10487,10489],{"id":10488},"minimal-example","Minimal example",[112,10491],{},[26,10493,10494],{},"One table, one header row, one data row:",[2446,10496,10498],{"className":6112,"code":10497,"language":5926,"meta":67,"style":67},"\"data\": [\n  [\n    [\"header1\", \"header2\"],\n    [\"value1\", \"value2\"]\n  ]\n]\n",[145,10499,10500,10507,10512,10527,10541,10546],{"__ignoreMap":67},[1332,10501,10502,10504],{"class":2455,"line":2131},[1332,10503,5861],{"class":2462},[1332,10505,10506],{"class":2521},": [\n",[1332,10508,10509],{"class":2455,"line":670},[1332,10510,10511],{"class":2521},"  [\n",[1332,10513,10514,10517,10520,10522,10525],{"class":2455,"line":68},[1332,10515,10516],{"class":2521},"    [",[1332,10518,10519],{"class":2462},"\"header1\"",[1332,10521,4468],{"class":2521},[1332,10523,10524],{"class":2462},"\"header2\"",[1332,10526,6167],{"class":2521},[1332,10528,10529,10531,10534,10536,10539],{"class":2455,"line":1478},[1332,10530,10516],{"class":2521},[1332,10532,10533],{"class":2462},"\"value1\"",[1332,10535,4468],{"class":2521},[1332,10537,10538],{"class":2462},"\"value2\"",[1332,10540,5164],{"class":2521},[1332,10542,10543],{"class":2455,"line":293},[1332,10544,10545],{"class":2521},"  ]\n",[1332,10547,10548],{"class":2455,"line":2237},[1332,10549,5164],{"class":2521},[107,10551,10553],{"id":10552},"validation-rules","Validation rules",[112,10555],{},[4589,10557,10558,10568],{},[4592,10559,10560],{},[4595,10561,10562,10565],{},[4598,10563,10564],{},"Rule",[4598,10566,10567],{},"Detail",[4605,10569,10570,10580,10590,10601,10612,10624,10639,10647],{},[4595,10571,10572,10577],{},[4610,10573,10574,10576],{},[145,10575,580],{}," is optional",[4610,10578,10579],{},"Omit it entirely if your automation doesn't expect input.",[4595,10581,10582,10587],{},[4610,10583,10584,10586],{},[145,10585,580],{}," is an array",[4610,10588,10589],{},"The outermost element is always an array of tables, even if there's only one table.",[4595,10591,10592,10595],{},[4610,10593,10594],{},"Each table is an array of rows",[4610,10596,10597,10598,10600],{},"A table with no rows (",[145,10599,173],{},") is allowed but unusual, the automation receives an empty input.",[4595,10602,10603,10606],{},[4610,10604,10605],{},"Each row is an array of cells",[4610,10607,10608,10609,10611],{},"Empty rows (",[145,10610,173],{},") cause unpredictable behaviour, avoid them.",[4595,10613,10614,10617],{},[4610,10615,10616],{},"Cells are strings",[4610,10618,10619,10620,10623],{},"Numbers and booleans are coerced to strings on the server. Pass ",[145,10621,10622],{},"\"42\""," for clarity.",[4595,10625,10626,10631],{},[4610,10627,10628,10629],{},"Cells must not be ",[145,10630,8822],{},[4610,10632,2487,10633,10635,10636,10638],{},[145,10634,8573],{}," for missing values. A ",[145,10637,8822],{}," cell breaks the row.",[4595,10640,10641,10644],{},[4610,10642,10643],{},"Cells must not contain nested arrays or objects",[4610,10645,10646],{},"Cells are flat scalars. To pass structured data, flatten across columns.",[4595,10648,10649,10652],{},[4610,10650,10651],{},"All rows in a table should have the same length",[4610,10653,10654],{},"Ragged rows cause column-index references to misalign.",[107,10656,10658],{"id":10657},"multiple-tables","Multiple tables",[112,10660],{},[26,10662,10663],{},"If the automation reads from two distinct inputs, pass them in order:",[2446,10665,10667],{"className":6112,"code":10666,"language":5926,"meta":67,"style":67},"\"data\": [\n  [\n    [\"url\"],\n    [\"https:\u002F\u002Fexample.com\u002Fa\"]\n  ],\n  [\n    [\"search_term\"],\n    [\"browser automation\"]\n  ]\n]\n",[145,10668,10669,10675,10679,10688,10697,10702,10706,10715,10724,10728],{"__ignoreMap":67},[1332,10670,10671,10673],{"class":2455,"line":2131},[1332,10672,5861],{"class":2462},[1332,10674,10506],{"class":2521},[1332,10676,10677],{"class":2455,"line":670},[1332,10678,10511],{"class":2521},[1332,10680,10681,10683,10686],{"class":2455,"line":68},[1332,10682,10516],{"class":2521},[1332,10684,10685],{"class":2462},"\"url\"",[1332,10687,6167],{"class":2521},[1332,10689,10690,10692,10695],{"class":2455,"line":1478},[1332,10691,10516],{"class":2521},[1332,10693,10694],{"class":2462},"\"https:\u002F\u002Fexample.com\u002Fa\"",[1332,10696,5164],{"class":2521},[1332,10698,10699],{"class":2455,"line":293},[1332,10700,10701],{"class":2521},"  ],\n",[1332,10703,10704],{"class":2455,"line":2237},[1332,10705,10511],{"class":2521},[1332,10707,10708,10710,10713],{"class":2455,"line":2623},[1332,10709,10516],{"class":2521},[1332,10711,10712],{"class":2462},"\"search_term\"",[1332,10714,6167],{"class":2521},[1332,10716,10717,10719,10722],{"class":2455,"line":2637},[1332,10718,10516],{"class":2521},[1332,10720,10721],{"class":2462},"\"browser automation\"",[1332,10723,5164],{"class":2521},[1332,10725,10726],{"class":2455,"line":2642},[1332,10727,10545],{"class":2521},[1332,10729,10730],{"class":2455,"line":2651},[1332,10731,5164],{"class":2521},[26,10733,10734],{},"The first table is the first input, the second table is the second input. Order matters and is matched positionally to the automation's input sources.",[107,10736,10738],{"id":10737},"header-rows","Header rows",[112,10740],{},[26,10742,10743],{},"Whether a header row is required depends on how the automation references columns:",[4589,10745,10746,10756],{},[4592,10747,10748],{},[4595,10749,10750,10753],{},[4598,10751,10752],{},"Automation references columns by",[4598,10754,10755],{},"Header row required",[4605,10757,10758,10772],{},[4595,10759,10760,10769],{},[4610,10761,10762,10763,4468,10766,9560],{},"Name (e.g. ",[145,10764,10765],{},"[url]",[145,10767,10768],{},"[search_term]",[4610,10770,10771],{},"Yes",[4595,10773,10774,10777],{},[4610,10775,10776],{},"Position (e.g. column 1, column 2)",[4610,10778,10779],{},"No",[26,10781,10782,10783,10786],{},"Match the convention the automation was authored with. If unsure, open it in the ",[192,10784,10785],{},"Builder"," and inspect how the input source step references columns.",[107,10788,10790],{"id":10789},"encoding","Encoding",[112,10792],{},[186,10794,10795,10804,10807],{},[189,10796,2273,10797,10799,10800,10803],{},[145,10798,580],{}," field is JSON, sent as part of the ",[145,10801,10802],{},"application\u002Fjson"," request body.",[189,10805,10806],{},"UTF-8 throughout. Non-ASCII characters in cell values are passed through unchanged.",[189,10808,10809,10810,10812],{},"No size limit is documented per cell or per request, but very large payloads (multiple megabytes) may hit timeout or rate limit issues. For high-volume input, batch across multiple ",[145,10811,4467],{}," calls instead of one giant payload.",[107,10814,4513],{"id":4512},[112,10816],{},[186,10818,10819,10824],{},[189,10820,10821,10823],{},[659,10822,10439],{"href":10356}," (tutorial with examples and common patterns)",[189,10825,10826],{},[659,10827,4528],{"href":4527},[2819,10829,10830],{},"html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}",{"title":67,"searchDepth":68,"depth":68,"links":10832},[10833,10834,10835,10836,10837,10838,10839],{"id":10442,"depth":670,"text":10443},{"id":10488,"depth":670,"text":10489},{"id":10552,"depth":670,"text":10553},{"id":10657,"depth":670,"text":10658},{"id":10737,"depth":670,"text":10738},{"id":10789,"depth":670,"text":10790},{"id":4512,"depth":670,"text":4513},"Schema reference for the 3-D data array passed in axiom.ai automation triggers.",{"metaTitle":10842},"axiom.ai API data payload format reference","\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Freference\u002Fdata-payload",{"title":10425,"description":10840},"docs\u002Fdeveloper-hub\u002Fapi\u002Freference\u002Fdata-payload","EHnt5D5kBgPmzL-sxYj8G8tkeUjzHiV_Htr8RyvuX54",{"id":10848,"title":10849,"body":10850,"date":71,"description":11152,"extension":73,"meta":11153,"navigation":75,"order":2131,"path":5304,"seo":11155,"stem":11156,"__hash__":11157},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Freference\u002Fendpoints.md","Endpoints",{"type":8,"value":10851,"toc":11145},[10852,10855,10859,10861,10876,11038,11042,11044,11050,11079,11083,11085,11095,11098,11102,11104,11126,11128,11130],[26,10853,10854],{},"A single-page lookup of every axiom.ai API endpoint. For full request and response details, follow the link in the rightmost column.",[107,10856,10858],{"id":10857},"rest-endpoints","REST endpoints",[112,10860],{},[26,10862,10863,10864,10867,10868,10870,10871,10873,10874,148],{},"The base URL for all REST endpoints is ",[145,10865,10866],{},"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3",". All requests are ",[145,10869,9878],{}," with a JSON body. Authentication is by API key in the ",[145,10872,4359],{}," field of the body, see ",[659,10875,4211],{"href":4558},[4589,10877,10878,10895],{},[4592,10879,10880],{},[4595,10881,10882,10885,10887,10890,10893],{},[4598,10883,10884],{},"Method",[4598,10886,7790],{},[4598,10888,10889],{},"Required body fields",[4598,10891,10892],{},"Optional",[4598,10894,5535],{},[4605,10896,10897,10921,10944,10970,10993,11018],{},[4595,10898,10899,10903,10907,10913,10917],{},[4610,10900,10901],{},[145,10902,9878],{},[4610,10904,10905],{},[145,10906,4467],{},[4610,10908,10909,4468,10911],{},[145,10910,4359],{},[145,10912,6802],{},[4610,10914,10915],{},[145,10916,580],{},[4610,10918,10919],{},[659,10920,4528],{"href":4527},[4595,10922,10923,10927,10932,10936,10938],{},[4610,10924,10925],{},[145,10926,9878],{},[4610,10928,10929],{},[145,10930,10931],{},"\u002Flist-automations",[4610,10933,10934],{},[145,10935,4359],{},[4610,10937],{},[4610,10939,10940],{},[659,10941,10943],{"href":10942},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Flist-automations","List automations",[4595,10945,10946,10950,10955,10959,10964],{},[4610,10947,10948],{},[145,10949,9878],{},[4610,10951,10952],{},[145,10953,10954],{},"\u002Frun-reports",[4610,10956,10957],{},[145,10958,4359],{},[4610,10960,10961],{},[145,10962,10963],{},"count",[4610,10965,10966],{},[659,10967,10969],{"href":10968},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Frun-reports","List run reports",[4595,10971,10972,10976,10980,10986,10988],{},[4610,10973,10974],{},[145,10975,9878],{},[4610,10977,10978],{},[145,10979,4474],{},[4610,10981,10982,4468,10984],{},[145,10983,4359],{},[145,10985,6802],{},[4610,10987],{},[4610,10989,10990],{},[659,10991,10992],{"href":7368},"Check run status",[4595,10994,10995,10999,11003,11011,11013],{},[4610,10996,10997],{},[145,10998,9878],{},[4610,11000,11001],{},[145,11002,4471],{},[4610,11004,11005,4468,11008],{},[145,11006,11007],{},"pid",[145,11009,11010],{},"pw",[4610,11012],{},[4610,11014,11015],{},[659,11016,11017],{"href":10363},"Stop a run",[4595,11019,11020,11024,11028,11032,11034],{},[4610,11021,11022],{},[145,11023,9878],{},[4610,11025,11026],{},[145,11027,4480],{},[4610,11029,11030],{},[145,11031,4359],{},[4610,11033],{},[4610,11035,11036],{},[659,11037,4540],{"href":4539},[107,11039,11041],{"id":11040},"cdp-endpoint","CDP endpoint",[112,11043],{},[26,11045,11046,11047,11049],{},"For driving a cloud browser from your code, connect a Chrome DevTools Protocol client to the WebSocket endpoint below. The API key is passed as the ",[145,11048,4417],{}," query parameter.",[4589,11051,11052,11062],{},[4592,11053,11054],{},[4595,11055,11056,11058,11060],{},[4598,11057,4600],{},[4598,11059,4585],{},[4598,11061,5535],{},[4605,11063,11064],{},[4595,11065,11066,11070,11074],{},[4610,11067,11068],{},[145,11069,4614],{},[4610,11071,11072],{},[145,11073,4619],{},[4610,11075,11076],{},[659,11077,11078],{"href":4533},"Start a session",[107,11080,11082],{"id":11081},"versioning","Versioning",[112,11084],{},[26,11086,11087,11088,11091,11092,11094],{},"The API version is part of the path. The current version is ",[145,11089,11090],{},"v3",". Older versions are deprecated and not maintained, always use ",[145,11093,11090],{}," in new integrations.",[26,11096,11097],{},"When a future major version ships, both the new and old paths will be served in parallel for a transition period. Breaking changes within a version are avoided wherever possible.",[107,11099,11101],{"id":11100},"transport-and-headers","Transport and headers",[112,11103],{},[186,11105,11106,11109,11117,11123],{},[189,11107,11108],{},"All requests use HTTPS, plain HTTP is not supported.",[189,11110,2273,11111,11114,11115,148],{},[145,11112,11113],{},"Content-Type"," header must be ",[145,11116,10802],{},[189,11118,11119,11120,11122],{},"No other custom headers are required. Specifically, the API key does not go in an ",[145,11121,4410],{}," header, it goes in the JSON body.",[189,11124,11125],{},"All responses are JSON.",[107,11127,4513],{"id":4512},[112,11129],{},[186,11131,11132,11136,11140],{},[189,11133,11134],{},[659,11135,5311],{"href":5310},[189,11137,11138],{},[659,11139,10425],{"href":10843},[189,11141,11142],{},[659,11143,11144],{"href":7601},"Rate limits",{"title":67,"searchDepth":68,"depth":68,"links":11146},[11147,11148,11149,11150,11151],{"id":10857,"depth":670,"text":10858},{"id":11040,"depth":670,"text":11041},{"id":11081,"depth":670,"text":11082},{"id":11100,"depth":670,"text":11101},{"id":4512,"depth":670,"text":4513},"Every axiom.ai API endpoint at a glance, with method, path, required parameters, and links to full reference pages.",{"metaTitle":11154},"axiom.ai API endpoints reference",{"title":10849,"description":11152},"docs\u002Fdeveloper-hub\u002Fapi\u002Freference\u002Fendpoints","y6vqoSaG5nyBpJoHU6LoEAZNb0wH_NmPv1gcd2Hooaw",{"id":11159,"title":5311,"body":11160,"date":71,"description":11692,"extension":73,"meta":11693,"navigation":75,"order":670,"path":5310,"seo":11695,"stem":11696,"__hash__":11697},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Freference\u002Ferrorcodes.md",{"type":8,"value":11161,"toc":11683},[11162,11165,11169,11171,11283,11287,11289,11292,11428,11432,11434,11446,11485,11494,11521,11525,11527,11530,11613,11617,11619,11622,11638,11642,11644,11647,11669,11671,11673],[26,11163,11164],{},"A reference of every error response the axiom.ai API can return, with the most likely cause and how to fix it. For programmatic handling, branch on the HTTP status code first, then on the error string.",[107,11166,11168],{"id":11167},"errors-by-http-status","Errors by HTTP status",[112,11170],{},[4589,11172,11173,11185],{},[4592,11174,11175],{},[4595,11176,11177,11180,11182],{},[4598,11178,11179],{},"Status",[4598,11181,8813],{},[4598,11183,11184],{},"Common cause",[4605,11186,11187,11199,11212,11227,11240,11256,11270],{},[4595,11188,11189,11194,11196],{},[4610,11190,11191],{},[145,11192,11193],{},"200",[4610,11195,10146],{},[4610,11197,11198],{},"Request was accepted and processed. The response body indicates the actual outcome (run started, run failed, and so on).",[4595,11200,11201,11206,11209],{},[4610,11202,11203],{},[145,11204,11205],{},"400",[4610,11207,11208],{},"Bad request",[4610,11210,11211],{},"A required field is missing, or the request body isn't valid JSON.",[4595,11213,11214,11219,11222],{},[4610,11215,11216],{},[145,11217,11218],{},"401",[4610,11220,11221],{},"Unauthorised",[4610,11223,2273,11224,11226],{},[145,11225,4359],{}," field is missing or doesn't match an active API key.",[4595,11228,11229,11234,11237],{},[4610,11230,11231],{},[145,11232,11233],{},"403",[4610,11235,11236],{},"Forbidden",[4610,11238,11239],{},"Your account is over its quota for the billing period.",[4595,11241,11242,11247,11250],{},[4610,11243,11244],{},[145,11245,11246],{},"404",[4610,11248,11249],{},"Not found",[4610,11251,11252,11253,11255],{},"The named automation doesn't exist, or the ",[145,11254,6259],{}," is invalid or expired.",[4595,11257,11258,11262,11265],{},[4610,11259,11260],{},[145,11261,7609],{},[4610,11263,11264],{},"Too many requests",[4610,11266,11267,11268,148],{},"You've exceeded the rate limit on this API key. Back off and retry. See ",[659,11269,11144],{"href":7601},[4595,11271,11272,11277,11280],{},[4610,11273,11274],{},[145,11275,11276],{},"5xx",[4610,11278,11279],{},"Server error",[4610,11281,11282],{},"A transient issue on the axiom.ai side. Retry with backoff.",[107,11284,11286],{"id":11285},"common-error-messages","Common error messages",[112,11288],{},[26,11290,11291],{},"The API returns a JSON body with an error string for failures. The exact wording is subject to change, so treat the HTTP status as the canonical signal and use the error string for diagnosis.",[4589,11293,11294,11310],{},[4592,11295,11296],{},[4595,11297,11298,11301,11304,11307],{},[4598,11299,11300],{},"Error string",[4598,11302,11303],{},"HTTP status",[4598,11305,11306],{},"Cause",[4598,11308,11309],{},"Fix",[4605,11311,11312,11336,11358,11379,11398],{},[4595,11313,11314,11319,11323,11331],{},[4610,11315,11316],{},[145,11317,11318],{},"Task not found, please check the name and try again.",[4610,11320,11321],{},[145,11322,11246],{},[4610,11324,2273,11325,11327,11328,11330],{},[145,11326,6802],{}," in your ",[145,11329,4467],{}," request doesn't match any automation in your account. Almost always a case or whitespace mismatch.",[4610,11332,4245,11333,11335],{},[192,11334,2836],{}," and copy the automation name exactly. Names are case- and whitespace-sensitive.",[4595,11337,11338,11343,11347,11352],{},[4610,11339,11340],{},[145,11341,11342],{},"Invalid key",[4610,11344,11345],{},[145,11346,11218],{},[4610,11348,2273,11349,11351],{},[145,11350,4359],{}," field is missing or doesn't match any active API key.",[4610,11353,11354,11355,11357],{},"Generate a new key, see ",[659,11356,4211],{"href":4558},". Remember that generating a new key invalidates the old one.",[4595,11359,11360,11365,11369,11372],{},[4610,11361,11362],{},[145,11363,11364],{},"Quota exceeded",[4610,11366,11367],{},[145,11368,11233],{},[4610,11370,11371],{},"Your account has used its full cloud runtime allowance for the billing period.",[4610,11373,11374,11375,148],{},"Wait for the next billing cycle, or upgrade your plan. Check usage with ",[659,11376,11377],{"href":4539},[145,11378,4480],{},[4595,11380,11381,11386,11390,11393],{},[4610,11382,11383],{},[145,11384,11385],{},"Rate limit exceeded. Try again in a few seconds.",[4610,11387,11388],{},[145,11389,7609],{},[4610,11391,11392],{},"You're calling the API faster than your tier allows.",[4610,11394,11395,11396,148],{},"Implement exponential backoff. See ",[659,11397,11144],{"href":7601},[4595,11399,11400,11405,11409,11419],{},[4610,11401,11402],{},[145,11403,11404],{},"Run not found",[4610,11406,11407],{},[145,11408,11246],{},[4610,11410,2273,11411,11413,11414,2344,11416,11418],{},[145,11412,6259],{}," you passed to ",[145,11415,4474],{},[145,11417,4471],{}," is invalid, expired, or wasn't created by this API key.",[4610,11420,11421,11422,11424,11425,11427],{},"Check the ",[145,11423,6259],{}," matches what ",[145,11426,4467],{}," returned. Run IDs are tied to the key that created them.",[107,11429,11431],{"id":11430},"run-status-failure","Run status: Failure",[112,11433],{},[26,11435,11436,11437,11439,11440,11442,11443,11445],{},"A successful API call (HTTP ",[145,11438,11193],{},") can still report that the run itself failed. Check the ",[145,11441,8624],{}," field in the ",[145,11444,4474],{}," response:",[4589,11447,11448,11456],{},[4592,11449,11450],{},[4595,11451,11452,11454],{},[4598,11453,11179],{},[4598,11455,8813],{},[4605,11457,11458,11467,11476],{},[4595,11459,11460,11464],{},[4610,11461,11462],{},[145,11463,10143],{},[4610,11465,11466],{},"Run is queued or actively executing.",[4595,11468,11469,11473],{},[4610,11470,11471],{},[145,11472,10146],{},[4610,11474,11475],{},"Run completed without errors.",[4595,11477,11478,11482],{},[4610,11479,11480],{},[145,11481,10150],{},[4610,11483,11484],{},"Run hit an error inside the automation and stopped.",[26,11486,11487,11488,11490,11491,11493],{},"When ",[145,11489,8624],{}," is ",[145,11492,10150],{},", the API doesn't return the underlying error message in the response, the run failed inside the cloud browser, not at the API layer. To diagnose:",[1923,11495,11496,11502,11511],{},[189,11497,11498,11499,11501],{},"Open the run in the ",[192,11500,2836],{},", every run has a detailed report with screenshots and step-level error messages.",[189,11503,4245,11504,11507,11508,11510],{},[145,11505,11506],{},"viewer_url"," returned by ",[145,11509,4467],{}," if the run is still recent enough to be available.",[189,11512,11513,11514,11520],{},"Add an ",[659,11515,11517],{"href":11516},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Ferror-metadata",[192,11518,11519],{},"Add error metadata"," step to your automation. Any data it captures is included in error reports for steps after it.",[107,11522,11524],{"id":11523},"browser-session-errors","Browser session errors",[112,11526],{},[26,11528,11529],{},"Errors driving a cloud browser via CDP appear as exceptions in your client library (Puppeteer, Playwright), not as HTTP responses. The most common:",[4589,11531,11532,11543],{},[4592,11533,11534],{},[4595,11535,11536,11539,11541],{},[4598,11537,11538],{},"Symptom",[4598,11540,11306],{},[4598,11542,11309],{},[4605,11544,11545,11564,11581,11597],{},[4595,11546,11547,11552,11558],{},[4610,11548,11549],{},[145,11550,11551],{},"WebSocket connection failed",[4610,11553,11554,11555,11557],{},"The endpoint URL is wrong, or the API key in the ",[145,11556,4417],{}," parameter is invalid.",[4610,11559,11560,11561,11563],{},"Check the URL is exactly ",[145,11562,4619],{},". Generate a new key if needed.",[4595,11565,11566,11571,11574],{},[4610,11567,11568],{},[145,11569,11570],{},"Navigation timeout exceeded",[4610,11572,11573],{},"The target page is slow or unreachable from a datacentre IP.",[4610,11575,11576,11577,11580],{},"Increase the timeout: ",[145,11578,11579],{},"page.goto(url, { timeout: 60_000 })",". For sites that block datacentre IPs, this won't help, the page is simply unreachable.",[4595,11582,11583,11588,11591],{},[4610,11584,11585],{},[145,11586,11587],{},"No element found for selector",[4610,11589,11590],{},"The selector doesn't match anything on the page, or the element hasn't rendered yet.",[4610,11592,2487,11593,11596],{},[145,11594,11595],{},"page.waitForSelector(selector)"," before clicking or typing.",[4595,11598,11599,11604,11607],{},[4610,11600,11601],{},[145,11602,11603],{},"Browser has disconnected",[4610,11605,11606],{},"Your session timed out, was closed by the server, or the API key was rotated mid-session.",[4610,11608,11609,11610,11612],{},"Reconnect with a fresh ",[145,11611,4650],{},". Wrap long-running scripts in retry logic.",[107,11614,11616],{"id":11615},"always-retry-on","Always retry on",[112,11618],{},[26,11620,11621],{},"A small number of error categories are safe to retry blindly with exponential backoff:",[186,11623,11624,11630,11635],{},[189,11625,11626,11627,11629],{},"HTTP ",[145,11628,7609],{}," (rate limited).",[189,11631,11626,11632,11634],{},[145,11633,11276],{}," (transient server error).",[189,11636,11637],{},"WebSocket connection drops on the CDP endpoint that aren't due to an invalid key.",[107,11639,11641],{"id":11640},"never-retry-on","Never retry on",[112,11643],{},[26,11645,11646],{},"These won't get better with retries, treat them as permanent failures and surface to your application:",[186,11648,11649,11654,11659,11664],{},[189,11650,11626,11651,11653],{},[145,11652,11205],{}," (your request is malformed, fix the request).",[189,11655,11626,11656,11658],{},[145,11657,11218],{}," (the key is invalid, rotate and update).",[189,11660,11626,11661,11663],{},[145,11662,11233],{}," (out of quota, wait or upgrade).",[189,11665,11626,11666,11668],{},[145,11667,11246],{}," (the automation or run doesn't exist, fix the reference).",[107,11670,4513],{"id":4512},[112,11672],{},[186,11674,11675,11679],{},[189,11676,11677],{},[659,11678,11144],{"href":7601},[189,11680,11681],{},[659,11682,10849],{"href":5304},{"title":67,"searchDepth":68,"depth":68,"links":11684},[11685,11686,11687,11688,11689,11690,11691],{"id":11167,"depth":670,"text":11168},{"id":11285,"depth":670,"text":11286},{"id":11430,"depth":670,"text":11431},{"id":11523,"depth":670,"text":11524},{"id":11615,"depth":670,"text":11616},{"id":11640,"depth":670,"text":11641},{"id":4512,"depth":670,"text":4513},"Every axiom.ai API error response, what it means, and how to resolve it.",{"metaTitle":11694},"axiom.ai API error codes and how to fix them",{"title":5311,"description":11692},"docs\u002Fdeveloper-hub\u002Fapi\u002Freference\u002Ferrorcodes","dcEM5pwG3N3YPs5eXzSDSE2C2Oj6_s0HxmWOgWG48lc",{"id":11699,"title":5535,"body":11700,"date":71,"description":11738,"extension":73,"meta":11739,"navigation":75,"order":2637,"path":5534,"seo":11741,"stem":11742,"__hash__":11743},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Freference\u002Findex.md",{"type":8,"value":11701,"toc":11735},[11702,11713,11722,11724,11726,11728],[26,11703,11704,11705,11707,11708,11710,11711,2679],{},"The Reference section is the dev-lookup view of the axiom.ai API. Use it when you already know what you're looking for and just need the signature: a method and path on the ",[659,11706,10849],{"href":5304}," page, an HTTP status or error string on the ",[659,11709,5311],{"href":5310}," page, or the schema of the input array on the ",[659,11712,10425],{"href":10843},[26,11714,11715,11716,6205,11719,148],{},"For tutorials and worked examples, see the per-endpoint pages under ",[659,11717,11718],{"href":4580},"Run automations",[659,11720,11721],{"href":4575},"Browser sessions",[107,11723,7725],{"id":7724},[112,11725],{},[2218,11727],{":by-order":1548},[26,11729,2222,11730,2226,11732,148],{},[659,11731,2225],{"href":1887},[659,11733,2231],{"href":2229,"rel":11734},[1218],{"title":67,"searchDepth":68,"depth":68,"links":11736},[11737],{"id":7724,"depth":670,"text":7725},"Lookup tables for every axiom.ai API endpoint, every error response, and the data payload schema used by triggers.",{"metaTitle":11740},"axiom.ai API reference for endpoints, errors, and payloads",{"title":5535,"description":11738},"docs\u002Fdeveloper-hub\u002Fapi\u002Freference\u002Findex","3ZNPutkkkzzFzHy1jW2495G5axQJOGphf0LfRwAdac8",{"id":11745,"title":10071,"body":11746,"date":71,"description":12476,"extension":73,"meta":12477,"navigation":75,"order":670,"path":10070,"seo":12479,"stem":12480,"__hash__":12481},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Freference\u002Fresponses.md",{"type":8,"value":11747,"toc":12463},[11748,11754,11757,11759,11762,11766,11786,11789,11793,11823,11828,11832,11862,11871,11874,11876,11945,11951,11954,11956,12013,12027,12030,12032,12150,12167,12170,12172,12255,12275,12279,12281,12287,12441,12443,12445,12460],[26,11749,11750,11751,11753],{},"Every axiom.ai API endpoint returns JSON. Successful responses always include the data the endpoint promised. Queued and error responses use a ",[145,11752,8624],{}," field so your code can branch on it cleanly. The full set of shapes is below, grouped by endpoint.",[107,11755,4467],{"id":11756},"trigger",[112,11758],{},[26,11760,11761],{},"Three possible responses. Inspect the keys to know which one you got.",[21,11763,11765],{"id":11764},"success-run-started","Success: run started",[2446,11767,11768],{"className":6112,"code":9968,"language":5926,"meta":67,"style":67},[145,11769,11770,11774,11782],{"__ignoreMap":67},[1332,11771,11772],{"class":2455,"line":2131},[1332,11773,6120],{"class":2521},[1332,11775,11776,11778,11780],{"class":2455,"line":670},[1332,11777,9979],{"class":6125},[1332,11779,5260],{"class":2521},[1332,11781,9984],{"class":2462},[1332,11783,11784],{"class":2455,"line":68},[1332,11785,2802],{"class":2521},[26,11787,11788],{},"The link opens a live noVNC view of the cloud browser.",[21,11790,11792],{"id":11791},"queued-waiting-for-a-concurrency-slot","Queued: waiting for a concurrency slot",[2446,11794,11795],{"className":6112,"code":9997,"language":5926,"meta":67,"style":67},[145,11796,11797,11801,11811,11819],{"__ignoreMap":67},[1332,11798,11799],{"class":2455,"line":2131},[1332,11800,6120],{"class":2521},[1332,11802,11803,11805,11807,11809],{"class":2455,"line":670},[1332,11804,10008],{"class":6125},[1332,11806,5260],{"class":2521},[1332,11808,10013],{"class":2462},[1332,11810,6024],{"class":2521},[1332,11812,11813,11815,11817],{"class":2455,"line":68},[1332,11814,10020],{"class":6125},[1332,11816,5260],{"class":2521},[1332,11818,10025],{"class":2462},[1332,11820,11821],{"class":2455,"line":1478},[1332,11822,2802],{"class":2521},[26,11824,6104,11825,11827],{},[659,11826,5287],{"href":5286}," for how queueing works.",[21,11829,11831],{"id":11830},"error-run-did-not-start","Error: run did not start",[2446,11833,11834],{"className":6112,"code":10035,"language":5926,"meta":67,"style":67},[145,11835,11836,11840,11850,11858],{"__ignoreMap":67},[1332,11837,11838],{"class":2455,"line":2131},[1332,11839,6120],{"class":2521},[1332,11841,11842,11844,11846,11848],{"class":2455,"line":670},[1332,11843,10008],{"class":6125},[1332,11845,5260],{"class":2521},[1332,11847,10050],{"class":2462},[1332,11849,6024],{"class":2521},[1332,11851,11852,11854,11856],{"class":2455,"line":68},[1332,11853,10020],{"class":6125},[1332,11855,5260],{"class":2521},[1332,11857,10061],{"class":2462},[1332,11859,11860],{"class":2455,"line":1478},[1332,11861,2802],{"class":2521},[26,11863,11864,11865,11868,11869,148],{},"Common ",[145,11866,11867],{},"message"," values are listed in ",[659,11870,5311],{"href":5310},[107,11872,4480],{"id":11873},"remaining-runtime",[112,11875],{},[2446,11877,11879],{"className":6112,"code":11878,"language":5926,"meta":67,"style":67},"{\n  \"status\": \"success\",\n  \"data\": {\n    \"used\": 0.47,\n    \"allowance\": 15000,\n    \"remaining\": 14999.53\n  }\n}\n",[145,11880,11881,11885,11896,11903,11915,11927,11937,11941],{"__ignoreMap":67},[1332,11882,11883],{"class":2455,"line":2131},[1332,11884,6120],{"class":2521},[1332,11886,11887,11889,11891,11894],{"class":2455,"line":670},[1332,11888,10008],{"class":6125},[1332,11890,5260],{"class":2521},[1332,11892,11893],{"class":2462},"\"success\"",[1332,11895,6024],{"class":2521},[1332,11897,11898,11901],{"class":2455,"line":68},[1332,11899,11900],{"class":6125},"  \"data\"",[1332,11902,6129],{"class":2521},[1332,11904,11905,11908,11910,11913],{"class":2455,"line":1478},[1332,11906,11907],{"class":6125},"    \"used\"",[1332,11909,5260],{"class":2521},[1332,11911,11912],{"class":2511},"0.47",[1332,11914,6024],{"class":2521},[1332,11916,11917,11920,11922,11925],{"class":2455,"line":293},[1332,11918,11919],{"class":6125},"    \"allowance\"",[1332,11921,5260],{"class":2521},[1332,11923,11924],{"class":2511},"15000",[1332,11926,6024],{"class":2521},[1332,11928,11929,11932,11934],{"class":2455,"line":2237},[1332,11930,11931],{"class":6125},"    \"remaining\"",[1332,11933,5260],{"class":2521},[1332,11935,11936],{"class":2511},"14999.53\n",[1332,11938,11939],{"class":2455,"line":2623},[1332,11940,6194],{"class":2521},[1332,11942,11943],{"class":2455,"line":2637},[1332,11944,2802],{"class":2521},[26,11946,11947,11948,11950],{},"All values are in minutes. See ",[659,11949,4540],{"href":4539}," for field descriptions.",[107,11952,10931],{"id":11953},"list-automations",[112,11955],{},[2446,11957,11959],{"className":6112,"code":11958,"language":5926,"meta":67,"style":67},"{\n  \"status\": \"success\",\n  \"data\": {\n    \"names\": [\n      \"Automation 1\",\n      \"Automation 2\"\n    ]\n  }\n}\n",[145,11960,11961,11965,11975,11981,11988,11995,12000,12005,12009],{"__ignoreMap":67},[1332,11962,11963],{"class":2455,"line":2131},[1332,11964,6120],{"class":2521},[1332,11966,11967,11969,11971,11973],{"class":2455,"line":670},[1332,11968,10008],{"class":6125},[1332,11970,5260],{"class":2521},[1332,11972,11893],{"class":2462},[1332,11974,6024],{"class":2521},[1332,11976,11977,11979],{"class":2455,"line":68},[1332,11978,11900],{"class":6125},[1332,11980,6129],{"class":2521},[1332,11982,11983,11986],{"class":2455,"line":1478},[1332,11984,11985],{"class":6125},"    \"names\"",[1332,11987,10506],{"class":2521},[1332,11989,11990,11993],{"class":2455,"line":293},[1332,11991,11992],{"class":2462},"      \"Automation 1\"",[1332,11994,6024],{"class":2521},[1332,11996,11997],{"class":2455,"line":2237},[1332,11998,11999],{"class":2462},"      \"Automation 2\"\n",[1332,12001,12002],{"class":2455,"line":2623},[1332,12003,12004],{"class":2521},"    ]\n",[1332,12006,12007],{"class":2455,"line":2637},[1332,12008,6194],{"class":2521},[1332,12010,12011],{"class":2455,"line":2642},[1332,12012,2802],{"class":2521},[26,12014,12015,12018,12019,12021,12022,12024,12025,148],{},[145,12016,12017],{},"names"," are the exact strings you pass to ",[145,12020,4467],{}," as the ",[145,12023,6802],{}," parameter. See ",[659,12026,10943],{"href":10942},[107,12028,10954],{"id":12029},"run-reports",[112,12031],{},[2446,12033,12035],{"className":6112,"code":12034,"language":5926,"meta":67,"style":67},"{\n  \"status\": \"success\",\n  \"data\": {\n    \"reports\": [\n      {\n        \"task_name\": \"Automation Name\",\n        \"status\": \"Success\",\n        \"description\": \"Execution started with Axiom cloud version 4.6.0 (remotely triggered)\\n\\nAxiom run completed successfully!\",\n        \"created_at\": \"2025-04-10T15:14:51.000000Z\",\n        \"updated_at\": \"2025-04-10T15:15:00.000000Z\"\n      }\n    ]\n  }\n}\n",[145,12036,12037,12041,12051,12057,12064,12069,12081,12093,12111,12123,12133,12138,12142,12146],{"__ignoreMap":67},[1332,12038,12039],{"class":2455,"line":2131},[1332,12040,6120],{"class":2521},[1332,12042,12043,12045,12047,12049],{"class":2455,"line":670},[1332,12044,10008],{"class":6125},[1332,12046,5260],{"class":2521},[1332,12048,11893],{"class":2462},[1332,12050,6024],{"class":2521},[1332,12052,12053,12055],{"class":2455,"line":68},[1332,12054,11900],{"class":6125},[1332,12056,6129],{"class":2521},[1332,12058,12059,12062],{"class":2455,"line":1478},[1332,12060,12061],{"class":6125},"    \"reports\"",[1332,12063,10506],{"class":2521},[1332,12065,12066],{"class":2455,"line":293},[1332,12067,12068],{"class":2521},"      {\n",[1332,12070,12071,12074,12076,12079],{"class":2455,"line":2237},[1332,12072,12073],{"class":6125},"        \"task_name\"",[1332,12075,5260],{"class":2521},[1332,12077,12078],{"class":2462},"\"Automation Name\"",[1332,12080,6024],{"class":2521},[1332,12082,12083,12086,12088,12091],{"class":2455,"line":2623},[1332,12084,12085],{"class":6125},"        \"status\"",[1332,12087,5260],{"class":2521},[1332,12089,12090],{"class":2462},"\"Success\"",[1332,12092,6024],{"class":2521},[1332,12094,12095,12098,12100,12103,12106,12109],{"class":2455,"line":2637},[1332,12096,12097],{"class":6125},"        \"description\"",[1332,12099,5260],{"class":2521},[1332,12101,12102],{"class":2462},"\"Execution started with Axiom cloud version 4.6.0 (remotely triggered)",[1332,12104,12105],{"class":2507},"\\n\\n",[1332,12107,12108],{"class":2462},"Axiom run completed successfully!\"",[1332,12110,6024],{"class":2521},[1332,12112,12113,12116,12118,12121],{"class":2455,"line":2642},[1332,12114,12115],{"class":6125},"        \"created_at\"",[1332,12117,5260],{"class":2521},[1332,12119,12120],{"class":2462},"\"2025-04-10T15:14:51.000000Z\"",[1332,12122,6024],{"class":2521},[1332,12124,12125,12128,12130],{"class":2455,"line":2651},[1332,12126,12127],{"class":6125},"        \"updated_at\"",[1332,12129,5260],{"class":2521},[1332,12131,12132],{"class":2462},"\"2025-04-10T15:15:00.000000Z\"\n",[1332,12134,12135],{"class":2455,"line":2673},[1332,12136,12137],{"class":2521},"      }\n",[1332,12139,12140],{"class":2455,"line":2692},[1332,12141,12004],{"class":2521},[1332,12143,12144],{"class":2455,"line":2727},[1332,12145,6194],{"class":2521},[1332,12147,12148],{"class":2455,"line":2739},[1332,12149,2802],{"class":2521},[26,12151,12152,12153,12155,12156,4468,12158,10147,12160,12162,12163,12024,12165,148],{},"Reports are sorted most-recent first. ",[145,12154,8624],{}," is one of ",[145,12157,10143],{},[145,12159,10146],{},[145,12161,10150],{},". Default is 5 reports, override with the optional ",[145,12164,10963],{},[659,12166,10969],{"href":10968},[107,12168,4474],{"id":12169},"run-data",[112,12171],{},[2446,12173,12175],{"className":6112,"code":12174,"language":5926,"meta":67,"style":67},"{\n  \"status\": \"Success\",\n  \"data\": {\n    \"google-sheet-data\": [\n      [\"A1\", \"B1\", \"C1\"],\n      [\"A2\", \"B2\", \"C2\"]\n    ]\n  }\n}\n",[145,12176,12177,12181,12191,12197,12204,12224,12243,12247,12251],{"__ignoreMap":67},[1332,12178,12179],{"class":2455,"line":2131},[1332,12180,6120],{"class":2521},[1332,12182,12183,12185,12187,12189],{"class":2455,"line":670},[1332,12184,10008],{"class":6125},[1332,12186,5260],{"class":2521},[1332,12188,12090],{"class":2462},[1332,12190,6024],{"class":2521},[1332,12192,12193,12195],{"class":2455,"line":68},[1332,12194,11900],{"class":6125},[1332,12196,6129],{"class":2521},[1332,12198,12199,12202],{"class":2455,"line":1478},[1332,12200,12201],{"class":6125},"    \"google-sheet-data\"",[1332,12203,10506],{"class":2521},[1332,12205,12206,12209,12212,12214,12217,12219,12222],{"class":2455,"line":293},[1332,12207,12208],{"class":2521},"      [",[1332,12210,12211],{"class":2462},"\"A1\"",[1332,12213,4468],{"class":2521},[1332,12215,12216],{"class":2462},"\"B1\"",[1332,12218,4468],{"class":2521},[1332,12220,12221],{"class":2462},"\"C1\"",[1332,12223,6167],{"class":2521},[1332,12225,12226,12228,12231,12233,12236,12238,12241],{"class":2455,"line":2237},[1332,12227,12208],{"class":2521},[1332,12229,12230],{"class":2462},"\"A2\"",[1332,12232,4468],{"class":2521},[1332,12234,12235],{"class":2462},"\"B2\"",[1332,12237,4468],{"class":2521},[1332,12239,12240],{"class":2462},"\"C2\"",[1332,12242,5164],{"class":2521},[1332,12244,12245],{"class":2455,"line":2623},[1332,12246,12004],{"class":2521},[1332,12248,12249],{"class":2455,"line":2637},[1332,12250,6194],{"class":2521},[1332,12252,12253],{"class":2455,"line":2642},[1332,12254,2802],{"class":2521},[26,12256,12257,12155,12259,4468,12261,10147,12263,12265,12266,12268,12269,12272,12273,148],{},[145,12258,8624],{},[145,12260,10143],{},[145,12262,10146],{},[145,12264,10150],{},". ",[145,12267,580],{}," is an object keyed by the token name of each writer step (typically a Google Sheet). Each value is a 2D ",[145,12270,12271],{},"[row][col]"," array of what the step wrote. See ",[659,12274,10992],{"href":7368},[107,12276,12278],{"id":12277},"reading-any-response","Reading any response",[112,12280],{},[26,12282,12283,12284,12286],{},"A robust client checks for the ",[145,12285,8624],{}," field first:",[2446,12288,12290],{"className":2962,"code":12289,"language":2964,"meta":67,"style":67},"const data = await res.json();\n\nif (data.status === \"error\") {\n  throw new Error(data.message);\n}\nif (data.status === \"queued\") {\n  console.log(\"Queued:\", data.message);\n  return;\n}\nif (data.status === \"success\") {\n  return data.data;\n}\n\n\u002F\u002F \u002Ftrigger success has no `status` field, just the viewer link.\nif (data[\"OPEN LINK IN BROWSER\"]) {\n  return data[\"OPEN LINK IN BROWSER\"];\n}\n",[145,12291,12292,12309,12313,12327,12339,12343,12356,12370,12376,12380,12393,12400,12404,12408,12413,12426,12437],{"__ignoreMap":67},[1332,12293,12294,12296,12299,12301,12303,12305,12307],{"class":2455,"line":2131},[1332,12295,2508],{"class":2507},[1332,12297,12298],{"class":2511}," data",[1332,12300,2515],{"class":2507},[1332,12302,2518],{"class":2507},[1332,12304,6559],{"class":2521},[1332,12306,5926],{"class":2525},[1332,12308,2670],{"class":2521},[1332,12310,12311],{"class":2455,"line":670},[1332,12312,2588],{"emptyLinePlaceholder":75},[1332,12314,12315,12317,12320,12322,12325],{"class":2455,"line":68},[1332,12316,6072],{"class":2507},[1332,12318,12319],{"class":2521}," (data.status ",[1332,12321,9291],{"class":2507},[1332,12323,12324],{"class":2462}," \"error\"",[1332,12326,6473],{"class":2521},[1332,12328,12329,12332,12334,12336],{"class":2455,"line":1478},[1332,12330,12331],{"class":2507},"  throw",[1332,12333,2697],{"class":2507},[1332,12335,6440],{"class":2525},[1332,12337,12338],{"class":2521},"(data.message);\n",[1332,12340,12341],{"class":2455,"line":293},[1332,12342,2802],{"class":2521},[1332,12344,12345,12347,12349,12351,12354],{"class":2455,"line":2237},[1332,12346,6072],{"class":2507},[1332,12348,12319],{"class":2521},[1332,12350,9291],{"class":2507},[1332,12352,12353],{"class":2462}," \"queued\"",[1332,12355,6473],{"class":2521},[1332,12357,12358,12360,12362,12364,12367],{"class":2455,"line":2623},[1332,12359,3405],{"class":2521},[1332,12361,2575],{"class":2525},[1332,12363,1213],{"class":2521},[1332,12365,12366],{"class":2462},"\"Queued:\"",[1332,12368,12369],{"class":2521},", data.message);\n",[1332,12371,12372,12374],{"class":2455,"line":2637},[1332,12373,6556],{"class":2507},[1332,12375,4673],{"class":2521},[1332,12377,12378],{"class":2455,"line":2642},[1332,12379,2802],{"class":2521},[1332,12381,12382,12384,12386,12388,12391],{"class":2455,"line":2651},[1332,12383,6072],{"class":2507},[1332,12385,12319],{"class":2521},[1332,12387,9291],{"class":2507},[1332,12389,12390],{"class":2462}," \"success\"",[1332,12392,6473],{"class":2521},[1332,12394,12395,12397],{"class":2455,"line":2673},[1332,12396,6556],{"class":2507},[1332,12398,12399],{"class":2521}," data.data;\n",[1332,12401,12402],{"class":2455,"line":2692},[1332,12403,2802],{"class":2521},[1332,12405,12406],{"class":2455,"line":2727},[1332,12407,2588],{"emptyLinePlaceholder":75},[1332,12409,12410],{"class":2455,"line":2739},[1332,12411,12412],{"class":2609},"\u002F\u002F \u002Ftrigger success has no `status` field, just the viewer link.\n",[1332,12414,12415,12417,12420,12423],{"class":2455,"line":2750},[1332,12416,6072],{"class":2507},[1332,12418,12419],{"class":2521}," (data[",[1332,12421,12422],{"class":2462},"\"OPEN LINK IN BROWSER\"",[1332,12424,12425],{"class":2521},"]) {\n",[1332,12427,12428,12430,12433,12435],{"class":2455,"line":2765},[1332,12429,6556],{"class":2507},[1332,12431,12432],{"class":2521}," data[",[1332,12434,12422],{"class":2462},[1332,12436,4931],{"class":2521},[1332,12438,12439],{"class":2455,"line":2777},[1332,12440,2802],{"class":2521},[107,12442,4513],{"id":4512},[112,12444],{},[186,12446,12447,12451,12455],{},[189,12448,12449],{},[659,12450,10849],{"href":5304},[189,12452,12453],{},[659,12454,5311],{"href":5310},[189,12456,12457],{},[659,12458,12459],{"href":10843},"Data payload",[2819,12461,12462],{},"html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}",{"title":67,"searchDepth":68,"depth":68,"links":12464},[12465,12470,12471,12472,12473,12474,12475],{"id":11756,"depth":670,"text":4467,"children":12466},[12467,12468,12469],{"id":11764,"depth":68,"text":11765},{"id":11791,"depth":68,"text":11792},{"id":11830,"depth":68,"text":11831},{"id":11873,"depth":670,"text":4480},{"id":11953,"depth":670,"text":10931},{"id":12029,"depth":670,"text":10954},{"id":12169,"depth":670,"text":4474},{"id":12277,"depth":670,"text":12278},{"id":4512,"depth":670,"text":4513},"Every JSON response shape returned by the axiom.ai API, including success, queued, and error variants.",{"metaTitle":12478},"axiom.ai API response shapes for every endpoint",{"title":10071,"description":12476},"docs\u002Fdeveloper-hub\u002Fapi\u002Freference\u002Fresponses","AvjG2J5QwvxzBFGRGZG4WbZByhF22UhyA1VgCNE3sXg",{"id":12483,"title":10992,"body":12484,"date":71,"description":13129,"extension":73,"meta":13130,"navigation":75,"order":1478,"path":7368,"seo":13132,"stem":13133,"__hash__":13134},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Fcheck-run-status.md",{"type":8,"value":12485,"toc":13118},[12486,12499,12503,12505,12516,12568,12572,12606,12610,12612,12686,12731,12735,12781,12785,12787,12829,12832,13034,13038,13040,13046,13050,13052,13065,13067,13069,13115],[26,12487,2273,12488,12490,12491,12493,12494,12498],{},[145,12489,4474],{}," endpoint returns the current status of an automation and any data it wrote out (for example, rows added to a Google Sheet, or values returned from a custom JavaScript step). Identify the run by the automation's ",[145,12492,6802],{},", the same string you pass to ",[659,12495,12496],{"href":4527},[145,12497,4467],{},". Poll this endpoint after triggering to know when the run is finished.",[107,12500,12502],{"id":12501},"request","Request",[112,12504],{},[2446,12506,12510],{"className":12507,"code":12508,"language":12509,"meta":67,"style":67},"language-http shiki shiki-themes github-light-default github-dark-default","POST \u002Fapi\u002Fv3\u002Frun-data\n","http",[145,12511,12512],{"__ignoreMap":67},[1332,12513,12514],{"class":2455,"line":2131},[1332,12515,12508],{},[4589,12517,12518,12533],{},[4592,12519,12520],{},[4595,12521,12522,12525,12528,12530],{},[4598,12523,12524],{},"Parameter",[4598,12526,12527],{},"Type",[4598,12529,8403],{},[4598,12531,12532],{},"Description",[4605,12534,12535,12550],{},[4595,12536,12537,12541,12543,12545],{},[4610,12538,12539],{},[145,12540,4359],{},[4610,12542,6750],{},[4610,12544,10771],{},[4610,12546,12547,12548,148],{},"Your API key. See ",[659,12549,4211],{"href":4558},[4595,12551,12552,12556,12558,12560],{},[4610,12553,12554],{},[145,12555,6802],{},[4610,12557,6750],{},[4610,12559,10771],{},[4610,12561,12562,12563,12565,12566,148],{},"Exact name of the automation, as it appears in the ",[192,12564,2836],{},". Case-sensitive and whitespace-sensitive. Same string you pass to ",[145,12567,4467],{},[107,12569,12571],{"id":12570},"request-payload","Request payload",[2446,12573,12575],{"className":6112,"code":12574,"language":5926,"meta":67,"style":67},"{\n  \"key\": \"\u003CAPI_KEY>\",\n  \"name\": \"\u003CAUTOMATION_NAME>\"\n}\n",[145,12576,12577,12581,12593,12602],{"__ignoreMap":67},[1332,12578,12579],{"class":2455,"line":2131},[1332,12580,6120],{"class":2521},[1332,12582,12583,12586,12588,12591],{"class":2455,"line":670},[1332,12584,12585],{"class":6125},"  \"key\"",[1332,12587,5260],{"class":2521},[1332,12589,12590],{"class":2462},"\"\u003CAPI_KEY>\"",[1332,12592,6024],{"class":2521},[1332,12594,12595,12597,12599],{"class":2455,"line":68},[1332,12596,8544],{"class":6125},[1332,12598,5260],{"class":2521},[1332,12600,12601],{"class":2462},"\"\u003CAUTOMATION_NAME>\"\n",[1332,12603,12604],{"class":2455,"line":1478},[1332,12605,2802],{"class":2521},[107,12607,12609],{"id":12608},"response","Response",[112,12611],{},[2446,12613,12614],{"className":6112,"code":12174,"language":5926,"meta":67,"style":67},[145,12615,12616,12620,12630,12636,12642,12658,12674,12678,12682],{"__ignoreMap":67},[1332,12617,12618],{"class":2455,"line":2131},[1332,12619,6120],{"class":2521},[1332,12621,12622,12624,12626,12628],{"class":2455,"line":670},[1332,12623,10008],{"class":6125},[1332,12625,5260],{"class":2521},[1332,12627,12090],{"class":2462},[1332,12629,6024],{"class":2521},[1332,12631,12632,12634],{"class":2455,"line":68},[1332,12633,11900],{"class":6125},[1332,12635,6129],{"class":2521},[1332,12637,12638,12640],{"class":2455,"line":1478},[1332,12639,12201],{"class":6125},[1332,12641,10506],{"class":2521},[1332,12643,12644,12646,12648,12650,12652,12654,12656],{"class":2455,"line":293},[1332,12645,12208],{"class":2521},[1332,12647,12211],{"class":2462},[1332,12649,4468],{"class":2521},[1332,12651,12216],{"class":2462},[1332,12653,4468],{"class":2521},[1332,12655,12221],{"class":2462},[1332,12657,6167],{"class":2521},[1332,12659,12660,12662,12664,12666,12668,12670,12672],{"class":2455,"line":2237},[1332,12661,12208],{"class":2521},[1332,12663,12230],{"class":2462},[1332,12665,4468],{"class":2521},[1332,12667,12235],{"class":2462},[1332,12669,4468],{"class":2521},[1332,12671,12240],{"class":2462},[1332,12673,5164],{"class":2521},[1332,12675,12676],{"class":2455,"line":2623},[1332,12677,12004],{"class":2521},[1332,12679,12680],{"class":2455,"line":2637},[1332,12681,6194],{"class":2521},[1332,12683,12684],{"class":2455,"line":2642},[1332,12685,2802],{"class":2521},[4589,12687,12688,12698],{},[4592,12689,12690],{},[4595,12691,12692,12694,12696],{},[4598,12693,8400],{},[4598,12695,12527],{},[4598,12697,12532],{},[4605,12699,12700,12717],{},[4595,12701,12702,12706,12708],{},[4610,12703,12704],{},[145,12705,8624],{},[4610,12707,6750],{},[4610,12709,12710,12711,4468,12713,10147,12715,148],{},"One of ",[145,12712,10143],{},[145,12714,10146],{},[145,12716,10150],{},[4595,12718,12719,12723,12726],{},[4610,12720,12721],{},[145,12722,580],{},[4610,12724,12725],{},"object",[4610,12727,12728,12729,148],{},"Data the automation wrote out, keyed by the token name of each Google Sheet (or other writer step). Each value is a 2D array of ",[145,12730,12271],{},[21,12732,12734],{"id":12733},"status-values","Status values",[4589,12736,12737,12746],{},[4592,12738,12739],{},[4595,12740,12741,12744],{},[4598,12742,12743],{},"Value",[4598,12745,8813],{},[4605,12747,12748,12757,12769],{},[4595,12749,12750,12754],{},[4610,12751,12752],{},[145,12753,10143],{},[4610,12755,12756],{},"The run is in the queue or actively executing.",[4595,12758,12759,12763],{},[4610,12760,12761],{},[145,12762,10146],{},[4610,12764,12765,12766,12768],{},"The run completed without errors. The ",[145,12767,580],{}," field contains any output.",[4595,12770,12771,12775],{},[4610,12772,12773],{},[145,12774,10150],{},[4610,12776,12777,12778,12780],{},"The run hit an error and stopped. Check the run report in the ",[192,12779,2836],{}," for details.",[107,12782,12784],{"id":12783},"example","Example",[112,12786],{},[2446,12788,12789],{"className":2448,"code":10093,"language":2450,"meta":67,"style":67},[145,12790,12791,12803,12811,12817,12821,12825],{"__ignoreMap":67},[1332,12792,12793,12795,12797,12799,12801],{"class":2455,"line":2131},[1332,12794,4370],{"class":2458},[1332,12796,4373],{"class":2511},[1332,12798,4376],{"class":2462},[1332,12800,10106],{"class":2462},[1332,12802,4382],{"class":2507},[1332,12804,12805,12807,12809],{"class":2455,"line":670},[1332,12806,4387],{"class":2511},[1332,12808,4390],{"class":2462},[1332,12810,4382],{"class":2507},[1332,12812,12813,12815],{"class":2455,"line":68},[1332,12814,4397],{"class":2511},[1332,12816,8346],{"class":2462},[1332,12818,12819],{"class":2455,"line":1478},[1332,12820,9919],{"class":2462},[1332,12822,12823],{"class":2455,"line":293},[1332,12824,9924],{"class":2462},[1332,12826,12827],{"class":2455,"line":2237},[1332,12828,8391],{"class":2462},[26,12830,12831],{},"A typical polling loop:",[2446,12833,12835],{"className":2962,"code":12834,"language":2964,"meta":67,"style":67},"async function waitForRun(name, key) {\n  while (true) {\n    const res = await fetch(\"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Frun-data\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\u002Fjson\" },\n      body: JSON.stringify({ key, name }),\n    });\n    const result = await res.json();\n\n    if (result.status === \"Success\") return result.data;\n    if (result.status === \"Failure\") throw new Error(\"Run failed\");\n\n    await new Promise(r => setTimeout(r, 10_000)); \u002F\u002F poll every 10s\n  }\n}\n",[145,12836,12837,12856,12867,12886,12895,12909,12923,12927,12943,12947,12967,12993,12997,13026,13030],{"__ignoreMap":67},[1332,12838,12839,12841,12843,12846,12848,12850,12852,12854],{"class":2455,"line":2131},[1332,12840,3332],{"class":2507},[1332,12842,6458],{"class":2507},[1332,12844,12845],{"class":2525}," waitForRun",[1332,12847,1213],{"class":2521},[1332,12849,6802],{"class":2458},[1332,12851,4468],{"class":2521},[1332,12853,4359],{"class":2458},[1332,12855,6473],{"class":2521},[1332,12857,12858,12861,12863,12865],{"class":2455,"line":670},[1332,12859,12860],{"class":2507},"  while",[1332,12862,3842],{"class":2521},[1332,12864,1548],{"class":2511},[1332,12866,6473],{"class":2521},[1332,12868,12869,12871,12873,12875,12877,12879,12881,12884],{"class":2455,"line":68},[1332,12870,2654],{"class":2507},[1332,12872,6480],{"class":2511},[1332,12874,2515],{"class":2507},[1332,12876,2518],{"class":2507},[1332,12878,6487],{"class":2525},[1332,12880,1213],{"class":2521},[1332,12882,12883],{"class":2462},"\"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Frun-data\"",[1332,12885,6505],{"class":2521},[1332,12887,12888,12891,12893],{"class":2455,"line":1478},[1332,12889,12890],{"class":2521},"      method: ",[1332,12892,6513],{"class":2462},[1332,12894,6024],{"class":2521},[1332,12896,12897,12900,12903,12905,12907],{"class":2455,"line":293},[1332,12898,12899],{"class":2521},"      headers: { ",[1332,12901,12902],{"class":2462},"\"Content-Type\"",[1332,12904,5260],{"class":2521},[1332,12906,6528],{"class":2462},[1332,12908,6531],{"class":2521},[1332,12910,12911,12914,12916,12918,12920],{"class":2455,"line":2237},[1332,12912,12913],{"class":2521},"      body: ",[1332,12915,6539],{"class":2511},[1332,12917,148],{"class":2521},[1332,12919,6544],{"class":2525},[1332,12921,12922],{"class":2521},"({ key, name }),\n",[1332,12924,12925],{"class":2455,"line":2623},[1332,12926,3613],{"class":2521},[1332,12928,12929,12931,12933,12935,12937,12939,12941],{"class":2455,"line":2637},[1332,12930,2654],{"class":2507},[1332,12932,6857],{"class":2511},[1332,12934,2515],{"class":2507},[1332,12936,2518],{"class":2507},[1332,12938,6559],{"class":2521},[1332,12940,5926],{"class":2525},[1332,12942,2670],{"class":2521},[1332,12944,12945],{"class":2455,"line":2642},[1332,12946,2588],{"emptyLinePlaceholder":75},[1332,12948,12949,12951,12954,12956,12959,12961,12964],{"class":2455,"line":2651},[1332,12950,5840],{"class":2507},[1332,12952,12953],{"class":2521}," (result.status ",[1332,12955,9291],{"class":2507},[1332,12957,12958],{"class":2462}," \"Success\"",[1332,12960,2709],{"class":2521},[1332,12962,12963],{"class":2507},"return",[1332,12965,12966],{"class":2521}," result.data;\n",[1332,12968,12969,12971,12973,12975,12978,12980,12982,12984,12986,12988,12991],{"class":2455,"line":2673},[1332,12970,5840],{"class":2507},[1332,12972,12953],{"class":2521},[1332,12974,9291],{"class":2507},[1332,12976,12977],{"class":2462}," \"Failure\"",[1332,12979,2709],{"class":2521},[1332,12981,6435],{"class":2507},[1332,12983,2697],{"class":2507},[1332,12985,6440],{"class":2525},[1332,12987,1213],{"class":2521},[1332,12989,12990],{"class":2462},"\"Run failed\"",[1332,12992,2583],{"class":2521},[1332,12994,12995],{"class":2455,"line":2692},[1332,12996,2588],{"emptyLinePlaceholder":75},[1332,12998,12999,13001,13003,13005,13007,13010,13012,13014,13017,13020,13023],{"class":2455,"line":2727},[1332,13000,2676],{"class":2507},[1332,13002,2697],{"class":2507},[1332,13004,2700],{"class":2511},[1332,13006,1213],{"class":2521},[1332,13008,13009],{"class":2458},"r",[1332,13011,10271],{"class":2507},[1332,13013,2715],{"class":2525},[1332,13015,13016],{"class":2521},"(r, ",[1332,13018,13019],{"class":2511},"10_000",[1332,13021,13022],{"class":2521},")); ",[1332,13024,13025],{"class":2609},"\u002F\u002F poll every 10s\n",[1332,13027,13028],{"class":2455,"line":2739},[1332,13029,6194],{"class":2521},[1332,13031,13032],{"class":2455,"line":2750},[1332,13033,2802],{"class":2521},[107,13035,13037],{"id":13036},"polling-cadence","Polling cadence",[112,13039],{},[26,13041,13042,13043,13045],{},"Poll every 5 to 15 seconds for most automations. Faster polling won't make the run finish any quicker, and may trip ",[659,13044,7602],{"href":7601},". For long-running automations (those that take more than a few minutes), increase the interval to 30 seconds or use exponential backoff: start at 5 seconds, double each time, cap at 60.",[107,13047,13049],{"id":13048},"when-theres-no-completion-webhook","When there's no completion webhook",[112,13051],{},[26,13053,13054,13055,13057,13058,13064],{},"The API doesn't push a notification when a run finishes; polling ",[145,13056,4474],{}," is the only way to detect completion from outside. If you want a push-style notification, add a ",[659,13059,13061],{"href":13060},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Fwebhooks-from-a-step",[192,13062,13063],{},"Trigger webhook"," step inside the automation itself. The automation will POST to your URL when it reaches that step, which you can place at the end of the flow to get a \"done\" signal.",[107,13066,6276],{"id":6275},[112,13068],{},[186,13070,13071,13080,13091,13097,13110],{},[189,13072,13073,13075,13076,148],{},[145,13074,4474],{}," returns the status of the most recent run of an automation with the given name. To see runs further back in history, use ",[659,13077,13078],{"href":10968},[145,13079,10954],{},[189,13081,2273,13082,13084,13085,13087,13088,13090],{},[145,13083,580],{}," object is keyed by the token name of each writer step (most commonly a Google Sheet token). One automation can write to several sheets, in which case ",[145,13086,580],{}," has several keys. Each value is the 2D ",[145,13089,12271],{}," content of that sheet.",[189,13092,13093,13094,13096],{},"An automation that doesn't write any data returns ",[145,13095,580],{}," as an empty object.",[189,13098,13099,13100,13102,13103,13106,13107,13109],{},"A run that's been queued reports ",[145,13101,10143],{},", the same as a run that's actively executing. There's no separate ",[145,13104,13105],{},"Queued"," state today. See ",[659,13108,5287],{"href":5286}," for ways to tell the two apart.",[189,13111,13112,13113,148],{},"Names are matched exactly. Case and whitespace must match the ",[192,13114,2836],{},[2819,13116,13117],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}",{"title":67,"searchDepth":68,"depth":68,"links":13119},[13120,13121,13122,13125,13126,13127,13128],{"id":12501,"depth":670,"text":12502},{"id":12570,"depth":670,"text":12571},{"id":12608,"depth":670,"text":12609,"children":13123},[13124],{"id":12733,"depth":68,"text":12734},{"id":12783,"depth":670,"text":12784},{"id":13036,"depth":670,"text":13037},{"id":13048,"depth":670,"text":13049},{"id":6275,"depth":670,"text":6276},"Poll the axiom.ai API for the current status of an automation by name and retrieve any data it wrote out.",{"metaTitle":13131},"Check the status of an axiom.ai cloud automation run",{"title":10992,"description":13129},"docs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Fcheck-run-status","6f7hbfKUGG4tWd30xeT6bVQ8Fk2ppMh7OXnMz9G99TI",{"id":13136,"title":4581,"body":13137,"date":71,"description":13164,"extension":73,"meta":13165,"navigation":75,"order":2131,"path":4580,"seo":13167,"stem":13168,"__hash__":13169},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Findex.md",{"type":8,"value":13138,"toc":13161},[13139,13142,13148,13150,13152,13154],[26,13140,13141],{},"The Orchestrate API's endpoints let you fire any pre-built automation — code or no-code — from outside the Chrome extension, then track it through to completion. Use them to wire automations into your backend, into a Zapier or Make scenario, into an MCP server, or into anywhere else that can make an HTTP request.",[26,13143,13144,13145,13147],{},"This is the right layer when the workflow already exists in the No-Code Tool. If you'd rather author the flow in code, see the ",[659,13146,4576],{"href":4575}," — the layer below.",[107,13149,7725],{"id":7724},[112,13151],{},[2218,13153],{":by-order":1548},[26,13155,2222,13156,2226,13158,148],{},[659,13157,2225],{"href":1887},[659,13159,2231],{"href":2229,"rel":13160},[1218],{"title":67,"searchDepth":68,"depth":68,"links":13162},[13163],{"id":7724,"depth":670,"text":7725},"Trigger pre-built automations — code or no-code — pass input data, poll for results, and stop runs from outside the Chrome extension.",{"metaTitle":13166},"Orchestrate API — trigger axiom.ai automations from outside the Chrome extension",{"title":4581,"description":13164},"docs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Findex","ZNKkXfM-RaKxweYRfQci75zHcpELH__g0JAa6HYJYtU",{"id":13171,"title":10943,"body":13172,"date":71,"description":13538,"extension":73,"meta":13539,"navigation":75,"order":293,"path":10942,"seo":13541,"stem":13542,"__hash__":13543},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Flist-automations.md",{"type":8,"value":13173,"toc":13532},[13174,13182,13184,13186,13195,13225,13227,13229,13281,13323,13325,13327,13359,13362,13510,13512,13514,13529],[26,13175,2273,13176,13178,13179,13181],{},[145,13177,10931],{}," endpoint returns the names of every saved No-Code Tool automation on your account. Use it to populate a dropdown in your own UI, validate an automation name before calling ",[145,13180,4467],{},", or audit what's available to the integration.",[107,13183,12502],{"id":12501},[112,13185],{},[2446,13187,13189],{"className":12507,"code":13188,"language":12509,"meta":67,"style":67},"POST \u002Fapi\u002Fv3\u002Flist-automations\n",[145,13190,13191],{"__ignoreMap":67},[1332,13192,13193],{"class":2455,"line":2131},[1332,13194,13188],{},[4589,13196,13197,13209],{},[4592,13198,13199],{},[4595,13200,13201,13203,13205,13207],{},[4598,13202,12524],{},[4598,13204,12527],{},[4598,13206,8403],{},[4598,13208,12532],{},[4605,13210,13211],{},[4595,13212,13213,13217,13219,13221],{},[4610,13214,13215],{},[145,13216,4359],{},[4610,13218,6750],{},[4610,13220,10771],{},[4610,13222,12547,13223,148],{},[659,13224,4211],{"href":4558},[107,13226,12609],{"id":12608},[112,13228],{},[2446,13230,13231],{"className":6112,"code":11958,"language":5926,"meta":67,"style":67},[145,13232,13233,13237,13247,13253,13259,13265,13269,13273,13277],{"__ignoreMap":67},[1332,13234,13235],{"class":2455,"line":2131},[1332,13236,6120],{"class":2521},[1332,13238,13239,13241,13243,13245],{"class":2455,"line":670},[1332,13240,10008],{"class":6125},[1332,13242,5260],{"class":2521},[1332,13244,11893],{"class":2462},[1332,13246,6024],{"class":2521},[1332,13248,13249,13251],{"class":2455,"line":68},[1332,13250,11900],{"class":6125},[1332,13252,6129],{"class":2521},[1332,13254,13255,13257],{"class":2455,"line":1478},[1332,13256,11985],{"class":6125},[1332,13258,10506],{"class":2521},[1332,13260,13261,13263],{"class":2455,"line":293},[1332,13262,11992],{"class":2462},[1332,13264,6024],{"class":2521},[1332,13266,13267],{"class":2455,"line":2237},[1332,13268,11999],{"class":2462},[1332,13270,13271],{"class":2455,"line":2623},[1332,13272,12004],{"class":2521},[1332,13274,13275],{"class":2455,"line":2637},[1332,13276,6194],{"class":2521},[1332,13278,13279],{"class":2455,"line":2642},[1332,13280,2802],{"class":2521},[4589,13282,13283,13293],{},[4592,13284,13285],{},[4595,13286,13287,13289,13291],{},[4598,13288,8400],{},[4598,13290,12527],{},[4598,13292,12532],{},[4605,13294,13295,13309],{},[4595,13296,13297,13301,13303],{},[4610,13298,13299],{},[145,13300,8624],{},[4610,13302,6750],{},[4610,13304,13305,13308],{},[145,13306,13307],{},"success"," on a successful call, otherwise an error string.",[4595,13310,13311,13316,13318],{},[4610,13312,13313],{},[145,13314,13315],{},"data.names",[4610,13317,6761],{},[4610,13319,13320,13321,148],{},"Array of automation names, exactly as they appear in the ",[192,13322,2836],{},[107,13324,12784],{"id":12783},[112,13326],{},[2446,13328,13330],{"className":2448,"code":13329,"language":2450,"meta":67,"style":67},"curl -X POST https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Flist-automations \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"key\": \"your-api-key-here\"}'\n",[145,13331,13332,13345,13353],{"__ignoreMap":67},[1332,13333,13334,13336,13338,13340,13343],{"class":2455,"line":2131},[1332,13335,4370],{"class":2458},[1332,13337,4373],{"class":2511},[1332,13339,4376],{"class":2462},[1332,13341,13342],{"class":2462}," https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Flist-automations",[1332,13344,4382],{"class":2507},[1332,13346,13347,13349,13351],{"class":2455,"line":670},[1332,13348,4387],{"class":2511},[1332,13350,4390],{"class":2462},[1332,13352,4382],{"class":2507},[1332,13354,13355,13357],{"class":2455,"line":68},[1332,13356,4397],{"class":2511},[1332,13358,4400],{"class":2462},[26,13360,13361],{},"Use the returned names to drive an automation picker in your own application:",[2446,13363,13365],{"className":2962,"code":13364,"language":2964,"meta":67,"style":67},"const res = await fetch(\"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Flist-automations\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application\u002Fjson\" },\n  body: JSON.stringify({ key: process.env.AXIOM_API_KEY }),\n});\nconst { data } = await res.json();\n\nconsole.log(`You have ${data.names.length} automations available.`);\ndata.names.forEach(n => console.log(` - ${n}`));\n",[145,13366,13367,13386,13394,13406,13424,13428,13448,13452,13479],{"__ignoreMap":67},[1332,13368,13369,13371,13373,13375,13377,13379,13381,13384],{"class":2455,"line":2131},[1332,13370,2508],{"class":2507},[1332,13372,6480],{"class":2511},[1332,13374,2515],{"class":2507},[1332,13376,2518],{"class":2507},[1332,13378,6487],{"class":2525},[1332,13380,1213],{"class":2521},[1332,13382,13383],{"class":2462},"\"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Flist-automations\"",[1332,13385,6505],{"class":2521},[1332,13387,13388,13390,13392],{"class":2455,"line":670},[1332,13389,9611],{"class":2521},[1332,13391,6513],{"class":2462},[1332,13393,6024],{"class":2521},[1332,13395,13396,13398,13400,13402,13404],{"class":2455,"line":68},[1332,13397,9620],{"class":2521},[1332,13399,12902],{"class":2462},[1332,13401,5260],{"class":2521},[1332,13403,6528],{"class":2462},[1332,13405,6531],{"class":2521},[1332,13407,13408,13410,13412,13414,13416,13419,13421],{"class":2455,"line":1478},[1332,13409,9633],{"class":2521},[1332,13411,6539],{"class":2511},[1332,13413,148],{"class":2521},[1332,13415,6544],{"class":2525},[1332,13417,13418],{"class":2521},"({ key: process.env.",[1332,13420,4713],{"class":2511},[1332,13422,13423],{"class":2521}," }),\n",[1332,13425,13426],{"class":2455,"line":293},[1332,13427,2542],{"class":2521},[1332,13429,13430,13432,13434,13436,13438,13440,13442,13444,13446],{"class":2455,"line":2237},[1332,13431,2508],{"class":2507},[1332,13433,6595],{"class":2521},[1332,13435,580],{"class":2511},[1332,13437,6601],{"class":2521},[1332,13439,5110],{"class":2507},[1332,13441,2518],{"class":2507},[1332,13443,6559],{"class":2521},[1332,13445,5926],{"class":2525},[1332,13447,2670],{"class":2521},[1332,13449,13450],{"class":2455,"line":2623},[1332,13451,2588],{"emptyLinePlaceholder":75},[1332,13453,13454,13456,13458,13460,13463,13465,13467,13469,13471,13474,13477],{"class":2455,"line":2637},[1332,13455,2572],{"class":2521},[1332,13457,2575],{"class":2525},[1332,13459,1213],{"class":2521},[1332,13461,13462],{"class":2462},"`You have ${",[1332,13464,580],{"class":2521},[1332,13466,148],{"class":2462},[1332,13468,12017],{"class":2521},[1332,13470,148],{"class":2462},[1332,13472,13473],{"class":2511},"length",[1332,13475,13476],{"class":2462},"} automations available.`",[1332,13478,2583],{"class":2521},[1332,13480,13481,13484,13487,13489,13492,13494,13497,13499,13501,13504,13506,13508],{"class":2455,"line":2642},[1332,13482,13483],{"class":2521},"data.names.",[1332,13485,13486],{"class":2525},"forEach",[1332,13488,1213],{"class":2521},[1332,13490,13491],{"class":2458},"n",[1332,13493,10271],{"class":2507},[1332,13495,13496],{"class":2521}," console.",[1332,13498,2575],{"class":2525},[1332,13500,1213],{"class":2521},[1332,13502,13503],{"class":2462},"` - ${",[1332,13505,13491],{"class":2521},[1332,13507,6502],{"class":2462},[1332,13509,2724],{"class":2521},[107,13511,6276],{"id":6275},[112,13513],{},[186,13515,13516,13526],{},[189,13517,13518,13519,12021,13523,13525],{},"Names returned here are the exact strings to pass to ",[659,13520,13521],{"href":4527},[145,13522,4467],{},[145,13524,6802],{}," parameter. They're case-sensitive and whitespace-sensitive.",[189,13527,13528],{},"The list includes every automation saved to the cloud on your account, including ones you haven't run recently.",[2819,13530,13531],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}",{"title":67,"searchDepth":68,"depth":68,"links":13533},[13534,13535,13536,13537],{"id":12501,"depth":670,"text":12502},{"id":12608,"depth":670,"text":12609},{"id":12783,"depth":670,"text":12784},{"id":6275,"depth":670,"text":6276},"Fetch the names of every saved No-Code Tool automation on your account, useful for building UIs or validating an automation name before triggering it.",{"metaTitle":13540},"List all axiom.ai automations on an account",{"title":10943,"description":13538},"docs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Flist-automations","5aBQ5PF__Lv-Ax4g6RjupGMOlzdHXcT0e_JXQiRyuBM",{"id":13545,"title":10439,"body":13546,"date":71,"description":13947,"extension":73,"meta":13948,"navigation":75,"order":68,"path":10356,"seo":13950,"stem":13951,"__hash__":13952},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Fpass-input-data.md",{"type":8,"value":13547,"toc":13937},[13548,13556,13560,13562,13571,13577,13580,13626,13629,13633,13635,13641,13648,13652,13654,13661,13744,13751,13753,13755,13758,13832,13835,13837,13839,13842,13848,13852,13854,13886,13890,13892,13920,13922,13924,13934],[26,13549,2273,13550,13552,13553,13555],{},[145,13551,4467],{}," endpoint accepts an optional ",[145,13554,580],{}," field that's passed into the automation as if you'd uploaded a spreadsheet. This lets the same automation act on different inputs each time it runs, fetching different URLs, filling forms with different values, scraping different search terms, and so on.",[107,13557,13559],{"id":13558},"the-data-shape","The data shape",[112,13561],{},[26,13563,2273,13564,13566,13567,13570],{},[145,13565,580],{}," field is an ",[192,13568,13569],{},"array of tables",". Each table is an array of rows, and each row is an array of cell values. Three levels deep:",[2446,13572,13575],{"className":13573,"code":13574,"language":5402},[5400],"data\n└── tables (array)\n    └── rows (array)\n        └── cells (array of strings)\n",[145,13576,13574],{"__ignoreMap":67},[26,13578,13579],{},"A minimal payload with one table and one data row:",[2446,13581,13582],{"className":6112,"code":10497,"language":5926,"meta":67,"style":67},[145,13583,13584,13590,13594,13606,13618,13622],{"__ignoreMap":67},[1332,13585,13586,13588],{"class":2455,"line":2131},[1332,13587,5861],{"class":2462},[1332,13589,10506],{"class":2521},[1332,13591,13592],{"class":2455,"line":670},[1332,13593,10511],{"class":2521},[1332,13595,13596,13598,13600,13602,13604],{"class":2455,"line":68},[1332,13597,10516],{"class":2521},[1332,13599,10519],{"class":2462},[1332,13601,4468],{"class":2521},[1332,13603,10524],{"class":2462},[1332,13605,6167],{"class":2521},[1332,13607,13608,13610,13612,13614,13616],{"class":2455,"line":1478},[1332,13609,10516],{"class":2521},[1332,13611,10533],{"class":2462},[1332,13613,4468],{"class":2521},[1332,13615,10538],{"class":2462},[1332,13617,5164],{"class":2521},[1332,13619,13620],{"class":2455,"line":293},[1332,13621,10545],{"class":2521},[1332,13623,13624],{"class":2455,"line":2237},[1332,13625,5164],{"class":2521},[26,13627,13628],{},"The outermost array is the list of tables. Most automations only consume one table, but you can pass several if the automation reads from multiple sources.",[107,13630,13632],{"id":13631},"why-three-levels-deep","Why three levels deep",[112,13634],{},[26,13636,13637,13638,13640],{},"The shape mirrors how the No-Code Tool handles spreadsheets and CSVs internally. When you upload a Google Sheet to an automation in the ",[192,13639,10785],{},", you're handing it a table of rows and cells. The API just lets you skip the upload step, you pass the same shape directly.",[26,13642,13643,13644,13647],{},"This means you don't pass key-value objects like ",[145,13645,13646],{},"{ \"email\": \"x@y.com\" }",". You pass rows of values, and the automation's steps reference them positionally (column 1, column 2, and so on).",[107,13649,13651],{"id":13650},"a-complete-example","A complete example",[112,13653],{},[26,13655,13656,13657,13660],{},"An automation called ",[145,13658,13659],{},"Scrape product page"," that visits a list of URLs and writes results back to a Google Sheet:",[2446,13662,13664],{"className":2448,"code":13663,"language":2450,"meta":67,"style":67},"curl -X POST https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"key\": \"your-api-key-here\",\n    \"name\": \"Scrape product page\",\n    \"data\": [\n      [\n        [\"url\"],\n        [\"https:\u002F\u002Fexample.com\u002Fproduct\u002F1\"],\n        [\"https:\u002F\u002Fexample.com\u002Fproduct\u002F2\"],\n        [\"https:\u002F\u002Fexample.com\u002Fproduct\u002F3\"]\n      ]\n    ]\n  }'\n",[145,13665,13666,13678,13686,13692,13696,13701,13706,13711,13716,13721,13726,13731,13736,13740],{"__ignoreMap":67},[1332,13667,13668,13670,13672,13674,13676],{"class":2455,"line":2131},[1332,13669,4370],{"class":2458},[1332,13671,4373],{"class":2511},[1332,13673,4376],{"class":2462},[1332,13675,9898],{"class":2462},[1332,13677,4382],{"class":2507},[1332,13679,13680,13682,13684],{"class":2455,"line":670},[1332,13681,4387],{"class":2511},[1332,13683,4390],{"class":2462},[1332,13685,4382],{"class":2507},[1332,13687,13688,13690],{"class":2455,"line":68},[1332,13689,4397],{"class":2511},[1332,13691,8346],{"class":2462},[1332,13693,13694],{"class":2455,"line":1478},[1332,13695,9919],{"class":2462},[1332,13697,13698],{"class":2455,"line":293},[1332,13699,13700],{"class":2462},"    \"name\": \"Scrape product page\",\n",[1332,13702,13703],{"class":2455,"line":2237},[1332,13704,13705],{"class":2462},"    \"data\": [\n",[1332,13707,13708],{"class":2455,"line":2623},[1332,13709,13710],{"class":2462},"      [\n",[1332,13712,13713],{"class":2455,"line":2637},[1332,13714,13715],{"class":2462},"        [\"url\"],\n",[1332,13717,13718],{"class":2455,"line":2642},[1332,13719,13720],{"class":2462},"        [\"https:\u002F\u002Fexample.com\u002Fproduct\u002F1\"],\n",[1332,13722,13723],{"class":2455,"line":2651},[1332,13724,13725],{"class":2462},"        [\"https:\u002F\u002Fexample.com\u002Fproduct\u002F2\"],\n",[1332,13727,13728],{"class":2455,"line":2673},[1332,13729,13730],{"class":2462},"        [\"https:\u002F\u002Fexample.com\u002Fproduct\u002F3\"]\n",[1332,13732,13733],{"class":2455,"line":2692},[1332,13734,13735],{"class":2462},"      ]\n",[1332,13737,13738],{"class":2455,"line":2727},[1332,13739,12004],{"class":2462},[1332,13741,13742],{"class":2455,"line":2739},[1332,13743,8391],{"class":2462},[26,13745,13746,13747,13750],{},"The automation receives a single table with one column (",[145,13748,13749],{},"url",") and three data rows, then loops over them.",[107,13752,10658],{"id":10657},[112,13754],{},[26,13756,13757],{},"If the automation reads from two distinct inputs, pass two tables in order:",[2446,13759,13761],{"className":6112,"code":13760,"language":5926,"meta":67,"style":67},"\"data\": [\n  [\n    [\"search_term\"],\n    [\"browser automation\"],\n    [\"web scraping\"]\n  ],\n  [\n    [\"target_url\"],\n    [\"https:\u002F\u002Fexample.com\u002Flog\"]\n  ]\n]\n",[145,13762,13763,13769,13773,13781,13789,13798,13802,13806,13815,13824,13828],{"__ignoreMap":67},[1332,13764,13765,13767],{"class":2455,"line":2131},[1332,13766,5861],{"class":2462},[1332,13768,10506],{"class":2521},[1332,13770,13771],{"class":2455,"line":670},[1332,13772,10511],{"class":2521},[1332,13774,13775,13777,13779],{"class":2455,"line":68},[1332,13776,10516],{"class":2521},[1332,13778,10712],{"class":2462},[1332,13780,6167],{"class":2521},[1332,13782,13783,13785,13787],{"class":2455,"line":1478},[1332,13784,10516],{"class":2521},[1332,13786,10721],{"class":2462},[1332,13788,6167],{"class":2521},[1332,13790,13791,13793,13796],{"class":2455,"line":293},[1332,13792,10516],{"class":2521},[1332,13794,13795],{"class":2462},"\"web scraping\"",[1332,13797,5164],{"class":2521},[1332,13799,13800],{"class":2455,"line":2237},[1332,13801,10701],{"class":2521},[1332,13803,13804],{"class":2455,"line":2623},[1332,13805,10511],{"class":2521},[1332,13807,13808,13810,13813],{"class":2455,"line":2637},[1332,13809,10516],{"class":2521},[1332,13811,13812],{"class":2462},"\"target_url\"",[1332,13814,6167],{"class":2521},[1332,13816,13817,13819,13822],{"class":2455,"line":2642},[1332,13818,10516],{"class":2521},[1332,13820,13821],{"class":2462},"\"https:\u002F\u002Fexample.com\u002Flog\"",[1332,13823,5164],{"class":2521},[1332,13825,13826],{"class":2455,"line":2651},[1332,13827,10545],{"class":2521},[1332,13829,13830],{"class":2455,"line":2673},[1332,13831,5164],{"class":2521},[26,13833,13834],{},"The first table is referenced as the first input in the automation, the second table as the second input.",[107,13836,10738],{"id":10737},[112,13838],{},[26,13840,13841],{},"Whether the automation expects a header row depends on how it was authored. Match what you'd upload as a Google Sheet for the same automation: if you'd include a header row in the sheet, include one here.",[26,13843,13844,13845,13847],{},"When in doubt, open the automation in the ",[192,13846,10785],{}," and look at how the input source is configured. If it references columns by name, you need a header row. If it references them by position, you don't.",[107,13849,13851],{"id":13850},"cell-value-rules","Cell value rules",[112,13853],{},[186,13855,13856,13868,13880],{},[189,13857,13858,13861,13862,6205,13864,13867],{},[192,13859,13860],{},"Use strings."," Numbers and booleans are coerced to strings on the server, so passing ",[145,13863,10622],{},[145,13865,13866],{},"42"," produces the same result.",[189,13869,13870,13873,13874,13876,13877,13879],{},[192,13871,13872],{},"Use empty strings for missing values",", not ",[145,13875,8822],{},". A ",[145,13878,8822],{}," cell breaks the row alignment.",[189,13881,13882,13885],{},[192,13883,13884],{},"Don't nest objects or arrays inside a cell."," Cells are flat scalar values. To pass structured data, flatten it across multiple columns.",[107,13887,13889],{"id":13888},"common-pitfalls","Common pitfalls",[112,13891],{},[186,13893,13894,13908,13914],{},[189,13895,13896,13899,13900,13903,13904,13907],{},[192,13897,13898],{},"Forgetting the outer array."," Sending ",[145,13901,13902],{},"[[\"a\",\"b\"],[\"c\",\"d\"]]"," (two levels) instead of ",[145,13905,13906],{},"[[[\"a\",\"b\"],[\"c\",\"d\"]]]"," (three levels) is silently misinterpreted as multiple single-cell rows. Always count the brackets.",[189,13909,13910,13913],{},[192,13911,13912],{},"Mismatched row lengths."," Every row should have the same number of cells as the header row. Ragged rows cause unpredictable behaviour in steps that reference columns by index.",[189,13915,13916,13919],{},[192,13917,13918],{},"Trailing empty rows."," Some authors strip trailing empties; others count them. If your automation processes \"every row,\" include only the rows you actually want processed.",[107,13921,4513],{"id":4512},[112,13923],{},[186,13925,13926,13930],{},[189,13927,13928],{},[659,13929,4528],{"href":4527},[189,13931,13932],{},[659,13933,10992],{"href":7368},[2819,13935,13936],{},"html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}",{"title":67,"searchDepth":68,"depth":68,"links":13938},[13939,13940,13941,13942,13943,13944,13945,13946],{"id":13558,"depth":670,"text":13559},{"id":13631,"depth":670,"text":13632},{"id":13650,"depth":670,"text":13651},{"id":10657,"depth":670,"text":10658},{"id":10737,"depth":670,"text":10738},{"id":13850,"depth":670,"text":13851},{"id":13888,"depth":670,"text":13889},{"id":4512,"depth":670,"text":4513},"Send dynamic input into a No-Code Tool automation when triggering it via the API, using the table-shaped data payload.",{"metaTitle":13949},"Pass input data into an axiom.ai automation via the API",{"title":10439,"description":13947},"docs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Fpass-input-data","AfrnOXNrPIzFFB07jT6Z0RJv7Twe9NIIWC1xqzoLLqs",{"id":13954,"title":10969,"body":13955,"date":71,"description":14660,"extension":73,"meta":14661,"navigation":75,"order":1478,"path":10968,"seo":14663,"stem":14664,"__hash__":14665},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Frun-reports.md",{"type":8,"value":13956,"toc":14653},[13957,13962,13964,13966,13975,14022,14024,14057,14059,14061,14163,14271,14273,14275,14307,14317,14619,14621,14623,14650],[26,13958,2273,13959,13961],{},[145,13960,10954],{}," endpoint returns recent runs on your account, each with the automation name, status, description, and timestamps. Use it to check whether a recently triggered run has finished, to build a run-history view in your own dashboard, or to audit what your integration has been doing.",[107,13963,12502],{"id":12501},[112,13965],{},[2446,13967,13969],{"className":12507,"code":13968,"language":12509,"meta":67,"style":67},"POST \u002Fapi\u002Fv3\u002Frun-reports\n",[145,13970,13971],{"__ignoreMap":67},[1332,13972,13973],{"class":2455,"line":2131},[1332,13974,13968],{},[4589,13976,13977,13989],{},[4592,13978,13979],{},[4595,13980,13981,13983,13985,13987],{},[4598,13982,12524],{},[4598,13984,12527],{},[4598,13986,8403],{},[4598,13988,12532],{},[4605,13990,13991,14005],{},[4595,13992,13993,13997,13999,14001],{},[4610,13994,13995],{},[145,13996,4359],{},[4610,13998,6750],{},[4610,14000,10771],{},[4610,14002,12547,14003,148],{},[659,14004,4211],{"href":4558},[4595,14006,14007,14011,14014,14016],{},[4610,14008,14009],{},[145,14010,10963],{},[4610,14012,14013],{},"number",[4610,14015,10779],{},[4610,14017,14018,14019,148],{},"Number of reports to return. Defaults to ",[145,14020,14021],{},"5",[107,14023,12571],{"id":12570},[2446,14025,14027],{"className":6112,"code":14026,"language":5926,"meta":67,"style":67},"{\n  \"key\": \"\u003CAPI_KEY>\",\n  \"count\": 10\n}\n",[145,14028,14029,14033,14043,14053],{"__ignoreMap":67},[1332,14030,14031],{"class":2455,"line":2131},[1332,14032,6120],{"class":2521},[1332,14034,14035,14037,14039,14041],{"class":2455,"line":670},[1332,14036,12585],{"class":6125},[1332,14038,5260],{"class":2521},[1332,14040,12590],{"class":2462},[1332,14042,6024],{"class":2521},[1332,14044,14045,14048,14050],{"class":2455,"line":68},[1332,14046,14047],{"class":6125},"  \"count\"",[1332,14049,5260],{"class":2521},[1332,14051,14052],{"class":2511},"10\n",[1332,14054,14055],{"class":2455,"line":1478},[1332,14056,2802],{"class":2521},[107,14058,12609],{"id":12608},[112,14060],{},[2446,14062,14063],{"className":6112,"code":12034,"language":5926,"meta":67,"style":67},[145,14064,14065,14069,14079,14085,14091,14095,14105,14115,14129,14139,14147,14151,14155,14159],{"__ignoreMap":67},[1332,14066,14067],{"class":2455,"line":2131},[1332,14068,6120],{"class":2521},[1332,14070,14071,14073,14075,14077],{"class":2455,"line":670},[1332,14072,10008],{"class":6125},[1332,14074,5260],{"class":2521},[1332,14076,11893],{"class":2462},[1332,14078,6024],{"class":2521},[1332,14080,14081,14083],{"class":2455,"line":68},[1332,14082,11900],{"class":6125},[1332,14084,6129],{"class":2521},[1332,14086,14087,14089],{"class":2455,"line":1478},[1332,14088,12061],{"class":6125},[1332,14090,10506],{"class":2521},[1332,14092,14093],{"class":2455,"line":293},[1332,14094,12068],{"class":2521},[1332,14096,14097,14099,14101,14103],{"class":2455,"line":2237},[1332,14098,12073],{"class":6125},[1332,14100,5260],{"class":2521},[1332,14102,12078],{"class":2462},[1332,14104,6024],{"class":2521},[1332,14106,14107,14109,14111,14113],{"class":2455,"line":2623},[1332,14108,12085],{"class":6125},[1332,14110,5260],{"class":2521},[1332,14112,12090],{"class":2462},[1332,14114,6024],{"class":2521},[1332,14116,14117,14119,14121,14123,14125,14127],{"class":2455,"line":2637},[1332,14118,12097],{"class":6125},[1332,14120,5260],{"class":2521},[1332,14122,12102],{"class":2462},[1332,14124,12105],{"class":2507},[1332,14126,12108],{"class":2462},[1332,14128,6024],{"class":2521},[1332,14130,14131,14133,14135,14137],{"class":2455,"line":2642},[1332,14132,12115],{"class":6125},[1332,14134,5260],{"class":2521},[1332,14136,12120],{"class":2462},[1332,14138,6024],{"class":2521},[1332,14140,14141,14143,14145],{"class":2455,"line":2651},[1332,14142,12127],{"class":6125},[1332,14144,5260],{"class":2521},[1332,14146,12132],{"class":2462},[1332,14148,14149],{"class":2455,"line":2673},[1332,14150,12137],{"class":2521},[1332,14152,14153],{"class":2455,"line":2692},[1332,14154,12004],{"class":2521},[1332,14156,14157],{"class":2455,"line":2727},[1332,14158,6194],{"class":2521},[1332,14160,14161],{"class":2455,"line":2739},[1332,14162,2802],{"class":2521},[4589,14164,14165,14175],{},[4592,14166,14167],{},[4595,14168,14169,14171,14173],{},[4598,14170,8400],{},[4598,14172,12527],{},[4598,14174,12532],{},[4605,14176,14177,14189,14201,14218,14235,14247,14259],{},[4595,14178,14179,14183,14185],{},[4610,14180,14181],{},[145,14182,8624],{},[4610,14184,6750],{},[4610,14186,14187,13308],{},[145,14188,13307],{},[4595,14190,14191,14196,14198],{},[4610,14192,14193],{},[145,14194,14195],{},"data.reports",[4610,14197,6761],{},[4610,14199,14200],{},"Array of run reports, most recent first.",[4595,14202,14203,14208,14210],{},[4610,14204,14205],{},[145,14206,14207],{},"reports[].task_name",[4610,14209,6750],{},[4610,14211,14212,14213,14215,14216,148],{},"Name of the automation that ran, matching the ",[145,14214,6802],{}," passed to ",[145,14217,4467],{},[4595,14219,14220,14225,14227],{},[4610,14221,14222],{},[145,14223,14224],{},"reports[].status",[4610,14226,6750],{},[4610,14228,12710,14229,4468,14231,10147,14233,148],{},[145,14230,10143],{},[145,14232,10146],{},[145,14234,10150],{},[4595,14236,14237,14242,14244],{},[4610,14238,14239],{},[145,14240,14241],{},"reports[].description",[4610,14243,6750],{},[4610,14245,14246],{},"Human-readable run summary, including the cloud version and any failure details.",[4595,14248,14249,14254,14256],{},[4610,14250,14251],{},[145,14252,14253],{},"reports[].created_at",[4610,14255,6750],{},[4610,14257,14258],{},"ISO 8601 UTC timestamp of when the run started.",[4595,14260,14261,14266,14268],{},[4610,14262,14263],{},[145,14264,14265],{},"reports[].updated_at",[4610,14267,6750],{},[4610,14269,14270],{},"ISO 8601 UTC timestamp of the most recent status change.",[107,14272,12784],{"id":12783},[112,14274],{},[2446,14276,14278],{"className":2448,"code":14277,"language":2450,"meta":67,"style":67},"curl -X POST https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Frun-reports \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"key\": \"your-api-key-here\"}'\n",[145,14279,14280,14293,14301],{"__ignoreMap":67},[1332,14281,14282,14284,14286,14288,14291],{"class":2455,"line":2131},[1332,14283,4370],{"class":2458},[1332,14285,4373],{"class":2511},[1332,14287,4376],{"class":2462},[1332,14289,14290],{"class":2462}," https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Frun-reports",[1332,14292,4382],{"class":2507},[1332,14294,14295,14297,14299],{"class":2455,"line":670},[1332,14296,4387],{"class":2511},[1332,14298,4390],{"class":2462},[1332,14300,4382],{"class":2507},[1332,14302,14303,14305],{"class":2455,"line":68},[1332,14304,4397],{"class":2511},[1332,14306,4400],{"class":2462},[26,14308,14309,14310,14312,14313,2344,14315,3297],{},"A common pattern is to trigger a run, then poll ",[145,14311,10954],{}," until your task's most recent report shows ",[145,14314,10146],{},[145,14316,10150],{},[2446,14318,14320],{"className":2962,"code":14319,"language":2964,"meta":67,"style":67},"const KEY = process.env.AXIOM_API_KEY;\nconst TASK = \"My First Automation\";\n\nawait fetch(\"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application\u002Fjson\" },\n  body: JSON.stringify({ key: KEY, name: TASK }),\n});\n\nwhile (true) {\n  await new Promise(r => setTimeout(r, 10000));\n  const res = await fetch(\"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Frun-reports\", {\n    method: \"POST\",\n    headers: { \"Content-Type\": \"application\u002Fjson\" },\n    body: JSON.stringify({ key: KEY }),\n  });\n  const { data } = await res.json();\n  const latest = data.reports.find(r => r.task_name === TASK);\n  if (latest && latest.status !== \"Running\") {\n    console.log(`Run finished with status: ${latest.status}`);\n    break;\n  }\n}\n",[145,14321,14322,14336,14350,14354,14367,14375,14387,14410,14414,14418,14429,14452,14471,14479,14491,14507,14511,14531,14561,14582,14604,14611,14615],{"__ignoreMap":67},[1332,14323,14324,14326,14328,14330,14332,14334],{"class":2455,"line":2131},[1332,14325,2508],{"class":2507},[1332,14327,6410],{"class":2511},[1332,14329,2515],{"class":2507},[1332,14331,6415],{"class":2521},[1332,14333,4713],{"class":2511},[1332,14335,4673],{"class":2521},[1332,14337,14338,14340,14343,14345,14348],{"class":2455,"line":670},[1332,14339,2508],{"class":2507},[1332,14341,14342],{"class":2511}," TASK",[1332,14344,2515],{"class":2507},[1332,14346,14347],{"class":2462}," \"My First Automation\"",[1332,14349,4673],{"class":2521},[1332,14351,14352],{"class":2455,"line":68},[1332,14353,2588],{"emptyLinePlaceholder":75},[1332,14355,14356,14358,14360,14362,14365],{"class":2455,"line":1478},[1332,14357,3020],{"class":2507},[1332,14359,6487],{"class":2525},[1332,14361,1213],{"class":2521},[1332,14363,14364],{"class":2462},"\"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger\"",[1332,14366,6505],{"class":2521},[1332,14368,14369,14371,14373],{"class":2455,"line":293},[1332,14370,9611],{"class":2521},[1332,14372,6513],{"class":2462},[1332,14374,6024],{"class":2521},[1332,14376,14377,14379,14381,14383,14385],{"class":2455,"line":2237},[1332,14378,9620],{"class":2521},[1332,14380,12902],{"class":2462},[1332,14382,5260],{"class":2521},[1332,14384,6528],{"class":2462},[1332,14386,6531],{"class":2521},[1332,14388,14389,14391,14393,14395,14397,14400,14402,14405,14408],{"class":2455,"line":2623},[1332,14390,9633],{"class":2521},[1332,14392,6539],{"class":2511},[1332,14394,148],{"class":2521},[1332,14396,6544],{"class":2525},[1332,14398,14399],{"class":2521},"({ key: ",[1332,14401,5723],{"class":2511},[1332,14403,14404],{"class":2521},", name: ",[1332,14406,14407],{"class":2511},"TASK",[1332,14409,13423],{"class":2521},[1332,14411,14412],{"class":2455,"line":2637},[1332,14413,2542],{"class":2521},[1332,14415,14416],{"class":2455,"line":2642},[1332,14417,2588],{"emptyLinePlaceholder":75},[1332,14419,14420,14423,14425,14427],{"class":2455,"line":2651},[1332,14421,14422],{"class":2507},"while",[1332,14424,3842],{"class":2521},[1332,14426,1548],{"class":2511},[1332,14428,6473],{"class":2521},[1332,14430,14431,14433,14435,14437,14439,14441,14443,14445,14447,14450],{"class":2455,"line":2673},[1332,14432,3389],{"class":2507},[1332,14434,2697],{"class":2507},[1332,14436,2700],{"class":2511},[1332,14438,1213],{"class":2521},[1332,14440,13009],{"class":2458},[1332,14442,10271],{"class":2507},[1332,14444,2715],{"class":2525},[1332,14446,13016],{"class":2521},[1332,14448,14449],{"class":2511},"10000",[1332,14451,2724],{"class":2521},[1332,14453,14454,14456,14458,14460,14462,14464,14466,14469],{"class":2455,"line":2692},[1332,14455,3344],{"class":2507},[1332,14457,6480],{"class":2511},[1332,14459,2515],{"class":2507},[1332,14461,2518],{"class":2507},[1332,14463,6487],{"class":2525},[1332,14465,1213],{"class":2521},[1332,14467,14468],{"class":2462},"\"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Frun-reports\"",[1332,14470,6505],{"class":2521},[1332,14472,14473,14475,14477],{"class":2455,"line":2727},[1332,14474,6510],{"class":2521},[1332,14476,6513],{"class":2462},[1332,14478,6024],{"class":2521},[1332,14480,14481,14483,14485,14487,14489],{"class":2455,"line":2739},[1332,14482,6520],{"class":2521},[1332,14484,12902],{"class":2462},[1332,14486,5260],{"class":2521},[1332,14488,6528],{"class":2462},[1332,14490,6531],{"class":2521},[1332,14492,14493,14495,14497,14499,14501,14503,14505],{"class":2455,"line":2750},[1332,14494,6536],{"class":2521},[1332,14496,6539],{"class":2511},[1332,14498,148],{"class":2521},[1332,14500,6544],{"class":2525},[1332,14502,14399],{"class":2521},[1332,14504,5723],{"class":2511},[1332,14506,13423],{"class":2521},[1332,14508,14509],{"class":2455,"line":2765},[1332,14510,3368],{"class":2521},[1332,14512,14513,14515,14517,14519,14521,14523,14525,14527,14529],{"class":2455,"line":2777},[1332,14514,3344],{"class":2507},[1332,14516,6595],{"class":2521},[1332,14518,580],{"class":2511},[1332,14520,6601],{"class":2521},[1332,14522,5110],{"class":2507},[1332,14524,2518],{"class":2507},[1332,14526,6559],{"class":2521},[1332,14528,5926],{"class":2525},[1332,14530,2670],{"class":2521},[1332,14532,14533,14535,14538,14540,14543,14546,14548,14550,14552,14555,14557,14559],{"class":2455,"line":2788},[1332,14534,3344],{"class":2507},[1332,14536,14537],{"class":2511}," latest",[1332,14539,2515],{"class":2507},[1332,14541,14542],{"class":2521}," data.reports.",[1332,14544,14545],{"class":2525},"find",[1332,14547,1213],{"class":2521},[1332,14549,13009],{"class":2458},[1332,14551,10271],{"class":2507},[1332,14553,14554],{"class":2521}," r.task_name ",[1332,14556,9291],{"class":2507},[1332,14558,14342],{"class":2511},[1332,14560,2583],{"class":2521},[1332,14562,14563,14565,14568,14571,14574,14577,14580],{"class":2455,"line":2799},[1332,14564,9156],{"class":2507},[1332,14566,14567],{"class":2521}," (latest ",[1332,14569,14570],{"class":2507},"&&",[1332,14572,14573],{"class":2521}," latest.status ",[1332,14575,14576],{"class":2507},"!==",[1332,14578,14579],{"class":2462}," \"Running\"",[1332,14581,6473],{"class":2521},[1332,14583,14584,14586,14588,14590,14593,14596,14598,14600,14602],{"class":2455,"line":3751},[1332,14585,2753],{"class":2521},[1332,14587,2575],{"class":2525},[1332,14589,1213],{"class":2521},[1332,14591,14592],{"class":2462},"`Run finished with status: ${",[1332,14594,14595],{"class":2521},"latest",[1332,14597,148],{"class":2462},[1332,14599,8624],{"class":2521},[1332,14601,6502],{"class":2462},[1332,14603,2583],{"class":2521},[1332,14605,14606,14609],{"class":2455,"line":3762},[1332,14607,14608],{"class":2507},"    break",[1332,14610,4673],{"class":2521},[1332,14612,14613],{"class":2455,"line":3777},[1332,14614,6194],{"class":2521},[1332,14616,14617],{"class":2455,"line":3787},[1332,14618,2802],{"class":2521},[107,14620,6276],{"id":6275},[112,14622],{},[186,14624,14625,14631,14641,14647],{},[189,14626,14627,14628,148],{},"Reports are returned most-recent first based on ",[145,14629,14630],{},"created_at",[189,14632,14633,14634,14636,14637,14640],{},"Each call to ",[145,14635,10954],{}," counts against the ",[659,14638,14639],{"href":7601},"100-per-minute rate limit",". Don't poll faster than once every 5 to 15 seconds.",[189,14642,14643,14646],{},[145,14644,14645],{},"description"," can contain multi-line text including stack traces for failed runs. Render it as preformatted text, not HTML, to preserve formatting.",[189,14648,14649],{},"The endpoint returns recent runs only. There's no historical archive accessible over the API today.",[2819,14651,14652],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}",{"title":67,"searchDepth":68,"depth":68,"links":14654},[14655,14656,14657,14658,14659],{"id":12501,"depth":670,"text":12502},{"id":12570,"depth":670,"text":12571},{"id":12608,"depth":670,"text":12609},{"id":12783,"depth":670,"text":12784},{"id":6275,"depth":670,"text":6276},"Fetch a list of recent automation runs on your account, each with its status, description, and timestamps.",{"metaTitle":14662},"List recent axiom.ai automation runs",{"title":10969,"description":14660},"docs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Frun-reports","ZUaZt3DubWapcdP7yqI1_yU1qX30R18JzbIWwt7QEsk",{"id":14667,"title":11017,"body":14668,"date":71,"description":14989,"extension":73,"meta":14990,"navigation":75,"order":293,"path":10363,"seo":14992,"stem":14993,"__hash__":14994},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Fstop-a-run.md",{"type":8,"value":14669,"toc":14980},[14670,14675,14689,14691,14693,14702,14749,14751,14786,14788,14790,14836,14839,14841,14844,14850,14853,14886,14889,14893,14895,14900,14926,14930,14932,14943,14946,14948,14950,14977],[26,14671,2273,14672,14674],{},[145,14673,4471],{}," endpoint cancels an in-flight cloud run. Use it when an automation is taking longer than expected, when your application logic determines the run is no longer needed, or when you need to free a concurrency slot for a more urgent run.",[26,14676,14677,14678,14680,14681,6205,14683,14685,14686,14688],{},"Unlike most other axiom.ai endpoints, ",[145,14679,4471],{}," does not take your API key plus an automation name. It takes two values that are unique to a single live run: ",[145,14682,11007],{},[145,14684,11010],{},". Both are extracted from the viewer URL that ",[145,14687,4467],{}," returns.",[107,14690,12502],{"id":12501},[112,14692],{},[2446,14694,14696],{"className":12507,"code":14695,"language":12509,"meta":67,"style":67},"POST \u002Fapi\u002Fv3\u002Fstop\n",[145,14697,14698],{"__ignoreMap":67},[1332,14699,14700],{"class":2455,"line":2131},[1332,14701,14695],{},[4589,14703,14704,14716],{},[4592,14705,14706],{},[4595,14707,14708,14710,14712,14714],{},[4598,14709,12524],{},[4598,14711,12527],{},[4598,14713,8403],{},[4598,14715,12532],{},[4605,14717,14718,14736],{},[4595,14719,14720,14724,14726,14728],{},[4610,14721,14722],{},[145,14723,11007],{},[4610,14725,6750],{},[4610,14727,10771],{},[4610,14729,14730,14731,14735],{},"Internal run identifier. The last two digits of the host name in the viewer URL. See ",[659,14732,14734],{"href":14733},"#how-to-get-pid-and-pw","How to get pid and pw"," below.",[4595,14737,14738,14742,14744,14746],{},[4610,14739,14740],{},[145,14741,11010],{},[4610,14743,6750],{},[4610,14745,10771],{},[4610,14747,14748],{},"Unique password for the run, also extracted from the viewer URL. Changes for every run.",[107,14750,12571],{"id":12570},[2446,14752,14754],{"className":6112,"code":14753,"language":5926,"meta":67,"style":67},"{\n  \"pid\": \"\u003CPID>\",\n  \"pw\": \"\u003CPASSWORD>\"\n}\n",[145,14755,14756,14760,14772,14782],{"__ignoreMap":67},[1332,14757,14758],{"class":2455,"line":2131},[1332,14759,6120],{"class":2521},[1332,14761,14762,14765,14767,14770],{"class":2455,"line":670},[1332,14763,14764],{"class":6125},"  \"pid\"",[1332,14766,5260],{"class":2521},[1332,14768,14769],{"class":2462},"\"\u003CPID>\"",[1332,14771,6024],{"class":2521},[1332,14773,14774,14777,14779],{"class":2455,"line":68},[1332,14775,14776],{"class":6125},"  \"pw\"",[1332,14778,5260],{"class":2521},[1332,14780,14781],{"class":2462},"\"\u003CPASSWORD>\"\n",[1332,14783,14784],{"class":2455,"line":1478},[1332,14785,2802],{"class":2521},[107,14787,12784],{"id":12783},[112,14789],{},[2446,14791,14793],{"className":2448,"code":14792,"language":2450,"meta":67,"style":67},"curl -X POST https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Fstop \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"pid\": \"02\",\n    \"pw\": \"your-run-password\"\n  }'\n",[145,14794,14795,14808,14816,14822,14827,14832],{"__ignoreMap":67},[1332,14796,14797,14799,14801,14803,14806],{"class":2455,"line":2131},[1332,14798,4370],{"class":2458},[1332,14800,4373],{"class":2511},[1332,14802,4376],{"class":2462},[1332,14804,14805],{"class":2462}," https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Fstop",[1332,14807,4382],{"class":2507},[1332,14809,14810,14812,14814],{"class":2455,"line":670},[1332,14811,4387],{"class":2511},[1332,14813,4390],{"class":2462},[1332,14815,4382],{"class":2507},[1332,14817,14818,14820],{"class":2455,"line":68},[1332,14819,4397],{"class":2511},[1332,14821,8346],{"class":2462},[1332,14823,14824],{"class":2455,"line":1478},[1332,14825,14826],{"class":2462},"    \"pid\": \"02\",\n",[1332,14828,14829],{"class":2455,"line":293},[1332,14830,14831],{"class":2462},"    \"pw\": \"your-run-password\"\n",[1332,14833,14834],{"class":2455,"line":2237},[1332,14835,8391],{"class":2462},[107,14837,14734],{"id":14838},"how-to-get-pid-and-pw",[112,14840],{},[26,14842,14843],{},"When you trigger a run, the response includes a viewer URL. The viewer URL contains a longer host that embeds both values. Example:",[2446,14845,14848],{"className":14846,"code":14847,"language":5402},[5400],"dev-c-0002-v4-proxy.axiom.ai&port=443&password=abc123xyz&taskId=22842\n",[145,14849,14847],{"__ignoreMap":67},[26,14851,14852],{},"From this URL:",[186,14854,14855,14871],{},[189,14856,14857,14861,14862,14865,14866,11490,14868,148],{},[192,14858,14859],{},[145,14860,11007],{}," is the last two digits of the host name. In the example above, the host is ",[145,14863,14864],{},"dev-c-0002-v4-proxy.axiom.ai",", so ",[145,14867,11007],{},[145,14869,14870],{},"02",[189,14872,14873,14877,14878,14880,14881,11490,14883,148],{},[192,14874,14875],{},[145,14876,11010],{}," is the value of the ",[145,14879,8450],{}," query parameter. In the example, ",[145,14882,11010],{},[145,14884,14885],{},"abc123xyz",[26,14887,14888],{},"Both values are tied to one specific run. They change every time you trigger.",[107,14890,14892],{"id":14891},"when-to-stop-a-run","When to stop a run",[112,14894],{},[26,14896,14897,14898,3297],{},"Common reasons to call ",[145,14899,4471],{},[186,14901,14902,14908,14914,14920],{},[189,14903,14904,14907],{},[192,14905,14906],{},"The user cancelled the request that triggered the run."," If your application kicked off a run for a user-initiated action and the user backs out, stop the run rather than letting it complete.",[189,14909,14910,14913],{},[192,14911,14912],{},"The run is taking too long."," Some runs hang on a slow page or a captcha. If you have an SLA, stop the run after a deadline and surface the failure to your application.",[189,14915,14916,14919],{},[192,14917,14918],{},"You triggered duplicates."," If your trigger logic accidentally fires the same run twice, stop the duplicate before it starts consuming runtime.",[189,14921,14922,14925],{},[192,14923,14924],{},"You need a concurrency slot for something more urgent."," Stopping a queued or low-priority run frees a slot immediately for the next trigger.",[107,14927,14929],{"id":14928},"what-happens-to-a-stopped-run","What happens to a stopped run",[112,14931],{},[26,14933,14934,14935,14937,14938,14942],{},"A stopped run reports ",[145,14936,10150],{}," from ",[659,14939,14940],{"href":7368},[145,14941,4474],{}," after cancellation. Any partial output the automation had already written (rows added to a Google Sheet, files downloaded) stays where it was written; the cleanup is your responsibility.",[26,14944,14945],{},"Stopped runs still count against your runtime allowance for the time they were actually executing. A queued run that's stopped before it starts uses no runtime.",[107,14947,6276],{"id":6275},[112,14949],{},[186,14951,14952,14960,14968,14974],{},[189,14953,14954,14955,6205,14957,14959],{},"You must extract ",[145,14956,11007],{},[145,14958,11010],{}," from the viewer URL at trigger time. There's no way to look them up later from your API key alone, so store them if you might need to stop the run.",[189,14961,14962,14963,2344,14965,14967],{},"Stopping a run that's already finished (status ",[145,14964,10146],{},[145,14966,10150],{},") is a no-op; the call returns successfully without doing anything.",[189,14969,14970,14971,14973],{},"There's no way to \"pause\" a run today, only stop. If you need to interrupt a long-running flow and resume later, design the automation around ",[145,14972,4467],{}," calls that pick up where the previous one left off (for example, by reading a checkpoint from a Google Sheet).",[189,14975,14976],{},"Stopping a run doesn't undo any external side effects the automation produced before the stop signal arrived. If the automation sent emails, made API calls, or moved money, those actions are not reversed.",[2819,14978,14979],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}",{"title":67,"searchDepth":68,"depth":68,"links":14981},[14982,14983,14984,14985,14986,14987,14988],{"id":12501,"depth":670,"text":12502},{"id":12570,"depth":670,"text":12571},{"id":12783,"depth":670,"text":12784},{"id":14838,"depth":670,"text":14734},{"id":14891,"depth":670,"text":14892},{"id":14928,"depth":670,"text":14929},{"id":6275,"depth":670,"text":6276},"Cancel a triggered automation that's still running in the cloud, freeing the concurrency slot for other runs.",{"metaTitle":14991},"Stop an in-flight axiom.ai cloud automation run",{"title":11017,"description":14989},"docs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Fstop-a-run","cVIXeIQSDRP8w4d00N9i7Ny_hBpc6pryNPUutYogkf0",{"id":14996,"title":4528,"body":14997,"date":71,"description":15521,"extension":73,"meta":15522,"navigation":75,"order":670,"path":4527,"seo":15524,"stem":15525,"__hash__":15526},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Ftrigger-an-automation.md",{"type":8,"value":14998,"toc":15510},[14999,15004,15006,15008,15017,15078,15080,15082,15085,15087,15107,15133,15137,15167,15206,15211,15213,15243,15286,15288,15290,15332,15335,15401,15416,15419,15421,15468,15470,15472,15508],[26,15000,2273,15001,15003],{},[145,15002,4467],{}," endpoint starts a cloud run of a saved No-Code Tool automation. The automation must already exist in your account and be saved to the cloud. The call returns immediately with a viewer link, or with a queued\u002Ferror response if the run could not start.",[107,15005,12502],{"id":12501},[112,15007],{},[2446,15009,15011],{"className":12507,"code":15010,"language":12509,"meta":67,"style":67},"POST \u002Fapi\u002Fv3\u002Ftrigger\n",[145,15012,15013],{"__ignoreMap":67},[1332,15014,15015],{"class":2455,"line":2131},[1332,15016,15010],{},[4589,15018,15019,15031],{},[4592,15020,15021],{},[4595,15022,15023,15025,15027,15029],{},[4598,15024,12524],{},[4598,15026,12527],{},[4598,15028,8403],{},[4598,15030,12532],{},[4605,15032,15033,15047,15062],{},[4595,15034,15035,15039,15041,15043],{},[4610,15036,15037],{},[145,15038,4359],{},[4610,15040,6750],{},[4610,15042,10771],{},[4610,15044,12547,15045,148],{},[659,15046,4211],{"href":4558},[4595,15048,15049,15053,15055,15057],{},[4610,15050,15051],{},[145,15052,6802],{},[4610,15054,6750],{},[4610,15056,10771],{},[4610,15058,12562,15059,15061],{},[192,15060,2836],{},". Case-sensitive and whitespace-sensitive.",[4595,15063,15064,15068,15070,15072],{},[4610,15065,15066],{},[145,15067,580],{},[4610,15069,6761],{},[4610,15071,10779],{},[4610,15073,15074,15075,15077],{},"Input data passed into the automation. See ",[659,15076,10439],{"href":10356}," for the shape.",[107,15079,12609],{"id":12608},[112,15081],{},[26,15083,15084],{},"The response shape depends on what happened. Three variants:",[21,15086,11765],{"id":11764},[2446,15088,15089],{"className":6112,"code":9968,"language":5926,"meta":67,"style":67},[145,15090,15091,15095,15103],{"__ignoreMap":67},[1332,15092,15093],{"class":2455,"line":2131},[1332,15094,6120],{"class":2521},[1332,15096,15097,15099,15101],{"class":2455,"line":670},[1332,15098,9979],{"class":6125},[1332,15100,5260],{"class":2521},[1332,15102,9984],{"class":2462},[1332,15104,15105],{"class":2455,"line":68},[1332,15106,2802],{"class":2521},[4589,15108,15109,15119],{},[4592,15110,15111],{},[4595,15112,15113,15115,15117],{},[4598,15114,8400],{},[4598,15116,12527],{},[4598,15118,12532],{},[4605,15120,15121],{},[4595,15122,15123,15128,15130],{},[4610,15124,15125],{},[145,15126,15127],{},"OPEN LINK IN BROWSER",[4610,15129,6750],{},[4610,15131,15132],{},"URL to a live noVNC view of the cloud browser. Useful for watching the run in real time or sharing a screencast with support.",[21,15134,15136],{"id":15135},"queued-run-accepted-but-waiting-for-a-slot","Queued: run accepted but waiting for a slot",[2446,15138,15139],{"className":6112,"code":9997,"language":5926,"meta":67,"style":67},[145,15140,15141,15145,15155,15163],{"__ignoreMap":67},[1332,15142,15143],{"class":2455,"line":2131},[1332,15144,6120],{"class":2521},[1332,15146,15147,15149,15151,15153],{"class":2455,"line":670},[1332,15148,10008],{"class":6125},[1332,15150,5260],{"class":2521},[1332,15152,10013],{"class":2462},[1332,15154,6024],{"class":2521},[1332,15156,15157,15159,15161],{"class":2455,"line":68},[1332,15158,10020],{"class":6125},[1332,15160,5260],{"class":2521},[1332,15162,10025],{"class":2462},[1332,15164,15165],{"class":2455,"line":1478},[1332,15166,2802],{"class":2521},[4589,15168,15169,15179],{},[4592,15170,15171],{},[4595,15172,15173,15175,15177],{},[4598,15174,8400],{},[4598,15176,12527],{},[4598,15178,12532],{},[4605,15180,15181,15195],{},[4595,15182,15183,15187,15189],{},[4610,15184,15185],{},[145,15186,8624],{},[4610,15188,6750],{},[4610,15190,15191,15194],{},[145,15192,15193],{},"queued"," when the call was accepted but no concurrency slot is free yet.",[4595,15196,15197,15201,15203],{},[4610,15198,15199],{},[145,15200,11867],{},[4610,15202,6750],{},[4610,15204,15205],{},"Human-readable description of what's happening and when the run will be retried.",[26,15207,6104,15208,15210],{},[659,15209,5287],{"href":5286}," for details on how queueing works.",[21,15212,11831],{"id":11830},[2446,15214,15215],{"className":6112,"code":10035,"language":5926,"meta":67,"style":67},[145,15216,15217,15221,15231,15239],{"__ignoreMap":67},[1332,15218,15219],{"class":2455,"line":2131},[1332,15220,6120],{"class":2521},[1332,15222,15223,15225,15227,15229],{"class":2455,"line":670},[1332,15224,10008],{"class":6125},[1332,15226,5260],{"class":2521},[1332,15228,10050],{"class":2462},[1332,15230,6024],{"class":2521},[1332,15232,15233,15235,15237],{"class":2455,"line":68},[1332,15234,10020],{"class":6125},[1332,15236,5260],{"class":2521},[1332,15238,10061],{"class":2462},[1332,15240,15241],{"class":2455,"line":1478},[1332,15242,2802],{"class":2521},[4589,15244,15245,15255],{},[4592,15246,15247],{},[4595,15248,15249,15251,15253],{},[4598,15250,8400],{},[4598,15252,12527],{},[4598,15254,12532],{},[4605,15256,15257,15270],{},[4595,15258,15259,15263,15265],{},[4610,15260,15261],{},[145,15262,8624],{},[4610,15264,6750],{},[4610,15266,15267,15269],{},[145,15268,2782],{}," when the call failed.",[4595,15271,15272,15276,15278],{},[4610,15273,15274],{},[145,15275,11867],{},[4610,15277,6750],{},[4610,15279,15280,15281,15285],{},"Description of what went wrong. See ",[659,15282,15284],{"href":15283},"#errors","Errors"," below for common messages.",[107,15287,12784],{"id":12783},[112,15289],{},[2446,15291,15292],{"className":2448,"code":9885,"language":2450,"meta":67,"style":67},[145,15293,15294,15306,15314,15320,15324,15328],{"__ignoreMap":67},[1332,15295,15296,15298,15300,15302,15304],{"class":2455,"line":2131},[1332,15297,4370],{"class":2458},[1332,15299,4373],{"class":2511},[1332,15301,4376],{"class":2462},[1332,15303,9898],{"class":2462},[1332,15305,4382],{"class":2507},[1332,15307,15308,15310,15312],{"class":2455,"line":670},[1332,15309,4387],{"class":2511},[1332,15311,4390],{"class":2462},[1332,15313,4382],{"class":2507},[1332,15315,15316,15318],{"class":2455,"line":68},[1332,15317,4397],{"class":2511},[1332,15319,8346],{"class":2462},[1332,15321,15322],{"class":2455,"line":1478},[1332,15323,9919],{"class":2462},[1332,15325,15326],{"class":2455,"line":293},[1332,15327,9924],{"class":2462},[1332,15329,15330],{"class":2455,"line":2237},[1332,15331,8391],{"class":2462},[26,15333,15334],{},"With input data:",[2446,15336,15338],{"className":2448,"code":15337,"language":2450,"meta":67,"style":67},"curl -X POST https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"key\": \"your-api-key-here\",\n    \"name\": \"Scrape product page\",\n    \"data\": [\n      [\"url\"],\n      [\"https:\u002F\u002Fexample.com\u002Fproduct\u002F1\"],\n      [\"https:\u002F\u002Fexample.com\u002Fproduct\u002F2\"]\n    ]\n  }'\n",[145,15339,15340,15352,15360,15366,15370,15374,15378,15383,15388,15393,15397],{"__ignoreMap":67},[1332,15341,15342,15344,15346,15348,15350],{"class":2455,"line":2131},[1332,15343,4370],{"class":2458},[1332,15345,4373],{"class":2511},[1332,15347,4376],{"class":2462},[1332,15349,9898],{"class":2462},[1332,15351,4382],{"class":2507},[1332,15353,15354,15356,15358],{"class":2455,"line":670},[1332,15355,4387],{"class":2511},[1332,15357,4390],{"class":2462},[1332,15359,4382],{"class":2507},[1332,15361,15362,15364],{"class":2455,"line":68},[1332,15363,4397],{"class":2511},[1332,15365,8346],{"class":2462},[1332,15367,15368],{"class":2455,"line":1478},[1332,15369,9919],{"class":2462},[1332,15371,15372],{"class":2455,"line":293},[1332,15373,13700],{"class":2462},[1332,15375,15376],{"class":2455,"line":2237},[1332,15377,13705],{"class":2462},[1332,15379,15380],{"class":2455,"line":2623},[1332,15381,15382],{"class":2462},"      [\"url\"],\n",[1332,15384,15385],{"class":2455,"line":2637},[1332,15386,15387],{"class":2462},"      [\"https:\u002F\u002Fexample.com\u002Fproduct\u002F1\"],\n",[1332,15389,15390],{"class":2455,"line":2642},[1332,15391,15392],{"class":2462},"      [\"https:\u002F\u002Fexample.com\u002Fproduct\u002F2\"]\n",[1332,15394,15395],{"class":2455,"line":2651},[1332,15396,12004],{"class":2462},[1332,15398,15399],{"class":2455,"line":2673},[1332,15400,8391],{"class":2462},[26,15402,15403,15405,15406,15408,15409,15411,15412,15415],{},[145,15404,580],{}," is a 2D array of ",[145,15407,12271],{},". The first row is typically a header. See ",[659,15410,10439],{"href":10356}," for the full format and how to consume it inside an automation with the ",[192,15413,15414],{},"Receive data from another app"," step.",[107,15417,15284],{"id":15418},"errors",[112,15420],{},[4589,15422,15423,15431],{},[4592,15424,15425],{},[4595,15426,15427,15429],{},[4598,15428,12609],{},[4598,15430,11306],{},[4605,15432,15433,15444,15457],{},[4595,15434,15435,15439],{},[4610,15436,15437],{},[145,15438,11318],{},[4610,15440,2273,15441,15443],{},[145,15442,6802],{}," doesn't match any automation in your account. Almost always a case or whitespace mismatch.",[4595,15445,15446,15450],{},[4610,15447,15448],{},[145,15449,11342],{},[4610,15451,2273,15452,15454,15455,148],{},[145,15453,4359],{}," is missing or doesn't match an active API key. Generate a new one in the ",[192,15456,2836],{},[4595,15458,15459,15463],{},[4610,15460,15461],{},[145,15462,11364],{},[4610,15464,15465,15466,148],{},"Your account has used its full cloud runtime allowance for the billing period. See ",[659,15467,4540],{"href":4539},[107,15469,6276],{"id":6275},[112,15471],{},[186,15473,15474,15479,15489,15505],{},[189,15475,15476,15477,148],{},"Triggering a run never returns a \"concurrency limit\" error. If your account is already at its concurrent-run limit, the new run is queued and the call returns a queued response (see above). See ",[659,15478,5287],{"href":5286},[189,15480,15481,15482,10087,15486,15488],{},"To track a run after triggering, poll ",[659,15483,15484],{"href":7368},[145,15485,4474],{},[145,15487,6802],{}," you triggered. It returns the current status of that automation's most recent run.",[189,15490,15491,15492,4468,15494,2936,15496,15498,15499,15501,15502,15504],{},"Names are matched exactly. ",[145,15493,9948],{},[145,15495,9951],{},[145,15497,9954],{}," (two spaces) are three different names. If you keep getting ",[145,15500,9958],{},", copy the name directly from the ",[192,15503,2836],{}," rather than retyping it.",[189,15506,15507],{},"Only the latest saved version of the automation runs. There's no way to pin to an older revision via the API today.",[2819,15509,14979],{},{"title":67,"searchDepth":68,"depth":68,"links":15511},[15512,15513,15518,15519,15520],{"id":12501,"depth":670,"text":12502},{"id":12608,"depth":670,"text":12609,"children":15514},[15515,15516,15517],{"id":11764,"depth":68,"text":11765},{"id":15135,"depth":68,"text":15136},{"id":11830,"depth":68,"text":11831},{"id":12783,"depth":670,"text":12784},{"id":15418,"depth":670,"text":15284},{"id":6275,"depth":670,"text":6276},"Start a saved No-Code Tool automation in the cloud by name, with optional input data passed in the request body.",{"metaTitle":15523},"Trigger an axiom.ai cloud automation via the API",{"title":4528,"description":15521},"docs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Ftrigger-an-automation","O8XcB5LRvk6lSnaSGmwL0Cq5PMz-GWBPQA45OlNbDgk",{"id":15528,"title":15529,"body":15530,"date":71,"description":15759,"extension":73,"meta":15760,"navigation":75,"order":2237,"path":13060,"seo":15762,"stem":15763,"__hash__":15764},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Fwebhooks-from-a-step.md","Webhooks from a step",{"type":8,"value":15531,"toc":15752},[15532,15537,15541,15543,15546,15607,15612,15616,15618,15624,15627,15667,15671,15673,15678,15684,15699,15713,15717,15719,15725,15735,15738,15740,15742],[26,15533,15534,15535,148],{},"Webhooks in axiom.ai are not part of the REST API surface, they are step types you add inside an automation. This page explains the two webhook step types and how they relate to ",[145,15536,4467],{},[107,15538,15540],{"id":15539},"trigger-vs-webhook-steps","Trigger vs webhook steps",[112,15542],{},[26,15544,15545],{},"Two different directions, two different mechanisms:",[4589,15547,15548,15561],{},[4592,15549,15550],{},[4595,15551,15552,15555,15558],{},[4598,15553,15554],{},"Direction",[4598,15556,15557],{},"Use this",[4598,15559,15560],{},"What it does",[4605,15562,15563,15578,15593],{},[4595,15564,15565,15568,15575],{},[4610,15566,15567],{},"External system → axiom.ai",[4610,15569,15570,15574],{},[659,15571,15572],{"href":4527},[145,15573,4467],{}," (REST endpoint)",[4610,15576,15577],{},"An external service tells axiom.ai to start an automation.",[4595,15579,15580,15582,15590],{},[4610,15581,15567],{},[4610,15583,15584,15589],{},[659,15585,15587],{"href":15586},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwebhook-receive",[192,15588,15414],{}," (step)",[4610,15591,15592],{},"An automation step waits for inbound data from a webhook URL axiom.ai provides.",[4595,15594,15595,15598,15604],{},[4610,15596,15597],{},"axiom.ai → external system",[4610,15599,15600,15589],{},[659,15601,15602],{"href":1123},[192,15603,13063],{},[4610,15605,15606],{},"An automation step POSTs collected data to a URL you provide, mid-run.",[26,15608,2487,15609,15611],{},[145,15610,4467],{}," when your code is the orchestrator and axiom.ai is one of many things it kicks off. Use webhook steps when the automation itself is the orchestrator, calling out to other services as it runs.",[107,15613,15615],{"id":15614},"send-data-to-an-external-service-mid-run","Send data to an external service mid-run",[112,15617],{},[26,15619,15620,15621,15623],{},"Add a ",[192,15622,13063],{}," step anywhere in your automation. When the run reaches it, axiom.ai POSTs the configured payload to your URL.",[26,15625,15626],{},"Common patterns:",[186,15628,15629,15642,15658],{},[189,15630,15631,15634,15635,15637,15638,148],{},[192,15632,15633],{},"End-of-run notification."," Place a ",[192,15636,13063],{}," step at the end of the automation. Your service receives a POST when the run finishes, removing the need to poll ",[659,15639,15640],{"href":7368},[145,15641,4474],{},[189,15643,15644,15647,15648,15654,15655,15657],{},[192,15645,15646],{},"Streaming results."," Inside a ",[659,15649,15651],{"href":15650},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Floop",[192,15652,15653],{},"Loop through data"," step, add a ",[192,15656,13063],{}," step. Each iteration of the loop POSTs its result to your service, useful for processing scraped data in real time rather than waiting for the whole automation to finish.",[189,15659,15660,15663,15664,15666],{},[192,15661,15662],{},"Branching to external logic."," Use ",[192,15665,13063],{}," to hand off to a serverless function that does something axiom.ai can't, then continue the automation with the function's response.",[107,15668,15670],{"id":15669},"receive-data-from-an-external-service","Receive data from an external service",[112,15672],{},[26,15674,15620,15675,15677],{},[192,15676,15414],{}," step at the start of your automation (or wherever you want to consume external data). The step provides a webhook URL you give to your external service. Data POSTed to that URL is available to subsequent steps as if it had been entered manually.",[26,15679,15680,15681,15683],{},"This is separate from ",[145,15682,4467],{},". The differences:",[186,15685,15686,15694],{},[189,15687,15688,15690,15691,15693],{},[145,15689,4467],{}," starts a run and accepts an optional ",[145,15692,580],{}," payload.",[189,15695,15696,15698],{},[192,15697,15414],{}," runs as part of an automation that's already executing, pulling data in mid-flow.",[26,15700,15701,15702,15704,15705,15707,15708,5214,15710,15712],{},"If you need to start a run AND pass data, use ",[145,15703,4467],{}," with the ",[145,15706,580],{}," parameter, see ",[659,15709,10439],{"href":10356},[192,15711,15414],{}," when you want a step inside a longer automation to pause and wait for external input.",[107,15714,15716],{"id":15715},"configuration-and-security","Configuration and security",[112,15718],{},[26,15720,15721,15722,15724],{},"Both webhook step types are configured inside the ",[192,15723,10785],{},", not via the API. Open the relevant step's reference page for the configuration fields and authoring details:",[186,15726,15727,15731],{},[189,15728,15729],{},[659,15730,13063],{"href":1123},[189,15732,15733],{},[659,15734,15414],{"href":15586},[26,15736,15737],{},"For inbound webhook URLs, treat the URL itself as a secret. Anyone who knows the URL can POST data into your automation. Rotate the URL (by re-creating the step) if you suspect it's been exposed.",[107,15739,4513],{"id":4512},[112,15741],{},[186,15743,15744,15748],{},[189,15745,15746],{},[659,15747,4528],{"href":4527},[189,15749,15750],{},[659,15751,10992],{"href":7368},{"title":67,"searchDepth":68,"depth":68,"links":15753},[15754,15755,15756,15757,15758],{"id":15539,"depth":670,"text":15540},{"id":15614,"depth":670,"text":15615},{"id":15669,"depth":670,"text":15670},{"id":15715,"depth":670,"text":15716},{"id":4512,"depth":670,"text":4513},"Use webhook steps inside an automation to push data to external services or trigger an automation from inbound webhooks.",{"metaTitle":15761},"Send and receive webhooks inside an axiom.ai automation",{"title":15529,"description":15759},"docs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Fwebhooks-from-a-step","Q1Z-heDHa0s8XhOBj1-Mp2VE0ur4AIP0fbXPro9g9gM",{"id":15766,"title":15767,"body":15768,"date":71,"description":16076,"extension":73,"meta":16077,"navigation":75,"order":1478,"path":16079,"seo":16080,"stem":16081,"__hash__":16082},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fclick.md","Click",{"type":8,"value":15769,"toc":16069},[15770,15783,15787,15789,15806,15890,15899,15901,15903,15949,15953,15955,15964,15992,15997,16021,16023,16025,16043,16045,16047,16066],[26,15771,15772,15775,15776,15782],{},[145,15773,15774],{},"axiom.click(select)"," clicks the first element on the page that matches a CSS selector. The same step type as the No-Code Tool's ",[659,15777,15779],{"href":15778},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclick-element",[192,15780,15781],{},"Click element",", called from your code with a selector you choose at runtime.",[107,15784,15786],{"id":15785},"signature","Signature",[112,15788],{},[2446,15790,15792],{"className":2962,"code":15791,"language":2964,"meta":67,"style":67},"await axiom.click(select, leftClickRightClick, optionalClick);\n",[145,15793,15794],{"__ignoreMap":67},[1332,15795,15796,15798,15801,15803],{"class":2455,"line":2131},[1332,15797,3020],{"class":2507},[1332,15799,15800],{"class":2521}," axiom.",[1332,15802,5473],{"class":2525},[1332,15804,15805],{"class":2521},"(select, leftClickRightClick, optionalClick);\n",[4589,15807,15808,15823],{},[4592,15809,15810],{},[4595,15811,15812,15814,15816,15818,15821],{},[4598,15813,12524],{},[4598,15815,12527],{},[4598,15817,8403],{},[4598,15819,15820],{},"Default",[4598,15822,12532],{},[4605,15824,15825,15842,15868],{},[4595,15826,15827,15832,15834,15836,15839],{},[4610,15828,15829],{},[145,15830,15831],{},"select",[4610,15833,6750],{},[4610,15835,10771],{},[4610,15837,15838],{},"—",[4610,15840,15841],{},"CSS selector for the element to click.",[4595,15843,15844,15849,15851,15853,15858],{},[4610,15845,15846],{},[145,15847,15848],{},"leftClickRightClick",[4610,15850,6750],{},[4610,15852,10779],{},[4610,15854,15855],{},[145,15856,15857],{},"\"left\"",[4610,15859,15860,2344,15862,5214,15865,15867],{},[145,15861,15857],{},[145,15863,15864],{},"\"right\"",[145,15866,15864],{}," to fire a context-menu click.",[4595,15869,15870,15875,15878,15880,15885],{},[4610,15871,15872],{},[145,15873,15874],{},"optionalClick",[4610,15876,15877],{},"boolean",[4610,15879,10779],{},[4610,15881,15882],{},[145,15883,15884],{},"false",[4610,15886,11487,15887,15889],{},[145,15888,1548],{},", the call resolves successfully even if the selector matches zero elements. Useful for \"click if present\" cleanups (close-banner, accept-cookies).",[26,15891,15892,15893,148],{},"If the selector matches multiple elements, only the first is clicked. For batched clicks, use ",[659,15894,15896],{"href":15895},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fclick-multiple",[145,15897,15898],{},"axiom.clickMultiple()",[107,15900,12784],{"id":12783},[112,15902],{},[2446,15904,15906],{"className":2962,"code":15905,"language":2964,"meta":67,"style":67},"await axiom.browserOpen();\nawait axiom.goto(\"https:\u002F\u002Fexample.com\u002Flogin\");\nawait axiom.click(\"button[type=submit]\");\n",[145,15907,15908,15919,15934],{"__ignoreMap":67},[1332,15909,15910,15912,15914,15917],{"class":2455,"line":2131},[1332,15911,3020],{"class":2507},[1332,15913,15800],{"class":2521},[1332,15915,15916],{"class":2525},"browserOpen",[1332,15918,2670],{"class":2521},[1332,15920,15921,15923,15925,15927,15929,15932],{"class":2455,"line":670},[1332,15922,3020],{"class":2507},[1332,15924,15800],{"class":2521},[1332,15926,2682],{"class":2525},[1332,15928,1213],{"class":2521},[1332,15930,15931],{"class":2462},"\"https:\u002F\u002Fexample.com\u002Flogin\"",[1332,15933,2583],{"class":2521},[1332,15935,15936,15938,15940,15942,15944,15947],{"class":2455,"line":68},[1332,15937,3020],{"class":2507},[1332,15939,15800],{"class":2521},[1332,15941,5473],{"class":2525},[1332,15943,1213],{"class":2521},[1332,15945,15946],{"class":2462},"\"button[type=submit]\"",[1332,15948,2583],{"class":2521},[107,15950,15952],{"id":15951},"common-patterns","Common patterns",[112,15954],{},[26,15956,15957,15960,15961,15963],{},[192,15958,15959],{},"Optional dismiss."," Cookie banners and consent modals only appear sometimes. With ",[145,15962,15874],{},", the step is a no-op when they're absent:",[2446,15965,15967],{"className":2962,"code":15966,"language":2964,"meta":67,"style":67},"await axiom.click(\"#cookie-accept\", \"left\", true);\n",[145,15968,15969],{"__ignoreMap":67},[1332,15970,15971,15973,15975,15977,15979,15982,15984,15986,15988,15990],{"class":2455,"line":2131},[1332,15972,3020],{"class":2507},[1332,15974,15800],{"class":2521},[1332,15976,5473],{"class":2525},[1332,15978,1213],{"class":2521},[1332,15980,15981],{"class":2462},"\"#cookie-accept\"",[1332,15983,4468],{"class":2521},[1332,15985,15857],{"class":2462},[1332,15987,4468],{"class":2521},[1332,15989,1548],{"class":2511},[1332,15991,2583],{"class":2521},[26,15993,15994],{},[192,15995,15996],{},"Right-click for context menus.",[2446,15998,16000],{"className":2962,"code":15999,"language":2964,"meta":67,"style":67},"await axiom.click(\".file-row\", \"right\");\n",[145,16001,16002],{"__ignoreMap":67},[1332,16003,16004,16006,16008,16010,16012,16015,16017,16019],{"class":2455,"line":2131},[1332,16005,3020],{"class":2507},[1332,16007,15800],{"class":2521},[1332,16009,5473],{"class":2525},[1332,16011,1213],{"class":2521},[1332,16013,16014],{"class":2462},"\".file-row\"",[1332,16016,4468],{"class":2521},[1332,16018,15864],{"class":2462},[1332,16020,2583],{"class":2521},[107,16022,6276],{"id":6275},[112,16024],{},[186,16026,16027,16034,16037],{},[189,16028,16029,16030,11490,16032,148],{},"Hidden, zero-size, or disabled elements throw an error unless ",[145,16031,15874],{},[145,16033,1548],{},[189,16035,16036],{},"Selectors operate on the top-level document only. Elements inside iframes are not reachable today.",[189,16038,16039,16040,148],{},"For elements without a stable selector (no ID, no class), use a more specific path like ",[145,16041,16042],{},"nav > ul > li:nth-child(3) > a",[107,16044,4513],{"id":4512},[112,16046],{},[186,16048,16049,16054,16060],{},[189,16050,16051],{},[659,16052,16053],{"href":15895},"Click multiple",[189,16055,16056],{},[659,16057,16059],{"href":16058},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fhover","Hover",[189,16061,16062],{},[659,16063,16065],{"href":16064},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fenter-text","Enter text",[2819,16067,16068],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}",{"title":67,"searchDepth":68,"depth":68,"links":16070},[16071,16072,16073,16074,16075],{"id":15785,"depth":670,"text":15786},{"id":12783,"depth":670,"text":12784},{"id":15951,"depth":670,"text":15952},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Click a button, link, or any other element in a cloud browser session by passing a CSS selector to axiom.click().",{"metaTitle":16078},"Click an element in an axiom.ai cloud browser session","\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fclick",{"title":15767,"description":16076},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fclick","DqXqEibbtFSCY61kSqSvVTTM69K6Sg9ByPwBhQSLS34",{"id":16084,"title":16085,"body":16086,"date":71,"description":16315,"extension":73,"meta":16316,"navigation":75,"order":2642,"path":16318,"seo":16319,"stem":16320,"__hash__":16321},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fclick-and-drag.md","Click and drag",{"type":8,"value":16087,"toc":16309},[16088,16100,16102,16104,16121,16170,16187,16189,16191,16205,16270,16272,16274,16292,16294,16296,16306],[26,16089,16090,16093,16094,148],{},[145,16091,16092],{},"axiom.clickAndDrag(startCoordinates, endCoordinates)"," presses the mouse at one coordinate, drags to another, and releases. Use it for sliders, drag-and-drop UIs, and any control that responds to a press-move-release rather than a click. The same step type as the No-Code Tool's ",[659,16095,16097],{"href":16096},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fmouse-drag",[192,16098,16099],{},"Mouse click & drag",[107,16101,15786],{"id":15785},[112,16103],{},[2446,16105,16107],{"className":2962,"code":16106,"language":2964,"meta":67,"style":67},"await axiom.clickAndDrag(startCoordinates, endCoordinates);\n",[145,16108,16109],{"__ignoreMap":67},[1332,16110,16111,16113,16115,16118],{"class":2455,"line":2131},[1332,16112,3020],{"class":2507},[1332,16114,15800],{"class":2521},[1332,16116,16117],{"class":2525},"clickAndDrag",[1332,16119,16120],{"class":2521},"(startCoordinates, endCoordinates);\n",[4589,16122,16123,16135],{},[4592,16124,16125],{},[4595,16126,16127,16129,16131,16133],{},[4598,16128,12524],{},[4598,16130,12527],{},[4598,16132,8403],{},[4598,16134,12532],{},[4605,16136,16137,16154],{},[4595,16138,16139,16144,16146,16148],{},[4610,16140,16141],{},[145,16142,16143],{},"startCoordinates",[4610,16145,12725],{},[4610,16147,10771],{},[4610,16149,16150,16153],{},[145,16151,16152],{},"{ scrollX, scrollY, clientX, clientY }",". Where the mouse-down event fires.",[4595,16155,16156,16161,16163,16165],{},[4610,16157,16158],{},[145,16159,16160],{},"endCoordinates",[4610,16162,12725],{},[4610,16164,10771],{},[4610,16166,16167,16169],{},[145,16168,16152],{},". Where the mouse-up event fires.",[26,16171,16172,16175,16176,16179,16180,16175,16183,16186],{},[145,16173,16174],{},"scrollX"," \u002F ",[145,16177,16178],{},"scrollY"," are the page-relative coordinates (the document position). ",[145,16181,16182],{},"clientX",[145,16184,16185],{},"clientY"," are viewport-relative. For most ordinary drag operations on a page that isn't scrolled in either axis, the four values are equal pairwise.",[107,16188,12784],{"id":12783},[112,16190],{},[26,16192,16193,16194,9879,16197,16200,16201,16204],{},"Slide a range control from ",[145,16195,16196],{},"x=100",[145,16198,16199],{},"x=300"," on the same horizontal line (",[145,16202,16203],{},"y=400","):",[2446,16206,16208],{"className":2962,"code":16207,"language":2964,"meta":67,"style":67},"await axiom.clickAndDrag(\n  { scrollX: 100, scrollY: 400, clientX: 100, clientY: 400 },\n  { scrollX: 300, scrollY: 400, clientX: 300, clientY: 400 }\n);\n",[145,16209,16210,16220,16245,16266],{"__ignoreMap":67},[1332,16211,16212,16214,16216,16218],{"class":2455,"line":2131},[1332,16213,3020],{"class":2507},[1332,16215,15800],{"class":2521},[1332,16217,16117],{"class":2525},[1332,16219,4878],{"class":2521},[1332,16221,16222,16225,16228,16231,16233,16236,16238,16241,16243],{"class":2455,"line":670},[1332,16223,16224],{"class":2521},"  { scrollX: ",[1332,16226,16227],{"class":2511},"100",[1332,16229,16230],{"class":2521},", scrollY: ",[1332,16232,11205],{"class":2511},[1332,16234,16235],{"class":2521},", clientX: ",[1332,16237,16227],{"class":2511},[1332,16239,16240],{"class":2521},", clientY: ",[1332,16242,11205],{"class":2511},[1332,16244,6531],{"class":2521},[1332,16246,16247,16249,16252,16254,16256,16258,16260,16262,16264],{"class":2455,"line":68},[1332,16248,16224],{"class":2521},[1332,16250,16251],{"class":2511},"300",[1332,16253,16230],{"class":2521},[1332,16255,11205],{"class":2511},[1332,16257,16235],{"class":2521},[1332,16259,16251],{"class":2511},[1332,16261,16240],{"class":2521},[1332,16263,11205],{"class":2511},[1332,16265,6185],{"class":2521},[1332,16267,16268],{"class":2455,"line":1478},[1332,16269,2583],{"class":2521},[107,16271,6276],{"id":6275},[112,16273],{},[186,16275,16276,16279],{},[189,16277,16278],{},"This step works in raw coordinates, not selectors. To anchor a drag to an element, compute the element's bounding box in a previous step (in the No-Code Tool the selector tool does this for you) and pass the result.",[189,16280,16281,16282,4468,16285,4468,16288,16291],{},"For drag operations that depend on HTML5 drag-and-drop events (",[145,16283,16284],{},"dragstart",[145,16286,16287],{},"dragover",[145,16289,16290],{},"drop","), some sites won't respond to a synthesized mouse drag. Test before relying on this for HTML5 drag UIs.",[107,16293,4513],{"id":4512},[112,16295],{},[186,16297,16298,16302],{},[189,16299,16300],{},[659,16301,15767],{"href":16079},[189,16303,16304],{},[659,16305,16059],{"href":16058},[2819,16307,16308],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}",{"title":67,"searchDepth":68,"depth":68,"links":16310},[16311,16312,16313,16314],{"id":15785,"depth":670,"text":15786},{"id":12783,"depth":670,"text":12784},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Press the mouse at one coordinate, drag to another, and release using axiom.clickAndDrag(). Useful for sliders, range pickers, drag-and-drop UIs, and slider captchas.",{"metaTitle":16317},"Mouse-press and drag between two coordinates in an axiom.ai cloud browser session","\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fclick-and-drag",{"title":16085,"description":16315},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fclick-and-drag","0YOu9r1O28gZyMh0SO_NVUtVAB8MmgCVHNu3PcTyQA0",{"id":16323,"title":16324,"body":16325,"date":71,"description":16474,"extension":73,"meta":16475,"navigation":75,"order":2623,"path":16477,"seo":16478,"stem":16479,"__hash__":16480},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fclick-engagement-button.md","Click engagement button",{"type":8,"value":16326,"toc":16468},[16327,16333,16335,16337,16354,16397,16399,16401,16404,16429,16437,16439,16441,16455,16457,16459,16465],[26,16328,16329,16332],{},[145,16330,16331],{},"axiom.clickEngagementButton(select, setValueToCheck)"," clicks a toggle button (like, follow, subscribe) only when its visible label doesn't already match the target state. Use it to make like\u002Ffollow steps idempotent — running them twice won't accidentally unlike or unfollow.",[107,16334,15786],{"id":15785},[112,16336],{},[2446,16338,16340],{"className":2962,"code":16339,"language":2964,"meta":67,"style":67},"await axiom.clickEngagementButton(select, setValueToCheck);\n",[145,16341,16342],{"__ignoreMap":67},[1332,16343,16344,16346,16348,16351],{"class":2455,"line":2131},[1332,16345,3020],{"class":2507},[1332,16347,15800],{"class":2521},[1332,16349,16350],{"class":2525},"clickEngagementButton",[1332,16352,16353],{"class":2521},"(select, setValueToCheck);\n",[4589,16355,16356,16368],{},[4592,16357,16358],{},[4595,16359,16360,16362,16364,16366],{},[4598,16361,12524],{},[4598,16363,12527],{},[4598,16365,8403],{},[4598,16367,12532],{},[4605,16369,16370,16383],{},[4595,16371,16372,16376,16378,16380],{},[4610,16373,16374],{},[145,16375,15831],{},[4610,16377,6750],{},[4610,16379,10771],{},[4610,16381,16382],{},"CSS selector for the button.",[4595,16384,16385,16390,16392,16394],{},[4610,16386,16387],{},[145,16388,16389],{},"setValueToCheck",[4610,16391,6750],{},[4610,16393,10771],{},[4610,16395,16396],{},"Text that indicates the button is already in the target state. If the button's text matches, the step is a no-op.",[107,16398,12784],{"id":12783},[112,16400],{},[26,16402,16403],{},"Follow a user, but only if they're not already followed:",[2446,16405,16407],{"className":2962,"code":16406,"language":2964,"meta":67,"style":67},"await axiom.clickEngagementButton(\"button.follow-action\", \"Following\");\n",[145,16408,16409],{"__ignoreMap":67},[1332,16410,16411,16413,16415,16417,16419,16422,16424,16427],{"class":2455,"line":2131},[1332,16412,3020],{"class":2507},[1332,16414,15800],{"class":2521},[1332,16416,16350],{"class":2525},[1332,16418,1213],{"class":2521},[1332,16420,16421],{"class":2462},"\"button.follow-action\"",[1332,16423,4468],{"class":2521},[1332,16425,16426],{"class":2462},"\"Following\"",[1332,16428,2583],{"class":2521},[26,16430,16431,16432,148],{},"If the button reads \"Follow\", the step clicks it. If it already reads \"Following\", the step is a no-op. The same step type as the No-Code Tool's ",[659,16433,16435],{"href":16434},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclick-social-media-buttons",[192,16436,16324],{},[107,16438,6276],{"id":6275},[112,16440],{},[186,16442,16443,16446],{},[189,16444,16445],{},"The match is on the button's visible text. Aria-pressed or other state attributes are ignored.",[189,16447,16448,16449,16454],{},"For non-toggle buttons (where clicking again does something different rather than reverting), use ",[659,16450,16451],{"href":16079},[145,16452,16453],{},"axiom.click()"," instead.",[107,16456,4513],{"id":4512},[112,16458],{},[186,16460,16461],{},[189,16462,16463],{},[659,16464,15767],{"href":16079},[2819,16466,16467],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}",{"title":67,"searchDepth":68,"depth":68,"links":16469},[16470,16471,16472,16473],{"id":15785,"depth":670,"text":15786},{"id":12783,"depth":670,"text":12784},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Click a like, follow, subscribe, or similar toggle only when it isn't already in the target state, using axiom.clickEngagementButton().",{"metaTitle":16476},"Toggle a like\u002Ffollow\u002Fsubscribe button in an axiom.ai cloud browser session","\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fclick-engagement-button",{"title":16324,"description":16474},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fclick-engagement-button","tRl2xTrqghECWqOkPfuM_g0deIPx8IrGCo8kGjhcges",{"id":16482,"title":16053,"body":16483,"date":71,"description":16675,"extension":73,"meta":16676,"navigation":75,"order":2237,"path":15895,"seo":16678,"stem":16679,"__hash__":16680},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fclick-multiple.md",{"type":8,"value":16484,"toc":16669},[16485,16498,16500,16502,16519,16589,16591,16593,16596,16625,16627,16629,16653,16655,16657,16667],[26,16486,16487,16490,16491,16497],{},[145,16488,16489],{},"axiom.clickMultiple(select)"," clicks every element that matches a CSS selector, up to a cap. The same step type as the No-Code Tool's ",[659,16492,16494],{"href":16493},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclick-multiple-elements",[192,16495,16496],{},"Click multiple elements",", called from your code.",[107,16499,15786],{"id":15785},[112,16501],{},[2446,16503,16505],{"className":2962,"code":16504,"language":2964,"meta":67,"style":67},"await axiom.clickMultiple(select, leftClickRightClick, maxClicks);\n",[145,16506,16507],{"__ignoreMap":67},[1332,16508,16509,16511,16513,16516],{"class":2455,"line":2131},[1332,16510,3020],{"class":2507},[1332,16512,15800],{"class":2521},[1332,16514,16515],{"class":2525},"clickMultiple",[1332,16517,16518],{"class":2521},"(select, leftClickRightClick, maxClicks);\n",[4589,16520,16521,16535],{},[4592,16522,16523],{},[4595,16524,16525,16527,16529,16531,16533],{},[4598,16526,12524],{},[4598,16528,12527],{},[4598,16530,8403],{},[4598,16532,15820],{},[4598,16534,12532],{},[4605,16536,16537,16552,16572],{},[4595,16538,16539,16543,16545,16547,16549],{},[4610,16540,16541],{},[145,16542,15831],{},[4610,16544,6750],{},[4610,16546,10771],{},[4610,16548,15838],{},[4610,16550,16551],{},"CSS selector matching the elements to click.",[4595,16553,16554,16558,16560,16562,16566],{},[4610,16555,16556],{},[145,16557,15848],{},[4610,16559,6750],{},[4610,16561,10779],{},[4610,16563,16564],{},[145,16565,15857],{},[4610,16567,16568,2344,16570,148],{},[145,16569,15857],{},[145,16571,15864],{},[4595,16573,16574,16579,16581,16583,16586],{},[4610,16575,16576],{},[145,16577,16578],{},"maxClicks",[4610,16580,14013],{},[4610,16582,10779],{},[4610,16584,16585],{},"unlimited",[4610,16587,16588],{},"Cap on how many elements to click. Use this to bound runtime on pages that match more elements than you want to act on.",[107,16590,12784],{"id":12783},[112,16592],{},[26,16594,16595],{},"Expand every collapsed section on a page (up to 20):",[2446,16597,16599],{"className":2962,"code":16598,"language":2964,"meta":67,"style":67},"await axiom.clickMultiple(\".section-header.collapsed\", \"left\", 20);\n",[145,16600,16601],{"__ignoreMap":67},[1332,16602,16603,16605,16607,16609,16611,16614,16616,16618,16620,16623],{"class":2455,"line":2131},[1332,16604,3020],{"class":2507},[1332,16606,15800],{"class":2521},[1332,16608,16515],{"class":2525},[1332,16610,1213],{"class":2521},[1332,16612,16613],{"class":2462},"\".section-header.collapsed\"",[1332,16615,4468],{"class":2521},[1332,16617,15857],{"class":2462},[1332,16619,4468],{"class":2521},[1332,16621,16622],{"class":2511},"20",[1332,16624,2583],{"class":2521},[107,16626,6276],{"id":6275},[112,16628],{},[186,16630,16631,16634,16645],{},[189,16632,16633],{},"Elements are clicked in document order.",[189,16635,16636,16637,16641,16642,16454],{},"Hidden, zero-size, or disabled elements throw — there's no \"skip if not clickable\" mode on this method. For a defensive pass, loop on ",[659,16638,16639],{"href":16079},[145,16640,16453],{}," with ",[145,16643,16644],{},"optionalClick: true",[189,16646,16647,16648,16650,16651,148],{},"For per-element work (read state, decide whether to click, click), drive the loop in your own code with ",[145,16649,16453],{}," rather than ",[145,16652,16515],{},[107,16654,4513],{"id":4512},[112,16656],{},[186,16658,16659,16663],{},[189,16660,16661],{},[659,16662,15767],{"href":16079},[189,16664,16665],{},[659,16666,16324],{"href":16477},[2819,16668,16068],{},{"title":67,"searchDepth":68,"depth":68,"links":16670},[16671,16672,16673,16674],{"id":15785,"depth":670,"text":15786},{"id":12783,"depth":670,"text":12784},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Click every element matching a CSS selector, up to a maximum, using axiom.clickMultiple().",{"metaTitle":16677},"Click every matching element in an axiom.ai cloud browser session",{"title":16053,"description":16675},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fclick-multiple","d09pDWva79wI0vUZsRbTYgkNwGD2JNQCXoiLW97XGLs",{"id":16682,"title":16683,"body":16684,"date":71,"description":16948,"extension":73,"meta":16949,"navigation":75,"order":3807,"path":16951,"seo":16952,"stem":16953,"__hash__":16954},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fclose-a-session.md","Close a session",{"type":8,"value":16685,"toc":16941},[16686,16697,16699,16701,16718,16762,16765,16769,16771,16872,16877,16881,16883,16909,16911,16913,16924,16926,16928,16938],[26,16687,16688,16691,16692,16175,16694,16696],{},[145,16689,16690],{},"axiom.browserClose()"," closes the session and frees its resources. Cloud sessions consume runtime quota for their entire open lifetime, so always close yours when you're done. The cleanest pattern is to wrap your work in a ",[145,16693,2645],{},[145,16695,4790],{}," block so the close happens even if your code throws.",[107,16698,15786],{"id":15785},[112,16700],{},[2446,16702,16704],{"className":2962,"code":16703,"language":2964,"meta":67,"style":67},"await axiom.browserClose(cdpLink);\n",[145,16705,16706],{"__ignoreMap":67},[1332,16707,16708,16710,16712,16715],{"class":2455,"line":2131},[1332,16709,3020],{"class":2507},[1332,16711,15800],{"class":2521},[1332,16713,16714],{"class":2525},"browserClose",[1332,16716,16717],{"class":2521},"(cdpLink);\n",[4589,16719,16720,16734],{},[4592,16721,16722],{},[4595,16723,16724,16726,16728,16730,16732],{},[4598,16725,12524],{},[4598,16727,12527],{},[4598,16729,8403],{},[4598,16731,15820],{},[4598,16733,12532],{},[4605,16735,16736],{},[4595,16737,16738,16743,16745,16747,16755],{},[4610,16739,16740],{},[145,16741,16742],{},"cdpLink",[4610,16744,6750],{},[4610,16746,10779],{},[4610,16748,16749,16752,16753],{},[145,16750,16751],{},"axiom.cdpLink"," cached from the last ",[145,16754,5467],{},[4610,16756,16757,16758,16761],{},"Pod CDP endpoint to close. Pass an explicit value only when closing a session you opened from a different ",[145,16759,16760],{},"AxiomApi"," instance (rare).",[26,16763,16764],{},"Returns the server's confirmation message string.",[107,16766,16768],{"id":16767},"the-standard-pattern","The standard pattern",[112,16770],{},[2446,16772,16774],{"className":2962,"code":16773,"language":2964,"meta":67,"style":67},"import { AxiomApi } from 'axiom-api';\n\nconst axiom = new AxiomApi(process.env.AXIOM_API_KEY);\nawait axiom.browserOpen();\ntry {\n  await axiom.goto(\"https:\u002F\u002Fexample.com\");\n  \u002F\u002F ... your automation\n} finally {\n  await axiom.browserClose();\n}\n",[145,16775,16776,16790,16794,16815,16825,16831,16845,16850,16858,16868],{"__ignoreMap":67},[1332,16777,16778,16780,16783,16785,16788],{"class":2455,"line":2131},[1332,16779,4661],{"class":2507},[1332,16781,16782],{"class":2521}," { AxiomApi } ",[1332,16784,4667],{"class":2507},[1332,16786,16787],{"class":2462}," 'axiom-api'",[1332,16789,4673],{"class":2521},[1332,16791,16792],{"class":2455,"line":670},[1332,16793,2588],{"emptyLinePlaceholder":75},[1332,16795,16796,16798,16801,16803,16805,16808,16811,16813],{"class":2455,"line":68},[1332,16797,2508],{"class":2507},[1332,16799,16800],{"class":2511}," axiom",[1332,16802,2515],{"class":2507},[1332,16804,2697],{"class":2507},[1332,16806,16807],{"class":2525}," AxiomApi",[1332,16809,16810],{"class":2521},"(process.env.",[1332,16812,4713],{"class":2511},[1332,16814,2583],{"class":2521},[1332,16816,16817,16819,16821,16823],{"class":2455,"line":1478},[1332,16818,3020],{"class":2507},[1332,16820,15800],{"class":2521},[1332,16822,15916],{"class":2525},[1332,16824,2670],{"class":2521},[1332,16826,16827,16829],{"class":2455,"line":293},[1332,16828,2645],{"class":2507},[1332,16830,2648],{"class":2521},[1332,16832,16833,16835,16837,16839,16841,16843],{"class":2455,"line":2237},[1332,16834,3389],{"class":2507},[1332,16836,15800],{"class":2521},[1332,16838,2682],{"class":2525},[1332,16840,1213],{"class":2521},[1332,16842,4759],{"class":2462},[1332,16844,2583],{"class":2521},[1332,16846,16847],{"class":2455,"line":2623},[1332,16848,16849],{"class":2609},"  \u002F\u002F ... your automation\n",[1332,16851,16852,16854,16856],{"class":2455,"line":2637},[1332,16853,2768],{"class":2521},[1332,16855,4790],{"class":2507},[1332,16857,2648],{"class":2521},[1332,16859,16860,16862,16864,16866],{"class":2455,"line":2642},[1332,16861,3389],{"class":2507},[1332,16863,15800],{"class":2521},[1332,16865,16714],{"class":2525},[1332,16867,2670],{"class":2521},[1332,16869,16870],{"class":2455,"line":2651},[1332,16871,2802],{"class":2521},[26,16873,2273,16874,16876],{},[145,16875,4790],{}," block runs whether your code succeeds or throws, so the session always closes. Without it, an unhandled error leaks the session and you keep paying for runtime until the server reaps it.",[107,16878,16880],{"id":16879},"what-happens-when-a-session-is-closed","What happens when a session is closed",[112,16882],{},[186,16884,16885,16888,16891,16894,16899],{},[189,16886,16887],{},"The cloud Chromium instance shuts down immediately.",[189,16889,16890],{},"Any in-flight network requests are cancelled.",[189,16892,16893],{},"Cookies, localStorage, and any other in-memory state for the session is discarded.",[189,16895,16896,16897,148],{},"Runtime stops accruing against your ",[659,16898,4820],{"href":4539},[189,16900,16901,16902,16905,16906,16908],{},"Subsequent calls on the same ",[145,16903,16904],{},"axiom"," instance throw until you call ",[145,16907,5467],{}," again.",[107,16910,6276],{"id":6275},[112,16912],{},[186,16914,16915,16918,16921],{},[189,16916,16917],{},"Idle sessions are eventually timed out by the server, but this is not immediate. A leaked session can rack up several minutes of runtime before being reaped.",[189,16919,16920],{},"There's no way to reconnect to a closed session. If you need to resume work later, store the relevant state (URL, form values) in your own code and re-apply it on the next session.",[189,16922,16923],{},"For long-running scripts that do many independent tasks, prefer opening and closing a session per task rather than holding one open for the whole duration. Fresh sessions are more reliable and easier to reason about.",[107,16925,4513],{"id":4512},[112,16927],{},[186,16929,16930,16934],{},[189,16931,16932],{},[659,16933,11078],{"href":4533},[189,16935,16936],{},[659,16937,4540],{"href":4539},[2819,16939,16940],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}",{"title":67,"searchDepth":68,"depth":68,"links":16942},[16943,16944,16945,16946,16947],{"id":15785,"depth":670,"text":15786},{"id":16767,"depth":670,"text":16768},{"id":16879,"depth":670,"text":16880},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Close the cloud browser session to free its resources and stop consuming runtime quota.",{"metaTitle":16950},"Close an axiom.ai cloud browser session with axiom-api","\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fclose-a-session",{"title":16683,"description":16948},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fclose-a-session","mEU_sxLp6X37xBzWeV324C-hzl3uZmG9uwNoZ7MWBMk",{"id":16956,"title":16957,"body":16958,"date":71,"description":17212,"extension":73,"meta":17213,"navigation":75,"order":2692,"path":17215,"seo":17216,"stem":17217,"__hash__":17218},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fdate-picker.md","Date picker",{"type":8,"value":16959,"toc":17206},[16960,16971,16973,16975,16992,17077,17079,17081,17153,17155,17157,17187,17189,17191,17203],[26,16961,16962,16965,16966,148],{},[145,16963,16964],{},"axiom.datePicker(selectMonth, selectMonthChangeButton, changeMonthTo, changeDayOfMonthTo)"," drives a calendar-widget date picker: it advances the calendar until the visible month matches your target, then clicks the day. The same step type as the No-Code Tool's ",[659,16967,16969],{"href":16968},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdate-picker",[192,16970,16957],{},[107,16972,15786],{"id":15785},[112,16974],{},[2446,16976,16978],{"className":2962,"code":16977,"language":2964,"meta":67,"style":67},"await axiom.datePicker(selectMonth, selectMonthChangeButton, changeMonthTo, changeDayOfMonthTo);\n",[145,16979,16980],{"__ignoreMap":67},[1332,16981,16982,16984,16986,16989],{"class":2455,"line":2131},[1332,16983,3020],{"class":2507},[1332,16985,15800],{"class":2521},[1332,16987,16988],{"class":2525},"datePicker",[1332,16990,16991],{"class":2521},"(selectMonth, selectMonthChangeButton, changeMonthTo, changeDayOfMonthTo);\n",[4589,16993,16994,17006],{},[4592,16995,16996],{},[4595,16997,16998,17000,17002,17004],{},[4598,16999,12524],{},[4598,17001,12527],{},[4598,17003,8403],{},[4598,17005,12532],{},[4605,17007,17008,17022,17039,17059],{},[4595,17009,17010,17015,17017,17019],{},[4610,17011,17012],{},[145,17013,17014],{},"selectMonth",[4610,17016,6750],{},[4610,17018,10771],{},[4610,17020,17021],{},"CSS selector for the element that displays the currently shown month (e.g. the calendar's header).",[4595,17023,17024,17029,17031,17033],{},[4610,17025,17026],{},[145,17027,17028],{},"selectMonthChangeButton",[4610,17030,6750],{},[4610,17032,10771],{},[4610,17034,17035,17036,148],{},"CSS selector for the \"next month\" button on the widget. The step clicks it until the displayed month matches ",[145,17037,17038],{},"changeMonthTo",[4595,17040,17041,17045,17047,17049],{},[4610,17042,17043],{},[145,17044,17038],{},[4610,17046,6750],{},[4610,17048,10771],{},[4610,17050,17051,17052,17055,17056,17058],{},"The target month name (e.g. ",[145,17053,17054],{},"\"June 2026\"","). Matched fuzzily against the text of ",[145,17057,17014],{}," so a small format difference is tolerated.",[4595,17060,17061,17066,17068,17070],{},[4610,17062,17063],{},[145,17064,17065],{},"changeDayOfMonthTo",[4610,17067,6750],{},[4610,17069,10771],{},[4610,17071,17072,17073,17076],{},"The target day (e.g. ",[145,17074,17075],{},"\"15\"","). The step clicks the closest matching day cell.",[107,17078,12784],{"id":12783},[112,17080],{},[2446,17082,17084],{"className":2962,"code":17083,"language":2964,"meta":67,"style":67},"await axiom.click(\"#checkin-date\");           \u002F\u002F open the picker\nawait axiom.datePicker(\n  \".calendar .month-header\",                  \u002F\u002F selectMonth\n  \".calendar .next-month-button\",             \u002F\u002F selectMonthChangeButton\n  \"June 2026\",\n  \"15\"\n);\n",[145,17085,17086,17105,17115,17126,17137,17144,17149],{"__ignoreMap":67},[1332,17087,17088,17090,17092,17094,17096,17099,17102],{"class":2455,"line":2131},[1332,17089,3020],{"class":2507},[1332,17091,15800],{"class":2521},[1332,17093,5473],{"class":2525},[1332,17095,1213],{"class":2521},[1332,17097,17098],{"class":2462},"\"#checkin-date\"",[1332,17100,17101],{"class":2521},");           ",[1332,17103,17104],{"class":2609},"\u002F\u002F open the picker\n",[1332,17106,17107,17109,17111,17113],{"class":2455,"line":670},[1332,17108,3020],{"class":2507},[1332,17110,15800],{"class":2521},[1332,17112,16988],{"class":2525},[1332,17114,4878],{"class":2521},[1332,17116,17117,17120,17123],{"class":2455,"line":68},[1332,17118,17119],{"class":2462},"  \".calendar .month-header\"",[1332,17121,17122],{"class":2521},",                  ",[1332,17124,17125],{"class":2609},"\u002F\u002F selectMonth\n",[1332,17127,17128,17131,17134],{"class":2455,"line":1478},[1332,17129,17130],{"class":2462},"  \".calendar .next-month-button\"",[1332,17132,17133],{"class":2521},",             ",[1332,17135,17136],{"class":2609},"\u002F\u002F selectMonthChangeButton\n",[1332,17138,17139,17142],{"class":2455,"line":293},[1332,17140,17141],{"class":2462},"  \"June 2026\"",[1332,17143,6024],{"class":2521},[1332,17145,17146],{"class":2455,"line":2237},[1332,17147,17148],{"class":2462},"  \"15\"\n",[1332,17150,17151],{"class":2455,"line":2623},[1332,17152,2583],{"class":2521},[107,17154,6276],{"id":6275},[112,17156],{},[186,17158,17159,17171,17174],{},[189,17160,17161,17162,17165,17166,17168,17169,16454],{},"This step is built for ",[192,17163,17164],{},"forward navigation only"," — it clicks ",[145,17167,17028],{}," repeatedly. If your target month is in the past relative to the picker's initial month, pass the \"previous month\" button as ",[145,17170,17028],{},[189,17172,17173],{},"The day match picks the calendar cell closest in document order. On months where the first\u002Flast few cells belong to the previous\u002Fnext month, this can occasionally pick the wrong cell — verify your selector targets only the current month's day cells.",[189,17175,17176,17177,17180,17181,17186],{},"For non-widget date inputs (",[145,17178,17179],{},"\u003Cinput type=\"date\">","), use ",[659,17182,17183],{"href":16064},[145,17184,17185],{},"axiom.enterText()"," with an ISO date string instead.",[107,17188,4513],{"id":4512},[112,17190],{},[186,17192,17193,17197],{},[189,17194,17195],{},[659,17196,15767],{"href":16079},[189,17198,17199],{},[659,17200,17202],{"href":17201},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fselect-list","Select list",[2819,17204,17205],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}",{"title":67,"searchDepth":68,"depth":68,"links":17207},[17208,17209,17210,17211],{"id":15785,"depth":670,"text":15786},{"id":12783,"depth":670,"text":12784},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Navigate a calendar widget month by month and pick a target day using axiom.datePicker().",{"metaTitle":17214},"Pick a date in a calendar widget in an axiom.ai cloud browser session","\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fdate-picker",{"title":16957,"description":17212},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fdate-picker","KyRMrnlNNcJwPcsxQzTD90hIy2ndRpIb-oZ1xdTnkKY",{"id":17220,"title":16065,"body":17221,"date":71,"description":17686,"extension":73,"meta":17687,"navigation":75,"order":293,"path":16064,"seo":17689,"stem":17690,"__hash__":17691},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fenter-text.md",{"type":8,"value":17222,"toc":17679},[17223,17234,17236,17238,17254,17383,17385,17387,17471,17473,17475,17481,17510,17524,17576,17584,17622,17624,17626,17658,17660,17662,17677],[26,17224,17225,17228,17229,16497],{},[145,17226,17227],{},"axiom.enterText(selectTextField, text)"," enters text into the first element matching a CSS selector. The same step type as the No-Code Tool's ",[659,17230,17232],{"href":17231},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fenter-text",[192,17233,16065],{},[107,17235,15786],{"id":15785},[112,17237],{},[2446,17239,17241],{"className":2962,"code":17240,"language":2964,"meta":67,"style":67},"await axiom.enterText(selectTextField, text, delay, appendExisting, customLineBreak, optionalText);\n",[145,17242,17243],{"__ignoreMap":67},[1332,17244,17245,17247,17249,17251],{"class":2455,"line":2131},[1332,17246,3020],{"class":2507},[1332,17248,15800],{"class":2521},[1332,17250,5476],{"class":2525},[1332,17252,17253],{"class":2521},"(selectTextField, text, delay, appendExisting, customLineBreak, optionalText);\n",[4589,17255,17256,17270],{},[4592,17257,17258],{},[4595,17259,17260,17262,17264,17266,17268],{},[4598,17261,12524],{},[4598,17263,12527],{},[4598,17265,8403],{},[4598,17267,15820],{},[4598,17269,12532],{},[4605,17271,17272,17288,17303,17321,17341,17363],{},[4595,17273,17274,17279,17281,17283,17285],{},[4610,17275,17276],{},[145,17277,17278],{},"selectTextField",[4610,17280,6750],{},[4610,17282,10771],{},[4610,17284,15838],{},[4610,17286,17287],{},"CSS selector for the input.",[4595,17289,17290,17294,17296,17298,17300],{},[4610,17291,17292],{},[145,17293,5402],{},[4610,17295,6750],{},[4610,17297,10771],{},[4610,17299,15838],{},[4610,17301,17302],{},"Text to enter into the input.",[4595,17304,17305,17310,17312,17314,17318],{},[4610,17306,17307],{},[145,17308,17309],{},"delay",[4610,17311,14013],{},[4610,17313,10779],{},[4610,17315,17316],{},[145,17317,256],{},[4610,17319,17320],{},"Per-keystroke delay in milliseconds. Use a non-zero value (e.g. 50–100) when target sites debounce input or run keystroke-based validation.",[4595,17322,17323,17328,17330,17332,17336],{},[4610,17324,17325],{},[145,17326,17327],{},"appendExisting",[4610,17329,15877],{},[4610,17331,10779],{},[4610,17333,17334],{},[145,17335,15884],{},[4610,17337,11487,17338,17340],{},[145,17339,1548],{},", appends to the field's current value instead of replacing it.",[4595,17342,17343,17348,17351,17353,17357],{},[4610,17344,17345],{},[145,17346,17347],{},"customLineBreak",[4610,17349,17350],{},"string | null",[4610,17352,10779],{},[4610,17354,17355],{},[145,17356,8822],{},[4610,17358,17359,17360,17362],{},"Token in ",[145,17361,5402],{}," to translate into a real newline keypress. Use this when the field treats Enter as \"submit\" but you want literal multi-line input.",[4595,17364,17365,17370,17372,17374,17378],{},[4610,17366,17367],{},[145,17368,17369],{},"optionalText",[4610,17371,15877],{},[4610,17373,10779],{},[4610,17375,17376],{},[145,17377,15884],{},[4610,17379,11487,17380,17382],{},[145,17381,1548],{},", the call resolves successfully even if the selector matches zero elements.",[107,17384,12784],{"id":12783},[112,17386],{},[2446,17388,17390],{"className":2962,"code":17389,"language":2964,"meta":67,"style":67},"await axiom.browserOpen();\nawait axiom.goto(\"https:\u002F\u002Fexample.com\u002Flogin\");\nawait axiom.enterText(\"#email\", \"user@example.com\");\nawait axiom.enterText(\"#password\", process.env.PW);\nawait axiom.click(\"button[type=submit]\");\n",[145,17391,17392,17402,17416,17436,17457],{"__ignoreMap":67},[1332,17393,17394,17396,17398,17400],{"class":2455,"line":2131},[1332,17395,3020],{"class":2507},[1332,17397,15800],{"class":2521},[1332,17399,15916],{"class":2525},[1332,17401,2670],{"class":2521},[1332,17403,17404,17406,17408,17410,17412,17414],{"class":2455,"line":670},[1332,17405,3020],{"class":2507},[1332,17407,15800],{"class":2521},[1332,17409,2682],{"class":2525},[1332,17411,1213],{"class":2521},[1332,17413,15931],{"class":2462},[1332,17415,2583],{"class":2521},[1332,17417,17418,17420,17422,17424,17426,17429,17431,17434],{"class":2455,"line":68},[1332,17419,3020],{"class":2507},[1332,17421,15800],{"class":2521},[1332,17423,5476],{"class":2525},[1332,17425,1213],{"class":2521},[1332,17427,17428],{"class":2462},"\"#email\"",[1332,17430,4468],{"class":2521},[1332,17432,17433],{"class":2462},"\"user@example.com\"",[1332,17435,2583],{"class":2521},[1332,17437,17438,17440,17442,17444,17446,17449,17452,17455],{"class":2455,"line":1478},[1332,17439,3020],{"class":2507},[1332,17441,15800],{"class":2521},[1332,17443,5476],{"class":2525},[1332,17445,1213],{"class":2521},[1332,17447,17448],{"class":2462},"\"#password\"",[1332,17450,17451],{"class":2521},", process.env.",[1332,17453,17454],{"class":2511},"PW",[1332,17456,2583],{"class":2521},[1332,17458,17459,17461,17463,17465,17467,17469],{"class":2455,"line":293},[1332,17460,3020],{"class":2507},[1332,17462,15800],{"class":2521},[1332,17464,5473],{"class":2525},[1332,17466,1213],{"class":2521},[1332,17468,15946],{"class":2462},[1332,17470,2583],{"class":2521},[107,17472,15952],{"id":15951},[112,17474],{},[26,17476,17477,17480],{},[192,17478,17479],{},"Slow down for picky inputs."," Search-as-you-type fields and React-controlled inputs sometimes drop characters when typed instantly. A small per-character delay fixes most cases:",[2446,17482,17484],{"className":2962,"code":17483,"language":2964,"meta":67,"style":67},"await axiom.enterText(\"#search\", \"ergonomic keyboard\", 60);\n",[145,17485,17486],{"__ignoreMap":67},[1332,17487,17488,17490,17492,17494,17496,17499,17501,17504,17506,17508],{"class":2455,"line":2131},[1332,17489,3020],{"class":2507},[1332,17491,15800],{"class":2521},[1332,17493,5476],{"class":2525},[1332,17495,1213],{"class":2521},[1332,17497,17498],{"class":2462},"\"#search\"",[1332,17500,4468],{"class":2521},[1332,17502,17503],{"class":2462},"\"ergonomic keyboard\"",[1332,17505,4468],{"class":2521},[1332,17507,1066],{"class":2511},[1332,17509,2583],{"class":2521},[26,17511,17512,17515,17516,17518,17519,9879,17521,17523],{},[192,17513,17514],{},"Append rather than replace."," By default ",[145,17517,5476],{}," replaces the field's contents. Set ",[145,17520,17327],{},[145,17522,1548],{}," to add to it:",[2446,17525,17527],{"className":2962,"code":17526,"language":2964,"meta":67,"style":67},"await axiom.enterText(\"textarea#notes\", \"\\n\\nUpdated \" + new Date().toISOString(), 0, true);\n",[145,17528,17529],{"__ignoreMap":67},[1332,17530,17531,17533,17535,17537,17539,17542,17544,17546,17548,17551,17554,17556,17559,17562,17565,17568,17570,17572,17574],{"class":2455,"line":2131},[1332,17532,3020],{"class":2507},[1332,17534,15800],{"class":2521},[1332,17536,5476],{"class":2525},[1332,17538,1213],{"class":2521},[1332,17540,17541],{"class":2462},"\"textarea#notes\"",[1332,17543,4468],{"class":2521},[1332,17545,5912],{"class":2462},[1332,17547,12105],{"class":2507},[1332,17549,17550],{"class":2462},"Updated \"",[1332,17552,17553],{"class":2507}," +",[1332,17555,2697],{"class":2507},[1332,17557,17558],{"class":2525}," Date",[1332,17560,17561],{"class":2521},"().",[1332,17563,17564],{"class":2525},"toISOString",[1332,17566,17567],{"class":2521},"(), ",[1332,17569,256],{"class":2511},[1332,17571,4468],{"class":2521},[1332,17573,1548],{"class":2511},[1332,17575,2583],{"class":2521},[26,17577,17578,17581,17582,3297],{},[192,17579,17580],{},"Multi-line text without submitting."," If the form treats Enter as submit, escape line breaks with a custom token and pass it as ",[145,17583,17347],{},[2446,17585,17587],{"className":2962,"code":17586,"language":2964,"meta":67,"style":67},"await axiom.enterText(\"textarea\", \"line one\u003CBR>line two\u003CBR>line three\", 0, false, \"\u003CBR>\");\n",[145,17588,17589],{"__ignoreMap":67},[1332,17590,17591,17593,17595,17597,17599,17602,17604,17607,17609,17611,17613,17615,17617,17620],{"class":2455,"line":2131},[1332,17592,3020],{"class":2507},[1332,17594,15800],{"class":2521},[1332,17596,5476],{"class":2525},[1332,17598,1213],{"class":2521},[1332,17600,17601],{"class":2462},"\"textarea\"",[1332,17603,4468],{"class":2521},[1332,17605,17606],{"class":2462},"\"line one\u003CBR>line two\u003CBR>line three\"",[1332,17608,4468],{"class":2521},[1332,17610,256],{"class":2511},[1332,17612,4468],{"class":2521},[1332,17614,15884],{"class":2511},[1332,17616,4468],{"class":2521},[1332,17618,17619],{"class":2462},"\"\u003CBR>\"",[1332,17621,2583],{"class":2521},[107,17623,6276],{"id":6275},[112,17625],{},[186,17627,17628,17642,17651],{},[189,17629,17630,17631,6205,17634,17637,17638,17641],{},"Best results on ",[145,17632,17633],{},"\u003Cinput>",[145,17635,17636],{},"\u003Ctextarea>",". Behaviour on ",[145,17639,17640],{},"contenteditable"," divs and custom controls (rich-text editors, code editors) varies — test before relying on it.",[189,17643,17644,17645,148],{},"For control keys (Tab, Enter, arrow keys) on their own, use ",[659,17646,17648],{"href":17647},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fpress-keys",[145,17649,17650],{},"axiom.pressKeys()",[189,17652,17653,17654,11490,17656,148],{},"The element must be focusable. Disabled, hidden, or zero-size inputs throw an error unless ",[145,17655,17369],{},[145,17657,1548],{},[107,17659,4513],{"id":4512},[112,17661],{},[186,17663,17664,17669,17673],{},[189,17665,17666],{},[659,17667,17668],{"href":17647},"Press keys",[189,17670,17671],{},[659,17672,15767],{"href":16079},[189,17674,17675],{},[659,17676,17202],{"href":17201},[2819,17678,16068],{},{"title":67,"searchDepth":68,"depth":68,"links":17680},[17681,17682,17683,17684,17685],{"id":15785,"depth":670,"text":15786},{"id":12783,"depth":670,"text":12784},{"id":15951,"depth":670,"text":15952},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Enter text into an input, textarea, or other focusable element in a cloud browser session using axiom.enterText().",{"metaTitle":17688},"Enter text into an input in an axiom.ai cloud browser session",{"title":16065,"description":17686},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fenter-text","TiJE3eT-2yn4Tk9vUUvttGq83KjEHrbK1QnGke9MGag",{"id":17693,"title":17694,"body":17695,"date":71,"description":17826,"extension":73,"meta":17827,"navigation":75,"order":2739,"path":17829,"seo":17830,"stem":17831,"__hash__":17832},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fget-clipboard-contents.md","Get clipboard contents",{"type":8,"value":17696,"toc":17820},[17697,17703,17705,17707,17730,17733,17735,17737,17740,17786,17788,17790,17801,17803,17805,17817],[26,17698,17699,17702],{},[145,17700,17701],{},"axiom.getClipboardContents()"," returns the current contents of the cloud browser's clipboard as a string. Use it to retrieve data from pages that respond to a \"copy\" button by putting the result on the clipboard rather than rendering it into the DOM.",[107,17704,15786],{"id":15785},[112,17706],{},[2446,17708,17710],{"className":2962,"code":17709,"language":2964,"meta":67,"style":67},"const text = await axiom.getClipboardContents();\n",[145,17711,17712],{"__ignoreMap":67},[1332,17713,17714,17716,17719,17721,17723,17725,17728],{"class":2455,"line":2131},[1332,17715,2508],{"class":2507},[1332,17717,17718],{"class":2511}," text",[1332,17720,2515],{"class":2507},[1332,17722,2518],{"class":2507},[1332,17724,15800],{"class":2521},[1332,17726,17727],{"class":2525},"getClipboardContents",[1332,17729,2670],{"class":2521},[26,17731,17732],{},"No parameters. Returns the clipboard contents as a string.",[107,17734,12784],{"id":12783},[112,17736],{},[26,17738,17739],{},"Trigger a page's \"copy share link\" button and read the link off the clipboard:",[2446,17741,17743],{"className":2962,"code":17742,"language":2964,"meta":67,"style":67},"await axiom.click(\"button.copy-share-link\");\nconst shareLink = await axiom.getClipboardContents();\nconsole.log(shareLink);\n",[145,17744,17745,17760,17777],{"__ignoreMap":67},[1332,17746,17747,17749,17751,17753,17755,17758],{"class":2455,"line":2131},[1332,17748,3020],{"class":2507},[1332,17750,15800],{"class":2521},[1332,17752,5473],{"class":2525},[1332,17754,1213],{"class":2521},[1332,17756,17757],{"class":2462},"\"button.copy-share-link\"",[1332,17759,2583],{"class":2521},[1332,17761,17762,17764,17767,17769,17771,17773,17775],{"class":2455,"line":670},[1332,17763,2508],{"class":2507},[1332,17765,17766],{"class":2511}," shareLink",[1332,17768,2515],{"class":2507},[1332,17770,2518],{"class":2507},[1332,17772,15800],{"class":2521},[1332,17774,17727],{"class":2525},[1332,17776,2670],{"class":2521},[1332,17778,17779,17781,17783],{"class":2455,"line":68},[1332,17780,2572],{"class":2521},[1332,17782,2575],{"class":2525},[1332,17784,17785],{"class":2521},"(shareLink);\n",[107,17787,6276],{"id":6275},[112,17789],{},[186,17791,17792,17795,17798],{},[189,17793,17794],{},"The clipboard belongs to the cloud browser session, not your local machine. Reading the clipboard from your machine after the session finishes is a separate problem (use a sheet, an HTTP call, or any other output channel from your code).",[189,17796,17797],{},"The clipboard is shared across all tabs in the session. Successive clicks that each copy to the clipboard will overwrite each other — read between clicks.",[189,17799,17800],{},"Returns an empty string when the clipboard is empty.",[107,17802,4513],{"id":4512},[112,17804],{},[186,17806,17807,17811],{},[189,17808,17809],{},[659,17810,15767],{"href":16079},[189,17812,17813],{},[659,17814,17816],{"href":17815},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fscrape","Scrape",[2819,17818,17819],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}",{"title":67,"searchDepth":68,"depth":68,"links":17821},[17822,17823,17824,17825],{"id":15785,"depth":670,"text":15786},{"id":12783,"depth":670,"text":12784},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Read the contents of the cloud browser's clipboard, useful for pages that put their copy output on the clipboard rather than in the DOM.",{"metaTitle":17828},"Read the cloud browser's clipboard in an axiom.ai session","\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fget-clipboard-contents",{"title":17694,"description":17826},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fget-clipboard-contents","LF8RLv0k8xgTLbnpJm5tLN43JScdUtipb9me5Kz56wE",{"id":17834,"title":17835,"body":17836,"date":71,"description":18081,"extension":73,"meta":18082,"navigation":75,"order":68,"path":18084,"seo":18085,"stem":18086,"__hash__":18087},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fgoto.md","Go to URL",{"type":8,"value":17837,"toc":18074},[17838,17850,17852,17854,17870,17953,17955,17957,17986,17990,17992,18000,18019,18021,18023,18051,18053,18055,18072],[26,17839,17840,17843,17844,16497],{},[145,17841,17842],{},"axiom.goto(url)"," sends the session's page to a URL and resolves once the page has loaded. The same step type as the No-Code Tool's ",[659,17845,17847],{"href":17846},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fgo-to-page",[192,17848,17849],{},"Go to page",[107,17851,15786],{"id":15785},[112,17853],{},[2446,17855,17857],{"className":2962,"code":17856,"language":2964,"meta":67,"style":67},"await axiom.goto(url, doNotShareLocalstorage, openInNewTab);\n",[145,17858,17859],{"__ignoreMap":67},[1332,17860,17861,17863,17865,17867],{"class":2455,"line":2131},[1332,17862,3020],{"class":2507},[1332,17864,15800],{"class":2521},[1332,17866,2682],{"class":2525},[1332,17868,17869],{"class":2521},"(url, doNotShareLocalstorage, openInNewTab);\n",[4589,17871,17872,17886],{},[4592,17873,17874],{},[4595,17875,17876,17878,17880,17882,17884],{},[4598,17877,12524],{},[4598,17879,12527],{},[4598,17881,8403],{},[4598,17883,15820],{},[4598,17885,12532],{},[4605,17887,17888,17909,17933],{},[4595,17889,17890,17894,17896,17898,17900],{},[4610,17891,17892],{},[145,17893,13749],{},[4610,17895,6750],{},[4610,17897,10771],{},[4610,17899,15838],{},[4610,17901,17902,17903,2344,17905,17908],{},"URL to navigate to. Must use ",[145,17904,12509],{},[145,17906,17907],{},"https"," scheme.",[4595,17910,17911,17916,17918,17920,17924],{},[4610,17912,17913],{},[145,17914,17915],{},"doNotShareLocalstorage",[4610,17917,15877],{},[4610,17919,10779],{},[4610,17921,17922],{},[145,17923,15884],{},[4610,17925,11487,17926,17928,17929,17932],{},[145,17927,1548],{},", isolates ",[145,17930,17931],{},"localStorage"," from any previously visited origins in the session.",[4595,17934,17935,17940,17942,17944,17948],{},[4610,17936,17937],{},[145,17938,17939],{},"openInNewTab",[4610,17941,15877],{},[4610,17943,10779],{},[4610,17945,17946],{},[145,17947,15884],{},[4610,17949,11487,17950,17952],{},[145,17951,1548],{},", opens the URL in a new tab rather than reusing the current page.",[107,17954,12784],{"id":12783},[112,17956],{},[2446,17958,17960],{"className":2962,"code":17959,"language":2964,"meta":67,"style":67},"await axiom.browserOpen();\nawait axiom.goto(\"https:\u002F\u002Fexample.com\u002Flogin\");\n",[145,17961,17962,17972],{"__ignoreMap":67},[1332,17963,17964,17966,17968,17970],{"class":2455,"line":2131},[1332,17965,3020],{"class":2507},[1332,17967,15800],{"class":2521},[1332,17969,15916],{"class":2525},[1332,17971,2670],{"class":2521},[1332,17973,17974,17976,17978,17980,17982,17984],{"class":2455,"line":670},[1332,17975,3020],{"class":2507},[1332,17977,15800],{"class":2521},[1332,17979,2682],{"class":2525},[1332,17981,1213],{"class":2521},[1332,17983,15931],{"class":2462},[1332,17985,2583],{"class":2521},[107,17987,17989],{"id":17988},"url-constraints","URL constraints",[112,17991],{},[26,17993,17994,17995,6205,17997,17999],{},"Only ",[145,17996,12509],{},[145,17998,17907],{}," URLs are accepted. Other schemes are rejected:",[186,18001,18002,18007,18013],{},[189,18003,18004,18006],{},[145,18005,5263],{},": the cloud sandbox has no local filesystem.",[189,18008,18009,18012],{},[145,18010,18011],{},"data:",": not supported.",[189,18014,18015,18018],{},[145,18016,18017],{},"chrome:\u002F\u002F",": browser-internal pages are not exposed.",[107,18020,6276],{"id":6275},[112,18022],{},[186,18024,18025,18028,18045],{},[189,18026,18027],{},"The cloud browser uses a datacentre IP. Some sites block known datacentre ranges with bot detection, expect this on those targets.",[189,18029,18030,18031,18034,18035,18037,18038,18044],{},"The call resolves once the page's ",[145,18032,18033],{},"load"," event fires. For pages that finish their real work after ",[145,18036,18033],{}," (single-page apps, lazy-loaded content), insert an ",[659,18039,18041],{"href":18040},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fwait",[145,18042,18043],{},"axiom.wait()"," before the next step, or retry the next step with your own loop.",[189,18046,18047,18048,18050],{},"There's no wait-for-selector method today. Use ",[145,18049,18043],{}," for a fixed pause, or retry your next call until it stops throwing.",[107,18052,4513],{"id":4512},[112,18054],{},[186,18056,18057,18061,18066],{},[189,18058,18059],{},[659,18060,15767],{"href":16079},[189,18062,18063],{},[659,18064,18065],{"href":18040},"Wait",[189,18067,18068],{},[659,18069,18071],{"href":18070},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fswitch-browser-tab","Switch browser tab",[2819,18073,16467],{},{"title":67,"searchDepth":68,"depth":68,"links":18075},[18076,18077,18078,18079,18080],{"id":15785,"depth":670,"text":15786},{"id":12783,"depth":670,"text":12784},{"id":17988,"depth":670,"text":17989},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Send the cloud browser session to a URL using axiom.goto() and wait for the page to load.",{"metaTitle":18083},"Send an axiom.ai cloud browser session to a URL with axiom-api","\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fgoto",{"title":17835,"description":18081},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fgoto","jaKuGmZfoV2agJEaYBXZu0_osERpn_MFY84eqTOOt08",{"id":18089,"title":16059,"body":18090,"date":71,"description":18247,"extension":73,"meta":18248,"navigation":75,"order":2637,"path":16058,"seo":18250,"stem":18251,"__hash__":18252},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fhover.md",{"type":8,"value":18091,"toc":18241},[18092,18108,18110,18112,18129,18158,18160,18162,18165,18200,18202,18204,18225,18227,18229,18239],[26,18093,18094,18097,18098,18101,18102,148],{},[145,18095,18096],{},"axiom.hover(select)"," moves the mouse pointer over the first element matching a CSS selector and fires the corresponding ",[145,18099,18100],{},"mouseover"," events. Use this to open dropdown menus, surface tooltips, or trigger lazy-loaded content that only appears on hover. The same step type as the No-Code Tool's ",[659,18103,18105],{"href":18104},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Frollover",[192,18106,18107],{},"Rollover element",[107,18109,15786],{"id":15785},[112,18111],{},[2446,18113,18115],{"className":2962,"code":18114,"language":2964,"meta":67,"style":67},"await axiom.hover(select);\n",[145,18116,18117],{"__ignoreMap":67},[1332,18118,18119,18121,18123,18126],{"class":2455,"line":2131},[1332,18120,3020],{"class":2507},[1332,18122,15800],{"class":2521},[1332,18124,18125],{"class":2525},"hover",[1332,18127,18128],{"class":2521},"(select);\n",[4589,18130,18131,18143],{},[4592,18132,18133],{},[4595,18134,18135,18137,18139,18141],{},[4598,18136,12524],{},[4598,18138,12527],{},[4598,18140,8403],{},[4598,18142,12532],{},[4605,18144,18145],{},[4595,18146,18147,18151,18153,18155],{},[4610,18148,18149],{},[145,18150,15831],{},[4610,18152,6750],{},[4610,18154,10771],{},[4610,18156,18157],{},"CSS selector for the element to hover over.",[107,18159,12784],{"id":12783},[112,18161],{},[26,18163,18164],{},"Open a hover-only navigation menu, then click an item inside it:",[2446,18166,18168],{"className":2962,"code":18167,"language":2964,"meta":67,"style":67},"await axiom.hover(\"nav .menu-trigger\");\nawait axiom.click(\".dropdown-menu .item-settings\");\n",[145,18169,18170,18185],{"__ignoreMap":67},[1332,18171,18172,18174,18176,18178,18180,18183],{"class":2455,"line":2131},[1332,18173,3020],{"class":2507},[1332,18175,15800],{"class":2521},[1332,18177,18125],{"class":2525},[1332,18179,1213],{"class":2521},[1332,18181,18182],{"class":2462},"\"nav .menu-trigger\"",[1332,18184,2583],{"class":2521},[1332,18186,18187,18189,18191,18193,18195,18198],{"class":2455,"line":670},[1332,18188,3020],{"class":2507},[1332,18190,15800],{"class":2521},[1332,18192,5473],{"class":2525},[1332,18194,1213],{"class":2521},[1332,18196,18197],{"class":2462},"\".dropdown-menu .item-settings\"",[1332,18199,2583],{"class":2521},[107,18201,6276],{"id":6275},[112,18203],{},[186,18205,18206,18214,18222],{},[189,18207,18208,18209,18213],{},"The hover persists until the next mouse move. A subsequent ",[659,18210,18211],{"href":16079},[145,18212,16453],{}," elsewhere on the page will move the mouse and dismiss any hover-revealed UI — chain hover and click without other interleaved steps.",[189,18215,18216,18217,18221],{},"Some sites use focus-based dropdowns rather than hover. For those, ",[659,18218,18219],{"href":16079},[145,18220,16453],{}," the trigger instead.",[189,18223,18224],{},"Selectors operate on the top-level document only.",[107,18226,4513],{"id":4512},[112,18228],{},[186,18230,18231,18235],{},[189,18232,18233],{},[659,18234,15767],{"href":16079},[189,18236,18237],{},[659,18238,16085],{"href":16318},[2819,18240,16467],{},{"title":67,"searchDepth":68,"depth":68,"links":18242},[18243,18244,18245,18246],{"id":15785,"depth":670,"text":15786},{"id":12783,"depth":670,"text":12784},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Move the mouse over an element to trigger hover-only UI (dropdown menus, tooltips, lazy-loaded content) using axiom.hover().",{"metaTitle":18249},"Hover an element in an axiom.ai cloud browser session",{"title":16059,"description":18247},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fhover","aCNKmEURNMqOAIWP2evvKgWneag5j9rCUpEs00lkeho",{"id":18254,"title":4576,"body":18255,"date":71,"description":19116,"extension":73,"meta":19117,"navigation":75,"order":2237,"path":4575,"seo":19119,"stem":19120,"__hash__":19121},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Findex.md",{"type":8,"value":18256,"toc":19101},[18257,18272,18286,18290,18292,18299,18317,18331,18336,18340,18343,18349,18357,18361,18367,18371,18373,18417,18422,18424,18426,18436,18442,18446,18448,18704,18708,18710,18713,18953,18957,18959,18966,18970,18972,18975,19080,19085,19087,19089,19091,19098],[26,18258,18259,18260,18262,18263,4468,18265,4468,18267,4468,18269,18271],{},"The Step API is our library of step functions wrapping the ",[659,18261,4564],{"href":5339}," with high-level browser actions you call against a cloud browser session, one at a time, choosing each step based on what the previous one returned. Open a session, fire ",[145,18264,2682],{},[145,18266,5473],{},[145,18268,5476],{},[145,18270,5479],{},", and so on, then close the session when you're done. Use this when you want to drive a browser dynamically from your code rather than running a pre-built automation end to end.",[26,18273,18274,18275,18278,18279,16175,18282,18285],{},"Under the hood, the step functions run as HTTP calls against the cloud browser's pod. Each call goes to ",[145,18276,18277],{},"POST \u002Fapi\u002Fv5\u002Fstep"," (or ",[145,18280,18281],{},"\u002Fapi\u002Fv5\u002Fbrowser\u002Fopen",[145,18283,18284],{},"\u002Fapi\u002Fv5\u002Fbrowser\u002Fclose"," for lifecycle). You have three ways to drive a session — pick whichever fits your stack.",[107,18287,18289],{"id":18288},"how-to-call-them","How to call them",[112,18291],{},[21,18293,18295,18298],{"id":18294},"axiom-api-node-library",[145,18296,18297],{},"axiom-api"," Node library",[26,18300,18301,18302,18305,18306,4468,18309,4468,18311,4468,18313,18316],{},"The canonical wrapper. ",[145,18303,18304],{},"npm install",", instantiate, and call the named methods: ",[145,18307,18308],{},"axiom.goto()",[145,18310,16453],{},[145,18312,17185],{},[145,18314,18315],{},"axiom.scrape()",", and so on. Node only; not required, but saves you from writing the HTTP boilerplate and handles transparent retries when a long-running step's request times out.",[2446,18318,18320],{"className":2448,"code":18319,"language":2450,"meta":67,"style":67},"npm install axiom-api\n",[145,18321,18322],{"__ignoreMap":67},[1332,18323,18324,18326,18328],{"class":2455,"line":2131},[1332,18325,2459],{"class":2458},[1332,18327,3288],{"class":2462},[1332,18329,18330],{"class":2462}," axiom-api\n",[26,18332,6104,18333,18335],{},[659,18334,11078],{"href":4533}," for the full instantiate-and-open flow.",[21,18337,18339],{"id":18338},"puppeteer-or-any-cdp-client","Puppeteer or any CDP client",[26,18341,18342],{},"If you'd rather have full Chrome DevTools Protocol control than the high-level step-function helpers, point any CDP-speaking client at the cloud browser WebSocket directly. You get every Puppeteer method, just running on our infrastructure instead of your own.",[2446,18344,18347],{"className":18345,"code":18346,"language":5402},[5400],"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=YOUR_API_KEY\n",[145,18348,18346],{"__ignoreMap":67},[26,18350,6104,18351,18353,18354,18356],{},[659,18352,4211],{"href":4558}," for how the key is passed, and ",[659,18355,10849],{"href":5304}," for the canonical list.",[21,18358,18360],{"id":18359},"mcp-server","MCP server",[26,18362,18363,18364,18366],{},"Expose step functions as MCP tools so Claude or another LLM client can drive a session step by step. See ",[659,18365,10403],{"href":5379}," for the patterns and reference implementations.",[107,18368,18370],{"id":18369},"when-to-use-this-vs-other-layers","When to use this vs other layers",[112,18372],{},[4589,18374,18375,18385],{},[4592,18376,18377],{},[4595,18378,18379,18382],{},[4598,18380,18381],{},"You want to",[4598,18383,18384],{},"Use",[4605,18386,18387,18398,18409],{},[4595,18388,18389,18392],{},[4610,18390,18391],{},"Run a pre-built No-Code Tool automation from start to finish",[4610,18393,18394],{},[659,18395,18396],{"href":4527},[145,18397,4467],{},[4595,18399,18400,18403],{},[4610,18401,18402],{},"Run a pre-authored Puppeteer \u002F CDP script in the cloud",[4610,18404,18405],{},[659,18406,18408],{"href":18407},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\u002Frun-a-code-tool-automation","Run a Code Dashboard automation",[4595,18410,18411,18414],{},[4610,18412,18413],{},"Drive a session step by step, choosing each action based on the page",[4610,18415,18416],{},"This section",[26,18418,18419,18421],{},[145,18420,4467],{}," and the Code Dashboard path are fully pre-authored (the workflow is baked in). The Step API gives you scripted high-level actions with the dynamism of choosing each call at runtime.",[107,18423,5197],{"id":5196},[112,18425],{},[26,18427,18428,18429,18432,18433,18435],{},"A session is an isolated cloud browser. Open one with ",[145,18430,18431],{},"axiom.browserOpen()",", drive it with the action methods, then close it with ",[145,18434,16690],{},". Sessions left open consume runtime quota, so always close yours.",[2446,18437,18440],{"className":18438,"code":18439,"language":5402},[5400],"new AxiomApi(key)   →   axiom.browserOpen()\n                              │\n                              ├─ axiom.goto(url)\n                              ├─ axiom.click(selector)\n                              ├─ axiom.enterText(selector, text)\n                              ├─ axiom.pressKeys(\"Enter\")\n                              ├─ axiom.scrape(url, selector, ...)\n                              ├─ axiom.wait(2000)\n                              │\n                              ▼\n                         axiom.browserClose()\n",[145,18441,18439],{"__ignoreMap":67},[107,18443,18445],{"id":18444},"available-step-methods","Available step methods",[112,18447],{},[4589,18449,18450,18459],{},[4592,18451,18452],{},[4595,18453,18454,18456],{},[4598,18455,10884],{},[4598,18457,18458],{},"Purpose",[4605,18460,18461,18476,18488,18500,18512,18524,18536,18548,18560,18572,18588,18600,18612,18624,18636,18649,18662,18675,18691],{},[4595,18462,18463,18473],{},[4610,18464,18465,16175,18469],{},[659,18466,18467],{"href":4533},[145,18468,5467],{},[659,18470,18471],{"href":16951},[145,18472,5486],{},[4610,18474,18475],{},"Open \u002F close the session.",[4595,18477,18478,18485],{},[4610,18479,18480],{},[659,18481,18482],{"href":18084},[145,18483,18484],{},"goto(url, ...)",[4610,18486,18487],{},"Navigate the page to a URL.",[4595,18489,18490,18497],{},[4610,18491,18492],{},[659,18493,18494],{"href":16079},[145,18495,18496],{},"click(select, ...)",[4610,18498,18499],{},"Click an element.",[4595,18501,18502,18509],{},[4610,18503,18504],{},[659,18505,18506],{"href":15895},[145,18507,18508],{},"clickMultiple(select, ...)",[4610,18510,18511],{},"Click every matching element up to a max.",[4595,18513,18514,18521],{},[4610,18515,18516],{},[659,18517,18518],{"href":16477},[145,18519,18520],{},"clickEngagementButton(select, ...)",[4610,18522,18523],{},"Toggle a like\u002Ffollow\u002Fsubscribe-style button only if it isn't already in the target state.",[4595,18525,18526,18533],{},[4610,18527,18528],{},[659,18529,18530],{"href":16058},[145,18531,18532],{},"hover(select)",[4610,18534,18535],{},"Hover the mouse over an element.",[4595,18537,18538,18545],{},[4610,18539,18540],{},[659,18541,18542],{"href":16318},[145,18543,18544],{},"clickAndDrag(start, end)",[4610,18546,18547],{},"Mouse-press at one coordinate, release at another.",[4595,18549,18550,18557],{},[4610,18551,18552],{},[659,18553,18554],{"href":16064},[145,18555,18556],{},"enterText(selectTextField, text, ...)",[4610,18558,18559],{},"Enter text into an input.",[4595,18561,18562,18569],{},[4610,18563,18564],{},[659,18565,18566],{"href":17647},[145,18567,18568],{},"pressKeys(key, ...)",[4610,18570,18571],{},"Fire keyboard events (Enter, Tab, arrow keys, …).",[4595,18573,18574,18581],{},[4610,18575,18576],{},[659,18577,18578],{"href":17201},[145,18579,18580],{},"selectList(select, text)",[4610,18582,18583,18584,18587],{},"Pick an option in a ",[145,18585,18586],{},"\u003Cselect>"," dropdown.",[4595,18589,18590,18597],{},[4610,18591,18592],{},[659,18593,18594],{"href":17215},[145,18595,18596],{},"datePicker(...)",[4610,18598,18599],{},"Navigate a calendar widget and pick a date.",[4595,18601,18602,18609],{},[4610,18603,18604],{},[659,18605,18606],{"href":17829},[145,18607,18608],{},"getClipboardContents()",[4610,18610,18611],{},"Read the cloud browser's clipboard (after a copy step).",[4595,18613,18614,18621],{},[4610,18615,18616],{},[659,18617,18618],{"href":18070},[145,18619,18620],{},"switchBrowserTab(selectTab)",[4610,18622,18623],{},"Switch the active tab in the session.",[4595,18625,18626,18633],{},[4610,18627,18628],{},[659,18629,18630],{"href":17815},[145,18631,18632],{},"scrape(url, selector, pager, max_results, settings)",[4610,18634,18635],{},"Smart-scrape a list of records, optionally paginating.",[4595,18637,18638,18646],{},[4610,18639,18640],{},[659,18641,18643],{"href":18642},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fscrape-metadata",[145,18644,18645],{},"scrapeMetadata(metadata)",[4610,18647,18648],{},"Pull structured fields (title, description, OG tags, …) from the current page.",[4595,18650,18651,18659],{},[4610,18652,18653],{},[659,18654,18656],{"href":18655},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fintegrate-ai",[145,18657,18658],{},"integrateAI(aiOptions)",[4610,18660,18661],{},"Run an LLM call inline (summarise, classify, extract).",[4595,18663,18664,18672],{},[4610,18665,18666],{},[659,18667,18669],{"href":18668},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fsolve-captcha",[145,18670,18671],{},"solveCaptcha(apiKey)",[4610,18673,18674],{},"Hand the current page's captcha to a solver.",[4595,18676,18677,18684],{},[4610,18678,18679],{},[659,18680,18681],{"href":18040},[145,18682,18683],{},"wait(time)",[4610,18685,18686,18687,18690],{},"Pause the session on the pod for ",[145,18688,18689],{},"time"," milliseconds (keeps the session alive).",[4595,18692,18693,18701],{},[4610,18694,18695],{},[659,18696,18698],{"href":18697},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Frestart-browser",[145,18699,18700],{},"restartBrowser()",[4610,18702,18703],{},"Restart the cloud browser within the same session.",[107,18705,18707],{"id":18706},"end-to-end-example","End-to-end example",[112,18709],{},[26,18711,18712],{},"A canonical \"log in, scrape, store\" flow:",[2446,18714,18716],{"className":2962,"code":18715,"language":2964,"meta":67,"style":67},"import { AxiomApi } from 'axiom-api';\n\nconst axiom = new AxiomApi(process.env.AXIOM_API_KEY);\n\nawait axiom.browserOpen();\ntry {\n  await axiom.goto(\"https:\u002F\u002Fexample.com\u002Flogin\");\n  await axiom.enterText(\"#email\", \"user@example.com\");\n  await axiom.enterText(\"#password\", process.env.PW);\n  await axiom.click(\"button[type=submit]\");\n  await axiom.wait(2000);\n\n  const rows = await axiom.scrape(\n    null,                       \u002F\u002F stay on the current page\n    \".product-card\",            \u002F\u002F record selector\n    null,                       \u002F\u002F no pagination\n    50,                         \u002F\u002F max results\n    {}                          \u002F\u002F default settings\n  );\n  \u002F\u002F ... persist `rows` somewhere\n} finally {\n  await axiom.browserClose();\n}\n",[145,18717,18718,18730,18734,18752,18756,18766,18772,18786,18804,18822,18836,18851,18855,18872,18883,18894,18903,18914,18922,18926,18931,18939,18949],{"__ignoreMap":67},[1332,18719,18720,18722,18724,18726,18728],{"class":2455,"line":2131},[1332,18721,4661],{"class":2507},[1332,18723,16782],{"class":2521},[1332,18725,4667],{"class":2507},[1332,18727,16787],{"class":2462},[1332,18729,4673],{"class":2521},[1332,18731,18732],{"class":2455,"line":670},[1332,18733,2588],{"emptyLinePlaceholder":75},[1332,18735,18736,18738,18740,18742,18744,18746,18748,18750],{"class":2455,"line":68},[1332,18737,2508],{"class":2507},[1332,18739,16800],{"class":2511},[1332,18741,2515],{"class":2507},[1332,18743,2697],{"class":2507},[1332,18745,16807],{"class":2525},[1332,18747,16810],{"class":2521},[1332,18749,4713],{"class":2511},[1332,18751,2583],{"class":2521},[1332,18753,18754],{"class":2455,"line":1478},[1332,18755,2588],{"emptyLinePlaceholder":75},[1332,18757,18758,18760,18762,18764],{"class":2455,"line":293},[1332,18759,3020],{"class":2507},[1332,18761,15800],{"class":2521},[1332,18763,15916],{"class":2525},[1332,18765,2670],{"class":2521},[1332,18767,18768,18770],{"class":2455,"line":2237},[1332,18769,2645],{"class":2507},[1332,18771,2648],{"class":2521},[1332,18773,18774,18776,18778,18780,18782,18784],{"class":2455,"line":2623},[1332,18775,3389],{"class":2507},[1332,18777,15800],{"class":2521},[1332,18779,2682],{"class":2525},[1332,18781,1213],{"class":2521},[1332,18783,15931],{"class":2462},[1332,18785,2583],{"class":2521},[1332,18787,18788,18790,18792,18794,18796,18798,18800,18802],{"class":2455,"line":2637},[1332,18789,3389],{"class":2507},[1332,18791,15800],{"class":2521},[1332,18793,5476],{"class":2525},[1332,18795,1213],{"class":2521},[1332,18797,17428],{"class":2462},[1332,18799,4468],{"class":2521},[1332,18801,17433],{"class":2462},[1332,18803,2583],{"class":2521},[1332,18805,18806,18808,18810,18812,18814,18816,18818,18820],{"class":2455,"line":2642},[1332,18807,3389],{"class":2507},[1332,18809,15800],{"class":2521},[1332,18811,5476],{"class":2525},[1332,18813,1213],{"class":2521},[1332,18815,17448],{"class":2462},[1332,18817,17451],{"class":2521},[1332,18819,17454],{"class":2511},[1332,18821,2583],{"class":2521},[1332,18823,18824,18826,18828,18830,18832,18834],{"class":2455,"line":2651},[1332,18825,3389],{"class":2507},[1332,18827,15800],{"class":2521},[1332,18829,5473],{"class":2525},[1332,18831,1213],{"class":2521},[1332,18833,15946],{"class":2462},[1332,18835,2583],{"class":2521},[1332,18837,18838,18840,18842,18844,18846,18849],{"class":2455,"line":2673},[1332,18839,3389],{"class":2507},[1332,18841,15800],{"class":2521},[1332,18843,5482],{"class":2525},[1332,18845,1213],{"class":2521},[1332,18847,18848],{"class":2511},"2000",[1332,18850,2583],{"class":2521},[1332,18852,18853],{"class":2455,"line":2692},[1332,18854,2588],{"emptyLinePlaceholder":75},[1332,18856,18857,18859,18862,18864,18866,18868,18870],{"class":2455,"line":2727},[1332,18858,3344],{"class":2507},[1332,18860,18861],{"class":2511}," rows",[1332,18863,2515],{"class":2507},[1332,18865,2518],{"class":2507},[1332,18867,15800],{"class":2521},[1332,18869,5479],{"class":2525},[1332,18871,4878],{"class":2521},[1332,18873,18874,18877,18880],{"class":2455,"line":2739},[1332,18875,18876],{"class":2511},"    null",[1332,18878,18879],{"class":2521},",                       ",[1332,18881,18882],{"class":2609},"\u002F\u002F stay on the current page\n",[1332,18884,18885,18888,18891],{"class":2455,"line":2750},[1332,18886,18887],{"class":2462},"    \".product-card\"",[1332,18889,18890],{"class":2521},",            ",[1332,18892,18893],{"class":2609},"\u002F\u002F record selector\n",[1332,18895,18896,18898,18900],{"class":2455,"line":2765},[1332,18897,18876],{"class":2511},[1332,18899,18879],{"class":2521},[1332,18901,18902],{"class":2609},"\u002F\u002F no pagination\n",[1332,18904,18905,18908,18911],{"class":2455,"line":2777},[1332,18906,18907],{"class":2511},"    50",[1332,18909,18910],{"class":2521},",                         ",[1332,18912,18913],{"class":2609},"\u002F\u002F max results\n",[1332,18915,18916,18919],{"class":2455,"line":2788},[1332,18917,18918],{"class":2521},"    {}                          ",[1332,18920,18921],{"class":2609},"\u002F\u002F default settings\n",[1332,18923,18924],{"class":2455,"line":2799},[1332,18925,6644],{"class":2521},[1332,18927,18928],{"class":2455,"line":3751},[1332,18929,18930],{"class":2609},"  \u002F\u002F ... persist `rows` somewhere\n",[1332,18932,18933,18935,18937],{"class":2455,"line":3762},[1332,18934,2768],{"class":2521},[1332,18936,4790],{"class":2507},[1332,18938,2648],{"class":2521},[1332,18940,18941,18943,18945,18947],{"class":2455,"line":3777},[1332,18942,3389],{"class":2507},[1332,18944,15800],{"class":2521},[1332,18946,16714],{"class":2525},[1332,18948,2670],{"class":2521},[1332,18950,18951],{"class":2455,"line":3787},[1332,18952,2802],{"class":2521},[107,18954,18956],{"id":18955},"synchronous-feeling-with-async-safety-net","Synchronous-feeling, with async safety net",[112,18958],{},[26,18960,18961,18962,18965],{},"Each step method makes a single HTTP request that blocks until the pod returns the step's result. If the request times out at the network layer or the pod reports that a step is already in flight, the library transparently polls ",[145,18963,18964],{},"POST \u002Fapi\u002Fv5\u002Fstep\u002Fresult"," with exponential backoff until the step finishes (default deadline: 1 hour). You write straight-line code; the library handles long-running steps and flaky connections.",[107,18967,18969],{"id":18968},"whats-not-exposed-yet","What's not exposed yet",[112,18971],{},[26,18973,18974],{},"The step-trigger surface is intentionally focused on common interaction primitives. Things you'd need to work around today:",[186,18976,18977,19008,19023,19029,19035,19061],{},[189,18978,18979,18982,18983,16175,18986,18989,18990,18994,18995,19000,19001,8621,19003,15415],{},[192,18980,18981],{},"Raw page text \u002F HTML readout."," No ",[145,18984,18985],{},"getText()",[145,18987,18988],{},"getHtml()"," method. Use ",[659,18991,18992],{"href":17815},[145,18993,18315],{}," for record extraction or ",[659,18996,18997],{"href":18642},[145,18998,18999],{},"axiom.scrapeMetadata()"," for page-level fields. For anything more bespoke, fall back to ",[145,19002,4467],{},[659,19004,19006],{"href":19005},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fscrape",[192,19007,194],{},[189,19009,19010,19013,19014,19020,19021,148],{},[192,19011,19012],{},"Screenshots."," Not exposed. Use a No-Code Tool automation with ",[659,19015,19017],{"href":19016},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsave-screenshot",[192,19018,19019],{},"Save screenshot locally"," and trigger via ",[145,19022,4467],{},[189,19024,19025,19028],{},[192,19026,19027],{},"File upload \u002F download."," Not exposed.",[189,19030,19031,19034],{},[192,19032,19033],{},"Iframe traversal."," Selectors operate on the top-level document only.",[189,19036,19037,18982,19040,19043,19044,8621,19046,19052,19053,19056,19057,19060],{},[192,19038,19039],{},"Direct JS evaluation.",[145,19041,19042],{},"evaluate()"," method. For arbitrary JS, use ",[145,19045,4467],{},[659,19047,19049],{"href":19048},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-javascript",[192,19050,19051],{},"Write javascript"," step inside an automation, or drop down to the ",[659,19054,19055],{"href":5339},"CDP socket"," and call ",[145,19058,19059],{},"Runtime.evaluate"," yourself.",[189,19062,19063,19066,19067,19069,19070,19072,19073,19077,19078,148],{},[192,19064,19065],{},"Cookie \u002F storage management."," Sessions are stateless across ",[145,19068,5467],{}," calls. The ",[145,19071,17915],{}," flag on ",[659,19074,19075],{"href":18084},[145,19076,18308],{}," isolates a single navigation; for finer-grained cookie handling, fall back to ",[145,19079,4467],{},[26,19081,19082,19083,16454],{},"If you need any of the above, the typical workaround is to author a small No-Code Tool automation that includes the missing capability and call it via ",[145,19084,4467],{},[107,19086,7725],{"id":7724},[112,19088],{},[2218,19090],{":by-order":1548},[26,19092,2222,19093,2226,19095,148],{},[659,19094,2225],{"href":1887},[659,19096,2231],{"href":2229,"rel":19097},[1218],[2819,19099,19100],{},"html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}",{"title":67,"searchDepth":68,"depth":68,"links":19102},[19103,19109,19110,19111,19112,19113,19114,19115],{"id":18288,"depth":670,"text":18289,"children":19104},[19105,19107,19108],{"id":18294,"depth":68,"text":19106},"axiom-api Node library",{"id":18338,"depth":68,"text":18339},{"id":18359,"depth":68,"text":18360},{"id":18369,"depth":670,"text":18370},{"id":5196,"depth":670,"text":5197},{"id":18444,"depth":670,"text":18445},{"id":18706,"depth":670,"text":18707},{"id":18955,"depth":670,"text":18956},{"id":18968,"depth":670,"text":18969},{"id":7724,"depth":670,"text":7725},"Drive a cloud browser session step by step (goto, click, enter text, wait, scrape) choosing each action based on what the previous one returned.",{"metaTitle":19118},"Step API — high-level browser actions on a cloud browser",{"title":4576,"description":19116},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Findex","vzmuZ3OLAohGyBOfQpsqeY1hUskzA3phtqPHVx6LVJw",{"id":19123,"title":19124,"body":19125,"date":71,"description":19538,"extension":73,"meta":19539,"navigation":75,"order":2777,"path":18655,"seo":19541,"stem":19542,"__hash__":19543},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fintegrate-ai.md","Integrate AI",{"type":8,"value":19126,"toc":19532},[19127,19148,19150,19152,19175,19289,19293,19295,19300,19402,19407,19495,19497,19499,19515,19517,19519,19530],[26,19128,19129,19132,19133,19136,19137,19140,19141,19147],{},[145,19130,19131],{},"axiom.integrateAI(aiOptions)"," runs an LLM call inline within the session. Two modes are supported: ",[145,19134,19135],{},"generate"," (prompt → completion) and ",[145,19138,19139],{},"extract"," (prompt → structured fields from supplied data). The same step type as the No-Code Tool's ",[659,19142,19144],{"href":19143},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fchatgpt-generate",[192,19145,19146],{},"Generate text with ChatGPT"," \u002F extraction-AI step.",[107,19149,15786],{"id":15785},[112,19151],{},[2446,19153,19155],{"className":2962,"code":19154,"language":2964,"meta":67,"style":67},"const result = await axiom.integrateAI(aiOptions);\n",[145,19156,19157],{"__ignoreMap":67},[1332,19158,19159,19161,19163,19165,19167,19169,19172],{"class":2455,"line":2131},[1332,19160,2508],{"class":2507},[1332,19162,6857],{"class":2511},[1332,19164,2515],{"class":2507},[1332,19166,2518],{"class":2507},[1332,19168,15800],{"class":2521},[1332,19170,19171],{"class":2525},"integrateAI",[1332,19173,19174],{"class":2521},"(aiOptions);\n",[4589,19176,19177,19189],{},[4592,19178,19179],{},[4595,19180,19181,19183,19185,19187],{},[4598,19182,8400],{},[4598,19184,12527],{},[4598,19186,8403],{},[4598,19188,12532],{},[4605,19190,19191,19212,19226,19240,19257,19273],{},[4595,19192,19193,19198,19207,19209],{},[4610,19194,19195],{},[145,19196,19197],{},"aiOptions.aiFunction",[4610,19199,19200,19203,19204],{},[145,19201,19202],{},"\"generate\""," | ",[145,19205,19206],{},"\"extract\"",[4610,19208,10771],{},[4610,19210,19211],{},"Selects mode.",[4595,19213,19214,19219,19221,19223],{},[4610,19215,19216],{},[145,19217,19218],{},"aiOptions.key",[4610,19220,6750],{},[4610,19222,10779],{},[4610,19224,19225],{},"Your LLM API key. Leave unset to use the API key stored against your axiom.ai account.",[4595,19227,19228,19233,19235,19237],{},[4610,19229,19230],{},[145,19231,19232],{},"aiOptions.model",[4610,19234,6750],{},[4610,19236,10779],{},[4610,19238,19239],{},"Model identifier (provider-specific). Defaults to the account-level default.",[4595,19241,19242,19247,19249,19254],{},[4610,19243,19244],{},[145,19245,19246],{},"aiOptions.prompt",[4610,19248,6750],{},[4610,19250,19251,19253],{},[145,19252,19135],{}," only",[4610,19255,19256],{},"The prompt.",[4595,19258,19259,19264,19266,19270],{},[4610,19260,19261],{},[145,19262,19263],{},"aiOptions.extractData",[4610,19265,6750],{},[4610,19267,19268,19253],{},[145,19269,19139],{},[4610,19271,19272],{},"The source text (typically scraped earlier in the run).",[4595,19274,19275,19280,19282,19286],{},[4610,19276,19277],{},[145,19278,19279],{},"aiOptions.promptExtract",[4610,19281,6750],{},[4610,19283,19284,19253],{},[145,19285,19139],{},[4610,19287,19288],{},"The extraction prompt (e.g. \"Return a JSON object with keys name, price, sku\").",[107,19290,19292],{"id":19291},"examples","Examples",[112,19294],{},[26,19296,19297],{},[192,19298,19299],{},"Generate a summary of scraped content:",[2446,19301,19303],{"className":2962,"code":19302,"language":2964,"meta":67,"style":67},"const rows = await axiom.scrape(null, { hierarchy: \"article\" }, null, 1, {});\nconst result = await axiom.integrateAI({\n  aiFunction: 'generate',\n  prompt: `Summarise this in one sentence:\\n\\n${rows[0][0]}`\n});\n",[145,19304,19305,19342,19358,19368,19398],{"__ignoreMap":67},[1332,19306,19307,19309,19311,19313,19315,19317,19319,19321,19323,19326,19329,19332,19334,19336,19339],{"class":2455,"line":2131},[1332,19308,2508],{"class":2507},[1332,19310,18861],{"class":2511},[1332,19312,2515],{"class":2507},[1332,19314,2518],{"class":2507},[1332,19316,15800],{"class":2521},[1332,19318,5479],{"class":2525},[1332,19320,1213],{"class":2521},[1332,19322,8822],{"class":2511},[1332,19324,19325],{"class":2521},", { hierarchy: ",[1332,19327,19328],{"class":2462},"\"article\"",[1332,19330,19331],{"class":2521}," }, ",[1332,19333,8822],{"class":2511},[1332,19335,4468],{"class":2521},[1332,19337,19338],{"class":2511},"1",[1332,19340,19341],{"class":2521},", {});\n",[1332,19343,19344,19346,19348,19350,19352,19354,19356],{"class":2455,"line":670},[1332,19345,2508],{"class":2507},[1332,19347,6857],{"class":2511},[1332,19349,2515],{"class":2507},[1332,19351,2518],{"class":2507},[1332,19353,15800],{"class":2521},[1332,19355,19171],{"class":2525},[1332,19357,2529],{"class":2521},[1332,19359,19360,19363,19366],{"class":2455,"line":68},[1332,19361,19362],{"class":2521},"  aiFunction: ",[1332,19364,19365],{"class":2462},"'generate'",[1332,19367,6024],{"class":2521},[1332,19369,19370,19373,19376,19378,19381,19384,19387,19389,19392,19394,19396],{"class":2455,"line":1478},[1332,19371,19372],{"class":2521},"  prompt: ",[1332,19374,19375],{"class":2462},"`Summarise this in one sentence:",[1332,19377,12105],{"class":2507},[1332,19379,19380],{"class":2462},"${",[1332,19382,19383],{"class":2521},"rows",[1332,19385,19386],{"class":2462},"[",[1332,19388,256],{"class":2511},[1332,19390,19391],{"class":2462},"][",[1332,19393,256],{"class":2511},[1332,19395,5133],{"class":2462},[1332,19397,4716],{"class":2462},[1332,19399,19400],{"class":2455,"line":293},[1332,19401,2542],{"class":2521},[26,19403,19404],{},[192,19405,19406],{},"Extract structured fields from a page:",[2446,19408,19410],{"className":2962,"code":19409,"language":2964,"meta":67,"style":67},"const rows = await axiom.scrape(null, { hierarchy: \"body\" }, null, 1, {});\nconst result = await axiom.integrateAI({\n  aiFunction: 'extract',\n  extractData: rows[0][0],\n  promptExtract: 'Return a JSON object with keys: company_name, ceo_name, founded_year.'\n});\n",[145,19411,19412,19445,19461,19470,19483,19491],{"__ignoreMap":67},[1332,19413,19414,19416,19418,19420,19422,19424,19426,19428,19430,19432,19435,19437,19439,19441,19443],{"class":2455,"line":2131},[1332,19415,2508],{"class":2507},[1332,19417,18861],{"class":2511},[1332,19419,2515],{"class":2507},[1332,19421,2518],{"class":2507},[1332,19423,15800],{"class":2521},[1332,19425,5479],{"class":2525},[1332,19427,1213],{"class":2521},[1332,19429,8822],{"class":2511},[1332,19431,19325],{"class":2521},[1332,19433,19434],{"class":2462},"\"body\"",[1332,19436,19331],{"class":2521},[1332,19438,8822],{"class":2511},[1332,19440,4468],{"class":2521},[1332,19442,19338],{"class":2511},[1332,19444,19341],{"class":2521},[1332,19446,19447,19449,19451,19453,19455,19457,19459],{"class":2455,"line":670},[1332,19448,2508],{"class":2507},[1332,19450,6857],{"class":2511},[1332,19452,2515],{"class":2507},[1332,19454,2518],{"class":2507},[1332,19456,15800],{"class":2521},[1332,19458,19171],{"class":2525},[1332,19460,2529],{"class":2521},[1332,19462,19463,19465,19468],{"class":2455,"line":68},[1332,19464,19362],{"class":2521},[1332,19466,19467],{"class":2462},"'extract'",[1332,19469,6024],{"class":2521},[1332,19471,19472,19475,19477,19479,19481],{"class":2455,"line":1478},[1332,19473,19474],{"class":2521},"  extractData: rows[",[1332,19476,256],{"class":2511},[1332,19478,19391],{"class":2521},[1332,19480,256],{"class":2511},[1332,19482,6167],{"class":2521},[1332,19484,19485,19488],{"class":2455,"line":293},[1332,19486,19487],{"class":2521},"  promptExtract: ",[1332,19489,19490],{"class":2462},"'Return a JSON object with keys: company_name, ceo_name, founded_year.'\n",[1332,19492,19493],{"class":2455,"line":2237},[1332,19494,2542],{"class":2521},[107,19496,6276],{"id":6275},[112,19498],{},[186,19500,19501,19504],{},[189,19502,19503],{},"For arbitrary LLM workflows (chains, tool use, streaming), call your LLM provider's API directly from your code rather than going through this step. This step is best when you want the LLM call to count against your axiom.ai runtime quota and to keep the whole flow in one place.",[189,19505,19506,19507,19510,19511,19514],{},"The exact set of supported ",[145,19508,19509],{},"model"," values depends on which provider keys are configured on your account. See ",[659,19512,19513],{"href":425},"API integrations"," for the current list.",[107,19516,4513],{"id":4512},[112,19518],{},[186,19520,19521,19525],{},[189,19522,19523],{},[659,19524,17816],{"href":17815},[189,19526,19527],{},[659,19528,19529],{"href":18642},"Scrape metadata",[2819,19531,17819],{},{"title":67,"searchDepth":68,"depth":68,"links":19533},[19534,19535,19536,19537],{"id":15785,"depth":670,"text":15786},{"id":19291,"depth":670,"text":19292},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Run an LLM call inline within a step-function session for prompt completion, classification, or extraction using axiom.integrateAI().",{"metaTitle":19540},"Run an inline LLM call from an axiom.ai cloud browser session",{"title":19124,"description":19538},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fintegrate-ai","y0CupNGIPDzR-2Ny5AxqEpeWduadU4bl2aADAeWWSgc",{"id":19545,"title":17668,"body":19546,"date":71,"description":19879,"extension":73,"meta":19880,"navigation":75,"order":2651,"path":17647,"seo":19882,"stem":19883,"__hash__":19884},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fpress-keys.md",{"type":8,"value":19547,"toc":19873},[19548,19565,19567,19569,19586,19674,19709,19711,19713,19718,19770,19775,19801,19806,19835,19837,19839,19857,19859,19861,19871],[26,19549,19550,19553,19554,19558,19559,148],{},[145,19551,19552],{},"axiom.pressKeys(key)"," fires a keyboard event on the currently focused element. Use it for control keys (",[659,19555,19556],{"href":16064},[145,19557,17185],{}," handles ordinary typed text), modifier combinations, and keyboard navigation. The same step type as the No-Code Tool's ",[659,19560,19562],{"href":19561},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fpress-keys",[192,19563,19564],{},"Press key(s)",[107,19566,15786],{"id":15785},[112,19568],{},[2446,19570,19572],{"className":2962,"code":19571,"language":2964,"meta":67,"style":67},"await axiom.pressKeys(key, delimiter, delay);\n",[145,19573,19574],{"__ignoreMap":67},[1332,19575,19576,19578,19580,19583],{"class":2455,"line":2131},[1332,19577,3020],{"class":2507},[1332,19579,15800],{"class":2521},[1332,19581,19582],{"class":2525},"pressKeys",[1332,19584,19585],{"class":2521},"(key, delimiter, delay);\n",[4589,19587,19588,19602],{},[4592,19589,19590],{},[4595,19591,19592,19594,19596,19598,19600],{},[4598,19593,12524],{},[4598,19595,12527],{},[4598,19597,8403],{},[4598,19599,15820],{},[4598,19601,12532],{},[4605,19603,19604,19639,19656],{},[4595,19605,19606,19610,19615,19617,19619],{},[4610,19607,19608],{},[145,19609,4359],{},[4610,19611,19612,19613],{},"string | string",[1332,19614],{},[4610,19616,10771],{},[4610,19618,15838],{},[4610,19620,19621,19622,4468,19625,4468,19628,19631,19632,19635,19636,148],{},"A single key name (",[145,19623,19624],{},"\"Enter\"",[145,19626,19627],{},"\"Tab\"",[145,19629,19630],{},"\"ArrowDown\"","), an array of keys to press as a chord (",[145,19633,19634],{},"[\"Control\", \"a\"]","), or a delimited string parsed via ",[145,19637,19638],{},"delimiter",[4595,19640,19641,19645,19647,19649,19651],{},[4610,19642,19643],{},[145,19644,19638],{},[4610,19646,6750],{},[4610,19648,10779],{},[4610,19650,15838],{},[4610,19652,11487,19653,19655],{},[145,19654,4359],{}," is a string, split it on this delimiter into multiple keys to be pressed in sequence.",[4595,19657,19658,19662,19664,19666,19671],{},[4610,19659,19660],{},[145,19661,17309],{},[4610,19663,14013],{},[4610,19665,10779],{},[4610,19667,19668],{},[145,19669,19670],{},"10",[4610,19672,19673],{},"Milliseconds between successive key presses.",[26,19675,19676,19677,3842,19682,4468,19685,4468,19688,4468,19691,4468,19694,4468,19697,19700,19701,19704,19705,19708],{},"Key names follow the ",[659,19678,19681],{"href":19679,"rel":19680},"https:\u002F\u002Fchromedevtools.github.io\u002Fdevtools-protocol\u002Ftot\u002FInput\u002F#method-dispatchKeyEvent",[1218],"Chrome DevTools key constants",[145,19683,19684],{},"Enter",[145,19686,19687],{},"Tab",[145,19689,19690],{},"Escape",[145,19692,19693],{},"ArrowLeft",[145,19695,19696],{},"Control",[145,19698,19699],{},"Meta",", etc.). On cloud Linux pods, ",[145,19702,19703],{},"\"Meta\""," is automatically rewritten to ",[145,19706,19707],{},"\"Control\""," so the same script works regardless of the underlying OS.",[107,19710,19292],{"id":19291},[112,19712],{},[26,19714,19715],{},[192,19716,19717],{},"Submit a form by pressing Enter:",[2446,19719,19721],{"className":2962,"code":19720,"language":2964,"meta":67,"style":67},"await axiom.click(\"input#search\");\nawait axiom.enterText(\"input#search\", \"ergonomic keyboard\");\nawait axiom.pressKeys(\"Enter\");\n",[145,19722,19723,19738,19756],{"__ignoreMap":67},[1332,19724,19725,19727,19729,19731,19733,19736],{"class":2455,"line":2131},[1332,19726,3020],{"class":2507},[1332,19728,15800],{"class":2521},[1332,19730,5473],{"class":2525},[1332,19732,1213],{"class":2521},[1332,19734,19735],{"class":2462},"\"input#search\"",[1332,19737,2583],{"class":2521},[1332,19739,19740,19742,19744,19746,19748,19750,19752,19754],{"class":2455,"line":670},[1332,19741,3020],{"class":2507},[1332,19743,15800],{"class":2521},[1332,19745,5476],{"class":2525},[1332,19747,1213],{"class":2521},[1332,19749,19735],{"class":2462},[1332,19751,4468],{"class":2521},[1332,19753,17503],{"class":2462},[1332,19755,2583],{"class":2521},[1332,19757,19758,19760,19762,19764,19766,19768],{"class":2455,"line":68},[1332,19759,3020],{"class":2507},[1332,19761,15800],{"class":2521},[1332,19763,19582],{"class":2525},[1332,19765,1213],{"class":2521},[1332,19767,19624],{"class":2462},[1332,19769,2583],{"class":2521},[26,19771,19772],{},[192,19773,19774],{},"Select-all in the focused field:",[2446,19776,19778],{"className":2962,"code":19777,"language":2964,"meta":67,"style":67},"await axiom.pressKeys([\"Control\", \"a\"]);\n",[145,19779,19780],{"__ignoreMap":67},[1332,19781,19782,19784,19786,19788,19791,19793,19795,19798],{"class":2455,"line":2131},[1332,19783,3020],{"class":2507},[1332,19785,15800],{"class":2521},[1332,19787,19582],{"class":2525},[1332,19789,19790],{"class":2521},"([",[1332,19792,19707],{"class":2462},[1332,19794,4468],{"class":2521},[1332,19796,19797],{"class":2462},"\"a\"",[1332,19799,19800],{"class":2521},"]);\n",[26,19802,19803],{},[192,19804,19805],{},"Navigate a custom listbox with arrow keys, then commit:",[2446,19807,19809],{"className":2962,"code":19808,"language":2964,"meta":67,"style":67},"await axiom.pressKeys(\"ArrowDown,ArrowDown,Enter\", \",\", 80);\n",[145,19810,19811],{"__ignoreMap":67},[1332,19812,19813,19815,19817,19819,19821,19824,19826,19829,19831,19833],{"class":2455,"line":2131},[1332,19814,3020],{"class":2507},[1332,19816,15800],{"class":2521},[1332,19818,19582],{"class":2525},[1332,19820,1213],{"class":2521},[1332,19822,19823],{"class":2462},"\"ArrowDown,ArrowDown,Enter\"",[1332,19825,4468],{"class":2521},[1332,19827,19828],{"class":2462},"\",\"",[1332,19830,4468],{"class":2521},[1332,19832,264],{"class":2511},[1332,19834,2583],{"class":2521},[107,19836,6276],{"id":6275},[112,19838],{},[186,19840,19841,19849],{},[189,19842,19843,19844,19848],{},"The event targets whatever element currently has focus. Click an input first (or use ",[659,19845,19846],{"href":16064},[145,19847,17185],{}," to focus by selector) before pressing keys that the page should treat as field input.",[189,19850,19851,19852,19856],{},"For ordinary text input, prefer ",[659,19853,19854],{"href":16064},[145,19855,17185],{}," — it handles focusing the element for you.",[107,19858,4513],{"id":4512},[112,19860],{},[186,19862,19863,19867],{},[189,19864,19865],{},[659,19866,16065],{"href":16064},[189,19868,19869],{},[659,19870,15767],{"href":16079},[2819,19872,16068],{},{"title":67,"searchDepth":68,"depth":68,"links":19874},[19875,19876,19877,19878],{"id":15785,"depth":670,"text":15786},{"id":19291,"depth":670,"text":19292},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Send keyboard key presses (Enter, Tab, arrow keys, modifier combinations) to the currently focused element using axiom.pressKeys().",{"metaTitle":19881},"Fire keyboard events in an axiom.ai cloud browser session",{"title":17668,"description":19879},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fpress-keys","hhIN_ejU_1994Vn7W7Tp5uHNazV11bFi8lAIeoKjivY",{"id":19886,"title":19887,"body":19888,"date":71,"description":20116,"extension":73,"meta":20117,"navigation":75,"order":3751,"path":18697,"seo":20119,"stem":20120,"__hash__":20121},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Frestart-browser.md","Restart browser",{"type":8,"value":19889,"toc":20109},[19890,19902,19904,19906,19922,19925,19927,19929,20025,20029,20031,20034,20057,20068,20070,20072,20093,20095,20097,20107],[26,19891,19892,19895,19896,19898,19899,19901],{},[145,19893,19894],{},"axiom.restartBrowser()"," restarts the cloud browser within the current session. Use it when the browser is wedged (an unrecoverable dialog, a hung page, leaked memory from a previous run) but you want to keep using the same session — and the same quota of concurrent slots — rather than ",[145,19897,5486],{},"-ing and ",[145,19900,5467],{},"-ing.",[107,19903,15786],{"id":15785},[112,19905],{},[2446,19907,19909],{"className":2962,"code":19908,"language":2964,"meta":67,"style":67},"await axiom.restartBrowser();\n",[145,19910,19911],{"__ignoreMap":67},[1332,19912,19913,19915,19917,19920],{"class":2455,"line":2131},[1332,19914,3020],{"class":2507},[1332,19916,15800],{"class":2521},[1332,19918,19919],{"class":2525},"restartBrowser",[1332,19921,2670],{"class":2521},[26,19923,19924],{},"No parameters, no return value.",[107,19926,12784],{"id":12783},[112,19928],{},[2446,19930,19932],{"className":2962,"code":19931,"language":2964,"meta":67,"style":67},"try {\n  await axiom.goto(\"https:\u002F\u002Fexample.com\u002Fheavy-page\");\n  await axiom.click(\".main-action\");\n} catch (e) {\n  \u002F\u002F Browser may be stuck. Restart and retry once.\n  await axiom.restartBrowser();\n  await axiom.goto(\"https:\u002F\u002Fexample.com\u002Fheavy-page\");\n  await axiom.click(\".main-action\");\n}\n",[145,19933,19934,19940,19955,19970,19978,19983,19993,20007,20021],{"__ignoreMap":67},[1332,19935,19936,19938],{"class":2455,"line":2131},[1332,19937,2645],{"class":2507},[1332,19939,2648],{"class":2521},[1332,19941,19942,19944,19946,19948,19950,19953],{"class":2455,"line":670},[1332,19943,3389],{"class":2507},[1332,19945,15800],{"class":2521},[1332,19947,2682],{"class":2525},[1332,19949,1213],{"class":2521},[1332,19951,19952],{"class":2462},"\"https:\u002F\u002Fexample.com\u002Fheavy-page\"",[1332,19954,2583],{"class":2521},[1332,19956,19957,19959,19961,19963,19965,19968],{"class":2455,"line":68},[1332,19958,3389],{"class":2507},[1332,19960,15800],{"class":2521},[1332,19962,5473],{"class":2525},[1332,19964,1213],{"class":2521},[1332,19966,19967],{"class":2462},"\".main-action\"",[1332,19969,2583],{"class":2521},[1332,19971,19972,19974,19976],{"class":2455,"line":1478},[1332,19973,2768],{"class":2521},[1332,19975,2771],{"class":2507},[1332,19977,2774],{"class":2521},[1332,19979,19980],{"class":2455,"line":293},[1332,19981,19982],{"class":2609},"  \u002F\u002F Browser may be stuck. Restart and retry once.\n",[1332,19984,19985,19987,19989,19991],{"class":2455,"line":2237},[1332,19986,3389],{"class":2507},[1332,19988,15800],{"class":2521},[1332,19990,19919],{"class":2525},[1332,19992,2670],{"class":2521},[1332,19994,19995,19997,19999,20001,20003,20005],{"class":2455,"line":2623},[1332,19996,3389],{"class":2507},[1332,19998,15800],{"class":2521},[1332,20000,2682],{"class":2525},[1332,20002,1213],{"class":2521},[1332,20004,19952],{"class":2462},[1332,20006,2583],{"class":2521},[1332,20008,20009,20011,20013,20015,20017,20019],{"class":2455,"line":2637},[1332,20010,3389],{"class":2507},[1332,20012,15800],{"class":2521},[1332,20014,5473],{"class":2525},[1332,20016,1213],{"class":2521},[1332,20018,19967],{"class":2462},[1332,20020,2583],{"class":2521},[1332,20022,20023],{"class":2455,"line":2642},[1332,20024,2802],{"class":2521},[107,20026,20028],{"id":20027},"whats-preserved-whats-lost","What's preserved, what's lost",[112,20030],{},[26,20032,20033],{},"A restart spins up a fresh Chrome instance inside the same session:",[186,20035,20036,20045],{},[189,20037,20038,20041,20042,20044],{},[192,20039,20040],{},"Lost:"," cookies, ",[145,20043,17931],{},", open tabs, in-flight network requests, anything else held in browser memory.",[189,20046,20047,20050,20051,20053,20054,20056],{},[192,20048,20049],{},"Preserved:"," the session itself — your ",[145,20052,16904],{}," instance keeps the same ",[145,20055,16742],{},", you don't need to re-authenticate, and the session's runtime quota and concurrency slot are unchanged.",[26,20058,20059,20060,20064,20065,20067],{},"If you need to retain cookies across the restart, save what you need with ",[659,20061,20062],{"href":17815},[145,20063,18315],{}," before calling ",[145,20066,18700],{},", and re-apply them on the new browser.",[107,20069,6276],{"id":6275},[112,20071],{},[186,20073,20074,20090],{},[189,20075,20076,20077,20081,20082,20086,20087,20089],{},"For most error-recovery flows, simply ",[659,20078,20079],{"href":16951},[145,20080,5486],{}," + ",[659,20083,20084],{"href":4533},[145,20085,5467],{}," on a new instance is cleaner. Reach for ",[145,20088,18700],{}," only when you want to avoid waiting in the session queue again.",[189,20091,20092],{},"This step is rare in normal flows. Use it as a recovery primitive, not a routine reset.",[107,20094,4513],{"id":4512},[112,20096],{},[186,20098,20099,20103],{},[189,20100,20101],{},[659,20102,11078],{"href":4533},[189,20104,20105],{},[659,20106,16683],{"href":16951},[2819,20108,17205],{},{"title":67,"searchDepth":68,"depth":68,"links":20110},[20111,20112,20113,20114,20115],{"id":15785,"depth":670,"text":15786},{"id":12783,"depth":670,"text":12784},{"id":20027,"depth":670,"text":20028},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Restart the cloud browser within the current session to recover from a wedged state without losing the session itself, using axiom.restartBrowser().",{"metaTitle":20118},"Restart the cloud browser within an axiom.ai session",{"title":19887,"description":20116},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Frestart-browser","yNtVS--6m8GpBn2uMLw2RQC_llh8TAuaOMu9scZyrzU",{"id":20123,"title":17816,"body":20124,"date":71,"description":20417,"extension":73,"meta":20418,"navigation":75,"order":2750,"path":17815,"seo":20420,"stem":20421,"__hash__":20422},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fscrape.md",{"type":8,"value":20125,"toc":20411},[20126,20138,20140,20142,20164,20270,20273,20275,20277,20280,20359,20361,20363,20394,20396,20398,20408],[26,20127,20128,20131,20132,20137],{},[145,20129,20130],{},"axiom.scrape(url, selector, pager, max_results, settings)"," extracts a list of structured records from a page (or a sequence of pages, if you supply a pager). The same step type as the No-Code Tool's ",[659,20133,20134],{"href":19005},[192,20135,20136],{},"Get data from bot's current page",", called from your code with selectors you choose at runtime.",[107,20139,15786],{"id":15785},[112,20141],{},[2446,20143,20145],{"className":2962,"code":20144,"language":2964,"meta":67,"style":67},"const rows = await axiom.scrape(url, selector, pager, max_results, settings);\n",[145,20146,20147],{"__ignoreMap":67},[1332,20148,20149,20151,20153,20155,20157,20159,20161],{"class":2455,"line":2131},[1332,20150,2508],{"class":2507},[1332,20152,18861],{"class":2511},[1332,20154,2515],{"class":2507},[1332,20156,2518],{"class":2507},[1332,20158,15800],{"class":2521},[1332,20160,5479],{"class":2525},[1332,20162,20163],{"class":2521},"(url, selector, pager, max_results, settings);\n",[4589,20165,20166,20178],{},[4592,20167,20168],{},[4595,20169,20170,20172,20174,20176],{},[4598,20171,12524],{},[4598,20173,12527],{},[4598,20175,8403],{},[4598,20177,12532],{},[4605,20179,20180,20199,20213,20235,20252],{},[4595,20181,20182,20186,20191,20193],{},[4610,20183,20184],{},[145,20185,13749],{},[4610,20187,19612,20188,20190],{},[1332,20189],{}," | null",[4610,20192,10771],{},[4610,20194,20195,20196,20198],{},"URL (or array of URLs) to scrape. Pass ",[145,20197,8822],{}," to scrape the page currently loaded in the session. Multiple URLs are scraped in sequence.",[4595,20200,20201,20206,20208,20210],{},[4610,20202,20203],{},[145,20204,20205],{},"selector",[4610,20207,12725],{},[4610,20209,10771],{},[4610,20211,20212],{},"Selector definition for the records to extract. Use the No-Code Tool's selector tool (or a recorded selector from a previous run) to produce this.",[4595,20214,20215,20220,20223,20225],{},[4610,20216,20217],{},[145,20218,20219],{},"pager",[4610,20221,20222],{},"object | null",[4610,20224,10771],{},[4610,20226,20227,20228,20230,20231,20234],{},"Selector for the \"next page\" link. Pass ",[145,20229,8822],{}," for single-page scraping. With a pager, the scraper paginates until ",[145,20232,20233],{},"max_results"," is hit or the pager stops resolving.",[4595,20236,20237,20241,20244,20246],{},[4610,20238,20239],{},[145,20240,20233],{},[4610,20242,20243],{},"number | null",[4610,20245,10771],{},[4610,20247,20248,20249,20251],{},"Cap on the number of records returned. Must be a positive whole number (or ",[145,20250,8822],{}," for unlimited).",[4595,20253,20254,20259,20261,20263],{},[4610,20255,20256],{},[145,20257,20258],{},"settings",[4610,20260,12725],{},[4610,20262,10771],{},[4610,20264,20265,20266,20269],{},"Behavioural tuning (output format, minimum wait, …). Pass ",[145,20267,20268],{},"{}"," for defaults.",[26,20271,20272],{},"Returns a 2D array of records (rows × fields).",[107,20274,12784],{"id":12783},[112,20276],{},[26,20278,20279],{},"Scrape product cards from a category page, paginating until 100 results:",[2446,20281,20283],{"className":2962,"code":20282,"language":2964,"meta":67,"style":67},"const products = await axiom.scrape(\n  null,                                  \u002F\u002F stay on the current page\n  { hierarchy: \".product-card\" },        \u002F\u002F record selector\n  { hierarchy: \"a.pagination-next\" },    \u002F\u002F pager selector\n  100,                                   \u002F\u002F max results\n  {}                                     \u002F\u002F default settings\n);\n",[145,20284,20285,20302,20312,20325,20338,20348,20355],{"__ignoreMap":67},[1332,20286,20287,20289,20292,20294,20296,20298,20300],{"class":2455,"line":2131},[1332,20288,2508],{"class":2507},[1332,20290,20291],{"class":2511}," products",[1332,20293,2515],{"class":2507},[1332,20295,2518],{"class":2507},[1332,20297,15800],{"class":2521},[1332,20299,5479],{"class":2525},[1332,20301,4878],{"class":2521},[1332,20303,20304,20307,20310],{"class":2455,"line":670},[1332,20305,20306],{"class":2511},"  null",[1332,20308,20309],{"class":2521},",                                  ",[1332,20311,18882],{"class":2609},[1332,20313,20314,20317,20320,20323],{"class":2455,"line":68},[1332,20315,20316],{"class":2521},"  { hierarchy: ",[1332,20318,20319],{"class":2462},"\".product-card\"",[1332,20321,20322],{"class":2521}," },        ",[1332,20324,18893],{"class":2609},[1332,20326,20327,20329,20332,20335],{"class":2455,"line":1478},[1332,20328,20316],{"class":2521},[1332,20330,20331],{"class":2462},"\"a.pagination-next\"",[1332,20333,20334],{"class":2521}," },    ",[1332,20336,20337],{"class":2609},"\u002F\u002F pager selector\n",[1332,20339,20340,20343,20346],{"class":2455,"line":293},[1332,20341,20342],{"class":2511},"  100",[1332,20344,20345],{"class":2521},",                                   ",[1332,20347,18913],{"class":2609},[1332,20349,20350,20353],{"class":2455,"line":2237},[1332,20351,20352],{"class":2521},"  {}                                     ",[1332,20354,18921],{"class":2609},[1332,20356,20357],{"class":2455,"line":2623},[1332,20358,2583],{"class":2521},[107,20360,6276],{"id":6275},[112,20362],{},[186,20364,20365,20372,20380,20388],{},[189,20366,2273,20367,6205,20369,20371],{},[145,20368,20205],{},[145,20370,20219],{}," shapes match the selector tokens emitted by the No-Code Tool's selector tool. If you're authoring by hand, capturing them once via the No-Code Tool and copy-pasting is the lowest-friction approach.",[189,20373,20374,20375,20379],{},"For single-record extraction (page title, OG image, single field), use ",[659,20376,20377],{"href":18642},[145,20378,18999],{}," — it's faster and simpler.",[189,20381,20382,20383,7176,20386,148],{},"The scraper handles lazy-loaded content by waiting briefly after each pager click. Sites with slow infinite-scroll may need a higher ",[145,20384,20385],{},"minWait",[145,20387,20258],{},[189,20389,20390,20391,20393],{},"Multiple URLs in ",[145,20392,13749],{}," are scraped sequentially and the results concatenated; failures on one URL fail the whole call.",[107,20395,4513],{"id":4512},[112,20397],{},[186,20399,20400,20404],{},[189,20401,20402],{},[659,20403,19529],{"href":18642},[189,20405,20406],{},[659,20407,17835],{"href":18084},[2819,20409,20410],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}",{"title":67,"searchDepth":68,"depth":68,"links":20412},[20413,20414,20415,20416],{"id":15785,"depth":670,"text":15786},{"id":12783,"depth":670,"text":12784},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Smart-scrape a list of records from one or more pages, with optional pagination and a maximum-results cap, using axiom.scrape().",{"metaTitle":20419},"Extract a list of records from a page in an axiom.ai cloud browser session",{"title":17816,"description":20417},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fscrape","_O6hiVpVCPJdy9xnykVIJtebiXQwXZk-Pk11dWNKYSo",{"id":20424,"title":19529,"body":20425,"date":71,"description":20829,"extension":73,"meta":20830,"navigation":75,"order":2765,"path":18642,"seo":20832,"stem":20833,"__hash__":20834},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fscrape-metadata.md",{"type":8,"value":20426,"toc":20822},[20427,20437,20439,20441,20465,20502,20505,20508,20510,20520,20620,20622,20624,20630,20704,20707,20776,20778,20780,20810,20812,20814,20820],[26,20428,20429,20432,20433,20436],{},[145,20430,20431],{},"axiom.scrapeMetadata(metadata)"," extracts page-level metadata fields from the current page: the document title, common analytics IDs (Google Analytics, Facebook Pixel), schema.org structured data, and the content of arbitrary ",[145,20434,20435],{},"\u003Cmeta>"," tags. Use it when you want a few specific page-level fields rather than a list of records.",[107,20438,15786],{"id":15785},[112,20440],{},[2446,20442,20444],{"className":2962,"code":20443,"language":2964,"meta":67,"style":67},"const values = await axiom.scrapeMetadata(metadata);\n",[145,20445,20446],{"__ignoreMap":67},[1332,20447,20448,20450,20453,20455,20457,20459,20462],{"class":2455,"line":2131},[1332,20449,2508],{"class":2507},[1332,20451,20452],{"class":2511}," values",[1332,20454,2515],{"class":2507},[1332,20456,2518],{"class":2507},[1332,20458,15800],{"class":2521},[1332,20460,20461],{"class":2525},"scrapeMetadata",[1332,20463,20464],{"class":2521},"(metadata);\n",[4589,20466,20467,20479],{},[4592,20468,20469],{},[4595,20470,20471,20473,20475,20477],{},[4598,20472,12524],{},[4598,20474,12527],{},[4598,20476,8403],{},[4598,20478,12532],{},[4605,20480,20481],{},[4595,20482,20483,20488,20490,20492],{},[4610,20484,20485],{},[145,20486,20487],{},"metadata",[4610,20489,6761],{},[4610,20491,10771],{},[4610,20493,20494,20495,20498,20499,14735],{},"Array of ",[145,20496,20497],{},"{ id, value, description }"," items describing which fields to extract. See ",[192,20500,20501],{},"Field types",[26,20503,20504],{},"Returns a 2D array of extracted values, in the same order as the input items.",[107,20506,20501],{"id":20507},"field-types",[112,20509],{},[26,20511,20512,20513,20515,20516,20519],{},"Each item in the ",[145,20514,20487],{}," array has an ",[145,20517,20518],{},"id"," that selects an extractor. The built-in extractors are:",[4589,20521,20522,20532],{},[4592,20523,20524],{},[4595,20525,20526,20530],{},[4598,20527,20528],{},[145,20529,20518],{},[4598,20531,12532],{},[4605,20533,20534,20547,20563,20573,20595],{},[4595,20535,20536,20541],{},[4610,20537,20538],{},[145,20539,20540],{},"general_metadata_title",[4610,20542,20543,20544,148],{},"The page's ",[145,20545,20546],{},"\u003Ctitle>",[4595,20548,20549,20554],{},[4610,20550,20551],{},[145,20552,20553],{},"analytics_and_tracking_google_analytics_id",[4610,20555,20556,20557,4468,20560,3696],{},"The first GA measurement ID found in inline scripts (",[145,20558,20559],{},"G-…",[145,20561,20562],{},"UA-…",[4595,20564,20565,20570],{},[4610,20566,20567],{},[145,20568,20569],{},"analytics_and_tracking_facebook_pixel_id",[4610,20571,20572],{},"The first Facebook Pixel ID found in inline scripts.",[4595,20574,20575,20580],{},[4610,20576,20577],{},[145,20578,20579],{},"schema.org_structured_data_\u003CTYPE>",[4610,20581,7407,20582,20585,20586,20589,20590,20592,20593,148],{},[145,20583,20584],{},"\u003Cscript type=\"application\u002Fld+json\">"," block whose ",[145,20587,20588],{},"@type"," matches the ",[145,20591,20588],{}," named in the item's ",[145,20594,14645],{},[4595,20596,20597,20602],{},[4610,20598,20599,20600],{},"any other ",[145,20601,20518],{},[4610,20603,20604,20605,20608,20609,20611,20612,20615,20616,20619],{},"The extractor falls back to ",[145,20606,20607],{},"value"," as a CSS selector, returning the matched element's ",[145,20610,271],{}," attribute, ",[145,20613,20614],{},"href"," attribute, or ",[145,20617,20618],{},"outerHTML"," (in that order of preference).",[107,20621,12784],{"id":12783},[112,20623],{},[26,20625,20626,20627,3297],{},"Pull the page title, GA ID, and the contents of ",[145,20628,20629],{},"\u003Cmeta name=\"description\">",[2446,20631,20633],{"className":2962,"code":20632,"language":2964,"meta":67,"style":67},"const [title, gaId, description] = await axiom.scrapeMetadata([\n  { id: 'general_metadata_title' },\n  { id: 'analytics_and_tracking_google_analytics_id' },\n  { id: 'meta_description', value: 'meta[name=\"description\"]' }\n]);\n",[145,20634,20635,20666,20676,20685,20700],{"__ignoreMap":67},[1332,20636,20637,20639,20642,20644,20646,20649,20651,20653,20655,20657,20659,20661,20663],{"class":2455,"line":2131},[1332,20638,2508],{"class":2507},[1332,20640,20641],{"class":2521}," [",[1332,20643,3416],{"class":2511},[1332,20645,4468],{"class":2521},[1332,20647,20648],{"class":2511},"gaId",[1332,20650,4468],{"class":2521},[1332,20652,14645],{"class":2511},[1332,20654,4952],{"class":2521},[1332,20656,5110],{"class":2507},[1332,20658,2518],{"class":2507},[1332,20660,15800],{"class":2521},[1332,20662,20461],{"class":2525},[1332,20664,20665],{"class":2521},"([\n",[1332,20667,20668,20671,20674],{"class":2455,"line":670},[1332,20669,20670],{"class":2521},"  { id: ",[1332,20672,20673],{"class":2462},"'general_metadata_title'",[1332,20675,6531],{"class":2521},[1332,20677,20678,20680,20683],{"class":2455,"line":68},[1332,20679,20670],{"class":2521},[1332,20681,20682],{"class":2462},"'analytics_and_tracking_google_analytics_id'",[1332,20684,6531],{"class":2521},[1332,20686,20687,20689,20692,20695,20698],{"class":2455,"line":1478},[1332,20688,20670],{"class":2521},[1332,20690,20691],{"class":2462},"'meta_description'",[1332,20693,20694],{"class":2521},", value: ",[1332,20696,20697],{"class":2462},"'meta[name=\"description\"]'",[1332,20699,6185],{"class":2521},[1332,20701,20702],{"class":2455,"line":293},[1332,20703,19800],{"class":2521},[26,20705,20706],{},"Pull a specific schema.org block:",[2446,20708,20710],{"className":2962,"code":20709,"language":2964,"meta":67,"style":67},"const [product] = await axiom.scrapeMetadata([\n  { id: 'schema.org_structured_data_Product', description: '@type: Product' }\n]);\nconst parsed = JSON.parse(product[0]);\n",[145,20711,20712,20733,20748,20752],{"__ignoreMap":67},[1332,20713,20714,20716,20718,20721,20723,20725,20727,20729,20731],{"class":2455,"line":2131},[1332,20715,2508],{"class":2507},[1332,20717,20641],{"class":2521},[1332,20719,20720],{"class":2511},"product",[1332,20722,4952],{"class":2521},[1332,20724,5110],{"class":2507},[1332,20726,2518],{"class":2507},[1332,20728,15800],{"class":2521},[1332,20730,20461],{"class":2525},[1332,20732,20665],{"class":2521},[1332,20734,20735,20737,20740,20743,20746],{"class":2455,"line":670},[1332,20736,20670],{"class":2521},[1332,20738,20739],{"class":2462},"'schema.org_structured_data_Product'",[1332,20741,20742],{"class":2521},", description: ",[1332,20744,20745],{"class":2462},"'@type: Product'",[1332,20747,6185],{"class":2521},[1332,20749,20750],{"class":2455,"line":68},[1332,20751,19800],{"class":2521},[1332,20753,20754,20756,20759,20761,20764,20766,20769,20772,20774],{"class":2455,"line":1478},[1332,20755,2508],{"class":2507},[1332,20757,20758],{"class":2511}," parsed",[1332,20760,2515],{"class":2507},[1332,20762,20763],{"class":2511}," JSON",[1332,20765,148],{"class":2521},[1332,20767,20768],{"class":2525},"parse",[1332,20770,20771],{"class":2521},"(product[",[1332,20773,256],{"class":2511},[1332,20775,19800],{"class":2521},[107,20777,6276],{"id":6275},[112,20779],{},[186,20781,20782,20789,20792],{},[189,20783,20784,20785,16454],{},"Each item returns a single value. For multi-row extraction, use ",[659,20786,20787],{"href":17815},[145,20788,18315],{},[189,20790,20791],{},"Schema.org extraction parses the matched JSON-LD block and returns its serialised form. Parse it on your side.",[189,20793,20794,20795,20797,20798,20800,20801,20803,20804,20800,20807,20809],{},"The fallback selector extractor reads ",[145,20796,271],{}," first (for ",[145,20799,20435],{}," tags), then ",[145,20802,20614],{}," (for ",[145,20805,20806],{},"\u003Clink>",[145,20808,20618],{},". This is convenient for the common cases but means the same selector can return different shapes depending on the element type.",[107,20811,4513],{"id":4512},[112,20813],{},[186,20815,20816],{},[189,20817,20818],{},[659,20819,17816],{"href":17815},[2819,20821,17819],{},{"title":67,"searchDepth":68,"depth":68,"links":20823},[20824,20825,20826,20827,20828],{"id":15785,"depth":670,"text":15786},{"id":20507,"depth":670,"text":20501},{"id":12783,"depth":670,"text":12784},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Extract page-level metadata (title, analytics IDs, schema.org structured data, or any meta-tag content) using axiom.scrapeMetadata().",{"metaTitle":20831},"Extract page-level metadata in an axiom.ai cloud browser session",{"title":19529,"description":20829},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fscrape-metadata","jJGhfLyBU-muh_N3vcmX8MBwJVt92fo-eKHAY_9KlDc",{"id":20836,"title":17202,"body":20837,"date":71,"description":21003,"extension":73,"meta":21004,"navigation":75,"order":2673,"path":17201,"seo":21006,"stem":21007,"__hash__":21008},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fselect-list.md",{"type":8,"value":20838,"toc":20997},[20839,20853,20855,20857,20874,20923,20925,20927,20952,20954,20956,20981,20983,20985,20995],[26,20840,20841,20844,20845,20847,20848,148],{},[145,20842,20843],{},"axiom.selectList(select, text)"," picks an option in a native HTML ",[145,20846,18586],{}," element by matching on the option's visible text. The same step type as the No-Code Tool's ",[659,20849,20851],{"href":20850},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fselect-list",[192,20852,17202],{},[107,20854,15786],{"id":15785},[112,20856],{},[2446,20858,20860],{"className":2962,"code":20859,"language":2964,"meta":67,"style":67},"await axiom.selectList(select, text);\n",[145,20861,20862],{"__ignoreMap":67},[1332,20863,20864,20866,20868,20871],{"class":2455,"line":2131},[1332,20865,3020],{"class":2507},[1332,20867,15800],{"class":2521},[1332,20869,20870],{"class":2525},"selectList",[1332,20872,20873],{"class":2521},"(select, text);\n",[4589,20875,20876,20888],{},[4592,20877,20878],{},[4595,20879,20880,20882,20884,20886],{},[4598,20881,12524],{},[4598,20883,12527],{},[4598,20885,8403],{},[4598,20887,12532],{},[4605,20889,20890,20906],{},[4595,20891,20892,20896,20898,20900],{},[4610,20893,20894],{},[145,20895,15831],{},[4610,20897,6750],{},[4610,20899,10771],{},[4610,20901,20902,20903,20905],{},"CSS selector for the ",[145,20904,18586],{}," element.",[4595,20907,20908,20912,20914,20916],{},[4610,20909,20910],{},[145,20911,5402],{},[4610,20913,6750],{},[4610,20915,10771],{},[4610,20917,20918,20919,20922],{},"Visible text of the option to pick (matched case-sensitively against ",[145,20920,20921],{},"\u003Coption>"," text content).",[107,20924,12784],{"id":12783},[112,20926],{},[2446,20928,20930],{"className":2962,"code":20929,"language":2964,"meta":67,"style":67},"await axiom.selectList(\"select#country\", \"United Kingdom\");\n",[145,20931,20932],{"__ignoreMap":67},[1332,20933,20934,20936,20938,20940,20942,20945,20947,20950],{"class":2455,"line":2131},[1332,20935,3020],{"class":2507},[1332,20937,15800],{"class":2521},[1332,20939,20870],{"class":2525},[1332,20941,1213],{"class":2521},[1332,20943,20944],{"class":2462},"\"select#country\"",[1332,20946,4468],{"class":2521},[1332,20948,20949],{"class":2462},"\"United Kingdom\"",[1332,20951,2583],{"class":2521},[107,20953,6276],{"id":6275},[112,20955],{},[186,20957,20958,20969,20975],{},[189,20959,20960,20961,20963,20964,20968],{},"Only works on native ",[145,20962,18586],{}," elements. Custom-built dropdowns (divs styled as dropdowns, headless-UI listboxes, React-Select, etc.) don't respond to this — drive them with ",[659,20965,20966],{"href":16079},[145,20967,16453],{},": click the trigger, then click the option.",[189,20970,20971,20972,20974],{},"Matching is on the option's visible text, not its ",[145,20973,20607],{}," attribute. If the visible text and the underlying value diverge, use the visible text.",[189,20976,20977,20978,20980],{},"If no option matches ",[145,20979,5402],{}," exactly, the step throws.",[107,20982,4513],{"id":4512},[112,20984],{},[186,20986,20987,20991],{},[189,20988,20989],{},[659,20990,15767],{"href":16079},[189,20992,20993],{},[659,20994,16065],{"href":16064},[2819,20996,16467],{},{"title":67,"searchDepth":68,"depth":68,"links":20998},[20999,21000,21001,21002],{"id":15785,"depth":670,"text":15786},{"id":12783,"depth":670,"text":12784},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Pick an option in a native HTML \u003Cselect> element by visible text using axiom.selectList().",{"metaTitle":21005},"Pick an option in a native dropdown in an axiom.ai cloud browser session",{"title":17202,"description":21003},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fselect-list","t6kdUs_F-bHXMlZisDn2mBkWle-RPjYGjV6D40cOKe8",{"id":21010,"title":21011,"body":21012,"date":71,"description":21189,"extension":73,"meta":21190,"navigation":75,"order":2788,"path":18668,"seo":21192,"stem":21193,"__hash__":21194},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fsolve-captcha.md","Solve captcha",{"type":8,"value":21013,"toc":21183},[21014,21026,21028,21030,21047,21078,21080,21082,21147,21149,21151,21167,21169,21171,21181],[26,21015,21016,21019,21020,148],{},[145,21017,21018],{},"axiom.solveCaptcha(apiKey)"," sends the captcha on the current page to a third-party solver (2Captcha by default), waits for the result, and submits it into the captcha field. The same step type as the No-Code Tool's ",[659,21021,21023],{"href":21022},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsolve-captcha",[192,21024,21025],{},"Solve Captcha",[107,21027,15786],{"id":15785},[112,21029],{},[2446,21031,21033],{"className":2962,"code":21032,"language":2964,"meta":67,"style":67},"await axiom.solveCaptcha(apiKey);\n",[145,21034,21035],{"__ignoreMap":67},[1332,21036,21037,21039,21041,21044],{"class":2455,"line":2131},[1332,21038,3020],{"class":2507},[1332,21040,15800],{"class":2521},[1332,21042,21043],{"class":2525},"solveCaptcha",[1332,21045,21046],{"class":2521},"(apiKey);\n",[4589,21048,21049,21061],{},[4592,21050,21051],{},[4595,21052,21053,21055,21057,21059],{},[4598,21054,12524],{},[4598,21056,12527],{},[4598,21058,8403],{},[4598,21060,12532],{},[4605,21062,21063],{},[4595,21064,21065,21069,21071,21073],{},[4610,21066,21067],{},[145,21068,9451],{},[4610,21070,6750],{},[4610,21072,10779],{},[4610,21074,21075,21076,3696],{},"API key for the captcha solver. If omitted or empty, the step uses the 2Captcha key stored on your axiom.ai account (set under ",[659,21077,19513],{"href":425},[107,21079,12784],{"id":12783},[112,21081],{},[2446,21083,21085],{"className":2962,"code":21084,"language":2964,"meta":67,"style":67},"await axiom.goto(\"https:\u002F\u002Fexample.com\u002Flogin\");\nawait axiom.enterText(\"#email\", \"user@example.com\");\nawait axiom.solveCaptcha();                  \u002F\u002F uses the stored 2Captcha key\nawait axiom.click(\"button[type=submit]\");\n",[145,21086,21087,21101,21119,21133],{"__ignoreMap":67},[1332,21088,21089,21091,21093,21095,21097,21099],{"class":2455,"line":2131},[1332,21090,3020],{"class":2507},[1332,21092,15800],{"class":2521},[1332,21094,2682],{"class":2525},[1332,21096,1213],{"class":2521},[1332,21098,15931],{"class":2462},[1332,21100,2583],{"class":2521},[1332,21102,21103,21105,21107,21109,21111,21113,21115,21117],{"class":2455,"line":670},[1332,21104,3020],{"class":2507},[1332,21106,15800],{"class":2521},[1332,21108,5476],{"class":2525},[1332,21110,1213],{"class":2521},[1332,21112,17428],{"class":2462},[1332,21114,4468],{"class":2521},[1332,21116,17433],{"class":2462},[1332,21118,2583],{"class":2521},[1332,21120,21121,21123,21125,21127,21130],{"class":2455,"line":68},[1332,21122,3020],{"class":2507},[1332,21124,15800],{"class":2521},[1332,21126,21043],{"class":2525},[1332,21128,21129],{"class":2521},"();                  ",[1332,21131,21132],{"class":2609},"\u002F\u002F uses the stored 2Captcha key\n",[1332,21134,21135,21137,21139,21141,21143,21145],{"class":2455,"line":1478},[1332,21136,3020],{"class":2507},[1332,21138,15800],{"class":2521},[1332,21140,5473],{"class":2525},[1332,21142,1213],{"class":2521},[1332,21144,15946],{"class":2462},[1332,21146,2583],{"class":2521},[107,21148,6276],{"id":6275},[112,21150],{},[186,21152,21153,21156,21164],{},[189,21154,21155],{},"Captcha solving is billed by the third-party solver, not by axiom.ai. Your axiom.ai runtime quota covers only the time the session spends waiting for the result.",[189,21157,21158,21159,21163],{},"The step detects the captcha type on the page (reCAPTCHA v2, hCaptcha, image captchas) and routes it appropriately. If the page's captcha widget loads slowly, insert an ",[659,21160,21161],{"href":18040},[145,21162,18043],{}," before this step.",[189,21165,21166],{},"Solver response times vary from a few seconds to a couple of minutes. The library's transparent polling fallback handles requests that exceed the default HTTP timeout — you don't need to do anything special on the client.",[107,21168,4513],{"id":4512},[112,21170],{},[186,21172,21173,21177],{},[189,21174,21175],{},[659,21176,15767],{"href":16079},[189,21178,21179],{},[659,21180,18065],{"href":18040},[2819,21182,17205],{},{"title":67,"searchDepth":68,"depth":68,"links":21184},[21185,21186,21187,21188],{"id":15785,"depth":670,"text":15786},{"id":12783,"depth":670,"text":12784},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Send the current page's captcha to a third-party solver and submit the result using axiom.solveCaptcha().",{"metaTitle":21191},"Solve a captcha in an axiom.ai cloud browser session",{"title":21011,"description":21189},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fsolve-captcha","dsL5OecnpJb3ef4DcRJK7zPITW6De_XFVdMdYgQeF1I",{"id":21196,"title":11078,"body":21197,"date":71,"description":21475,"extension":73,"meta":21476,"navigation":75,"order":670,"path":4533,"seo":21478,"stem":21479,"__hash__":21480},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fstart-a-session .md",{"type":8,"value":21198,"toc":21467},[21199,21212,21215,21217,21229,21233,21235,21240,21279,21286,21290,21292,21307,21313,21317,21319,21327,21421,21423,21425,21451,21453,21455,21465],[26,21200,21201,21203,21204,21207,21208,148],{},[145,21202,18431],{}," opens a fresh, isolated cloud browser session. Once open, every other ",[145,21205,21206],{},"axiom.*"," method drives that session until you call ",[659,21209,21210],{"href":16951},[145,21211,16690],{},[107,21213,21214],{"id":1488},"Install",[112,21216],{},[2446,21218,21219],{"className":2448,"code":18319,"language":2450,"meta":67,"style":67},[145,21220,21221],{"__ignoreMap":67},[1332,21222,21223,21225,21227],{"class":2455,"line":2131},[1332,21224,2459],{"class":2458},[1332,21226,3288],{"class":2462},[1332,21228,18330],{"class":2462},[107,21230,21232],{"id":21231},"instantiate-the-client","Instantiate the client",[112,21234],{},[26,21236,21237,21238,4628],{},"Pass your API key into the constructor. See ",[659,21239,4211],{"href":4558},[2446,21241,21243],{"className":2962,"code":21242,"language":2964,"meta":67,"style":67},"import { AxiomApi } from 'axiom-api';\n\nconst axiom = new AxiomApi(process.env.AXIOM_API_KEY);\n",[145,21244,21245,21257,21261],{"__ignoreMap":67},[1332,21246,21247,21249,21251,21253,21255],{"class":2455,"line":2131},[1332,21248,4661],{"class":2507},[1332,21250,16782],{"class":2521},[1332,21252,4667],{"class":2507},[1332,21254,16787],{"class":2462},[1332,21256,4673],{"class":2521},[1332,21258,21259],{"class":2455,"line":670},[1332,21260,2588],{"emptyLinePlaceholder":75},[1332,21262,21263,21265,21267,21269,21271,21273,21275,21277],{"class":2455,"line":68},[1332,21264,2508],{"class":2507},[1332,21266,16800],{"class":2511},[1332,21268,2515],{"class":2507},[1332,21270,2697],{"class":2507},[1332,21272,16807],{"class":2525},[1332,21274,16810],{"class":2521},[1332,21276,4713],{"class":2511},[1332,21278,2583],{"class":2521},[2093,21280,21281],{},[26,21282,21283,21285],{},[192,21284,2359],{}," never hard-code the key. Store it in an environment variable or a secrets manager.",[107,21287,21289],{"id":21288},"open-the-session","Open the session",[112,21291],{},[2446,21293,21295],{"className":2962,"code":21294,"language":2964,"meta":67,"style":67},"await axiom.browserOpen();\n",[145,21296,21297],{"__ignoreMap":67},[1332,21298,21299,21301,21303,21305],{"class":2455,"line":2131},[1332,21300,3020],{"class":2507},[1332,21302,15800],{"class":2521},[1332,21304,15916],{"class":2525},[1332,21306,2670],{"class":2521},[26,21308,21309,21310,21312],{},"The call resolves once the cloud browser is ready to accept commands. There's nothing to capture from the return value, the ",[145,21311,16904],{}," instance itself holds the session.",[107,21314,21316],{"id":21315},"standard-pattern","Standard pattern",[112,21318],{},[26,21320,21321,21322,16175,21324,21326],{},"Wrap the work in a ",[145,21323,2645],{},[145,21325,4790],{}," so the session always closes, even on errors:",[2446,21328,21329],{"className":2962,"code":16773,"language":2964,"meta":67,"style":67},[145,21330,21331,21343,21347,21365,21375,21381,21395,21399,21407,21417],{"__ignoreMap":67},[1332,21332,21333,21335,21337,21339,21341],{"class":2455,"line":2131},[1332,21334,4661],{"class":2507},[1332,21336,16782],{"class":2521},[1332,21338,4667],{"class":2507},[1332,21340,16787],{"class":2462},[1332,21342,4673],{"class":2521},[1332,21344,21345],{"class":2455,"line":670},[1332,21346,2588],{"emptyLinePlaceholder":75},[1332,21348,21349,21351,21353,21355,21357,21359,21361,21363],{"class":2455,"line":68},[1332,21350,2508],{"class":2507},[1332,21352,16800],{"class":2511},[1332,21354,2515],{"class":2507},[1332,21356,2697],{"class":2507},[1332,21358,16807],{"class":2525},[1332,21360,16810],{"class":2521},[1332,21362,4713],{"class":2511},[1332,21364,2583],{"class":2521},[1332,21366,21367,21369,21371,21373],{"class":2455,"line":1478},[1332,21368,3020],{"class":2507},[1332,21370,15800],{"class":2521},[1332,21372,15916],{"class":2525},[1332,21374,2670],{"class":2521},[1332,21376,21377,21379],{"class":2455,"line":293},[1332,21378,2645],{"class":2507},[1332,21380,2648],{"class":2521},[1332,21382,21383,21385,21387,21389,21391,21393],{"class":2455,"line":2237},[1332,21384,3389],{"class":2507},[1332,21386,15800],{"class":2521},[1332,21388,2682],{"class":2525},[1332,21390,1213],{"class":2521},[1332,21392,4759],{"class":2462},[1332,21394,2583],{"class":2521},[1332,21396,21397],{"class":2455,"line":2623},[1332,21398,16849],{"class":2609},[1332,21400,21401,21403,21405],{"class":2455,"line":2637},[1332,21402,2768],{"class":2521},[1332,21404,4790],{"class":2507},[1332,21406,2648],{"class":2521},[1332,21408,21409,21411,21413,21415],{"class":2455,"line":2642},[1332,21410,3389],{"class":2507},[1332,21412,15800],{"class":2521},[1332,21414,16714],{"class":2525},[1332,21416,2670],{"class":2521},[1332,21418,21419],{"class":2455,"line":2651},[1332,21420,2802],{"class":2521},[107,21422,6276],{"id":6275},[112,21424],{},[186,21426,21427,21433,21441,21446],{},[189,21428,21429,21430,21432],{},"Each ",[145,21431,16760],{}," instance manages one session at a time. To run multiple sessions in parallel, create multiple instances.",[189,21434,21435,21437,21438,21440],{},[145,21436,5467],{}," returns the session's CDP endpoint string and caches it on the instance as ",[145,21439,16751],{},". Subsequent step methods automatically pass this through, so you don't need to capture it for normal use.",[189,21442,21443,21444,148],{},"Sessions consume runtime quota for the entire time they're open, not just when actively executing a command. Always close sessions when you're done. See ",[659,21445,16683],{"href":16951},[189,21447,21448,21449,148],{},"The number of concurrent sessions per API key is limited by your plan tier. See ",[659,21450,5287],{"href":5286},[107,21452,4513],{"id":4512},[112,21454],{},[186,21456,21457,21461],{},[189,21458,21459],{},[659,21460,17835],{"href":18084},[189,21462,21463],{},[659,21464,16683],{"href":16951},[2819,21466,19100],{},{"title":67,"searchDepth":68,"depth":68,"links":21468},[21469,21470,21471,21472,21473,21474],{"id":1488,"depth":670,"text":21214},{"id":21231,"depth":670,"text":21232},{"id":21288,"depth":670,"text":21289},{"id":21315,"depth":670,"text":21316},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Install axiom-api, instantiate the AxiomApi class with your API key, then open a cloud browser session.",{"metaTitle":21477},"Open a cloud browser session with the axiom-api library",{"title":11078,"description":21475},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fstart-a-session ","AWpUUHCBeR7xjWzsADi0w_mKBT6qu5CUqoWUbN2sW6A",{"id":21482,"title":21483,"body":21484,"date":71,"description":22228,"extension":73,"meta":22229,"navigation":75,"order":6051,"path":22231,"seo":22232,"stem":22233,"__hash__":22234},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fstep-function-vs-no-code-step.md","Step function vs No-Code step",{"type":8,"value":21485,"toc":22223},[21486,21495,21499,21501,22150,22154,22156,22159,22171,22177,22181,22183,22189,22200,22203,22217],[26,21487,21488,21489,21491,21492,21494],{},"If you've built an automation in the No-Code Tool and want to drive the equivalent flow via the ",[145,21490,18297],{}," library, this table maps each step to its closest method. Steps without a direct equivalent are flagged in the ",[192,21493,6276],{}," column with the recommended workaround.",[107,21496,21498],{"id":21497},"mapping-table","Mapping table",[112,21500],{},[4589,21502,21503,21515],{},[4592,21504,21505],{},[4595,21506,21507,21510,21513],{},[4598,21508,21509],{},"No-Code Tool step",[4598,21511,21512],{},"axiom-api method",[4598,21514,6276],{},[4605,21516,21517,21535,21556,21573,21590,21608,21625,21641,21658,21678,21696,21715,21734,21752,21778,21797,21820,21839,21859,21877,21902,21927,21942,21962,21987,22005,22022,22040,22058,22073,22089,22104,22118,22133],{},[4595,21518,21519,21525,21532],{},[4610,21520,21521],{},[659,21522,21523],{"href":17846},[192,21524,17849],{},[4610,21526,21527],{},[659,21528,21529],{"href":18084},[145,21530,21531],{},"axiom.goto(url, ...)",[4610,21533,21534],{},"Direct equivalent.",[4595,21536,21537,21543,21550],{},[4610,21538,21539],{},[659,21540,21541],{"href":15778},[192,21542,15781],{},[4610,21544,21545],{},[659,21546,21547],{"href":16079},[145,21548,21549],{},"axiom.click(select, ...)",[4610,21551,21552,21553,21555],{},"Direct equivalent. Supports left\u002Fright click and \"click if present\" via the ",[145,21554,15874],{}," flag.",[4595,21557,21558,21564,21571],{},[4610,21559,21560],{},[659,21561,21562],{"href":16493},[192,21563,16496],{},[4610,21565,21566],{},[659,21567,21568],{"href":15895},[145,21569,21570],{},"axiom.clickMultiple(select, ...)",[4610,21572,21534],{},[4595,21574,21575,21581,21587],{},[4610,21576,21577],{},[659,21578,21579],{"href":16434},[192,21580,16324],{},[4610,21582,21583],{},[659,21584,21585],{"href":16477},[145,21586,16331],{},[4610,21588,21589],{},"Direct equivalent for like\u002Ffollow\u002Fsubscribe-style toggles.",[4595,21591,21592,21598,21605],{},[4610,21593,21594],{},[659,21595,21596],{"href":17231},[192,21597,16065],{},[4610,21599,21600],{},[659,21601,21602],{"href":16064},[145,21603,21604],{},"axiom.enterText(selectTextField, text, ...)",[4610,21606,21607],{},"Direct equivalent. Per-character delay, append-vs-replace, and a custom-line-break token are all supported.",[4595,21609,21610,21616,21623],{},[4610,21611,21612],{},[659,21613,21614],{"href":19561},[192,21615,19564],{},[4610,21617,21618],{},[659,21619,21620],{"href":17647},[145,21621,21622],{},"axiom.pressKeys(key, delimiter, delay)",[4610,21624,21534],{},[4595,21626,21627,21633,21639],{},[4610,21628,21629],{},[659,21630,21631],{"href":18104},[192,21632,18107],{},[4610,21634,21635],{},[659,21636,21637],{"href":16058},[145,21638,18096],{},[4610,21640,21534],{},[4595,21642,21643,21649,21656],{},[4610,21644,21645],{},[659,21646,21647],{"href":16096},[192,21648,16099],{},[4610,21650,21651],{},[659,21652,21653],{"href":16318},[145,21654,21655],{},"axiom.clickAndDrag(start, end)",[4610,21657,21534],{},[4595,21659,21660,21666,21672],{},[4610,21661,21662],{},[659,21663,21664],{"href":20850},[192,21665,17202],{},[4610,21667,21668],{},[659,21669,21670],{"href":17201},[145,21671,20843],{},[4610,21673,21674,21675,21677],{},"Direct equivalent for native ",[145,21676,18586],{}," elements.",[4595,21679,21680,21686,21693],{},[4610,21681,21682],{},[659,21683,21684],{"href":16968},[192,21685,16957],{},[4610,21687,21688],{},[659,21689,21690],{"href":17215},[145,21691,21692],{},"axiom.datePicker(...)",[4610,21694,21695],{},"Direct equivalent for calendar-widget date pickers.",[4595,21697,21698,21705,21712],{},[4610,21699,21700],{},[659,21701,21703],{"href":21702},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwait",[192,21704,18065],{},[4610,21706,21707],{},[659,21708,21709],{"href":18040},[145,21710,21711],{},"axiom.wait(time)",[4610,21713,21714],{},"Direct equivalent. Pauses on the pod so the session's inactivity timer stays reset.",[4595,21716,21717,21725,21728],{},[4610,21718,21719],{},[659,21720,21722],{"href":21721},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Frandom-wait",[192,21723,21724],{},"Random wait",[4610,21726,21727],{},"Compose in code",[4610,21729,21730,21731,148],{},"Compute the delay in your code, then call ",[145,21732,21733],{},"axiom.wait(delay)",[4595,21735,21736,21743,21750],{},[4610,21737,21738],{},[659,21739,21741],{"href":21740},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fswitch-tab",[192,21742,18071],{},[4610,21744,21745],{},[659,21746,21747],{"href":18070},[145,21748,21749],{},"axiom.switchBrowserTab(selectTab)",[4610,21751,21534],{},[4595,21753,21754,21762,21769],{},[4610,21755,21756],{},[659,21757,21759],{"href":21758},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fopen-tab",[192,21760,21761],{},"Open a new tab",[4610,21763,21764],{},[659,21765,21766],{"href":18084},[145,21767,21768],{},"axiom.goto(url, false, true)",[4610,21770,21771,21772,21775,21776,148],{},"Pass ",[145,21773,21774],{},"openInNewTab: true"," (third arg) to ",[145,21777,2682],{},[4595,21779,21780,21788,21794],{},[4610,21781,21782],{},[659,21783,21785],{"href":21784},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclose-tab",[192,21786,21787],{},"Close browser tab",[4610,21789,21790],{},[659,21791,21792],{"href":16951},[145,21793,16690],{},[4610,21795,21796],{},"Closes the whole session. There is no single-tab close today.",[4595,21798,21799,21805,21811],{},[4610,21800,21801],{},[659,21802,21803],{"href":19005},[192,21804,20136],{},[4610,21806,21807],{},[659,21808,21809],{"href":17815},[145,21810,20130],{},[4610,21812,21813,21814,21816,21817,21819],{},"Direct equivalent. Pass ",[145,21815,8822],{}," for ",[145,21818,13749],{}," to scrape the page already loaded.",[4595,21821,21822,21830,21836],{},[4610,21823,21824],{},[659,21825,21827],{"href":21826},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fscrape-metadata",[192,21828,21829],{},"Get page metadata",[4610,21831,21832],{},[659,21833,21834],{"href":18642},[145,21835,20431],{},[4610,21837,21838],{},"Direct equivalent for title\u002Fdescription\u002FOG-tag style fields.",[4595,21840,21841,21849,21856],{},[4610,21842,21843],{},[659,21844,21846],{"href":21845},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fget-a-list-of-links-to-pages",[192,21847,21848],{},"Get a list of links to pages from bot's current page",[4610,21850,21851],{},[659,21852,21853],{"href":17815},[145,21854,21855],{},"axiom.scrape(...)",[4610,21857,21858],{},"Pass a selector that targets the links you want.",[4595,21860,21861,21869,21875],{},[4610,21862,21863],{},[659,21864,21866],{"href":21865},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclipboard",[192,21867,21868],{},"Read clipboard",[4610,21870,21871],{},[659,21872,21873],{"href":17829},[145,21874,17701],{},[4610,21876,21534],{},[4595,21878,21879,21885,21888],{},[4610,21880,21881],{},[659,21882,21883],{"href":19016},[192,21884,19019],{},[4610,21886,21887],{},"Not exposed",[4610,21889,21890,21891,21895,21896,3842,21899,3696],{},"Fall back to a No-Code Tool automation triggered via ",[659,21892,21893],{"href":4527},[145,21894,4467],{},", or take the screenshot yourself over ",[659,21897,21898],{"href":5339},"CDP",[145,21900,21901],{},"Page.captureScreenshot",[4595,21903,21904,21912,21914],{},[4610,21905,21906],{},[659,21907,21909],{"href":21908},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsave-html",[192,21910,21911],{},"Save page HTML",[4610,21913,21887],{},[4610,21915,2487,21916,21920,21921,21923,21924,148],{},[659,21917,21918],{"href":17815},[145,21919,18315],{}," for structured extraction, or drop down to ",[659,21922,21898],{"href":5339}," and read ",[145,21925,21926],{},"DOM.getOuterHTML",[4595,21928,21929,21937,21939],{},[4610,21930,21931],{},[659,21932,21934],{"href":21933},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-file-from-url",[192,21935,21936],{},"Download file from URL",[4610,21938,21887],{},[4610,21940,21941],{},"Use a normal HTTP client in your code.",[4595,21943,21944,21950,21952],{},[4610,21945,21946],{},[659,21947,21948],{"href":19048},[192,21949,19051],{},[4610,21951,21887],{},[4610,21953,21954,21955,21957,21958,5210,21960,148],{},"Fall back to ",[145,21956,4467],{}," for arbitrary JS execution, or use ",[659,21959,21898],{"href":5339},[145,21961,19059],{},[4595,21963,21964,21972,21974],{},[4610,21965,21966],{},[659,21967,21969],{"href":21968},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclear-cookies",[192,21970,21971],{},"Clear cookies",[4610,21973,21887],{},[4610,21975,21976,21977,19072,21979,21983,21984,21986],{},"Open a fresh session for cookie isolation. The ",[145,21978,17915],{},[659,21980,21981],{"href":18084},[145,21982,18308],{}," handles the ",[145,21985,17931],{}," case for a single navigation.",[4595,21988,21989,21997,21999],{},[4610,21990,21991],{},[659,21992,21994],{"href":21993},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcurrent-url",[192,21995,21996],{},"Current Url",[4610,21998,21887],{},[4610,22000,22001,22002,22004],{},"Track URLs in your own code from each ",[145,22003,18308],{}," call.",[4595,22006,22007,22013,22019],{},[4610,22008,22009],{},[659,22010,22011],{"href":21022},[192,22012,21025],{},[4610,22014,22015],{},[659,22016,22017],{"href":18668},[145,22018,21018],{},[4610,22020,22021],{},"Direct equivalent. You supply the solver API key.",[4595,22023,22024,22031,22037],{},[4610,22025,22026],{},[659,22027,22028],{"href":19143},[192,22029,22030],{},"Generate text with ChatGPT \u002F AI",[4610,22032,22033],{},[659,22034,22035],{"href":18655},[145,22036,19131],{},[4610,22038,22039],{},"Direct equivalent for the inline-AI step. For arbitrary OpenAI\u002FAnthropic usage, call those APIs from your code instead.",[4595,22041,22042,22050,22053],{},[4610,22043,22044],{},[659,22045,22047],{"href":22046},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Ftry",[192,22048,22049],{},"Try \u002F Catch",[4610,22051,22052],{},"Native language construct",[4610,22054,22055],{},[145,22056,22057],{},"try { ... } catch (e) { ... }",[4595,22059,22060,22068,22070],{},[4610,22061,22062],{},[659,22063,22065],{"href":22064},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fif-condition",[192,22066,22067],{},"If condition",[4610,22069,22052],{},[4610,22071,22072],{},"Branch based on data returned by previous calls.",[4595,22074,22075,22081,22083],{},[4610,22076,22077],{},[659,22078,22079],{"href":15650},[192,22080,15653],{},[4610,22082,22052],{},[4610,22084,22085,22088],{},[145,22086,22087],{},"for"," loop in your code.",[4595,22090,22091,22099,22101],{},[4610,22092,22093],{},[659,22094,22096],{"href":22095},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-sheet",[192,22097,22098],{},"Read data from a Google Sheet",[4610,22100,21887],{},[4610,22102,22103],{},"Use the Google Sheets API directly from your code.",[4595,22105,22106,22114,22116],{},[4610,22107,22108],{},[659,22109,22111],{"href":22110},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-sheet",[192,22112,22113],{},"Write data to a Google Sheet",[4610,22115,21887],{},[4610,22117,22103],{},[4595,22119,22120,22128,22130],{},[4610,22121,22122],{},[659,22123,22125],{"href":22124},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsend-email",[192,22126,22127],{},"Send an email",[4610,22129,21887],{},[4610,22131,22132],{},"Use your language's email library or a service like SendGrid.",[4595,22134,22135,22141,22144],{},[4610,22136,22137],{},[659,22138,22139],{"href":1123},[192,22140,13063],{},[4610,22142,22143],{},"Native HTTP call",[4610,22145,22146,22149],{},[145,22147,22148],{},"fetch(url, { method: \"POST\", body })"," from your code.",[107,22151,22153],{"id":22152},"when-to-fall-back-to-trigger","When to fall back to \u002Ftrigger",[112,22155],{},[26,22157,22158],{},"The step-trigger surface covers the common interaction and extraction steps directly. For everything else (screenshots, raw HTML readout, arbitrary JS, file downloads, sheet I\u002FO, email), the recommended workaround is:",[1923,22160,22161,22164],{},[189,22162,22163],{},"Build the missing capability into a No-Code Tool automation.",[189,22165,22166,22167,22149],{},"Trigger that automation via ",[659,22168,22169],{"href":4527},[145,22170,4467],{},[26,22172,22173,22174,22176],{},"This gives you the imperative control of ",[145,22175,18297],{}," for the parts of the flow that need it, plus the full No-Code Tool step library for the parts that don't.",[107,22178,22180],{"id":22179},"when-to-port-and-when-not-to","When to port and when not to",[112,22182],{},[26,22184,22185,22186,22188],{},"Porting a No-Code Tool automation to ",[145,22187,18297],{}," makes sense when:",[186,22190,22191,22194,22197],{},[189,22192,22193],{},"The flow needs to branch based on what each step returned.",[189,22195,22196],{},"The flow needs to live alongside other code in your stack (in a backend service, a CI job, a scheduled function).",[189,22198,22199],{},"You want version control, code review, and tests on your automation logic.",[26,22201,22202],{},"Stick with the No-Code Tool when:",[186,22204,22205,22208,22211],{},[189,22206,22207],{},"The flow is short and stable, with no runtime branching.",[189,22209,22210],{},"The person maintaining it isn't a developer.",[189,22212,22213,22214,22216],{},"Triggering it via ",[145,22215,4467],{}," from your code already covers your needs.",[26,22218,22219,22220,22222],{},"The two surfaces aren't either-or. A common pattern is keeping the visual automation as the source of truth for stable workflows, then using ",[145,22221,18297],{}," for the dynamic, branchy parts of your application.",{"title":67,"searchDepth":68,"depth":68,"links":22224},[22225,22226,22227],{"id":21497,"depth":670,"text":21498},{"id":22152,"depth":670,"text":22153},{"id":22179,"depth":670,"text":22180},"Find the axiom-api method equivalent of every No-Code Tool step, useful when porting a visual automation to code.",{"metaTitle":22230},"Map No-Code Tool steps to axiom-api methods","\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fstep-function-vs-no-code-step",{"title":21483,"description":22228},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fstep-function-vs-no-code-step","7DHyasnXQlfwdwfDDxANy4QfdX7THkIEP4qG_w1aUMQ",{"id":22236,"title":18071,"body":22237,"date":71,"description":22435,"extension":73,"meta":22436,"navigation":75,"order":2727,"path":18070,"seo":22438,"stem":22439,"__hash__":22440},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fswitch-browser-tab.md",{"type":8,"value":22238,"toc":22429},[22239,22253,22255,22257,22274,22304,22306,22308,22311,22392,22394,22396,22413,22415,22417,22427],[26,22240,22241,22243,22244,22248,22249,148],{},[145,22242,21749],{}," switches the session's active tab. Use it after ",[659,22245,22246],{"href":18084},[145,22247,21768],{}," (or any other action that opens a new tab) to drive the newly opened tab. The same step type as the No-Code Tool's ",[659,22250,22251],{"href":21740},[192,22252,18071],{},[107,22254,15786],{"id":15785},[112,22256],{},[2446,22258,22260],{"className":2962,"code":22259,"language":2964,"meta":67,"style":67},"await axiom.switchBrowserTab(selectTab);\n",[145,22261,22262],{"__ignoreMap":67},[1332,22263,22264,22266,22268,22271],{"class":2455,"line":2131},[1332,22265,3020],{"class":2507},[1332,22267,15800],{"class":2521},[1332,22269,22270],{"class":2525},"switchBrowserTab",[1332,22272,22273],{"class":2521},"(selectTab);\n",[4589,22275,22276,22288],{},[4592,22277,22278],{},[4595,22279,22280,22282,22284,22286],{},[4598,22281,12524],{},[4598,22283,12527],{},[4598,22285,8403],{},[4598,22287,12532],{},[4605,22289,22290],{},[4595,22291,22292,22297,22299,22301],{},[4610,22293,22294],{},[145,22295,22296],{},"selectTab",[4610,22298,6750],{},[4610,22300,10771],{},[4610,22302,22303],{},"A substring of the target tab's title or URL. The session switches to the first tab whose title or URL contains this string.",[107,22305,12784],{"id":12783},[112,22307],{},[26,22309,22310],{},"Open a second tab and switch focus to it:",[2446,22312,22314],{"className":2962,"code":22313,"language":2964,"meta":67,"style":67},"await axiom.goto(\"https:\u002F\u002Fexample.com\u002Fdashboard\");\nawait axiom.goto(\"https:\u002F\u002Fexample.com\u002Freports\", false, true);   \u002F\u002F opens in new tab\nawait axiom.switchBrowserTab(\"reports\");                          \u002F\u002F focus the new tab\nawait axiom.click(\".export-csv\");\n",[145,22315,22316,22331,22358,22377],{"__ignoreMap":67},[1332,22317,22318,22320,22322,22324,22326,22329],{"class":2455,"line":2131},[1332,22319,3020],{"class":2507},[1332,22321,15800],{"class":2521},[1332,22323,2682],{"class":2525},[1332,22325,1213],{"class":2521},[1332,22327,22328],{"class":2462},"\"https:\u002F\u002Fexample.com\u002Fdashboard\"",[1332,22330,2583],{"class":2521},[1332,22332,22333,22335,22337,22339,22341,22344,22346,22348,22350,22352,22355],{"class":2455,"line":670},[1332,22334,3020],{"class":2507},[1332,22336,15800],{"class":2521},[1332,22338,2682],{"class":2525},[1332,22340,1213],{"class":2521},[1332,22342,22343],{"class":2462},"\"https:\u002F\u002Fexample.com\u002Freports\"",[1332,22345,4468],{"class":2521},[1332,22347,15884],{"class":2511},[1332,22349,4468],{"class":2521},[1332,22351,1548],{"class":2511},[1332,22353,22354],{"class":2521},");   ",[1332,22356,22357],{"class":2609},"\u002F\u002F opens in new tab\n",[1332,22359,22360,22362,22364,22366,22368,22371,22374],{"class":2455,"line":68},[1332,22361,3020],{"class":2507},[1332,22363,15800],{"class":2521},[1332,22365,22270],{"class":2525},[1332,22367,1213],{"class":2521},[1332,22369,22370],{"class":2462},"\"reports\"",[1332,22372,22373],{"class":2521},");                          ",[1332,22375,22376],{"class":2609},"\u002F\u002F focus the new tab\n",[1332,22378,22379,22381,22383,22385,22387,22390],{"class":2455,"line":1478},[1332,22380,3020],{"class":2507},[1332,22382,15800],{"class":2521},[1332,22384,5473],{"class":2525},[1332,22386,1213],{"class":2521},[1332,22388,22389],{"class":2462},"\".export-csv\"",[1332,22391,2583],{"class":2521},[107,22393,6276],{"id":6275},[112,22395],{},[186,22397,22398,22401,22404],{},[189,22399,22400],{},"The match is a substring search against tab title and URL. Use a string that's unique to the target tab — if multiple tabs match, the first match wins.",[189,22402,22403],{},"After a switch, subsequent step methods act on the newly active tab. The previous tab stays open until the session closes (or you switch back and close it).",[189,22405,22406,22407,22409,22410,22412],{},"All tabs share runtime quota and the same ",[145,22408,16904],{}," instance. For genuine parallelism, create multiple ",[145,22411,16760],{}," instances.",[107,22414,4513],{"id":4512},[112,22416],{},[186,22418,22419,22423],{},[189,22420,22421],{},[659,22422,17835],{"href":18084},[189,22424,22425],{},[659,22426,16683],{"href":16951},[2819,22428,16940],{},{"title":67,"searchDepth":68,"depth":68,"links":22430},[22431,22432,22433,22434],{"id":15785,"depth":670,"text":15786},{"id":12783,"depth":670,"text":12784},{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Switch the cloud browser session's focus to another tab using axiom.switchBrowserTab().",{"metaTitle":22437},"Switch the active tab in an axiom.ai cloud browser session",{"title":18071,"description":22435},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fswitch-browser-tab","4H3b_-Kq_nymLOyDf428OkjBeRC3ma8vn0iEKu3wtBY",{"id":22442,"title":18065,"body":22443,"date":71,"description":22636,"extension":73,"meta":22637,"navigation":75,"order":2799,"path":18040,"seo":22639,"stem":22640,"__hash__":22641},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fwait.md",{"type":8,"value":22444,"toc":22628},[22445,22457,22459,22461,22477,22506,22508,22510,22563,22570,22572,22580,22589,22591,22593,22612,22614,22616,22626],[26,22446,22447,22449,22450,22452,22453,148],{},[145,22448,21711],{}," pauses the session for ",[145,22451,18689],{}," milliseconds. Use it between steps to let content render, to throttle a sequence of clicks, or to wait out a server-side process before the next action. The same step type as the No-Code Tool's ",[659,22454,22455],{"href":21702},[192,22456,18065],{},[107,22458,15786],{"id":15785},[112,22460],{},[2446,22462,22464],{"className":2962,"code":22463,"language":2964,"meta":67,"style":67},"await axiom.wait(time);\n",[145,22465,22466],{"__ignoreMap":67},[1332,22467,22468,22470,22472,22474],{"class":2455,"line":2131},[1332,22469,3020],{"class":2507},[1332,22471,15800],{"class":2521},[1332,22473,5482],{"class":2525},[1332,22475,22476],{"class":2521},"(time);\n",[4589,22478,22479,22491],{},[4592,22480,22481],{},[4595,22482,22483,22485,22487,22489],{},[4598,22484,12524],{},[4598,22486,12527],{},[4598,22488,8403],{},[4598,22490,12532],{},[4605,22492,22493],{},[4595,22494,22495,22499,22501,22503],{},[4610,22496,22497],{},[145,22498,18689],{},[4610,22500,14013],{},[4610,22502,10771],{},[4610,22504,22505],{},"Duration to wait, in milliseconds.",[107,22507,12784],{"id":12783},[112,22509],{},[2446,22511,22513],{"className":2962,"code":22512,"language":2964,"meta":67,"style":67},"await axiom.click(\"button.export\");\nawait axiom.wait(5000);                   \u002F\u002F give the export job time to finish\nawait axiom.click(\"a.download-link\");\n",[145,22514,22515,22530,22548],{"__ignoreMap":67},[1332,22516,22517,22519,22521,22523,22525,22528],{"class":2455,"line":2131},[1332,22518,3020],{"class":2507},[1332,22520,15800],{"class":2521},[1332,22522,5473],{"class":2525},[1332,22524,1213],{"class":2521},[1332,22526,22527],{"class":2462},"\"button.export\"",[1332,22529,2583],{"class":2521},[1332,22531,22532,22534,22536,22538,22540,22542,22545],{"class":2455,"line":670},[1332,22533,3020],{"class":2507},[1332,22535,15800],{"class":2521},[1332,22537,5482],{"class":2525},[1332,22539,1213],{"class":2521},[1332,22541,2721],{"class":2511},[1332,22543,22544],{"class":2521},");                   ",[1332,22546,22547],{"class":2609},"\u002F\u002F give the export job time to finish\n",[1332,22549,22550,22552,22554,22556,22558,22561],{"class":2455,"line":68},[1332,22551,3020],{"class":2507},[1332,22553,15800],{"class":2521},[1332,22555,5473],{"class":2525},[1332,22557,1213],{"class":2521},[1332,22559,22560],{"class":2462},"\"a.download-link\"",[1332,22562,2583],{"class":2521},[107,22564,22566,22567,6841],{"id":22565},"why-this-and-not-a-local-settimeout","Why this and not a local ",[145,22568,22569],{},"setTimeout",[112,22571],{},[26,22573,22574,22576,22577,22579],{},[145,22575,18043],{}," pauses on the pod, not in your client process. The cloud session has an inactivity timer that closes the browser after a period without step traffic — a local ",[145,22578,22569],{}," from your code wouldn't reset that timer, so a long local sleep would let the session idle out and auto-close while your client thought everything was fine.",[26,22581,22582,22583,22585,22586,22588],{},"For waits where there is no session open yet (rare — typically before ",[145,22584,5467],{},"), ",[145,22587,18043],{}," falls back to a local sleep, so the same call is safe in both cases.",[107,22590,6276],{"id":6275},[112,22592],{},[186,22594,22595,22609],{},[189,22596,22597,22598,16641,22602,22604,22605,148],{},"For \"wait until X is on the page\" rather than a fixed pause, the library doesn't expose a wait-for-selector step today. Loop on ",[659,22599,22600],{"href":16079},[145,22601,16453],{},[145,22603,16644],{}," and re-check, or fall back to a No-Code Tool automation with a proper wait step via ",[659,22606,22607],{"href":4527},[145,22608,4467],{},[189,22610,22611],{},"Long waits still count against your runtime quota.",[107,22613,4513],{"id":4512},[112,22615],{},[186,22617,22618,22622],{},[189,22619,22620],{},[659,22621,15767],{"href":16079},[189,22623,22624],{},[659,22625,17835],{"href":18084},[2819,22627,16940],{},{"title":67,"searchDepth":68,"depth":68,"links":22629},[22630,22631,22632,22634,22635],{"id":15785,"depth":670,"text":15786},{"id":12783,"depth":670,"text":12784},{"id":22565,"depth":670,"text":22633},"Why this and not a local setTimeout?",{"id":6275,"depth":670,"text":6276},{"id":4512,"depth":670,"text":4513},"Pause the session for a fixed duration on the pod, keeping the session alive while you wait for content to render or for a server-side process to finish.",{"metaTitle":22638},"Pause an axiom.ai cloud browser session",{"title":18065,"description":22636},"docs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\u002Fwait","jBD6jeEio7lT0kTZqMbTlzJ_VmuUyEtrKNuF0X_2fNc",{"id":22643,"title":5523,"body":22644,"date":71,"description":22663,"extension":73,"meta":22664,"navigation":75,"order":1478,"path":5522,"seo":22666,"stem":22667,"__hash__":22668},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fusage-and-limits\u002Findex.md",{"type":8,"value":22645,"toc":22660},[22646,22649,22651,22653],[26,22647,22648],{},"These endpoints let your code check how much cloud runtime is left, see how runs are queued when you hit your concurrency limit, and avoid tripping rate limits. Use them to build dashboards, gate expensive runs behind a quota check, or back off cleanly when the API tells you to slow down.",[107,22650,7725],{"id":7724},[2218,22652],{":by-order":1548},[26,22654,2222,22655,2226,22657,148],{},[659,22656,2225],{"href":1887},[659,22658,2231],{"href":2229,"rel":22659},[1218],{"title":67,"searchDepth":68,"depth":68,"links":22661},[22662],{"id":7724,"depth":670,"text":7725},"Check remaining runtime, understand queueing and concurrency, and stay within rate limits when calling the axiom.ai API.",{"metaTitle":22665},"Check axiom.ai runtime usage, queueing, and rate limits",{"title":5523,"description":22663},"docs\u002Fdeveloper-hub\u002Fapi\u002Fusage-and-limits\u002Findex","ddwnz_yjQTPcTzSB_Utc4scD-O1CJtKw8jXVl_6Cl24",{"id":22670,"title":5287,"body":22671,"date":71,"description":22852,"extension":73,"meta":22853,"navigation":75,"order":68,"path":5286,"seo":22855,"stem":22856,"__hash__":22857},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fusage-and-limits\u002Fqueue-and-concurrency.md",{"type":8,"value":22672,"toc":22846},[22673,22676,22678,22680,22689,22692,22714,22718,22720,22734,22740,22744,22746,22789,22799,22803,22805],[26,22674,22675],{},"Cloud runs are queued per account. Your plan determines how many runs can execute at the same time, and any trigger above that limit waits its turn instead of failing.",[107,22677,1376],{"id":1375},[112,22679],{},[26,22681,22682,22683,22685,22686,22688],{},"When you call ",[145,22684,4467],{},", the API always accepts the request and returns a ",[145,22687,6259],{},", even if your account is already at its concurrency limit. The new run is added to the back of your account's queue and starts as soon as a running slot frees up.",[26,22690,22691],{},"This means:",[186,22693,22694,22700,22711],{},[189,22695,22696,22697,22699],{},"Triggering a run never returns \"too many concurrent runs\" as an error. The call succeeds and you get a ",[145,22698,6259],{}," regardless.",[189,22701,2273,22702,22704,22705,22707,22708,22710],{},[145,22703,6259],{}," you receive is real and pollable from the moment it's returned, but ",[145,22706,4474],{}," will report ",[145,22709,10143],{}," only once the run actually starts executing.",[189,22712,22713],{},"Queued runs are processed in the order they were triggered. There's no priority queue or fast-track tier today.",[107,22715,22717],{"id":22716},"check-whether-a-run-is-queued-or-executing","Check whether a run is queued or executing",[112,22719],{},[26,22721,2273,22722,22724,22725,22727,22728,22730,22731,22733],{},[145,22723,4474],{}," endpoint returns a ",[145,22726,8624],{}," field. A run that's been triggered but is still waiting in the queue reports ",[145,22729,10143],{},", the same as one that's actively executing in the cloud browser. There's no separate ",[145,22732,13105],{}," state today, so you can't programmatically distinguish \"waiting for a slot\" from \"actively running\" without additional signals (for example, checking whether the bot has produced any output yet).",[26,22735,22736,22737,22739],{},"If you need to tell the two apart, the most reliable approach is to call ",[145,22738,4480],{}," before and after the trigger, queued runs don't consume runtime until they start executing.",[107,22741,22743],{"id":22742},"cloud-concurrency-limits-per-plan","Cloud concurrency limits per plan",[112,22745],{},[4589,22747,22748,22758],{},[4592,22749,22750],{},[4595,22751,22752,22755],{},[4598,22753,22754],{},"Plan",[4598,22756,22757],{},"Max concurrent cloud runs",[4605,22759,22760,22767,22774,22782],{},[4595,22761,22762,22765],{},[4610,22763,22764],{},"Starter",[4610,22766,19338],{},[4595,22768,22769,22772],{},[4610,22770,22771],{},"Pro",[4610,22773,19338],{},[4595,22775,22776,22779],{},[4610,22777,22778],{},"Pro Max",[4610,22780,22781],{},"2",[4595,22783,22784,22787],{},[4610,22785,22786],{},"Ultimate",[4610,22788,16622],{},[2093,22790,22791],{},[26,22792,22793,22795,22796,22798],{},[192,22794,2359],{}," exact concurrency limits per plan tier are confirmed on the ",[659,22797,7415],{"href":7414},". Use that as the source of truth, the table above is for quick reference.",[107,22800,22802],{"id":22801},"tips-for-high-volume-callers","Tips for high-volume callers",[112,22804],{},[186,22806,22807,22820,22829,22835],{},[189,22808,22809,22812,22813,22815,22816,22819],{},[192,22810,22811],{},"Stay inside the 100-per-minute rate limit."," The API allows 100 calls per minute per key (see ",[659,22814,7602],{"href":7601},"). Past that, calls return ",[145,22817,22818],{},"429: Too Many Requests"," and the automation does not run. Throttle on your side so excess calls back up in your own queue instead of being silently rejected.",[189,22821,22822,22825,22826,22828],{},[192,22823,22824],{},"Use exponential backoff on polling."," If a run has been ",[145,22827,10143],{}," for several minutes, double your polling interval each time. A 5-second initial interval that backs off to 30 seconds works well for most automations and keeps polling clear of the rate limit.",[189,22830,22831,22834],{},[192,22832,22833],{},"Cap concurrency in your own code."," If your integration occasionally spikes, add a semaphore on your side so you don't queue hundreds of runs that won't complete for hours.",[189,22836,22837,22840,22841,22845],{},[192,22838,22839],{},"Stop runs you no longer need."," If your application logic determines a queued run is no longer relevant (for example, the user cancelled a request), call ",[659,22842,22843],{"href":10363},[145,22844,4471],{}," to cancel it and free the slot for something else.",{"title":67,"searchDepth":68,"depth":68,"links":22847},[22848,22849,22850,22851],{"id":1375,"depth":670,"text":1376},{"id":22716,"depth":670,"text":22717},{"id":22742,"depth":670,"text":22743},{"id":22801,"depth":670,"text":22802},"Understand how axiom.ai handles concurrent cloud runs, when triggers get queued, and how the queue clears.",{"metaTitle":22854},"How axiom.ai queues cloud automation runs",{"title":5287,"description":22852},"docs\u002Fdeveloper-hub\u002Fapi\u002Fusage-and-limits\u002Fqueue-and-concurrency","zLHk23nAopnJUHWCE1GGxpF_spQmdMiTwyk5q_X2dHI",{"id":22859,"title":11144,"body":22860,"date":71,"description":22972,"extension":73,"meta":22973,"navigation":75,"order":1478,"path":7601,"seo":22975,"stem":22976,"__hash__":22977},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fusage-and-limits\u002Frate-limits.md",{"type":8,"value":22861,"toc":22966},[22862,22865,22869,22871,22894,22898,22900,22908,22914,22918,22920,22948,22950,22952],[26,22863,22864],{},"The axiom.ai API allows up to 100 calls per minute per API key. This protects our infrastructure and keeps resources available for every user. We recommend that you limit calls in the application that triggers your automations to prevent failures.",[107,22866,22868],{"id":22867},"the-limit","The limit",[112,22870],{},[186,22872,22873,22879,22891],{},[189,22874,22875,22878],{},[192,22876,22877],{},"100 calls per 1 minute window",", counted per API key.",[189,22880,22881,22882,12265,22884,4468,22886,4468,22888,22890],{},"Applies to every endpoint, not just ",[145,22883,4467],{},[145,22885,4474],{},[145,22887,4471],{},[145,22889,4480],{},", and all step functions count against the same allowance.",[189,22892,22893],{},"The window is rolling, not aligned to wall-clock minutes.",[107,22895,22897],{"id":22896},"what-happens-when-you-hit-it","What happens when you hit it",[112,22899],{},[26,22901,22902,22903,22907],{},"Calls past the limit return a ",[659,22904,22905],{"href":5310},[145,22906,22818],{}," error. The automation does not run, and the failed call does not appear in your run reports.",[26,22909,22910,22911,22913],{},"That means a 429 isn't logged anywhere in the Dashboard, so if you're missing runs you'd expect to see, check your own application logs for ",[145,22912,7609],{}," responses first.",[107,22915,22917],{"id":22916},"how-to-stay-inside-the-limit","How to stay inside the limit",[112,22919],{},[186,22921,22922,22928,22934,22940],{},[189,22923,22924,22927],{},[192,22925,22926],{},"Throttle on your side."," Add a 100-per-minute cap (or lower) in the application that calls the API, so excess calls back up in your own queue instead of being rejected.",[189,22929,22930,22933],{},[192,22931,22932],{},"Use exponential backoff"," when you do hit a 429. Wait, retry, wait longer, retry. Don't fire the same call again in a tight loop.",[189,22935,22936,22939],{},[192,22937,22938],{},"Spread calls evenly."," A burst of 100 calls in the first second of the window is still over the limit. Pace them across the full minute.",[189,22941,22942,5210,22945,22947],{},[192,22943,22944],{},"Cache responses you don't need to refetch.",[145,22946,4480],{}," doesn't change second to second. Poll it once a minute, not once a second.",[107,22949,4513],{"id":4512},[112,22951],{},[186,22953,22954,22958,22962],{},[189,22955,22956],{},[659,22957,5287],{"href":5286},[189,22959,22960],{},[659,22961,4540],{"href":4539},[189,22963,22964],{},[659,22965,5311],{"href":5310},{"title":67,"searchDepth":68,"depth":68,"links":22967},[22968,22969,22970,22971],{"id":22867,"depth":670,"text":22868},{"id":22896,"depth":670,"text":22897},{"id":22916,"depth":670,"text":22917},{"id":4512,"depth":670,"text":4513},"The axiom.ai API allows 100 calls per minute per API key. Calls past that limit return a 429 error and the requested automation does not run.",{"metaTitle":22974},"axiom.ai API rate limits and how to stay inside them",{"title":11144,"description":22972},"docs\u002Fdeveloper-hub\u002Fapi\u002Fusage-and-limits\u002Frate-limits","rnSMugEeaWC-OzFd5NpiHm0UD1pnL3LM3B7UaLmpC_Q",{"id":22979,"title":4540,"body":22980,"date":71,"description":23365,"extension":73,"meta":23366,"navigation":75,"order":670,"path":4539,"seo":23368,"stem":23369,"__hash__":23370},"content\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fusage-and-limits\u002Fremaining-runtime.md",{"type":8,"value":22981,"toc":23359},[22982,22987,22989,22991,23000,23030,23032,23034,23097,23162,23165,23167,23169,23199,23202,23334,23336,23338,23356],[26,22983,2273,22984,22986],{},[145,22985,4480],{}," endpoint returns your account's cloud runtime allowance and usage for the current billing period. Use it to surface a \"you've used X of Y minutes this month\" widget in a dashboard, or to block expensive runs when you're nearly out of quota.",[107,22988,12502],{"id":12501},[112,22990],{},[2446,22992,22994],{"className":12507,"code":22993,"language":12509,"meta":67,"style":67},"POST \u002Fapi\u002Fv3\u002Fremaining-runtime\n",[145,22995,22996],{"__ignoreMap":67},[1332,22997,22998],{"class":2455,"line":2131},[1332,22999,22993],{},[4589,23001,23002,23014],{},[4592,23003,23004],{},[4595,23005,23006,23008,23010,23012],{},[4598,23007,12524],{},[4598,23009,12527],{},[4598,23011,8403],{},[4598,23013,12532],{},[4605,23015,23016],{},[4595,23017,23018,23022,23024,23026],{},[4610,23019,23020],{},[145,23021,4359],{},[4610,23023,6750],{},[4610,23025,10771],{},[4610,23027,12547,23028,148],{},[659,23029,4211],{"href":4558},[107,23031,12609],{"id":12608},[112,23033],{},[2446,23035,23037],{"className":6112,"code":23036,"language":5926,"meta":67,"style":67},"{\n  \"status\": \"success\",\n  \"data\": {\n    \"used\": 12.25,\n    \"allowance\": 15000,\n    \"remaining\": 14987.75\n  }\n}\n",[145,23038,23039,23043,23053,23059,23070,23080,23089,23093],{"__ignoreMap":67},[1332,23040,23041],{"class":2455,"line":2131},[1332,23042,6120],{"class":2521},[1332,23044,23045,23047,23049,23051],{"class":2455,"line":670},[1332,23046,10008],{"class":6125},[1332,23048,5260],{"class":2521},[1332,23050,11893],{"class":2462},[1332,23052,6024],{"class":2521},[1332,23054,23055,23057],{"class":2455,"line":68},[1332,23056,11900],{"class":6125},[1332,23058,6129],{"class":2521},[1332,23060,23061,23063,23065,23068],{"class":2455,"line":1478},[1332,23062,11907],{"class":6125},[1332,23064,5260],{"class":2521},[1332,23066,23067],{"class":2511},"12.25",[1332,23069,6024],{"class":2521},[1332,23071,23072,23074,23076,23078],{"class":2455,"line":293},[1332,23073,11919],{"class":6125},[1332,23075,5260],{"class":2521},[1332,23077,11924],{"class":2511},[1332,23079,6024],{"class":2521},[1332,23081,23082,23084,23086],{"class":2455,"line":2237},[1332,23083,11931],{"class":6125},[1332,23085,5260],{"class":2521},[1332,23087,23088],{"class":2511},"14987.75\n",[1332,23090,23091],{"class":2455,"line":2623},[1332,23092,6194],{"class":2521},[1332,23094,23095],{"class":2455,"line":2637},[1332,23096,2802],{"class":2521},[4589,23098,23099,23109],{},[4592,23100,23101],{},[4595,23102,23103,23105,23107],{},[4598,23104,8400],{},[4598,23106,12527],{},[4598,23108,12532],{},[4605,23110,23111,23123,23135,23147],{},[4595,23112,23113,23117,23119],{},[4610,23114,23115],{},[145,23116,8624],{},[4610,23118,6750],{},[4610,23120,23121,13308],{},[145,23122,13307],{},[4595,23124,23125,23130,23132],{},[4610,23126,23127],{},[145,23128,23129],{},"data.used",[4610,23131,14013],{},[4610,23133,23134],{},"Minutes of cloud runtime used in the current billing period.",[4595,23136,23137,23142,23144],{},[4610,23138,23139],{},[145,23140,23141],{},"data.allowance",[4610,23143,14013],{},[4610,23145,23146],{},"Total minutes of cloud runtime included in your plan for the current billing period.",[4595,23148,23149,23154,23156],{},[4610,23150,23151],{},[145,23152,23153],{},"data.remaining",[4610,23155,14013],{},[4610,23157,23158,23159,3696],{},"Minutes left (",[145,23160,23161],{},"allowance - used",[26,23163,23164],{},"All values are in minutes.",[107,23166,12784],{"id":12783},[112,23168],{},[2446,23170,23171],{"className":2448,"code":4363,"language":2450,"meta":67,"style":67},[145,23172,23173,23185,23193],{"__ignoreMap":67},[1332,23174,23175,23177,23179,23181,23183],{"class":2455,"line":2131},[1332,23176,4370],{"class":2458},[1332,23178,4373],{"class":2511},[1332,23180,4376],{"class":2462},[1332,23182,4379],{"class":2462},[1332,23184,4382],{"class":2507},[1332,23186,23187,23189,23191],{"class":2455,"line":670},[1332,23188,4387],{"class":2511},[1332,23190,4390],{"class":2462},[1332,23192,4382],{"class":2507},[1332,23194,23195,23197],{"class":2455,"line":68},[1332,23196,4397],{"class":2511},[1332,23198,4400],{"class":2462},[26,23200,23201],{},"A common pattern is to call this before triggering a long-running automation, so your code can fail fast rather than starting a run that will be killed mid-way through.",[2446,23203,23205],{"className":2962,"code":23204,"language":2964,"meta":67,"style":67},"const res = await fetch(\"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Fremaining-runtime\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application\u002Fjson\" },\n  body: JSON.stringify({ key: process.env.AXIOM_API_KEY }),\n});\nconst { data } = await res.json();\n\nif (data.remaining \u003C 5) {\n  throw new Error(`Only ${data.remaining} minutes left, skipping run.`);\n}\n",[145,23206,23207,23226,23234,23246,23262,23266,23286,23290,23305,23330],{"__ignoreMap":67},[1332,23208,23209,23211,23213,23215,23217,23219,23221,23224],{"class":2455,"line":2131},[1332,23210,2508],{"class":2507},[1332,23212,6480],{"class":2511},[1332,23214,2515],{"class":2507},[1332,23216,2518],{"class":2507},[1332,23218,6487],{"class":2525},[1332,23220,1213],{"class":2521},[1332,23222,23223],{"class":2462},"\"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Fremaining-runtime\"",[1332,23225,6505],{"class":2521},[1332,23227,23228,23230,23232],{"class":2455,"line":670},[1332,23229,9611],{"class":2521},[1332,23231,6513],{"class":2462},[1332,23233,6024],{"class":2521},[1332,23235,23236,23238,23240,23242,23244],{"class":2455,"line":68},[1332,23237,9620],{"class":2521},[1332,23239,12902],{"class":2462},[1332,23241,5260],{"class":2521},[1332,23243,6528],{"class":2462},[1332,23245,6531],{"class":2521},[1332,23247,23248,23250,23252,23254,23256,23258,23260],{"class":2455,"line":1478},[1332,23249,9633],{"class":2521},[1332,23251,6539],{"class":2511},[1332,23253,148],{"class":2521},[1332,23255,6544],{"class":2525},[1332,23257,13418],{"class":2521},[1332,23259,4713],{"class":2511},[1332,23261,13423],{"class":2521},[1332,23263,23264],{"class":2455,"line":293},[1332,23265,2542],{"class":2521},[1332,23267,23268,23270,23272,23274,23276,23278,23280,23282,23284],{"class":2455,"line":2237},[1332,23269,2508],{"class":2507},[1332,23271,6595],{"class":2521},[1332,23273,580],{"class":2511},[1332,23275,6601],{"class":2521},[1332,23277,5110],{"class":2507},[1332,23279,2518],{"class":2507},[1332,23281,6559],{"class":2521},[1332,23283,5926],{"class":2525},[1332,23285,2670],{"class":2521},[1332,23287,23288],{"class":2455,"line":2623},[1332,23289,2588],{"emptyLinePlaceholder":75},[1332,23291,23292,23294,23297,23300,23303],{"class":2455,"line":2637},[1332,23293,6072],{"class":2507},[1332,23295,23296],{"class":2521}," (data.remaining ",[1332,23298,23299],{"class":2507},"\u003C",[1332,23301,23302],{"class":2511}," 5",[1332,23304,6473],{"class":2521},[1332,23306,23307,23309,23311,23313,23315,23318,23320,23322,23325,23328],{"class":2455,"line":2642},[1332,23308,12331],{"class":2507},[1332,23310,2697],{"class":2507},[1332,23312,6440],{"class":2525},[1332,23314,1213],{"class":2521},[1332,23316,23317],{"class":2462},"`Only ${",[1332,23319,580],{"class":2521},[1332,23321,148],{"class":2462},[1332,23323,23324],{"class":2521},"remaining",[1332,23326,23327],{"class":2462},"} minutes left, skipping run.`",[1332,23329,2583],{"class":2521},[1332,23331,23332],{"class":2455,"line":2651},[1332,23333,2802],{"class":2521},[107,23335,6276],{"id":6275},[112,23337],{},[186,23339,23340,23343,23353],{},[189,23341,23342],{},"The billing period resets monthly on your subscription anniversary, not the calendar month. Usage figures reflect the current cycle.",[189,23344,23345,23346,23348,23349,23352],{},"Cloud runtime is consumed by ",[145,23347,4467],{}," runs and by browser sessions opened against ",[145,23350,23351],{},"wss:\u002F\u002Fcdp-lb.axiom.ai",". Local browser runs (the No-Code Tool running on your machine) don't draw from this allowance.",[189,23354,23355],{},"A long-open browser session counts against your allowance even if it's idle. Always close sessions when you're done with them.",[2819,23357,23358],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}",{"title":67,"searchDepth":68,"depth":68,"links":23360},[23361,23362,23363,23364],{"id":12501,"depth":670,"text":12502},{"id":12608,"depth":670,"text":12609},{"id":12783,"depth":670,"text":12784},{"id":6275,"depth":670,"text":6276},"Query the axiom.ai API for your account's cloud runtime allowance, used minutes, and remaining minutes for the current billing period.",{"metaTitle":23367},"Check remaining axiom.ai cloud runtime via the API",{"title":4540,"description":23365},"docs\u002Fdeveloper-hub\u002Fapi\u002Fusage-and-limits\u002Fremaining-runtime","e787WyRdeLLJYUTMUjcl31tgbiaVkwobV-r_tWpz7Qo",{"id":23372,"title":23373,"body":23374,"date":71,"description":24981,"extension":73,"meta":24982,"navigation":75,"order":670,"path":24984,"seo":24985,"stem":24986,"__hash__":24987},"content\u002Fdocs\u002Fdeveloper-hub\u002Fdeep-dives\u002Faxiom-structure.md","Automation JSON structure",{"type":8,"value":23375,"toc":24971},[23376,23379,23382,23389,23393,23395,23398,23451,23502,23508,23602,23669,23671,23673,23681,23778,23892,23895,23901,24028,24120,24133,24135,24146,24266,24337,24340,24344,24351,24566,24782,24784,24789,24877,24959,24963,24965,24968],[26,23377,23378],{},"When you export an axiom.ai automation, you get a JSON file containing the inner workings of the automation. The export is useful for sharing automations with the support team, with a colleague, or with anyone you're collaborating with. Most of the file is data axiom.ai uses to reconstruct the automation, but some of it is interesting on its own. This page documents the most useful fields. We've left out fields that relate to deprecated features, internal extension state, or rarely-used settings.",[26,23380,23381],{},"You can think of an exported automation as a snapshot of the automation's current state, including every step variable, error setting, and configuration value.",[2093,23383,23384],{},[26,23385,23386,23388],{},[192,23387,2099],{}," Don't edit an exported automation by hand. Errors in the JSON prevent the file from being imported back into the extension.",[107,23390,23392],{"id":23391},"identifiers","Identifiers",[112,23394],{},[26,23396,23397],{},"The first few fields in the JSON identify the automation:",[2446,23399,23401],{"className":6112,"code":23400,"language":5926,"meta":67,"style":67},"\"id\": 938717,\n\"name\": \"Send to Supabase\",\n\"templateId\": 0,\n\"triggers\": [ ... ]\n",[145,23402,23403,23415,23426,23437],{"__ignoreMap":67},[1332,23404,23405,23408,23410,23413],{"class":2455,"line":2131},[1332,23406,23407],{"class":2462},"\"id\"",[1332,23409,5260],{"class":2521},[1332,23411,23412],{"class":2511},"938717",[1332,23414,6024],{"class":2521},[1332,23416,23417,23419,23421,23424],{"class":2455,"line":670},[1332,23418,5832],{"class":2462},[1332,23420,5260],{"class":2521},[1332,23422,23423],{"class":2462},"\"Send to Supabase\"",[1332,23425,6024],{"class":2521},[1332,23427,23428,23431,23433,23435],{"class":2455,"line":68},[1332,23429,23430],{"class":2462},"\"templateId\"",[1332,23432,5260],{"class":2521},[1332,23434,256],{"class":2511},[1332,23436,6024],{"class":2521},[1332,23438,23439,23442,23445,23448],{"class":2455,"line":1478},[1332,23440,23441],{"class":2462},"\"triggers\"",[1332,23443,23444],{"class":2521},": [ ",[1332,23446,6835],{"class":23447},"sZcZs",[1332,23449,23450],{"class":2521}," ]\n",[4589,23452,23453,23462],{},[4592,23454,23455],{},[4595,23456,23457,23460],{},[4598,23458,23459],{},"Key",[4598,23461,12532],{},[4605,23463,23464,23473,23482,23492],{},[4595,23465,23466,23470],{},[4610,23467,23468],{},[145,23469,20518],{},[4610,23471,23472],{},"The automation's unique ID.",[4595,23474,23475,23479],{},[4610,23476,23477],{},[145,23478,6802],{},[4610,23480,23481],{},"The automation name, as shown in the dashboard.",[4595,23483,23484,23489],{},[4610,23485,23486],{},[145,23487,23488],{},"templateId",[4610,23490,23491],{},"The ID of the template the automation was created from, if any.",[4595,23493,23494,23499],{},[4610,23495,23496],{},[145,23497,23498],{},"triggers",[4610,23500,23501],{},"Configured triggers, such as schedules.",[26,23503,23504,23505,23507],{},"If the automation has a schedule, the ",[145,23506,23498],{}," array contains an entry like this:",[2446,23509,23511],{"className":6112,"code":23510,"language":5926,"meta":67,"style":67},"{\n    \"id\": 10126,\n    \"interval_type\": \"seconds\",\n    \"name\": \"\",\n    \"starting_time\": \"2025-02-26 16:26:23+00\",\n    \"status\": \"ready\",\n    \"time_criteria\": 86400,\n    \"type\": \"schedule\"\n}\n",[145,23512,23513,23517,23529,23541,23552,23564,23576,23588,23598],{"__ignoreMap":67},[1332,23514,23515],{"class":2455,"line":2131},[1332,23516,6120],{"class":2521},[1332,23518,23519,23522,23524,23527],{"class":2455,"line":670},[1332,23520,23521],{"class":6125},"    \"id\"",[1332,23523,5260],{"class":2521},[1332,23525,23526],{"class":2511},"10126",[1332,23528,6024],{"class":2521},[1332,23530,23531,23534,23536,23539],{"class":2455,"line":68},[1332,23532,23533],{"class":6125},"    \"interval_type\"",[1332,23535,5260],{"class":2521},[1332,23537,23538],{"class":2462},"\"seconds\"",[1332,23540,6024],{"class":2521},[1332,23542,23543,23546,23548,23550],{"class":2455,"line":1478},[1332,23544,23545],{"class":6125},"    \"name\"",[1332,23547,5260],{"class":2521},[1332,23549,8573],{"class":2462},[1332,23551,6024],{"class":2521},[1332,23553,23554,23557,23559,23562],{"class":2455,"line":293},[1332,23555,23556],{"class":6125},"    \"starting_time\"",[1332,23558,5260],{"class":2521},[1332,23560,23561],{"class":2462},"\"2025-02-26 16:26:23+00\"",[1332,23563,6024],{"class":2521},[1332,23565,23566,23569,23571,23574],{"class":2455,"line":2237},[1332,23567,23568],{"class":6125},"    \"status\"",[1332,23570,5260],{"class":2521},[1332,23572,23573],{"class":2462},"\"ready\"",[1332,23575,6024],{"class":2521},[1332,23577,23578,23581,23583,23586],{"class":2455,"line":2623},[1332,23579,23580],{"class":6125},"    \"time_criteria\"",[1332,23582,5260],{"class":2521},[1332,23584,23585],{"class":2511},"86400",[1332,23587,6024],{"class":2521},[1332,23589,23590,23593,23595],{"class":2455,"line":2637},[1332,23591,23592],{"class":6125},"    \"type\"",[1332,23594,5260],{"class":2521},[1332,23596,23597],{"class":2462},"\"schedule\"\n",[1332,23599,23600],{"class":2455,"line":2642},[1332,23601,2802],{"class":2521},[4589,23603,23604,23612],{},[4592,23605,23606],{},[4595,23607,23608,23610],{},[4598,23609,23459],{},[4598,23611,12532],{},[4605,23613,23614,23623,23636,23646,23659],{},[4595,23615,23616,23620],{},[4610,23617,23618],{},[145,23619,20518],{},[4610,23621,23622],{},"The schedule's unique ID.",[4595,23624,23625,23630],{},[4610,23626,23627],{},[145,23628,23629],{},"interval_type",[4610,23631,23632,23633,148],{},"The interval unit. Always ",[145,23634,23635],{},"seconds",[4595,23637,23638,23643],{},[4610,23639,23640],{},[145,23641,23642],{},"starting_time",[4610,23644,23645],{},"The time the schedule was set to start.",[4595,23647,23648,23653],{},[4610,23649,23650],{},[145,23651,23652],{},"time_criteria",[4610,23654,23655,23656,23658],{},"The number of seconds between runs. For example, ",[145,23657,23585],{}," is one day.",[4595,23660,23661,23666],{},[4610,23662,23663],{},[145,23664,23665],{},"type",[4610,23667,23668],{},"The trigger type.",[107,23670,581],{"id":580},[112,23672],{},[26,23674,2273,23675,23677,23678,23680],{},[145,23676,580],{}," key holds everything about the automation's behaviour: steps, settings, and the configurations that drive each run. The top of the ",[145,23679,580],{}," object looks like this:",[2446,23682,23684],{"className":6112,"code":23683,"language":5926,"meta":67,"style":67},"\"builderTemplateId\": 0,\n\"context\": [{ \"context\": \"url\", \"url\": \"\" }],\n\"continueOnError\": true,\n\"disablePageChangeMonitoring\": true,\n\"executablePath\": \"...\",\n\"extensionToLoad\": \"...\",\n\"form\": [ ... ]\n",[145,23685,23686,23697,23722,23733,23744,23756,23767],{"__ignoreMap":67},[1332,23687,23688,23691,23693,23695],{"class":2455,"line":2131},[1332,23689,23690],{"class":2462},"\"builderTemplateId\"",[1332,23692,5260],{"class":2521},[1332,23694,256],{"class":2511},[1332,23696,6024],{"class":2521},[1332,23698,23699,23702,23705,23707,23709,23711,23713,23715,23717,23719],{"class":2455,"line":670},[1332,23700,23701],{"class":2462},"\"context\"",[1332,23703,23704],{"class":2521},": [{ ",[1332,23706,23701],{"class":6125},[1332,23708,5260],{"class":2521},[1332,23710,10685],{"class":2462},[1332,23712,4468],{"class":2521},[1332,23714,10685],{"class":6125},[1332,23716,5260],{"class":2521},[1332,23718,8573],{"class":2462},[1332,23720,23721],{"class":2521}," }],\n",[1332,23723,23724,23727,23729,23731],{"class":2455,"line":68},[1332,23725,23726],{"class":2462},"\"continueOnError\"",[1332,23728,5260],{"class":2521},[1332,23730,1548],{"class":2511},[1332,23732,6024],{"class":2521},[1332,23734,23735,23738,23740,23742],{"class":2455,"line":1478},[1332,23736,23737],{"class":2462},"\"disablePageChangeMonitoring\"",[1332,23739,5260],{"class":2521},[1332,23741,1548],{"class":2511},[1332,23743,6024],{"class":2521},[1332,23745,23746,23749,23751,23754],{"class":2455,"line":293},[1332,23747,23748],{"class":2462},"\"executablePath\"",[1332,23750,5260],{"class":2521},[1332,23752,23753],{"class":2462},"\"...\"",[1332,23755,6024],{"class":2521},[1332,23757,23758,23761,23763,23765],{"class":2455,"line":2237},[1332,23759,23760],{"class":2462},"\"extensionToLoad\"",[1332,23762,5260],{"class":2521},[1332,23764,23753],{"class":2462},[1332,23766,6024],{"class":2521},[1332,23768,23769,23772,23774,23776],{"class":2455,"line":2623},[1332,23770,23771],{"class":2462},"\"form\"",[1332,23773,23444],{"class":2521},[1332,23775,6835],{"class":23447},[1332,23777,23450],{"class":2521},[4589,23779,23780,23792],{},[4592,23781,23782],{},[4595,23783,23784,23786,23788,23790],{},[4598,23785,23459],{},[4598,23787,12532],{},[4598,23789,15820],{},[4598,23791,1839],{},[4605,23793,23794,23814,23834,23854,23874],{},[4595,23795,23796,23801,23804,23808],{},[4610,23797,23798],{},[145,23799,23800],{},"continueOnError",[4610,23802,23803],{},"Continue after the automation hits an error.",[4610,23805,23806],{},[145,23807,15884],{},[4610,23809,23810],{},[659,23811,23813],{"href":23812},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling\u002Fcontinue-on-error","Continue on error",[4595,23815,23816,23821,23824,23828],{},[4610,23817,23818],{},[145,23819,23820],{},"disablePageChangeMonitoring",[4610,23822,23823],{},"Skip page-change monitoring between steps.",[4610,23825,23826],{},[145,23827,15884],{},[4610,23829,23830],{},[659,23831,23833],{"href":23832},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling\u002Fpage-monitoring","Disable page monitoring",[4595,23835,23836,23841,23844,23848],{},[4610,23837,23838],{},[145,23839,23840],{},"executablePath",[4610,23842,23843],{},"Path to a local Chrome installation.",[4610,23845,23846],{},[145,23847,8822],{},[4610,23849,23850],{},[659,23851,23853],{"href":23852},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fexecutable-path","Set executable path",[4595,23855,23856,23861,23864,23868],{},[4610,23857,23858],{},[145,23859,23860],{},"extensionToLoad",[4610,23862,23863],{},"Path to a Chrome extension to load.",[4610,23865,23866],{},[145,23867,8822],{},[4610,23869,23870],{},[659,23871,23873],{"href":23872},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fload-extension","Load another extension",[4595,23875,23876,23881,23888,23890],{},[4610,23877,23878],{},[145,23879,23880],{},"form",[4610,23882,23883,23884,148],{},"The list of steps. See ",[659,23885,23887],{"href":23886},"#step-data","Step data",[4610,23889],{},[4610,23891],{},[21,23893,23887],{"id":23894},"step-data",[26,23896,23897,23898,23900],{},"Step data lives in the ",[145,23899,23880],{}," key. It's an array of step objects shaped like this:",[2446,23902,23904],{"className":6112,"code":23903,"language":5926,"meta":67,"style":67},"{\n    \"description\": \"Instruct the bot to go to a new page.\",\n    \"hasErrors\": false,\n    \"index\": 0,\n    \"machine_name\": \"WidgetDriverGoto\",\n    \"metadata\": \"\",\n    \"name\": \"google.com\",\n    \"original_name\": \"Go to page\",\n    \"params\": [ ... ],\n    \"stepNumber\": \"1\",\n    \"token\": \"\"\n}\n",[145,23905,23906,23910,23922,23933,23944,23956,23967,23978,23990,24002,24014,24024],{"__ignoreMap":67},[1332,23907,23908],{"class":2455,"line":2131},[1332,23909,6120],{"class":2521},[1332,23911,23912,23915,23917,23920],{"class":2455,"line":670},[1332,23913,23914],{"class":6125},"    \"description\"",[1332,23916,5260],{"class":2521},[1332,23918,23919],{"class":2462},"\"Instruct the bot to go to a new page.\"",[1332,23921,6024],{"class":2521},[1332,23923,23924,23927,23929,23931],{"class":2455,"line":68},[1332,23925,23926],{"class":6125},"    \"hasErrors\"",[1332,23928,5260],{"class":2521},[1332,23930,15884],{"class":2511},[1332,23932,6024],{"class":2521},[1332,23934,23935,23938,23940,23942],{"class":2455,"line":1478},[1332,23936,23937],{"class":6125},"    \"index\"",[1332,23939,5260],{"class":2521},[1332,23941,256],{"class":2511},[1332,23943,6024],{"class":2521},[1332,23945,23946,23949,23951,23954],{"class":2455,"line":293},[1332,23947,23948],{"class":6125},"    \"machine_name\"",[1332,23950,5260],{"class":2521},[1332,23952,23953],{"class":2462},"\"WidgetDriverGoto\"",[1332,23955,6024],{"class":2521},[1332,23957,23958,23961,23963,23965],{"class":2455,"line":2237},[1332,23959,23960],{"class":6125},"    \"metadata\"",[1332,23962,5260],{"class":2521},[1332,23964,8573],{"class":2462},[1332,23966,6024],{"class":2521},[1332,23968,23969,23971,23973,23976],{"class":2455,"line":2623},[1332,23970,23545],{"class":6125},[1332,23972,5260],{"class":2521},[1332,23974,23975],{"class":2462},"\"google.com\"",[1332,23977,6024],{"class":2521},[1332,23979,23980,23983,23985,23988],{"class":2455,"line":2637},[1332,23981,23982],{"class":6125},"    \"original_name\"",[1332,23984,5260],{"class":2521},[1332,23986,23987],{"class":2462},"\"Go to page\"",[1332,23989,6024],{"class":2521},[1332,23991,23992,23995,23997,23999],{"class":2455,"line":2642},[1332,23993,23994],{"class":6125},"    \"params\"",[1332,23996,23444],{"class":2521},[1332,23998,6835],{"class":23447},[1332,24000,24001],{"class":2521}," ],\n",[1332,24003,24004,24007,24009,24012],{"class":2455,"line":2651},[1332,24005,24006],{"class":6125},"    \"stepNumber\"",[1332,24008,5260],{"class":2521},[1332,24010,24011],{"class":2462},"\"1\"",[1332,24013,6024],{"class":2521},[1332,24015,24016,24019,24021],{"class":2455,"line":2673},[1332,24017,24018],{"class":6125},"    \"token\"",[1332,24020,5260],{"class":2521},[1332,24022,24023],{"class":2462},"\"\"\n",[1332,24025,24026],{"class":2455,"line":2692},[1332,24027,2802],{"class":2521},[4589,24029,24030,24038],{},[4592,24031,24032],{},[4595,24033,24034,24036],{},[4598,24035,23459],{},[4598,24037,12532],{},[4605,24039,24040,24049,24059,24068,24077,24087,24101,24111],{},[4595,24041,24042,24046],{},[4610,24043,24044],{},[145,24045,14645],{},[4610,24047,24048],{},"The description of the step at the time it was created.",[4595,24050,24051,24056],{},[4610,24052,24053],{},[145,24054,24055],{},"machine_name",[4610,24057,24058],{},"axiom.ai's internal name for the step.",[4595,24060,24061,24065],{},[4610,24062,24063],{},[145,24064,20487],{},[4610,24066,24067],{},"Search keywords used by the step finder.",[4595,24069,24070,24074],{},[4610,24071,24072],{},[145,24073,6802],{},[4610,24075,24076],{},"The customisable display name.",[4595,24078,24079,24084],{},[4610,24080,24081],{},[145,24082,24083],{},"original_name",[4610,24085,24086],{},"The canonical step name without customisations.",[4595,24088,24089,24094],{},[4610,24090,24091],{},[145,24092,24093],{},"params",[4610,24095,24096,24097,148],{},"The step's configuration. See ",[659,24098,24100],{"href":24099},"#params","Params",[4595,24102,24103,24108],{},[4610,24104,24105],{},[145,24106,24107],{},"stepNumber",[4610,24109,24110],{},"The step's position in the automation.",[4595,24112,24113,24117],{},[4610,24114,24115],{},[145,24116,4417],{},[4610,24118,24119],{},"The data token output by the step, if any (the token name only, not the data).",[2093,24121,24122],{},[26,24123,24124,24126,24127,24129,24130,24132],{},[192,24125,2359],{}," The ",[145,24128,14645],{}," and parameter ",[145,24131,14645],{}," fields are stored at creation time so older steps continue to make sense if the canonical step description changes in a later release.",[21,24134,24100],{"id":24093},[26,24136,2273,24137,24139,24140,24145],{},[145,24138,24093],{}," array inside each step object holds every parameter the step has, plus the value you've configured. For example, a single parameter on the ",[659,24141,24143],{"href":24142},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-data-from-a-google-sheet-step",[192,24144,22098],{}," step looks like this:",[2446,24147,24149],{"className":6112,"code":24148,"language":5926,"meta":67,"style":67},"{\n    \"collapsible\": 0,\n    \"configurable\": true,\n    \"default_value\": \"\",\n    \"description\": [\"Select a google sheet to read from, or paste its URL here.\"],\n    \"help\": [],\n    \"image\": \"\",\n    \"name\": \"Spreadsheet\",\n    \"sheetName\": \"Your Google Sheet\",\n    \"type\": \"spreadsheet_picker\",\n    \"value\": \"...\"\n}\n",[145,24150,24151,24155,24166,24177,24188,24199,24207,24218,24229,24241,24252,24262],{"__ignoreMap":67},[1332,24152,24153],{"class":2455,"line":2131},[1332,24154,6120],{"class":2521},[1332,24156,24157,24160,24162,24164],{"class":2455,"line":670},[1332,24158,24159],{"class":6125},"    \"collapsible\"",[1332,24161,5260],{"class":2521},[1332,24163,256],{"class":2511},[1332,24165,6024],{"class":2521},[1332,24167,24168,24171,24173,24175],{"class":2455,"line":68},[1332,24169,24170],{"class":6125},"    \"configurable\"",[1332,24172,5260],{"class":2521},[1332,24174,1548],{"class":2511},[1332,24176,6024],{"class":2521},[1332,24178,24179,24182,24184,24186],{"class":2455,"line":1478},[1332,24180,24181],{"class":6125},"    \"default_value\"",[1332,24183,5260],{"class":2521},[1332,24185,8573],{"class":2462},[1332,24187,6024],{"class":2521},[1332,24189,24190,24192,24194,24197],{"class":2455,"line":293},[1332,24191,23914],{"class":6125},[1332,24193,6156],{"class":2521},[1332,24195,24196],{"class":2462},"\"Select a google sheet to read from, or paste its URL here.\"",[1332,24198,6167],{"class":2521},[1332,24200,24201,24204],{"class":2455,"line":2237},[1332,24202,24203],{"class":6125},"    \"help\"",[1332,24205,24206],{"class":2521},": [],\n",[1332,24208,24209,24212,24214,24216],{"class":2455,"line":2623},[1332,24210,24211],{"class":6125},"    \"image\"",[1332,24213,5260],{"class":2521},[1332,24215,8573],{"class":2462},[1332,24217,6024],{"class":2521},[1332,24219,24220,24222,24224,24227],{"class":2455,"line":2637},[1332,24221,23545],{"class":6125},[1332,24223,5260],{"class":2521},[1332,24225,24226],{"class":2462},"\"Spreadsheet\"",[1332,24228,6024],{"class":2521},[1332,24230,24231,24234,24236,24239],{"class":2455,"line":2642},[1332,24232,24233],{"class":6125},"    \"sheetName\"",[1332,24235,5260],{"class":2521},[1332,24237,24238],{"class":2462},"\"Your Google Sheet\"",[1332,24240,6024],{"class":2521},[1332,24242,24243,24245,24247,24250],{"class":2455,"line":2651},[1332,24244,23592],{"class":6125},[1332,24246,5260],{"class":2521},[1332,24248,24249],{"class":2462},"\"spreadsheet_picker\"",[1332,24251,6024],{"class":2521},[1332,24253,24254,24257,24259],{"class":2455,"line":2673},[1332,24255,24256],{"class":6125},"    \"value\"",[1332,24258,5260],{"class":2521},[1332,24260,24261],{"class":2462},"\"...\"\n",[1332,24263,24264],{"class":2455,"line":2692},[1332,24265,2802],{"class":2521},[4589,24267,24268,24276],{},[4592,24269,24270],{},[4595,24271,24272,24274],{},[4598,24273,23459],{},[4598,24275,12532],{},[4605,24277,24278,24288,24297,24306,24316,24328],{},[4595,24279,24280,24285],{},[4610,24281,24282],{},[145,24283,24284],{},"default_value",[4610,24286,24287],{},"The default value, if the step has one.",[4595,24289,24290,24294],{},[4610,24291,24292],{},[145,24293,14645],{},[4610,24295,24296],{},"The parameter's description (preserved from the step's creation time, see the note above).",[4595,24298,24299,24303],{},[4610,24300,24301],{},[145,24302,6802],{},[4610,24304,24305],{},"The parameter name.",[4595,24307,24308,24313],{},[4610,24309,24310],{},[145,24311,24312],{},"sheetName",[4610,24314,24315],{},"The name of the Google Sheet selected for this parameter.",[4595,24317,24318,24322],{},[4610,24319,24320],{},[145,24321,23665],{},[4610,24323,24324,24325,148],{},"The parameter type. The example above is a ",[145,24326,24327],{},"spreadsheet_picker",[4595,24329,24330,24334],{},[4610,24331,24332],{},[145,24333,20607],{},[4610,24335,24336],{},"The configured value.",[26,24338,24339],{},"Each parameter type may include extra fields specific to that parameter or step. The example above is a single parameter; most steps have several.",[21,24341,24343],{"id":24342},"automation-settings","Automation settings",[26,24345,24346,24347,24350],{},"The remaining keys are the automation's settings, the same ones you configure from the ",[192,24348,24349],{},"Cog"," icon in the Builder.",[2446,24352,24354],{"className":6112,"code":24353,"language":5926,"meta":67,"style":67},"\"headless\": false,\n\"iframesAllowed\": true,\n\"incognitoMode\": true,\n\"injector\": { \"injector\": \"dom\", \"magic_btn_status\": true, \"selector\": \"\" },\n\"maximumRuntime\": 600,\n\"mode\": \"browser\",\n\"notifications\": { ... },\n\"proxyAuth\": null,\n\"storeCookies\": true,\n\"templateId\": 0,\n\"templateItem\": null,\n\"templateMode\": false,\n\"templateStarted\": false,\n\"tokens\": null,\n\"useLocalTimezone\": true,\n\"userDataDir\": \"...\",\n\"viewport\": null\n",[145,24355,24356,24367,24378,24389,24423,24435,24447,24458,24469,24480,24490,24501,24512,24523,24534,24545,24556],{"__ignoreMap":67},[1332,24357,24358,24361,24363,24365],{"class":2455,"line":2131},[1332,24359,24360],{"class":2462},"\"headless\"",[1332,24362,5260],{"class":2521},[1332,24364,15884],{"class":2511},[1332,24366,6024],{"class":2521},[1332,24368,24369,24372,24374,24376],{"class":2455,"line":670},[1332,24370,24371],{"class":2462},"\"iframesAllowed\"",[1332,24373,5260],{"class":2521},[1332,24375,1548],{"class":2511},[1332,24377,6024],{"class":2521},[1332,24379,24380,24383,24385,24387],{"class":2455,"line":68},[1332,24381,24382],{"class":2462},"\"incognitoMode\"",[1332,24384,5260],{"class":2521},[1332,24386,1548],{"class":2511},[1332,24388,6024],{"class":2521},[1332,24390,24391,24394,24396,24398,24400,24403,24405,24408,24410,24412,24414,24417,24419,24421],{"class":2455,"line":1478},[1332,24392,24393],{"class":2462},"\"injector\"",[1332,24395,6175],{"class":2521},[1332,24397,24393],{"class":6125},[1332,24399,5260],{"class":2521},[1332,24401,24402],{"class":2462},"\"dom\"",[1332,24404,4468],{"class":2521},[1332,24406,24407],{"class":6125},"\"magic_btn_status\"",[1332,24409,5260],{"class":2521},[1332,24411,1548],{"class":2511},[1332,24413,4468],{"class":2521},[1332,24415,24416],{"class":6125},"\"selector\"",[1332,24418,5260],{"class":2521},[1332,24420,8573],{"class":2462},[1332,24422,6531],{"class":2521},[1332,24424,24425,24428,24430,24433],{"class":2455,"line":293},[1332,24426,24427],{"class":2462},"\"maximumRuntime\"",[1332,24429,5260],{"class":2521},[1332,24431,24432],{"class":2511},"600",[1332,24434,6024],{"class":2521},[1332,24436,24437,24440,24442,24445],{"class":2455,"line":2237},[1332,24438,24439],{"class":2462},"\"mode\"",[1332,24441,5260],{"class":2521},[1332,24443,24444],{"class":2462},"\"browser\"",[1332,24446,6024],{"class":2521},[1332,24448,24449,24452,24454,24456],{"class":2455,"line":2623},[1332,24450,24451],{"class":2462},"\"notifications\"",[1332,24453,6175],{"class":2521},[1332,24455,6835],{"class":23447},[1332,24457,6531],{"class":2521},[1332,24459,24460,24463,24465,24467],{"class":2455,"line":2637},[1332,24461,24462],{"class":2462},"\"proxyAuth\"",[1332,24464,5260],{"class":2521},[1332,24466,8822],{"class":2511},[1332,24468,6024],{"class":2521},[1332,24470,24471,24474,24476,24478],{"class":2455,"line":2642},[1332,24472,24473],{"class":2462},"\"storeCookies\"",[1332,24475,5260],{"class":2521},[1332,24477,1548],{"class":2511},[1332,24479,6024],{"class":2521},[1332,24481,24482,24484,24486,24488],{"class":2455,"line":2651},[1332,24483,23430],{"class":2462},[1332,24485,5260],{"class":2521},[1332,24487,256],{"class":2511},[1332,24489,6024],{"class":2521},[1332,24491,24492,24495,24497,24499],{"class":2455,"line":2673},[1332,24493,24494],{"class":2462},"\"templateItem\"",[1332,24496,5260],{"class":2521},[1332,24498,8822],{"class":2511},[1332,24500,6024],{"class":2521},[1332,24502,24503,24506,24508,24510],{"class":2455,"line":2692},[1332,24504,24505],{"class":2462},"\"templateMode\"",[1332,24507,5260],{"class":2521},[1332,24509,15884],{"class":2511},[1332,24511,6024],{"class":2521},[1332,24513,24514,24517,24519,24521],{"class":2455,"line":2727},[1332,24515,24516],{"class":2462},"\"templateStarted\"",[1332,24518,5260],{"class":2521},[1332,24520,15884],{"class":2511},[1332,24522,6024],{"class":2521},[1332,24524,24525,24528,24530,24532],{"class":2455,"line":2739},[1332,24526,24527],{"class":2462},"\"tokens\"",[1332,24529,5260],{"class":2521},[1332,24531,8822],{"class":2511},[1332,24533,6024],{"class":2521},[1332,24535,24536,24539,24541,24543],{"class":2455,"line":2750},[1332,24537,24538],{"class":2462},"\"useLocalTimezone\"",[1332,24540,5260],{"class":2521},[1332,24542,1548],{"class":2511},[1332,24544,6024],{"class":2521},[1332,24546,24547,24550,24552,24554],{"class":2455,"line":2765},[1332,24548,24549],{"class":2462},"\"userDataDir\"",[1332,24551,5260],{"class":2521},[1332,24553,23753],{"class":2462},[1332,24555,6024],{"class":2521},[1332,24557,24558,24561,24563],{"class":2455,"line":2777},[1332,24559,24560],{"class":2462},"\"viewport\"",[1332,24562,5260],{"class":2521},[1332,24564,24565],{"class":2511},"null\n",[4589,24567,24568,24580],{},[4592,24569,24570],{},[4595,24571,24572,24574,24576,24578],{},[4598,24573,23459],{},[4598,24575,12532],{},[4598,24577,15820],{},[4598,24579,1839],{},[4605,24581,24582,24602,24622,24642,24663,24687,24707,24727,24742,24762],{},[4595,24583,24584,24589,24592,24596],{},[4610,24585,24586],{},[145,24587,24588],{},"headless",[4610,24590,24591],{},"Run the browser in headless mode.",[4610,24593,24594],{},[145,24595,15884],{},[4610,24597,24598],{},[659,24599,24601],{"href":24600},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fheadless","Run headless",[4595,24603,24604,24609,24612,24616],{},[4610,24605,24606],{},[145,24607,24608],{},"iframesAllowed",[4610,24610,24611],{},"Allow the selector tool to interact with iframes.",[4610,24613,24614],{},[145,24615,15884],{},[4610,24617,24618],{},[659,24619,24621],{"href":24620},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling\u002Fiframes","Interact with iframes",[4595,24623,24624,24629,24632,24636],{},[4610,24625,24626],{},[145,24627,24628],{},"incognitoMode",[4610,24630,24631],{},"Run the automation in incognito mode.",[4610,24633,24634],{},[145,24635,15884],{},[4610,24637,24638],{},[659,24639,24641],{"href":24640},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fincognito","Run in incognito mode",[4595,24643,24644,24649,24652,24657],{},[4610,24645,24646],{},[145,24647,24648],{},"maximumRuntime",[4610,24650,24651],{},"Maximum runtime in seconds.",[4610,24653,24654],{},[145,24655,24656],{},"720",[4610,24658,24659],{},[659,24660,24662],{"href":24661},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fmax-runtime","Set maximum runtime",[4595,24664,24665,24670,24677,24681],{},[4610,24666,24667],{},[145,24668,24669],{},"notifications",[4610,24671,24672,24673,148],{},"Notification configuration. See ",[659,24674,24676],{"href":24675},"#notifications","Notifications",[4610,24678,24679],{},[145,24680,8822],{},[4610,24682,24683],{},[659,24684,24686],{"href":24685},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fnotifications","Set up notifications",[4595,24688,24689,24694,24697,24701],{},[4610,24690,24691],{},[145,24692,24693],{},"proxyAuth",[4610,24695,24696],{},"Proxy configuration, if a proxy is set up.",[4610,24698,24699],{},[145,24700,8822],{},[4610,24702,24703],{},[659,24704,24706],{"href":24705},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fproxy","Use a proxy",[4595,24708,24709,24714,24717,24721],{},[4610,24710,24711],{},[145,24712,24713],{},"storeCookies",[4610,24715,24716],{},"Use stored cookies and local storage.",[4610,24718,24719],{},[145,24720,8822],{},[4610,24722,24723],{},[659,24724,24726],{"href":24725},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fstore-cookies","Store cookies",[4595,24728,24729,24733,24736,24740],{},[4610,24730,24731],{},[145,24732,23488],{},[4610,24734,24735],{},"The template ID the automation was created from, if any.",[4610,24737,24738],{},[145,24739,256],{},[4610,24741],{},[4595,24743,24744,24749,24752,24756],{},[4610,24745,24746],{},[145,24747,24748],{},"useLocalTimezone",[4610,24750,24751],{},"Use the local timezone for scheduling.",[4610,24753,24754],{},[145,24755,15884],{},[4610,24757,24758],{},[659,24759,24761],{"href":24760},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Ftimezone","Configure timezone",[4595,24763,24764,24769,24772,24776],{},[4610,24765,24766],{},[145,24767,24768],{},"userDataDir",[4610,24770,24771],{},"Path to a custom Chromium profile, if one is set.",[4610,24773,24774],{},[145,24775,8822],{},[4610,24777,24778],{},[659,24779,24781],{"href":24780},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fprofile","Set a custom Chromium profile",[21,24783,24676],{"id":24669},[26,24785,2273,24786,24788],{},[145,24787,24669],{}," key holds the email and webhook notification configuration:",[2446,24790,24792],{"className":6112,"code":24791,"language":5926,"meta":67,"style":67},"{\n    \"emailAddress\": \"...\",\n    \"emailOn\": true,\n    \"onFailure\": true,\n    \"onSuccess\": false,\n    \"webhookOn\": false,\n    \"webhookPayload\": \"\",\n    \"webhookURL\": \"\"\n}\n",[145,24793,24794,24798,24809,24820,24831,24842,24853,24864,24873],{"__ignoreMap":67},[1332,24795,24796],{"class":2455,"line":2131},[1332,24797,6120],{"class":2521},[1332,24799,24800,24803,24805,24807],{"class":2455,"line":670},[1332,24801,24802],{"class":6125},"    \"emailAddress\"",[1332,24804,5260],{"class":2521},[1332,24806,23753],{"class":2462},[1332,24808,6024],{"class":2521},[1332,24810,24811,24814,24816,24818],{"class":2455,"line":68},[1332,24812,24813],{"class":6125},"    \"emailOn\"",[1332,24815,5260],{"class":2521},[1332,24817,1548],{"class":2511},[1332,24819,6024],{"class":2521},[1332,24821,24822,24825,24827,24829],{"class":2455,"line":1478},[1332,24823,24824],{"class":6125},"    \"onFailure\"",[1332,24826,5260],{"class":2521},[1332,24828,1548],{"class":2511},[1332,24830,6024],{"class":2521},[1332,24832,24833,24836,24838,24840],{"class":2455,"line":293},[1332,24834,24835],{"class":6125},"    \"onSuccess\"",[1332,24837,5260],{"class":2521},[1332,24839,15884],{"class":2511},[1332,24841,6024],{"class":2521},[1332,24843,24844,24847,24849,24851],{"class":2455,"line":2237},[1332,24845,24846],{"class":6125},"    \"webhookOn\"",[1332,24848,5260],{"class":2521},[1332,24850,15884],{"class":2511},[1332,24852,6024],{"class":2521},[1332,24854,24855,24858,24860,24862],{"class":2455,"line":2623},[1332,24856,24857],{"class":6125},"    \"webhookPayload\"",[1332,24859,5260],{"class":2521},[1332,24861,8573],{"class":2462},[1332,24863,6024],{"class":2521},[1332,24865,24866,24869,24871],{"class":2455,"line":2637},[1332,24867,24868],{"class":6125},"    \"webhookURL\"",[1332,24870,5260],{"class":2521},[1332,24872,24023],{"class":2462},[1332,24874,24875],{"class":2455,"line":2642},[1332,24876,2802],{"class":2521},[4589,24878,24879,24887],{},[4592,24880,24881],{},[4595,24882,24883,24885],{},[4598,24884,23459],{},[4598,24886,12532],{},[4605,24888,24889,24899,24909,24919,24929,24939,24949],{},[4595,24890,24891,24896],{},[4610,24892,24893],{},[145,24894,24895],{},"emailAddress",[4610,24897,24898],{},"The email addresses to send notifications to.",[4595,24900,24901,24906],{},[4610,24902,24903],{},[145,24904,24905],{},"emailOn",[4610,24907,24908],{},"Whether email notifications are enabled.",[4595,24910,24911,24916],{},[4610,24912,24913],{},[145,24914,24915],{},"onFailure",[4610,24917,24918],{},"Whether to notify on a failed run.",[4595,24920,24921,24926],{},[4610,24922,24923],{},[145,24924,24925],{},"onSuccess",[4610,24927,24928],{},"Whether to notify on a successful run.",[4595,24930,24931,24936],{},[4610,24932,24933],{},[145,24934,24935],{},"webhookOn",[4610,24937,24938],{},"Whether webhook notifications are enabled.",[4595,24940,24941,24946],{},[4610,24942,24943],{},[145,24944,24945],{},"webhookPayload",[4610,24947,24948],{},"The auto-generated webhook payload.",[4595,24950,24951,24956],{},[4610,24952,24953],{},[145,24954,24955],{},"webhookURL",[4610,24957,24958],{},"The URL the webhook payload is sent to.",[107,24960,24962],{"id":24961},"wrapping-up","Wrapping up",[112,24964],{},[26,24966,24967],{},"Understanding the JSON structure of an automation can help when you need to share an automation with support or read someone else's exported file. We don't recommend editing an automation through the JSON, but if you do, work from the table above to know what each key controls. Any malformed JSON will prevent the file from being imported back into the extension.",[2819,24969,24970],{},"html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sZcZs, html code.shiki .sZcZs{--shiki-default:#82071E;--shiki-default-font-style:italic;--shiki-dark:#FFA198;--shiki-dark-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}",{"title":67,"searchDepth":68,"depth":68,"links":24972},[24973,24974,24980],{"id":23391,"depth":670,"text":23392},{"id":580,"depth":670,"text":581,"children":24975},[24976,24977,24978,24979],{"id":23894,"depth":68,"text":23887},{"id":24093,"depth":68,"text":24100},{"id":24342,"depth":68,"text":24343},{"id":24669,"depth":68,"text":24676},{"id":24961,"depth":670,"text":24962},"Reference for the JSON structure of an exported axiom.ai automation, covering identifiers, step data, parameters, settings, and notification fields.",{"metaTitle":24983},"How an exported axiom.ai automation is structured","\u002Fdocs\u002Fdeveloper-hub\u002Fdeep-dives\u002Faxiom-structure",{"title":23373,"description":24981},"docs\u002Fdeveloper-hub\u002Fdeep-dives\u002Faxiom-structure","Yn3vKmiYr9ulZdefWZi3JH6C26Jf9oSt1jylb_QaQwo",{"id":24989,"title":24990,"body":24991,"date":71,"description":25506,"extension":73,"meta":25507,"navigation":75,"order":2131,"path":25509,"seo":25510,"stem":25511,"__hash__":25512},"content\u002Fdocs\u002Fdeveloper-hub\u002Fdeep-dives\u002Fchromium.md","Chromium",{"type":8,"value":24992,"toc":25494},[24993,24996,25000,25002,25021,25033,25037,25039,25042,25045,25056,25059,25080,25083,25087,25089,25115,25118,25148,25152,25154,25157,25193,25196,25200,25218,25230,25233,25237,25256,25280,25283,25287,25299,25302,25319,25329,25337,25341,25343],[26,24994,24995],{},"Chromium is the open-source browser project that axiom.ai uses to run every automation. This page covers what Chromium is, how axiom.ai relies on it, and the architectural decisions that affect performance and memory usage during runs.",[107,24997,24999],{"id":24998},"introduction","Introduction",[112,25001],{},[26,25003,25004,25005,5210,25014,148],{},"Chromium is an open-source web browser project developed and maintained by the Chromium Project, primarily backed by Google. It's the foundation for Google Chrome, Microsoft Edge, Brave, and many other popular browsers. Chromium provides a fast, lightweight, and secure browsing experience with a minimal interface and full support for modern web standards. Unlike Chrome, it has no proprietary additions: no automatic updates, no built-in media codecs, and no Google services integration. Developers and tech enthusiasts often use Chromium directly for its transparency, flexibility, and customisation potential ",[25006,25007,25008],"sup",{},[659,25009,19338],{"href":25010,"ariaDescribedBy":25011,"dataFootnoteRef":67,"id":25013},"#user-content-fn-1",[25012],"footnote-label","user-content-fnref-1",[25006,25015,25016],{},[659,25017,22781],{"href":25018,"ariaDescribedBy":25019,"dataFootnoteRef":67,"id":25020},"#user-content-fn-2",[25012],"user-content-fnref-2",[26,25022,25023,25024,25032],{},"According to StatCounter, at the time of publishing, 72.28% of browser market share belonged to Chromium-based browsers, with Chrome leading the pack ",[25006,25025,25026],{},[659,25027,25031],{"href":25028,"ariaDescribedBy":25029,"dataFootnoteRef":67,"id":25030},"#user-content-fn-3",[25012],"user-content-fnref-3","3",". Because of this dominance, Chromium remains an important platform for any tool that automates the browser, including axiom.ai.",[107,25034,25036],{"id":25035},"how-axiomai-uses-chromium","How axiom.ai uses Chromium",[112,25038],{},[26,25040,25041],{},"axiom.ai ships with a bundled version of Chromium and runs every automation inside it. Local runs open a Chromium window on your computer; cloud runs open a Chromium window on axiom.ai's infrastructure. Either way, the automation executes inside that Chromium instance.",[26,25043,25044],{},"Building on Chromium gives axiom.ai a few baseline advantages:",[186,25046,25047,25050,25053],{},[189,25048,25049],{},"Compatibility with most Chromium-based browsers.",[189,25051,25052],{},"Faster pages without Google service integrations.",[189,25054,25055],{},"A high level of customisation through Chromium's APIs.",[26,25057,25058],{},"These translate into specific axiom.ai features:",[186,25060,25061,25068,25074],{},[189,25062,25063,25064,25067],{},"Setting a ",[659,25065,25066],{"href":24780},"custom Chromium profile"," to handle authentication or carry over browser settings.",[189,25069,25070,25071,148],{},"Routing traffic through a ",[659,25072,25073],{"href":24705},"proxy server",[189,25075,25076,25079],{},[659,25077,25078],{"href":24725},"Storing cookies and local storage"," for use across runs.",[26,25081,25082],{},"These are a handful of examples; many other features depend on Chromium under the hood.",[107,25084,25086],{"id":25085},"puppeteer-and-chromium","Puppeteer and Chromium",[112,25088],{},[26,25090,25091,25096,25097,25105,25106,25110,25111,148],{},[659,25092,25095],{"href":25093,"rel":25094},"https:\u002F\u002Fpptr.dev",[1218],"Puppeteer"," is a JavaScript library that provides a high-level API to control Chromium over the DevTools Protocol and WebDriver BiDi ",[25006,25098,25099],{},[659,25100,25104],{"href":25101,"ariaDescribedBy":25102,"dataFootnoteRef":67,"id":25103},"#user-content-fn-4",[25012],"user-content-fnref-4","4",". It uses Chromium's built-in APIs to expose a clean automation interface, and axiom.ai uses Puppeteer internally. You can also call Puppeteer directly from a ",[659,25107,25108],{"href":19048},[192,25109,19051],{}," step using the ",[659,25112,25114],{"href":25113},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fpuppeteer","Puppeteer snippets",[26,25116,25117],{},"Puppeteer is developed by Google, so its primary target is Chromium, though a Firefox build is also available. The integration with Chromium gives Puppeteer the ability to:",[186,25119,25120,25135,25138,25145],{},[189,25121,25122,25123,4468,25127,2936,25131,148],{},"Use the DevTools Protocol to render pages, ",[659,25124,25126],{"href":25125},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsave-screenshot-locally","take screenshots",[659,25128,25130],{"href":25129},"\u002Fdocs\u002Ftutorials\u002Fwebforms","automate form submissions",[659,25132,25134],{"href":25133},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fnetwork#capture-network-requests","capture network requests",[189,25136,25137],{},"Ship with a stable Chrome version, giving developers a consistent runtime.",[189,25139,25140,25141,25144],{},"Run in ",[659,25142,25143],{"href":24600},"headless mode",", without a graphical interface, for faster automations.",[189,25146,25147],{},"Support every major operating system.",[107,25149,25151],{"id":25150},"chromium-architecture","Chromium architecture",[112,25153],{},[26,25155,25156],{},"Chromium's architecture prioritises user experience, often at the cost of memory. That trade-off explains why Chromium-based browsers are often associated with high RAM usage. It's a sensible trade for an everyday browser, but it has implications for automation. Here are the main architectural decisions:",[186,25158,25159,25165,25171,25177,25187],{},[189,25160,25161,25164],{},[192,25162,25163],{},"Multi-process architecture."," Each tab and extension (including axiom.ai) runs in a separate process. This isolates crashes and improves security but uses more RAM. To see the impact on your machine, open Task Manager (Windows) or Activity Monitor (macOS) and count the Chromium processes.",[189,25166,25167,25170],{},[192,25168,25169],{},"Preloading and caching."," Chromium aggressively caches content and preloads pages to keep things responsive.",[189,25172,25173,25176],{},[192,25174,25175],{},"JavaScript and rendering engine."," Chromium uses the V8 JavaScript engine and Blink rendering engine, which compile and execute JavaScript efficiently.",[189,25178,25179,25182,25183,25186],{},[192,25180,25181],{},"Tab and session management."," Recently improved with ",[192,25184,25185],{},"Memory Saver"," (formerly Data Saver), which puts inactive tabs to sleep. Without that feature on, Chromium keeps inactive tabs in memory so you can switch back instantly without a reload.",[189,25188,25189,25192],{},[192,25190,25191],{},"Garbage collection."," V8 uses aggressive garbage collection to manage memory but sometimes retains unused memory to speed up future tasks.",[26,25194,25195],{},"Each of these decisions improves the user experience at the cost of memory.",[21,25197,25199],{"id":25198},"v8-javascript-engine","V8 JavaScript engine",[26,25201,25202,25203,25210,25211,148],{},"A big chunk of Chromium's speed comes from the V8 JavaScript engine, which compiles JavaScript Just-In-Time (JIT). V8 is written in C++, runs on every major operating system, and implements ECMAScript and WebAssembly ",[25006,25204,25205],{},[659,25206,14021],{"href":25207,"ariaDescribedBy":25208,"dataFootnoteRef":67,"id":25209},"#user-content-fn-5",[25012],"user-content-fnref-5",". SpiderMonkey, Firefox's engine, also uses a C++ JIT compiler with overlapping optimisations ",[25006,25212,25213],{},[659,25214,3077],{"href":25215,"ariaDescribedBy":25216,"dataFootnoteRef":67,"id":25217},"#user-content-fn-6",[25012],"user-content-fnref-6",[26,25219,25220,25221,25229],{},"V8 has seen significant advances over the past few years: a new optimising compiler called Maglev (which sits between Sparkplug and TurboFan), a redesigned TurboFan architecture, a faster HTML parser, and improved DOM allocations ",[25006,25222,25223],{},[659,25224,25228],{"href":25225,"ariaDescribedBy":25226,"dataFootnoteRef":67,"id":25227},"#user-content-fn-7",[25012],"user-content-fnref-7","7",". Garbage collection improvements have added further performance gains.",[26,25231,25232],{},"For axiom.ai, this matters because Puppeteer runs inside Chromium and benefits from every V8 improvement. Each release makes the platform a little bit faster and more reliable for automation.",[21,25234,25236],{"id":25235},"process-model","Process model",[26,25238,25239,25240,25243,25244,25247,25248,148],{},"As mentioned, Chromium isolates each tab and extension into its own process. This stops a single bad tab from taking down the browser and improves security between tabs. Each rendered page runs in its own process with a ",[145,25241,25242],{},"RenderProcess"," object that communicates with the parent browser process. The browser keeps a ",[145,25245,25246],{},"RenderProcessHost"," for each renderer, which manages browser-side state and communication ",[25006,25249,25250],{},[659,25251,25255],{"href":25252,"ariaDescribedBy":25253,"dataFootnoteRef":67,"id":25254},"#user-content-fn-8",[25012],"user-content-fnref-8","8",[26,25257,25258,25259,25262,25263,25266,25267,25269,25270,25273,25274,25276,25277,25279],{},"When a new tab or window opens, Chromium creates a new process and a single ",[145,25260,25261],{},"RenderFrame"," that uses Mojo (an IPC service) to talk to the corresponding ",[145,25264,25265],{},"RenderFrameHost"," in the browser process. The ",[145,25268,25261],{}," represents a page, including any iframes inside it. Some windows opened with ",[145,25271,25272],{},"window.open"," share a ",[145,25275,25261],{}," with the page that opened them. To rein in process counts, Chromium can also adopt existing tabs into another tab's ",[145,25278,25261],{}," once the total number of tabs hits a limit.",[26,25281,25282],{},"This has direct implications for automation. When you run an automation, Chromium loads the page, all its resources, and the resources axiom.ai needs to drive it. axiom.ai's own footprint is small, but on heavy pages Chromium can hit the memory limit of the tab's process. When that happens, the tab crashes but the rest of the browser doesn't. Long-running browser sessions with long-running automations can run into the same issue. Reloading the page usually clears it.",[21,25284,25286],{"id":25285},"security-model","Security model",[26,25288,25289,25290,25298],{},"Chromium uses a sandbox to protect against vulnerabilities in the rendering engine. The sandbox blocks the rendering engine from making system calls that could exploit a vulnerability, and uses security tokens to make sure a compromised renderer can't reach the host operating system ",[25006,25291,25292],{},[659,25293,25297],{"href":25294,"ariaDescribedBy":25295,"dataFootnoteRef":67,"id":25296},"#user-content-fn-9",[25012],"user-content-fnref-9","9",". The sandbox pairs with the multi-process model: encapsulated processes plus restricted system access. Think of the sandbox as a sealed box where error-prone work happens.",[26,25300,25301],{},"The Chromium team runs an active vulnerability management process:",[186,25303,25304,25313,25316],{},[189,25305,25306,25307,25312],{},"Vulnerabilities are found through ",[659,25308,25311],{"href":25309,"rel":25310},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FFuzzing",[1218],"automated fuzzing",", security audits, and external reports.",[189,25314,25315],{},"A public bug tracker documents security issues.",[189,25317,25318],{},"Patches are developed, tested, and shipped on the schedule defined by the security risk mitigation plan.",[26,25320,25321,25322,148],{},"Chromium uses ClusterFuzz to run fuzzing infrastructure that continuously tests for crashes and vulnerabilities. AddressSanitizer and UndefinedBehaviorSanitizer detect memory corruption and undefined behaviour during development, and Syzkaller handles kernel fuzzing for sandboxed processes ",[25006,25323,25324],{},[659,25325,19670],{"href":25326,"ariaDescribedBy":25327,"dataFootnoteRef":67,"id":25328},"#user-content-fn-10",[25012],"user-content-fnref-10",[26,25330,25331,25332,148],{},"Chromium ships security updates on a fast release cadence, and most Chromium-based browsers (including Chrome) auto-update so users get the patches as soon as they're available. Updates are tracked publicly on Google's ",[659,25333,25336],{"href":25334,"rel":25335},"https:\u002F\u002Fchromereleases.googleblog.com",[1218],"Chrome Releases blog",[107,25338,25340],{"id":25339},"references","References",[112,25342],{},[1252,25344,25347,25352],{"className":25345,"dataFootnotes":67},[25346],"footnotes",[107,25348,25351],{"className":25349,"id":25012},[25350],"sr-only","Footnotes",[1923,25353,25354,25370,25383,25397,25411,25425,25439,25452,25466,25481],{},[189,25355,25357,25358,12265,25363],{"id":25356},"user-content-fn-1","Chromium Project, ",[659,25359,25362],{"href":25360,"rel":25361},"https:\u002F\u002Fwww.chromium.org\u002FHome\u002F",[1218],"Home",[659,25364,25369],{"href":25365,"ariaLabel":25366,"className":25367,"dataFootnoteBackref":67},"#user-content-fnref-1","Back to reference 1",[25368],"data-footnote-backref","↩",[189,25371,25357,25373,12265,25378],{"id":25372},"user-content-fn-2",[659,25374,25377],{"href":25375,"rel":25376},"https:\u002F\u002Fwww.chromium.org\u002Fdeveloper-hub\u002Fcore-principles\u002F",[1218],"Core Principles",[659,25379,25369],{"href":25380,"ariaLabel":25381,"className":25382,"dataFootnoteBackref":67},"#user-content-fnref-2","Back to reference 2",[25368],[189,25384,25386,25387,12265,25392],{"id":25385},"user-content-fn-3","StatCounter, ",[659,25388,25391],{"href":25389,"rel":25390},"https:\u002F\u002Fgs.statcounter.com\u002Fbrowser-market-share",[1218],"Browser Market Share",[659,25393,25369],{"href":25394,"ariaLabel":25395,"className":25396,"dataFootnoteBackref":67},"#user-content-fnref-3","Back to reference 3",[25368],[189,25398,25400,25401,12265,25406],{"id":25399},"user-content-fn-4","Puppeteer, ",[659,25402,25405],{"href":25403,"rel":25404},"https:\u002F\u002Fpptr.dev\u002Fguides\u002Fwhat-is-puppeteer",[1218],"What is Puppeteer?",[659,25407,25369],{"href":25408,"ariaLabel":25409,"className":25410,"dataFootnoteBackref":67},"#user-content-fnref-4","Back to reference 4",[25368],[189,25412,25414,25415,12265,25420],{"id":25413},"user-content-fn-5","V8, ",[659,25416,25419],{"href":25417,"rel":25418},"https:\u002F\u002Fv8.dev\u002F",[1218],"v8.dev",[659,25421,25369],{"href":25422,"ariaLabel":25423,"className":25424,"dataFootnoteBackref":67},"#user-content-fnref-5","Back to reference 5",[25368],[189,25426,25428,25429,12265,25434],{"id":25427},"user-content-fn-6","SpiderMonkey, ",[659,25430,25433],{"href":25431,"rel":25432},"https:\u002F\u002Fspidermonkey.dev\u002F",[1218],"spidermonkey.dev",[659,25435,25369],{"href":25436,"ariaLabel":25437,"className":25438,"dataFootnoteBackref":67},"#user-content-fnref-6","Back to reference 6",[25368],[189,25440,25414,25442,12265,25447],{"id":25441},"user-content-fn-7",[659,25443,25446],{"href":25444,"rel":25445},"https:\u002F\u002Fv8.dev\u002Fblog\u002Fholiday-season-2023",[1218],"\"V8 is Faster and Safer than Ever!\"",[659,25448,25369],{"href":25449,"ariaLabel":25450,"className":25451,"dataFootnoteBackref":67},"#user-content-fnref-7","Back to reference 7",[25368],[189,25453,25455,25456,12265,25461],{"id":25454},"user-content-fn-8","Chromium, ",[659,25457,25460],{"href":25458,"rel":25459},"https:\u002F\u002Fwww.chromium.org\u002Fdeveloper-hub\u002Fdesign-documents\u002Fmulti-process-architecture\u002F",[1218],"\"Multi-process Architecture\"",[659,25462,25369],{"href":25463,"ariaLabel":25464,"className":25465,"dataFootnoteBackref":67},"#user-content-fnref-8","Back to reference 8",[25368],[189,25467,25469,25470,25475,25476],{"id":25468},"user-content-fn-9","Adam Barth, Collin Jackson, Charles Reis, and the Google Chrome Team, ",[659,25471,25474],{"href":25472,"rel":25473},"https:\u002F\u002Fseclab.stanford.edu\u002Fwebsec\u002Fchromium\u002Fchromium-security-architecture.pdf",[1218],"\"The Security Architecture of the Chromium Browser\"",", 2008. ",[659,25477,25369],{"href":25478,"ariaLabel":25479,"className":25480,"dataFootnoteBackref":67},"#user-content-fnref-9","Back to reference 9",[25368],[189,25482,25455,25484,12265,25489],{"id":25483},"user-content-fn-10",[659,25485,25488],{"href":25486,"rel":25487},"https:\u002F\u002Fchromium.googlesource.com\u002Fchromium\u002Fsrc\u002F+\u002Fmain\u002Ftesting\u002Flibfuzzer\u002FREADME.md",[1218],"libfuzzer documentation",[659,25490,25369],{"href":25491,"ariaLabel":25492,"className":25493,"dataFootnoteBackref":67},"#user-content-fnref-10","Back to reference 10",[25368],{"title":67,"searchDepth":68,"depth":68,"links":25495},[25496,25497,25498,25499,25504,25505],{"id":24998,"depth":670,"text":24999},{"id":25035,"depth":670,"text":25036},{"id":25085,"depth":670,"text":25086},{"id":25150,"depth":670,"text":25151,"children":25500},[25501,25502,25503],{"id":25198,"depth":68,"text":25199},{"id":25235,"depth":68,"text":25236},{"id":25285,"depth":68,"text":25286},{"id":25339,"depth":670,"text":25340},{"id":25012,"depth":670,"text":25351},"A deep dive into Chromium, how its multi-process architecture and V8 engine affect performance, and how axiom.ai uses Chromium to run automations.",{"metaTitle":25508},"How Chromium works and how axiom.ai uses it","\u002Fdocs\u002Fdeveloper-hub\u002Fdeep-dives\u002Fchromium",{"title":24990,"description":25506},"docs\u002Fdeveloper-hub\u002Fdeep-dives\u002Fchromium","GHdPVM2l0fnjXFo4GRn1iAb9PYueaY7JiGvA9nYUh1E",{"id":25514,"title":25515,"body":25516,"date":71,"description":25799,"extension":73,"meta":25800,"navigation":75,"order":68,"path":25802,"seo":25803,"stem":25804,"__hash__":25805},"content\u002Fdocs\u002Fdeveloper-hub\u002Fdeep-dives\u002Fcookies.md","Cookies in axiom.ai",{"type":8,"value":25517,"toc":25785},[25518,25521,25527,25531,25533,25539,25563,25566,25570,25572,25575,25578,25592,25599,25602,25604,25607,25621,25624,25645,25651,25655,25657,25660,25667,25676,25680,25682,25686,25689,25695,25699,25702,25707,25711,25714,25719,25723,25730,25734,25736,25765,25769,25771],[26,25519,25520],{},"axiom.ai uses stored cookies to keep an automation signed into a target site between runs. The behaviour is straightforward most of the time, but a few corners (especially around duplication and the local browser state) catch users out. This page covers how cookies are stored, when they're applied, and what to do when something goes wrong.",[26,25522,25523,25524,148],{},"For the user-facing how-to on enabling cookie storage, see ",[659,25525,25526],{"href":24725},"store cookies",[107,25528,25530],{"id":25529},"how-axiomai-stores-cookies","How axiom.ai stores cookies",[112,25532],{},[26,25534,25535,25536,25538],{},"When the ",[659,25537,25526],{"href":24725}," setting is enabled for an automation, axiom.ai pulls the relevant cookies from your local browser and stores them in its database. The stored copy is:",[186,25540,25541,25547,25553],{},[189,25542,25543,25546],{},[192,25544,25545],{},"Encrypted at rest."," Cookies are written to the database in encrypted form. Nobody at axiom.ai can read the cookie values directly.",[189,25548,25549,25552],{},[192,25550,25551],{},"Bound to the automation."," Each automation has its own copy. Two automations storing cookies for the same site each get their own encrypted entry.",[189,25554,25555,25558,25559,25562],{},[192,25556,25557],{},"Sourced from the local browser."," The cookies axiom.ai stores come from your local browser at the moment you save the automation or click ",[192,25560,25561],{},"Resync cookies",". There's no other source.",[26,25564,25565],{},"Cookies are applied to the cloud browser before each cloud run, so the automation's session matches your local one. Local runs use your local browser session directly without going through stored cookies.",[107,25567,25569],{"id":25568},"how-duplication-affects-cookies","How duplication affects cookies",[112,25571],{},[26,25573,25574],{},"When you duplicate an automation, axiom.ai re-reads cookies from your local browser and stores a fresh encrypted copy against the new automation. The original and the duplicate end up with separate copies.",[26,25576,25577],{},"This usually works seamlessly. The cases where it doesn't:",[186,25579,25580,25586],{},[189,25581,25582,25585],{},[192,25583,25584],{},"The cookies aren't in your local browser at duplication time."," If you've cleared cookies, signed out of the target site, or used a different browser profile since the original was created, the local source is gone. The duplicate gets stored against the new automation, but with empty or stale values.",[189,25587,25588,25591],{},[192,25589,25590],{},"You signed out of and back into the target site."," Logging out invalidates the original cookie, even though it's still stored in axiom.ai's database. The next run uses an invalid cookie and fails authentication.",[26,25593,25594,25595,25598],{},"In both cases the fix is to ",[192,25596,25597],{},"resync"," the cookies on the duplicated automation. Resyncing pulls the current cookies from your local browser into the duplicate's encrypted storage, replacing whatever was there.",[107,25600,25561],{"id":25601},"resync-cookies",[112,25603],{},[26,25605,25606],{},"Resync whenever you suspect the stored cookie is out of date. Common triggers:",[186,25608,25609,25612,25615,25618],{},[189,25610,25611],{},"After signing out and back into the target site.",[189,25613,25614],{},"After clearing cookies in your browser.",[189,25616,25617],{},"After duplicating an automation that depends on cookies.",[189,25619,25620],{},"After moving to a different machine or browser profile.",[26,25622,25623],{},"To resync:",[1923,25625,25626,25632,25636],{},[189,25627,25628,25629,25631],{},"Open the automation and click the ",[192,25630,24349],{}," icon in the toolbar on the left.",[189,25633,4245,25634,2264],{},[192,25635,24726],{},[189,25637,1927,25638,25640,25641,25644],{},[192,25639,25561],{}," for the URL you want to refresh, or ",[192,25642,25643],{},"Globally resync cookies"," to refresh every automation that uses the same URL.",[26,25646,25647,25648,148],{},"For step-level details, see ",[659,25649,25526],{"href":25650},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fstore-cookies#configure-stored-cookies",[107,25652,25654],{"id":25653},"inspecting-stored-cookies","Inspecting stored cookies",[112,25656],{},[26,25658,25659],{},"axiom.ai doesn't expose stored cookie values, domains, or expiry through the UI. Cookies are stored encrypted, and the UI only shows which URLs have cookies stored against them, not what's inside.",[26,25661,25662,25663,25666],{},"For developer-level inspection, you can use Chrome DevTools to watch the GraphQL ",[145,25664,25665],{},"tasks"," query the dashboard makes when loading an automation. The query response contains the cookie metadata for each automation. The cookie values themselves remain encrypted and unreadable.",[2093,25668,25669],{},[26,25670,25671,25673,25674,16454],{},[192,25672,2359],{}," Inspecting the GraphQL response is for development debugging only. Don't rely on this for day-to-day cookie management; use ",[192,25675,25561],{},[107,25677,25679],{"id":25678},"common-scenarios","Common scenarios",[112,25681],{},[21,25683,25685],{"id":25684},"a-duplicated-automation-works-at-first-then-fails","A duplicated automation works at first, then fails",[26,25687,25688],{},"Most likely cause: the original cookie expired or was invalidated by signing out of the target site. The original automation may also be failing for the same reason, just less obviously if it's run more recently.",[26,25690,25691,25694],{},[192,25692,25693],{},"Fix:"," Resync cookies on both the original and the duplicate.",[21,25696,25698],{"id":25697},"a-duplicated-automation-fails-immediately","A duplicated automation fails immediately",[26,25700,25701],{},"Most likely cause: the cookies for the target site weren't in your local browser at the moment you duplicated. axiom.ai stored an empty or stale copy.",[26,25703,25704,25706],{},[192,25705,25693],{}," Sign in to the target site in your local browser to refresh the cookies there, then resync cookies on the duplicate.",[21,25708,25710],{"id":25709},"two-duplicates-of-the-same-automation-behave-differently","Two duplicates of the same automation behave differently",[26,25712,25713],{},"This is consistent with the storage model: each duplicate gets its own encrypted copy at duplication time. If your local browser state was different between duplications (different sign-in state, different time, different profile), the copies stored against each duplicate will differ.",[26,25715,25716,25718],{},[192,25717,25693],{}," Resync cookies on each duplicate so they all use the current local browser state.",[21,25720,25722],{"id":25721},"a-duplicated-automation-works-but-cookie-storage-feels-fragile","A duplicated automation works, but cookie storage feels fragile",[26,25724,25725,25726,25729],{},"This is the recommended pattern for any automation that depends on stored cookies, especially after duplication: ",[192,25727,25728],{},"resync cookies as part of your duplication workflow",", not as something you only do when something breaks. It's a one-click action, and it removes the largest source of cookie-related failures.",[107,25731,25733],{"id":25732},"best-practices","Best practices",[112,25735],{},[186,25737,25738,25747,25753,25759],{},[189,25739,25740,25746],{},[192,25741,25742,25743],{},"Enable ",[659,25744,25745],{"href":24685},"run notifications"," for automations that depend on cookies. You'll find out as soon as a cookie expires rather than discovering it in run reports days later.",[189,25748,25749,25752],{},[192,25750,25751],{},"Resync cookies after duplication."," Don't rely on the duplicate inheriting working cookies from the original.",[189,25754,25755,25758],{},[192,25756,25757],{},"Don't sign out of the target site in your local browser"," if you have automations that use stored cookies for that site. Signing out invalidates the cookies in axiom.ai's storage too.",[189,25760,25761,25764],{},[192,25762,25763],{},"Use one browser profile for cookie sources."," Cookies stored against an automation come from whichever browser profile was active when you saved or resynced. Switching profiles can invalidate the source.",[107,25766,25768],{"id":25767},"limitations","Limitations",[112,25770],{},[186,25772,25773,25776,25782],{},[189,25774,25775],{},"Cookie values, domains, and expiry can't be inspected directly from the UI.",[189,25777,25778,25779,25781],{},"Cookies are bound to the automation that stored them. There's no shared cookie pool across automations except via the ",[192,25780,25643],{}," action, which still produces separate copies.",[189,25783,25784],{},"axiom.ai can't refresh cookies on its own. If the source cookies in your local browser are gone or expired, the automation needs a manual resync.",{"title":67,"searchDepth":68,"depth":68,"links":25786},[25787,25788,25789,25790,25791,25797,25798],{"id":25529,"depth":670,"text":25530},{"id":25568,"depth":670,"text":25569},{"id":25601,"depth":670,"text":25561},{"id":25653,"depth":670,"text":25654},{"id":25678,"depth":670,"text":25679,"children":25792},[25793,25794,25795,25796],{"id":25684,"depth":68,"text":25685},{"id":25697,"depth":68,"text":25698},{"id":25709,"depth":68,"text":25710},{"id":25721,"depth":68,"text":25722},{"id":25732,"depth":670,"text":25733},{"id":25767,"depth":670,"text":25768},"A deep dive into how axiom.ai stores cookies for automations, how cookies behave when an automation is duplicated, and why resyncing is sometimes required.",{"metaTitle":25801},"How axiom.ai stores and applies cookies in automations","\u002Fdocs\u002Fdeveloper-hub\u002Fdeep-dives\u002Fcookies",{"title":25515,"description":25799},"docs\u002Fdeveloper-hub\u002Fdeep-dives\u002Fcookies","U4x6Tw3cpJt6zP-QnoiQOeYICWrW03dhbIJUFDlNcWw",{"id":25807,"title":25808,"body":25809,"date":71,"description":26289,"extension":73,"meta":26290,"navigation":75,"order":1478,"path":26292,"seo":26293,"stem":26294,"__hash__":26295},"content\u002Fdocs\u002Fdeveloper-hub\u002Fdeep-dives\u002Fdata-handling.md","Data handling",{"type":8,"value":25810,"toc":26268},[25811,25814,25821,25825,25827,25830,25834,25837,25845,25848,25852,25855,25872,25883,25895,25899,25902,25916,25923,25927,25929,25932,25950,25953,25957,25959,25962,25966,25969,25971,25982,25985,25989,25992,25995,26006,26009,26020,26024,26026,26034,26038,26041,26066,26070,26073,26092,26095,26098,26102,26110,26114,26116,26119,26157,26161,26163,26166,26190,26197,26200,26202,26215,26232,26235,26242,26246,26248],[26,25812,25813],{},"axiom.ai is designed so that customer data (the data your automations work with) stays out of axiom.ai's systems by default. This page covers what axiom.ai stores, what it doesn't, how desktop and cloud runs differ in practice, and the patterns to follow when handling sensitive data.",[2093,25815,25816],{},[26,25817,25818,25820],{},[192,25819,2359],{}," axiom.ai is a data processor. The user controls what data flows into and out of axiom.ai through the steps they configure. axiom.ai doesn't access, copy, or share customer data with third parties.",[107,25822,25824],{"id":25823},"what-axiomai-stores","What axiom.ai stores",[112,25826],{},[26,25828,25829],{},"The only data axiom.ai keeps is what's needed to run the platform itself. There are three categories.",[21,25831,25833],{"id":25832},"account-data","Account data",[26,25835,25836],{},"The information needed to maintain your account:",[186,25838,25839,25842],{},[189,25840,25841],{},"Names and email addresses on the account.",[189,25843,25844],{},"Plan and billing metadata.",[26,25846,25847],{},"Account data is stored encrypted at rest and accessed only by the team to provide support and maintain the service.",[21,25849,25851],{"id":25850},"automation-structure","Automation structure",[26,25853,25854],{},"When you save an automation, axiom.ai stores its structure so it can run later. This includes:",[186,25856,25857,25860,25863,25866,25869],{},[189,25858,25859],{},"The automation's name.",[189,25861,25862],{},"The list of steps in the automation.",[189,25864,25865],{},"The configuration of each step (selectors, target URLs, options, and any literal text typed into step fields).",[189,25867,25868],{},"The order of the steps.",[189,25870,25871],{},"Any settings configured on the automation (schedule, proxy, notifications, stored cookies, and so on).",[26,25873,25874,25875,25879,25880,148],{},"This is what gets exported when you ",[659,25876,25878],{"href":25877},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fimport-export\u002Fsharing","download an automation as JSON",". For the full structure, see ",[659,25881,25882],{"href":24984},"automation JSON structure",[2093,25884,25885],{},[26,25886,25887,25890,25891,14735],{},[192,25888,25889],{},"Important:"," Anything you manually type into a step input is stored as part of the automation. This includes search queries, URLs, default values, and any text you've typed instead of inserting a data token. Don't type sensitive values like passwords, API keys, or personally identifiable information directly into step fields. Use a data source (Google Sheet, webhook, API call) instead. See ",[659,25892,25894],{"href":25893},"#use-data-safely","use data safely",[21,25896,25898],{"id":25897},"run-metadata","Run metadata",[26,25900,25901],{},"For every run, axiom.ai records:",[186,25903,25904,25907,25910,25913],{},[189,25905,25906],{},"Run status (success, warning, failure).",[189,25908,25909],{},"Start and end times.",[189,25911,25912],{},"Runtime used.",[189,25914,25915],{},"Any error messages thrown by steps.",[26,25917,25918,25919,25922],{},"This metadata appears in ",[659,25920,2874],{"href":25921},"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Fhow-to-debug#check-run-reports",". It doesn't include the data your automation processed.",[107,25924,25926],{"id":25925},"what-axiomai-doesnt-store","What axiom.ai doesn't store",[112,25928],{},[26,25930,25931],{},"By default, the data your automation actually processes (what it scrapes, what gets passed through it, what it writes elsewhere) isn't stored. Specifically:",[186,25933,25934,25937,25944,25947],{},[189,25935,25936],{},"Data scraped from web pages.",[189,25938,25939,25940,25943],{},"Data passed in through ",[659,25941,15414],{"href":25942},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Freceive-data-from-another-app"," (Zapier, Make, n8n, the API).",[189,25945,25946],{},"Data read from Google Sheets or Excel.",[189,25948,25949],{},"Data written out through any step.",[26,25951,25952],{},"axiom.ai doesn't train AI or machine learning models on user data. There's no pipeline that ingests it, no analytics layer that aggregates it, no internal use of it.",[107,25954,25956],{"id":25955},"desktop-runs-vs-cloud-runs","Desktop runs vs cloud runs",[112,25958],{},[26,25960,25961],{},"The boundary between the two execution modes matters when you're thinking about data flow.",[21,25963,25965],{"id":25964},"desktop-runs","Desktop runs",[26,25967,25968],{},"Desktop runs execute in a browser on your own machine. The data the automation handles never leaves your network unless your automation explicitly sends it somewhere (a webhook, an AI step, a third-party integration).",[26,25970,22691],{},[186,25972,25973,25976,25979],{},[189,25974,25975],{},"Scraped data, page content, and intermediate values stay on your machine.",[189,25977,25978],{},"axiom.ai's servers don't see the run's data.",[189,25980,25981],{},"Run metadata (status, runtime, errors) is still sent to axiom.ai so you can see runs in the dashboard.",[26,25983,25984],{},"For data-sensitive workflows, the desktop app is the deployment of choice.",[21,25986,25988],{"id":25987},"cloud-runs","Cloud runs",[26,25990,25991],{},"Cloud runs execute in a private browser container on axiom.ai's infrastructure. The container is created at the start of the run and permanently deleted when the run ends. Nothing persists between runs.",[26,25993,25994],{},"While the run is in progress:",[186,25996,25997,26000,26003],{},[189,25998,25999],{},"The data flowing through the automation lives only inside the container.",[189,26001,26002],{},"The container has no shared storage with other accounts or other runs.",[189,26004,26005],{},"axiom.ai engineers can't reach into the container.",[26,26007,26008],{},"When the run ends:",[186,26010,26011,26014,26017],{},[189,26012,26013],{},"The container is destroyed.",[189,26015,26016],{},"Run metadata (status, runtime, errors) is retained for run reports.",[189,26018,26019],{},"The processed data is gone unless your automation wrote it somewhere (a Google Sheet, an export step, a webhook).",[107,26021,26023],{"id":26022},"use-data-safely","Use data safely",[112,26025],{},[26,26027,26028,26029,26033],{},"axiom.ai handles your data safely by default. The remaining surface area for accidental data exposure is in how ",[26030,26031,26032],"em",{},"you"," configure your automations. A few patterns to follow:",[21,26035,26037],{"id":26036},"dont-type-sensitive-values-into-step-fields","Don't type sensitive values into step fields",[26,26039,26040],{},"Anything typed directly into a step's text input is stored as part of the automation's structure. For sensitive values (passwords, API keys, customer data), pass the value in dynamically instead.",[186,26042,26043,26053,26059],{},[189,26044,26045,26046,2344,26049,26052],{},"Read sensitive inputs from a ",[659,26047,26048],{"href":963},"Google Sheet",[659,26050,26051],{"href":894},"Excel sheet"," the user controls.",[189,26054,26055,26056,26058],{},"Pass them in via ",[659,26057,15414],{"href":25942}," so the value comes from a webhook or API call.",[189,26060,26061,26062,26065],{},"For credentials specifically, use ",[659,26063,26064],{"href":24725},"stored cookies"," or your browser's password manager rather than entering passwords as text.",[21,26067,26069],{"id":26068},"egress-is-opt-in","Egress is opt-in",[26,26071,26072],{},"Data only leaves an automation when a step is configured to send it out. Examples:",[186,26074,26075,26080,26087],{},[189,26076,7407,26077,26079],{},[659,26078,13063],{"href":1123}," step sends data to an external URL.",[189,26081,7429,26082,26086],{},[659,26083,26085],{"href":26084},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fchatgpt","AI step"," sends prompt content to OpenAI.",[189,26088,7407,26089,26091],{},[659,26090,22113],{"href":963}," step writes to your Google account.",[26,26093,26094],{},"None of these are present by default. If your automation has none of these steps, data doesn't leave it.",[26,26096,26097],{},"When you do add an egress step, the destination is also yours: the third-party service receiving the data is bound by its own terms with you, not with axiom.ai.",[21,26099,26101],{"id":26100},"run-sensitive-workflows-on-the-desktop","Run sensitive workflows on the desktop",[26,26103,26104,26105,26109],{},"If a workflow handles regulated or highly sensitive data, run it on the ",[659,26106,26108],{"href":26107},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Finstall#installing-the-desktop-app-optional","desktop app"," rather than in the cloud. The data never reaches axiom.ai's servers, removing axiom.ai from the data flow entirely.",[107,26111,26113],{"id":26112},"security-practices","Security practices",[112,26115],{},[26,26117,26118],{},"A few specifics on how axiom.ai handles the data it does store:",[186,26120,26121,26127,26133,26139,26151],{},[189,26122,26123,26126],{},[192,26124,26125],{},"Encryption at rest."," All user data on axiom.ai's systems is stored encrypted.",[189,26128,26129,26132],{},[192,26130,26131],{},"Restricted admin access."," Only a small number of team members can access production systems, and access is logged.",[189,26134,26135,26138],{},[192,26136,26137],{},"Regular penetration testing."," axiom.ai runs penetration tests on a regular cadence.",[189,26140,26141,26144,26145,26150],{},[192,26142,26143],{},"Annual CASA review."," Google reviews axiom.ai's data handling annually through their ",[659,26146,26149],{"href":26147,"rel":26148},"https:\u002F\u002Fsupport.google.com\u002Fcloud\u002Fanswer\u002F13465431",[1218],"Cloud Application Security Assessment"," (CASA), which verifies secure handling and processing of data.",[189,26152,26153,26156],{},[192,26154,26155],{},"No customer-data access for support."," axiom.ai's support process doesn't require access to your customer data. If we ever ask for context to debug an issue, you decide what to share.",[107,26158,26160],{"id":26159},"compliance-and-certifications","Compliance and certifications",[112,26162],{},[26,26164,26165],{},"axiom.ai is designed to be compliant with common data-handling standards but is not formally certified for any of them. Specifically:",[186,26167,26168,26174,26184],{},[189,26169,26170,26173],{},[192,26171,26172],{},"Not SOC 2 certified."," The system is built around the principle of not handling customer data (so most controls are not applicable), but no formal SOC 2 audit has been completed.",[189,26175,26176,26179,26180,14735],{},[192,26177,26178],{},"Not HIPAA certified, no BAA offered."," axiom.ai doesn't sign Business Associate Agreements. For why this can still work for HIPAA-regulated workflows, see ",[659,26181,26183],{"href":26182},"#hipaa-and-axiom-ai","HIPAA and axiom.ai",[189,26185,26186,26189],{},[192,26187,26188],{},"CASA-verified annually."," Google's CASA review confirms that axiom.ai handles and processes data securely.",[26,26191,26192,26193,26196],{},"If you have a security questionnaire to complete, ",[659,26194,26195],{"href":1887},"contact support",". The team has filled these in for several enterprise users.",[107,26198,26183],{"id":26199},"hipaa-and-axiomai",[112,26201],{},[26,26203,26204,26205,6205,26210,3297],{},"axiom.ai doesn't sign BAAs, but the desktop deployment can still be appropriate for workflows that touch Protected Health Information (PHI). The reasoning, drawn from ",[659,26206,26209],{"href":26207,"rel":26208},"https:\u002F\u002Fwww.hhs.gov\u002Fhipaa\u002Ffor-professionals\u002Ffaq\u002F256\u002Fare-business-associate-agreements-required-with-software-vendors\u002Findex.html",[1218],"HHS guidance",[659,26211,26214],{"href":26212,"rel":26213},"https:\u002F\u002Fwww.ecfr.gov\u002Fcurrent\u002Ftitle-45\u002Fsection-160.103",[1218],"45 CFR 160.103",[186,26216,26217,26223,26226,26229],{},[189,26218,26219,26220,148],{},"Under HIPAA, a software vendor only becomes a business associate if it ",[192,26221,26222],{},"creates, receives, maintains, or transmits PHI on behalf of a covered entity",[189,26224,26225],{},"Selling software that runs in your environment doesn't trigger business-associate status.",[189,26227,26228],{},"When you run automations on the desktop app, PHI stays inside your network. axiom.ai doesn't see, store, or transmit any of it.",[189,26230,26231],{},"In that deployment model, axiom.ai isn't a business associate, and no BAA is required.",[26,26233,26234],{},"The cloud deployment is a different story: cloud runs process data on axiom.ai's infrastructure. If your workflows handle PHI, run them on the desktop app only.",[2093,26236,26237],{},[26,26238,26239,26241],{},[192,26240,25889],{}," This is a summary, not legal advice. HIPAA compliance is your organisation's responsibility, and the right deployment depends on your specific workflow. If you're unsure whether the desktop deployment fits your compliance needs, consult your privacy or compliance team before deploying.",[107,26243,26245],{"id":26244},"summary","Summary",[112,26247],{},[186,26249,26250,26253,26256,26259,26262,26265],{},[189,26251,26252],{},"axiom.ai stores account information, automation structure, and run metadata. It doesn't store the data your automations process.",[189,26254,26255],{},"Anything typed manually into a step is stored as part of the automation. Don't type sensitive values directly; pass them in through a data source.",[189,26257,26258],{},"Data only leaves an automation through steps you configure to send it out (webhooks, AI steps, integrations). None of these are present by default.",[189,26260,26261],{},"Desktop runs keep data inside your network. Cloud runs use private, ephemeral containers that are destroyed when the run ends.",[189,26263,26264],{},"For sensitive or regulated data, the desktop app is the recommended deployment.",[189,26266,26267],{},"axiom.ai is designed to be compliant with common standards (not formally certified), CASA-verified annually, and supports security questionnaires on request.",{"title":67,"searchDepth":68,"depth":68,"links":26269},[26270,26275,26276,26280,26285,26286,26287,26288],{"id":25823,"depth":670,"text":25824,"children":26271},[26272,26273,26274],{"id":25832,"depth":68,"text":25833},{"id":25850,"depth":68,"text":25851},{"id":25897,"depth":68,"text":25898},{"id":25925,"depth":670,"text":25926},{"id":25955,"depth":670,"text":25956,"children":26277},[26278,26279],{"id":25964,"depth":68,"text":25965},{"id":25987,"depth":68,"text":25988},{"id":26022,"depth":670,"text":26023,"children":26281},[26282,26283,26284],{"id":26036,"depth":68,"text":26037},{"id":26068,"depth":68,"text":26069},{"id":26100,"depth":68,"text":26101},{"id":26112,"depth":670,"text":26113},{"id":26159,"depth":670,"text":26160},{"id":26199,"depth":670,"text":26183},{"id":26244,"depth":670,"text":26245},"A deep dive into what data axiom.ai stores, what stays in your environment, how desktop and cloud runs differ, and how to use axiom.ai safely with sensitive data.",{"metaTitle":26291},"How axiom.ai stores, processes, and protects your data","\u002Fdocs\u002Fdeveloper-hub\u002Fdeep-dives\u002Fdata-handling",{"title":25808,"description":26289},"docs\u002Fdeveloper-hub\u002Fdeep-dives\u002Fdata-handling","gHDcqnizLJjlw8XNB3F7bOLHvkOgmO8sfjd1dUtrD5Q",{"id":26297,"title":26298,"body":26299,"date":71,"description":26325,"extension":73,"meta":26326,"navigation":75,"order":68,"path":26328,"seo":26329,"stem":26330,"__hash__":26331},"content\u002Fdocs\u002Fdeveloper-hub\u002Fdeep-dives\u002Findex.md","Deep dives",{"type":8,"value":26300,"toc":26322},[26301,26304,26308,26310,26313,26315],[26,26302,26303],{},"The deep dives explore tools and concepts behind axiom.ai in more detail than the main reference docs. Useful when you want to understand how something works, not just how to use it.",[107,26305,26307],{"id":26306},"articles","Articles",[112,26309],{},[26,26311,26312],{},"Read these as reference articles rather than a single path. Each is self-contained and answers a specific class of question: how axiom.ai's underlying browser works, how cookies are stored and applied, how data is handled across desktop and cloud runs, and what's inside an exported automation file. Pick whichever matches the question you have.",[2218,26314],{},[26,26316,2222,26317,2226,26319,148],{},[659,26318,2225],{"href":1887},[659,26320,2231],{"href":2229,"rel":26321},[1218],{"title":67,"searchDepth":68,"depth":68,"links":26323},[26324],{"id":26306,"depth":670,"text":26307},"In-depth articles on the tools and concepts behind axiom.ai, including Chromium, Puppeteer, cookie handling, data handling, and the structure of an exported automation.",{"metaTitle":26327},"In-depth articles on tools and concepts behind axiom.ai","\u002Fdocs\u002Fdeveloper-hub\u002Fdeep-dives",{"title":26298,"description":26325},"docs\u002Fdeveloper-hub\u002Fdeep-dives\u002Findex","PUQlqQx1_GgkOulvBRBP8DkoIOJ2W7B6vKRNYGleNjE",{"id":26333,"title":26334,"body":26335,"date":71,"description":26441,"extension":73,"meta":26442,"navigation":75,"order":68,"path":1538,"seo":26444,"stem":26445,"__hash__":26446},"content\u002Fdocs\u002Fdeveloper-hub\u002Findex.md","Developer Hub",{"type":8,"value":26336,"toc":26432},[26337,26347,26368,26370,26372,26376,26382,26386,26394,26398,26405,26409,26416,26420,26422],[26,26338,26339,26340,26342,26343,26346],{},"axiom.ai supports two developer paths: the ",[659,26341,5345],{"href":5562}," for triggering and integrating automations, and custom code (JavaScript and the ",[659,26344,2923],{"href":1536,"rel":26345},[1218],") for extending what an automation can do. The links below cover both.",[3075,26348,26349,26353,26359,26363],{"cols":670,"gap":3077},[499,26350],{"link":5562,"shape":26351,"text":26352,"title":5345},"scale1","Trigger pre-built automations, drive a cloud browser step by step, and authenticate from your own stack.",[499,26354],{"link":26355,"shape":26356,"text":26357,"title":26358},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript","scale2","Add JavaScript snippets inside No-Code Tool automations for custom logic, data shaping, and API calls.","Using code in no-code tool",[499,26360],{"link":26328,"shape":26361,"text":26362,"title":26298},"scale3","Technical background on how axiom.ai handles Chromium, browser sessions, cookies, and more.",[499,26364],{"link":26365,"shape":502,"text":26366,"title":26367},"\u002Fdocs\u002Fdeveloper-hub\u002Ftroubleshooting","Diagnose API errors, integration problems, and runtime issues.","Dev troubleshooting",[107,26369,384],{"id":383},[112,26371],{},[21,26373,26375],{"id":26374},"do-i-need-a-subscription-to-use-the-api","Do I need a subscription to use the API?",[26,26377,26378,26379,26381],{},"Yes. The API requires a paid plan. See the ",[659,26380,7415],{"href":7414}," for plans that include API access. Free plans don't include the API.",[21,26383,26385],{"id":26384},"do-i-need-a-subscription-to-use-javascript-in-my-automations","Do I need a subscription to use JavaScript in my automations?",[26,26387,26388,26389,26393],{},"No. The ",[659,26390,26391],{"href":19048},[192,26392,19051],{}," step is available on every plan, including free.",[21,26395,26397],{"id":26396},"does-the-api-have-rate-limits","Does the API have rate limits?",[26,26399,26400,26401,26404],{},"Yes. Every account is rate-limited to keep the platform stable. See the ",[659,26402,26403],{"href":7601},"rate limits documentation"," for the current limits.",[21,26406,26408],{"id":26407},"does-the-api-have-a-queue","Does the API have a queue?",[26,26410,26411,26412,26415],{},"Yes. The queue lets a small number of requests through even when your account has hit its concurrency limit. See the ",[659,26413,26414],{"href":5286},"queue documentation"," for the details.",[107,26417,26419],{"id":26418},"feedback","Feedback",[112,26421],{},[26,26423,26424,26425,2344,26428,26431],{},"We're always looking for ideas to improve the developer experience. Got feedback, a feature request, or work to share? Post in the ",[659,26426,2231],{"href":2229,"rel":26427},[1218],[659,26429,26430],{"href":1887},"contact us",". The team reviews feedback weekly.",{"title":67,"searchDepth":68,"depth":68,"links":26433},[26434,26440],{"id":383,"depth":670,"text":384,"children":26435},[26436,26437,26438,26439],{"id":26374,"depth":68,"text":26375},{"id":26384,"depth":68,"text":26385},{"id":26396,"depth":68,"text":26397},{"id":26407,"depth":68,"text":26408},{"id":26418,"depth":670,"text":26419},"Use axiom.ai as a developer platform with the API, the Code Dashboard, and custom JavaScript steps inside no-code automations, plus guides and troubleshooting.",{"metaTitle":26443},"API and code documentation for axiom.ai developers",{"title":26334,"description":26441},"docs\u002Fdeveloper-hub\u002Findex","QGSLRljsykDsYYnG2jrfT_LRuStO8Up4tblFaqdKrpk",{"id":26448,"title":26449,"body":26450,"date":71,"description":26532,"extension":73,"meta":26533,"navigation":75,"order":670,"path":10371,"seo":26535,"stem":26536,"__hash__":26537},"content\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Findex.md","Code snippets",{"type":8,"value":26451,"toc":26528},[26452,26459,26463,26465,26467,26471,26473,26486,26498,26501,26512,26521],[26,26453,2273,26454,26458],{},[659,26455,26456],{"href":19048},[192,26457,19051],{}," step lets you extend axiom.ai with custom code. The snippets in this section have been tried and tested in real automations, and many came from user requests. They're split into two categories: standard JavaScript that runs against the page, and Puppeteer snippets that drive the browser through Puppeteer's API.",[107,26460,26462],{"id":26461},"snippet-categories","Snippet categories",[112,26464],{},[2218,26466],{},[107,26468,26470],{"id":26469},"run-in-app","Run in app",[112,26472],{},[26,26474,2273,26475,26477,26478,26480,26481,26485],{},[145,26476,26470],{}," toggle on the ",[192,26479,19051],{}," step runs your code inside the desktop application instead of inside the page. This is required for any snippet that uses the ",[659,26482,26484],{"href":26483},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fpuppeteer","Puppeteer API",". It's also useful when:",[186,26487,26488,26491],{},[189,26489,26490],{},"You don't want your code to interact with the page's own scripts. Running in the page can trigger the page's event listeners or clash with its function and variable names.",[189,26492,26493,26494,26497],{},"You need access to Node.js APIs (the ",[145,26495,26496],{},"fs"," module, for example) that aren't available in a browser context.",[26,26499,26500],{},"There are trade-offs:",[186,26502,26503,26506],{},[189,26504,26505],{},"You can't access elements, functions, or variables from the page being automated.",[189,26507,26508,26509,26511],{},"Console output isn't visible during the run when ",[145,26510,26470],{}," is enabled.",[2093,26513,26514],{},[26,26515,26516,5210,26518,26520],{},[192,26517,2359],{},[145,26519,26470],{}," only works on desktop runs. Cloud runs always execute scripts in the page context.",[26,26522,2222,26523,2226,26525,148],{},[659,26524,2225],{"href":1887},[659,26526,2231],{"href":2229,"rel":26527},[1218],{"title":67,"searchDepth":68,"depth":68,"links":26529},[26530,26531],{"id":26461,"depth":670,"text":26462},{"id":26469,"depth":670,"text":26470},"Tried-and-tested JavaScript and Puppeteer snippets for the Write javascript step, plus guidance on when to use the Run in app option.",{"metaTitle":26534},"JavaScript and Puppeteer code snippets for axiom.ai",{"title":26449,"description":26532},"docs\u002Fdeveloper-hub\u002Fsnippets\u002Findex","alsrbtAmQmam5efBRBnmhTSf9rbnmGuEyD-QKb2igTM",{"id":26539,"title":26540,"body":26541,"date":71,"description":28090,"extension":73,"meta":28091,"navigation":75,"order":2131,"path":28093,"seo":28094,"stem":28095,"__hash__":28096},"content\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fdata.md","Data snippets",{"type":8,"value":26542,"toc":28077},[26543,26546,26550,26552,26555,26621,26624,26684,26687,26813,26821,26825,26827,26830,26903,26908,26912,26914,26921,26947,26950,27098,27109,27133,27137,27139,27142,27214,27223,27227,27229,27237,27668,27672,27674,27682,27686,27695,27773,27777,27782,27861,27865,27871,27972,27976,27981,28074],[26,26544,26545],{},"Data snippets help you manipulate data in your automations so it matches the format the next step (or downstream system) expects.",[107,26547,26549],{"id":26548},"get-the-date-and-time","Get the date and time",[112,26551],{},[26,26553,26554],{},"Get the date a number of days in the past:",[2446,26556,26558],{"className":2498,"code":26557,"language":2500,"meta":67,"style":67},"const yesterday = new Date();\nyesterday.setDate(yesterday.getDate() - 1); \u002F\u002F Change '1' to your desired number of days\nreturn [[yesterday.toLocaleDateString('en-US')]];\n",[145,26559,26560,26575,26603],{"__ignoreMap":67},[1332,26561,26562,26564,26567,26569,26571,26573],{"class":2455,"line":2131},[1332,26563,2508],{"class":2507},[1332,26565,26566],{"class":2511}," yesterday",[1332,26568,2515],{"class":2507},[1332,26570,2697],{"class":2507},[1332,26572,17558],{"class":2525},[1332,26574,2670],{"class":2521},[1332,26576,26577,26580,26583,26586,26589,26592,26594,26597,26600],{"class":2455,"line":670},[1332,26578,26579],{"class":2521},"yesterday.",[1332,26581,26582],{"class":2525},"setDate",[1332,26584,26585],{"class":2521},"(yesterday.",[1332,26587,26588],{"class":2525},"getDate",[1332,26590,26591],{"class":2521},"() ",[1332,26593,9555],{"class":2507},[1332,26595,26596],{"class":2511}," 1",[1332,26598,26599],{"class":2521},"); ",[1332,26601,26602],{"class":2609},"\u002F\u002F Change '1' to your desired number of days\n",[1332,26604,26605,26607,26610,26613,26615,26618],{"class":2455,"line":68},[1332,26606,12963],{"class":2507},[1332,26608,26609],{"class":2521}," [[yesterday.",[1332,26611,26612],{"class":2525},"toLocaleDateString",[1332,26614,1213],{"class":2521},[1332,26616,26617],{"class":2462},"'en-US'",[1332,26619,26620],{"class":2521},")]];\n",[26,26622,26623],{},"Get the date a number of days in the future:",[2446,26625,26627],{"className":2498,"code":26626,"language":2500,"meta":67,"style":67},"const targetDate = new Date();\ntargetDate.setDate(targetDate.getDate() + 14); \u002F\u002F Change '14' to your desired number of days\nreturn [[targetDate.toLocaleDateString('en-US')]];\n",[145,26628,26629,26644,26669],{"__ignoreMap":67},[1332,26630,26631,26633,26636,26638,26640,26642],{"class":2455,"line":2131},[1332,26632,2508],{"class":2507},[1332,26634,26635],{"class":2511}," targetDate",[1332,26637,2515],{"class":2507},[1332,26639,2697],{"class":2507},[1332,26641,17558],{"class":2525},[1332,26643,2670],{"class":2521},[1332,26645,26646,26649,26651,26654,26656,26658,26661,26664,26666],{"class":2455,"line":670},[1332,26647,26648],{"class":2521},"targetDate.",[1332,26650,26582],{"class":2525},[1332,26652,26653],{"class":2521},"(targetDate.",[1332,26655,26588],{"class":2525},[1332,26657,26591],{"class":2521},[1332,26659,26660],{"class":2507},"+",[1332,26662,26663],{"class":2511}," 14",[1332,26665,26599],{"class":2521},[1332,26667,26668],{"class":2609},"\u002F\u002F Change '14' to your desired number of days\n",[1332,26670,26671,26673,26676,26678,26680,26682],{"class":2455,"line":68},[1332,26672,12963],{"class":2507},[1332,26674,26675],{"class":2521}," [[targetDate.",[1332,26677,26612],{"class":2525},[1332,26679,1213],{"class":2521},[1332,26681,26617],{"class":2462},[1332,26683,26620],{"class":2521},[26,26685,26686],{},"Append a timestamp to scraped data:",[2446,26688,26690],{"className":2498,"code":26689,"language":2500,"meta":67,"style":67},"let data = [all-interaction-data]; \u002F\u002F Token from a previous scrape step\nlet dt = new Date().toLocaleString('en-GB', { timeZone: 'Europe\u002FLondon' });\n\nfor (var i = 0; i \u003C data.length; i++) {\n    data[i].push([dt]);\n}\n\nreturn data;\n",[145,26691,26692,26717,26748,26752,26787,26798,26802,26806],{"__ignoreMap":67},[1332,26693,26694,26697,26699,26701,26704,26706,26709,26711,26714],{"class":2455,"line":2131},[1332,26695,26696],{"class":2507},"let",[1332,26698,5843],{"class":2521},[1332,26700,5110],{"class":2507},[1332,26702,26703],{"class":2521}," [all",[1332,26705,9555],{"class":2507},[1332,26707,26708],{"class":2521},"interaction",[1332,26710,9555],{"class":2507},[1332,26712,26713],{"class":2521},"data]; ",[1332,26715,26716],{"class":2609},"\u002F\u002F Token from a previous scrape step\n",[1332,26718,26719,26721,26724,26726,26728,26730,26732,26735,26737,26740,26743,26746],{"class":2455,"line":670},[1332,26720,26696],{"class":2507},[1332,26722,26723],{"class":2521}," dt ",[1332,26725,5110],{"class":2507},[1332,26727,2697],{"class":2507},[1332,26729,17558],{"class":2525},[1332,26731,17561],{"class":2521},[1332,26733,26734],{"class":2525},"toLocaleString",[1332,26736,1213],{"class":2521},[1332,26738,26739],{"class":2462},"'en-GB'",[1332,26741,26742],{"class":2521},", { timeZone: ",[1332,26744,26745],{"class":2462},"'Europe\u002FLondon'",[1332,26747,3040],{"class":2521},[1332,26749,26750],{"class":2455,"line":68},[1332,26751,2588],{"emptyLinePlaceholder":75},[1332,26753,26754,26756,26758,26761,26764,26766,26769,26772,26774,26777,26779,26782,26785],{"class":2455,"line":1478},[1332,26755,22087],{"class":2507},[1332,26757,3842],{"class":2521},[1332,26759,26760],{"class":2507},"var",[1332,26762,26763],{"class":2521}," i ",[1332,26765,5110],{"class":2507},[1332,26767,26768],{"class":2511}," 0",[1332,26770,26771],{"class":2521},"; i ",[1332,26773,23299],{"class":2507},[1332,26775,26776],{"class":2521}," data.",[1332,26778,13473],{"class":2511},[1332,26780,26781],{"class":2521},"; i",[1332,26783,26784],{"class":2507},"++",[1332,26786,6473],{"class":2521},[1332,26788,26789,26792,26795],{"class":2455,"line":293},[1332,26790,26791],{"class":2521},"    data[i].",[1332,26793,26794],{"class":2525},"push",[1332,26796,26797],{"class":2521},"([dt]);\n",[1332,26799,26800],{"class":2455,"line":2237},[1332,26801,2802],{"class":2521},[1332,26803,26804],{"class":2455,"line":2623},[1332,26805,2588],{"emptyLinePlaceholder":75},[1332,26807,26808,26810],{"class":2455,"line":2637},[1332,26809,12963],{"class":2507},[1332,26811,26812],{"class":2521}," data;\n",[26,26814,26815,26816,148],{},"For locale options, see ",[659,26817,26820],{"href":26818,"rel":26819},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FGlobal_Objects\u002FIntl",[1218],"Mozilla's Intl reference",[107,26822,26824],{"id":26823},"get-the-current-day-of-the-week","Get the current day of the week",[112,26826],{},[26,26828,26829],{},"Return the day of the week in the locale you pass in:",[2446,26831,26833],{"className":2498,"code":26832,"language":2500,"meta":67,"style":67},"const locale = 'en-US';\nconst options = { weekday: 'long' };\nconst now = new Date();\nreturn new Intl.DateTimeFormat(locale, options).format(now);\n",[145,26834,26835,26849,26867,26882],{"__ignoreMap":67},[1332,26836,26837,26839,26842,26844,26847],{"class":2455,"line":2131},[1332,26838,2508],{"class":2507},[1332,26840,26841],{"class":2511}," locale",[1332,26843,2515],{"class":2507},[1332,26845,26846],{"class":2462}," 'en-US'",[1332,26848,4673],{"class":2521},[1332,26850,26851,26853,26856,26858,26861,26864],{"class":2455,"line":670},[1332,26852,2508],{"class":2507},[1332,26854,26855],{"class":2511}," options",[1332,26857,2515],{"class":2507},[1332,26859,26860],{"class":2521}," { weekday: ",[1332,26862,26863],{"class":2462},"'long'",[1332,26865,26866],{"class":2521}," };\n",[1332,26868,26869,26871,26874,26876,26878,26880],{"class":2455,"line":68},[1332,26870,2508],{"class":2507},[1332,26872,26873],{"class":2511}," now",[1332,26875,2515],{"class":2507},[1332,26877,2697],{"class":2507},[1332,26879,17558],{"class":2525},[1332,26881,2670],{"class":2521},[1332,26883,26884,26886,26888,26891,26894,26897,26900],{"class":2455,"line":1478},[1332,26885,12963],{"class":2507},[1332,26887,2697],{"class":2507},[1332,26889,26890],{"class":2521}," Intl.",[1332,26892,26893],{"class":2525},"DateTimeFormat",[1332,26895,26896],{"class":2521},"(locale, options).",[1332,26898,26899],{"class":2525},"format",[1332,26901,26902],{"class":2521},"(now);\n",[26,26904,26815,26905,148],{},[659,26906,26820],{"href":26818,"rel":26907},[1218],[107,26909,26911],{"id":26910},"add-a-placeholder-for-blank-cells","Add a placeholder for blank cells",[112,26913],{},[26,26915,26916,26917,26920],{},"Blank cells in scraped data are silently dropped by the Google Sheets API, which can shift columns left when the data is written. For example, the array ",[145,26918,26919],{},"[[\"1\", \"2\"], [\"\", \"4\"]]"," writes to a sheet like this:",[4589,26922,26923,26933],{},[4592,26924,26925],{},[4595,26926,26927,26930],{},[4598,26928,26929],{},"A",[4598,26931,26932],{},"B",[4605,26934,26935,26941],{},[4595,26936,26937,26939],{},[4610,26938,19338],{},[4610,26940,22781],{},[4595,26942,26943,26945],{},[4610,26944,25104],{},[4610,26946],{},[26,26948,26949],{},"To prevent the shift, replace blank cells with a placeholder before writing:",[2446,26951,26953],{"className":2498,"code":26952,"language":2500,"meta":67,"style":67},"var data = [scrape-data];\nconst placeholder = '-';\n\nfor (var i = 0; i \u003C data.length; i++) {\n    for (var j = 0; j \u003C data[i].length; j++) {\n        if (data[i][j] === '') {\n            data[i][j] = placeholder;\n        }\n    }\n}\n\nreturn data;\n",[145,26954,26955,26971,26985,26989,27017,27050,27065,27075,27080,27084,27088,27092],{"__ignoreMap":67},[1332,26956,26957,26959,26961,26963,26966,26968],{"class":2455,"line":2131},[1332,26958,26760],{"class":2507},[1332,26960,5843],{"class":2521},[1332,26962,5110],{"class":2507},[1332,26964,26965],{"class":2521}," [scrape",[1332,26967,9555],{"class":2507},[1332,26969,26970],{"class":2521},"data];\n",[1332,26972,26973,26975,26978,26980,26983],{"class":2455,"line":670},[1332,26974,2508],{"class":2507},[1332,26976,26977],{"class":2511}," placeholder",[1332,26979,2515],{"class":2507},[1332,26981,26982],{"class":2462}," '-'",[1332,26984,4673],{"class":2521},[1332,26986,26987],{"class":2455,"line":68},[1332,26988,2588],{"emptyLinePlaceholder":75},[1332,26990,26991,26993,26995,26997,26999,27001,27003,27005,27007,27009,27011,27013,27015],{"class":2455,"line":1478},[1332,26992,22087],{"class":2507},[1332,26994,3842],{"class":2521},[1332,26996,26760],{"class":2507},[1332,26998,26763],{"class":2521},[1332,27000,5110],{"class":2507},[1332,27002,26768],{"class":2511},[1332,27004,26771],{"class":2521},[1332,27006,23299],{"class":2507},[1332,27008,26776],{"class":2521},[1332,27010,13473],{"class":2511},[1332,27012,26781],{"class":2521},[1332,27014,26784],{"class":2507},[1332,27016,6473],{"class":2521},[1332,27018,27019,27022,27024,27026,27029,27031,27033,27036,27038,27041,27043,27046,27048],{"class":2455,"line":293},[1332,27020,27021],{"class":2507},"    for",[1332,27023,3842],{"class":2521},[1332,27025,26760],{"class":2507},[1332,27027,27028],{"class":2521}," j ",[1332,27030,5110],{"class":2507},[1332,27032,26768],{"class":2511},[1332,27034,27035],{"class":2521},"; j ",[1332,27037,23299],{"class":2507},[1332,27039,27040],{"class":2521}," data[i].",[1332,27042,13473],{"class":2511},[1332,27044,27045],{"class":2521},"; j",[1332,27047,26784],{"class":2507},[1332,27049,6473],{"class":2521},[1332,27051,27052,27055,27058,27060,27063],{"class":2455,"line":2237},[1332,27053,27054],{"class":2507},"        if",[1332,27056,27057],{"class":2521}," (data[i][j] ",[1332,27059,9291],{"class":2507},[1332,27061,27062],{"class":2462}," ''",[1332,27064,6473],{"class":2521},[1332,27066,27067,27070,27072],{"class":2455,"line":2623},[1332,27068,27069],{"class":2521},"            data[i][j] ",[1332,27071,5110],{"class":2507},[1332,27073,27074],{"class":2521}," placeholder;\n",[1332,27076,27077],{"class":2455,"line":2637},[1332,27078,27079],{"class":2521},"        }\n",[1332,27081,27082],{"class":2455,"line":2642},[1332,27083,3810],{"class":2521},[1332,27085,27086],{"class":2455,"line":2651},[1332,27087,2802],{"class":2521},[1332,27089,27090],{"class":2455,"line":2673},[1332,27091,2588],{"emptyLinePlaceholder":75},[1332,27093,27094,27096],{"class":2455,"line":2692},[1332,27095,12963],{"class":2507},[1332,27097,26812],{"class":2521},[26,27099,27100,27101,27104,27105,27108],{},"Change the ",[145,27102,27103],{},"placeholder"," value to suit your needs. The output goes into the ",[145,27106,27107],{},"code-data"," token, ready to write into a Google Sheet:",[4589,27110,27111,27119],{},[4592,27112,27113],{},[4595,27114,27115,27117],{},[4598,27116,26929],{},[4598,27118,26932],{},[4605,27120,27121,27127],{},[4595,27122,27123,27125],{},[4610,27124,19338],{},[4610,27126,22781],{},[4595,27128,27129,27131],{},[4610,27130,9555],{},[4610,27132,25104],{},[107,27134,27136],{"id":27135},"add-a-constant-value-to-the-last-column","Add a constant value to the last column",[112,27138],{},[26,27140,27141],{},"Append a fixed value to every row of an array, useful for tagging exports with a category, source, or run timestamp:",[2446,27143,27145],{"className":2498,"code":27144,"language":2500,"meta":67,"style":67},"var scrapeData = [scrape-data];\nvar data = 'example';\n\nscrapeData.forEach((item) => item.push(data));\n\nreturn scrapeData;\n",[145,27146,27147,27162,27175,27179,27203,27207],{"__ignoreMap":67},[1332,27148,27149,27151,27154,27156,27158,27160],{"class":2455,"line":2131},[1332,27150,26760],{"class":2507},[1332,27152,27153],{"class":2521}," scrapeData ",[1332,27155,5110],{"class":2507},[1332,27157,26965],{"class":2521},[1332,27159,9555],{"class":2507},[1332,27161,26970],{"class":2521},[1332,27163,27164,27166,27168,27170,27173],{"class":2455,"line":670},[1332,27165,26760],{"class":2507},[1332,27167,5843],{"class":2521},[1332,27169,5110],{"class":2507},[1332,27171,27172],{"class":2462}," 'example'",[1332,27174,4673],{"class":2521},[1332,27176,27177],{"class":2455,"line":68},[1332,27178,2588],{"emptyLinePlaceholder":75},[1332,27180,27181,27184,27186,27188,27191,27193,27195,27198,27200],{"class":2455,"line":1478},[1332,27182,27183],{"class":2521},"scrapeData.",[1332,27185,13486],{"class":2525},[1332,27187,2703],{"class":2521},[1332,27189,27190],{"class":2458},"item",[1332,27192,2709],{"class":2521},[1332,27194,2712],{"class":2507},[1332,27196,27197],{"class":2521}," item.",[1332,27199,26794],{"class":2525},[1332,27201,27202],{"class":2521},"(data));\n",[1332,27204,27205],{"class":2455,"line":293},[1332,27206,2588],{"emptyLinePlaceholder":75},[1332,27208,27209,27211],{"class":2455,"line":2237},[1332,27210,12963],{"class":2507},[1332,27212,27213],{"class":2521}," scrapeData;\n",[26,27215,2545,27216,27219,27220,27222],{},[145,27217,27218],{},"[scrape-data]"," with the token from the previous step, and ",[145,27221,580],{}," with the constant value to append.",[107,27224,27226],{"id":27225},"create-and-download-a-csv-file","Create and download a CSV file",[112,27228],{},[26,27230,27231,27232,27236],{},"Build a CSV from automation data and write it to a local path. Read ",[659,27233,27235],{"href":27234},"\u002Fdocs\u002Ftutorials\u002Fdata\u002Fexport#export-using-export-csv-file","export to CSV"," before using this; the built-in step is simpler for most use cases.",[2446,27238,27240],{"className":2498,"code":27239,"language":2500,"meta":67,"style":67},"\u002F\u002F Replace [google-sheet-data] with the data token containing the rows to export.\nconst data = [google-sheet-data];\n\nfunction arrayToCSV(array) {\n    return array.map(row =>\n        row.map(value => {\n            if (typeof value === 'string' && (value.includes(',') || value.includes('\"'))) {\n                return `\"${value.replace(\u002F\"\u002Fg, '\"\"')}\"`;\n            }\n            return value;\n        }).join(',')\n    ).join('\\n');\n}\n\nfunction writeCSVFile(directory, filename, csvData) {\n    const fullPath = `${directory}\u002F${filename}`;\n    fs.writeFile(fullPath, csvData, 'utf8', (err) => {\n        if (err) {\n            console.error('Error writing CSV file:', err);\n        } else {\n            console.log(`CSV file saved as ${fullPath}`);\n        }\n    });\n}\n\nconst csvData = arrayToCSV(data);\n\n\u002F\u002F Change to the desired download path. Use forward slashes.\nconst downloadDirectory = 'C:\u002FUsers\u002FAxiom\u002FDocuments\u002FAxiom';\n\n\u002F\u002F Optional: the name of the output file.\nconst filename = 'output.csv';\n\nwriteCSVFile(downloadDirectory, filename, csvData);\n",[145,27241,27242,27247,27267,27271,27285,27304,27319,27369,27403,27408,27416,27430,27449,27453,27457,27481,27504,27530,27537,27552,27562,27580,27584,27588,27592,27596,27610,27614,27619,27633,27637,27642,27656,27660],{"__ignoreMap":67},[1332,27243,27244],{"class":2455,"line":2131},[1332,27245,27246],{"class":2609},"\u002F\u002F Replace [google-sheet-data] with the data token containing the rows to export.\n",[1332,27248,27249,27251,27253,27255,27258,27260,27263,27265],{"class":2455,"line":670},[1332,27250,2508],{"class":2507},[1332,27252,12298],{"class":2511},[1332,27254,2515],{"class":2507},[1332,27256,27257],{"class":2521}," [google",[1332,27259,9555],{"class":2507},[1332,27261,27262],{"class":2521},"sheet",[1332,27264,9555],{"class":2507},[1332,27266,26970],{"class":2521},[1332,27268,27269],{"class":2455,"line":68},[1332,27270,2588],{"emptyLinePlaceholder":75},[1332,27272,27273,27276,27279,27281,27283],{"class":2455,"line":1478},[1332,27274,27275],{"class":2507},"function",[1332,27277,27278],{"class":2525}," arrayToCSV",[1332,27280,1213],{"class":2521},[1332,27282,6761],{"class":2458},[1332,27284,6473],{"class":2521},[1332,27286,27287,27290,27293,27296,27298,27301],{"class":2455,"line":293},[1332,27288,27289],{"class":2507},"    return",[1332,27291,27292],{"class":2521}," array.",[1332,27294,27295],{"class":2525},"map",[1332,27297,1213],{"class":2521},[1332,27299,27300],{"class":2458},"row",[1332,27302,27303],{"class":2507}," =>\n",[1332,27305,27306,27309,27311,27313,27315,27317],{"class":2455,"line":2237},[1332,27307,27308],{"class":2521},"        row.",[1332,27310,27295],{"class":2525},[1332,27312,1213],{"class":2521},[1332,27314,20607],{"class":2458},[1332,27316,10271],{"class":2507},[1332,27318,2648],{"class":2521},[1332,27320,27321,27324,27326,27329,27332,27334,27337,27340,27343,27346,27348,27351,27353,27356,27359,27361,27363,27366],{"class":2455,"line":2623},[1332,27322,27323],{"class":2507},"            if",[1332,27325,3842],{"class":2521},[1332,27327,27328],{"class":2507},"typeof",[1332,27330,27331],{"class":2521}," value ",[1332,27333,9291],{"class":2507},[1332,27335,27336],{"class":2462}," 'string'",[1332,27338,27339],{"class":2507}," &&",[1332,27341,27342],{"class":2521}," (value.",[1332,27344,27345],{"class":2525},"includes",[1332,27347,1213],{"class":2521},[1332,27349,27350],{"class":2462},"','",[1332,27352,2709],{"class":2521},[1332,27354,27355],{"class":2507},"||",[1332,27357,27358],{"class":2521}," value.",[1332,27360,27345],{"class":2525},[1332,27362,1213],{"class":2521},[1332,27364,27365],{"class":2462},"'\"'",[1332,27367,27368],{"class":2521},"))) {\n",[1332,27370,27371,27374,27377,27379,27381,27383,27385,27388,27391,27393,27396,27398,27401],{"class":2455,"line":2637},[1332,27372,27373],{"class":2507},"                return",[1332,27375,27376],{"class":2462}," `\"${",[1332,27378,20607],{"class":2521},[1332,27380,148],{"class":2462},[1332,27382,9105],{"class":2525},[1332,27384,1213],{"class":2462},[1332,27386,27387],{"class":2462},"\u002F\"\u002F",[1332,27389,27390],{"class":2507},"g",[1332,27392,4468],{"class":2462},[1332,27394,27395],{"class":2462},"'\"\"'",[1332,27397,9560],{"class":2462},[1332,27399,27400],{"class":2462},"}\"`",[1332,27402,4673],{"class":2521},[1332,27404,27405],{"class":2455,"line":2642},[1332,27406,27407],{"class":2521},"            }\n",[1332,27409,27410,27413],{"class":2455,"line":2651},[1332,27411,27412],{"class":2507},"            return",[1332,27414,27415],{"class":2521}," value;\n",[1332,27417,27418,27421,27424,27426,27428],{"class":2455,"line":2673},[1332,27419,27420],{"class":2521},"        }).",[1332,27422,27423],{"class":2525},"join",[1332,27425,1213],{"class":2521},[1332,27427,27350],{"class":2462},[1332,27429,5174],{"class":2521},[1332,27431,27432,27435,27437,27439,27442,27445,27447],{"class":2455,"line":2692},[1332,27433,27434],{"class":2521},"    ).",[1332,27436,27423],{"class":2525},[1332,27438,1213],{"class":2521},[1332,27440,27441],{"class":2462},"'",[1332,27443,27444],{"class":2507},"\\n",[1332,27446,27441],{"class":2462},[1332,27448,2583],{"class":2521},[1332,27450,27451],{"class":2455,"line":2727},[1332,27452,2802],{"class":2521},[1332,27454,27455],{"class":2455,"line":2739},[1332,27456,2588],{"emptyLinePlaceholder":75},[1332,27458,27459,27461,27464,27466,27469,27471,27474,27476,27479],{"class":2455,"line":2750},[1332,27460,27275],{"class":2507},[1332,27462,27463],{"class":2525}," writeCSVFile",[1332,27465,1213],{"class":2521},[1332,27467,27468],{"class":2458},"directory",[1332,27470,4468],{"class":2521},[1332,27472,27473],{"class":2458},"filename",[1332,27475,4468],{"class":2521},[1332,27477,27478],{"class":2458},"csvData",[1332,27480,6473],{"class":2521},[1332,27482,27483,27485,27488,27490,27493,27495,27498,27500,27502],{"class":2455,"line":2765},[1332,27484,2654],{"class":2507},[1332,27486,27487],{"class":2511}," fullPath",[1332,27489,2515],{"class":2507},[1332,27491,27492],{"class":2462}," `${",[1332,27494,27468],{"class":2521},[1332,27496,27497],{"class":2462},"}\u002F${",[1332,27499,27473],{"class":2521},[1332,27501,6502],{"class":2462},[1332,27503,4673],{"class":2521},[1332,27505,27506,27509,27512,27515,27518,27521,27524,27526,27528],{"class":2455,"line":2777},[1332,27507,27508],{"class":2521},"    fs.",[1332,27510,27511],{"class":2525},"writeFile",[1332,27513,27514],{"class":2521},"(fullPath, csvData, ",[1332,27516,27517],{"class":2462},"'utf8'",[1332,27519,27520],{"class":2521},", (",[1332,27522,27523],{"class":2458},"err",[1332,27525,2709],{"class":2521},[1332,27527,2712],{"class":2507},[1332,27529,2648],{"class":2521},[1332,27531,27532,27534],{"class":2455,"line":2788},[1332,27533,27054],{"class":2507},[1332,27535,27536],{"class":2521}," (err) {\n",[1332,27538,27539,27542,27544,27546,27549],{"class":2455,"line":2799},[1332,27540,27541],{"class":2521},"            console.",[1332,27543,2782],{"class":2525},[1332,27545,1213],{"class":2521},[1332,27547,27548],{"class":2462},"'Error writing CSV file:'",[1332,27550,27551],{"class":2521},", err);\n",[1332,27553,27554,27557,27560],{"class":2455,"line":3751},[1332,27555,27556],{"class":2521},"        } ",[1332,27558,27559],{"class":2507},"else",[1332,27561,2648],{"class":2521},[1332,27563,27564,27566,27568,27570,27573,27576,27578],{"class":2455,"line":3762},[1332,27565,27541],{"class":2521},[1332,27567,2575],{"class":2525},[1332,27569,1213],{"class":2521},[1332,27571,27572],{"class":2462},"`CSV file saved as ${",[1332,27574,27575],{"class":2521},"fullPath",[1332,27577,6502],{"class":2462},[1332,27579,2583],{"class":2521},[1332,27581,27582],{"class":2455,"line":3777},[1332,27583,27079],{"class":2521},[1332,27585,27586],{"class":2455,"line":3787},[1332,27587,3613],{"class":2521},[1332,27589,27590],{"class":2455,"line":3796},[1332,27591,2802],{"class":2521},[1332,27593,27594],{"class":2455,"line":3807},[1332,27595,2588],{"emptyLinePlaceholder":75},[1332,27597,27598,27600,27603,27605,27607],{"class":2455,"line":3813},[1332,27599,2508],{"class":2507},[1332,27601,27602],{"class":2511}," csvData",[1332,27604,2515],{"class":2507},[1332,27606,27278],{"class":2525},[1332,27608,27609],{"class":2521},"(data);\n",[1332,27611,27612],{"class":2455,"line":3819},[1332,27613,2588],{"emptyLinePlaceholder":75},[1332,27615,27616],{"class":2455,"line":3824},[1332,27617,27618],{"class":2609},"\u002F\u002F Change to the desired download path. Use forward slashes.\n",[1332,27620,27621,27623,27626,27628,27631],{"class":2455,"line":6027},[1332,27622,2508],{"class":2507},[1332,27624,27625],{"class":2511}," downloadDirectory",[1332,27627,2515],{"class":2507},[1332,27629,27630],{"class":2462}," 'C:\u002FUsers\u002FAxiom\u002FDocuments\u002FAxiom'",[1332,27632,4673],{"class":2521},[1332,27634,27635],{"class":2455,"line":6051},[1332,27636,2588],{"emptyLinePlaceholder":75},[1332,27638,27639],{"class":2455,"line":6057},[1332,27640,27641],{"class":2609},"\u002F\u002F Optional: the name of the output file.\n",[1332,27643,27644,27646,27649,27651,27654],{"class":2455,"line":6064},[1332,27645,2508],{"class":2507},[1332,27647,27648],{"class":2511}," filename",[1332,27650,2515],{"class":2507},[1332,27652,27653],{"class":2462}," 'output.csv'",[1332,27655,4673],{"class":2521},[1332,27657,27658],{"class":2455,"line":6069},[1332,27659,2588],{"emptyLinePlaceholder":75},[1332,27661,27662,27665],{"class":2455,"line":6086},[1332,27663,27664],{"class":2525},"writeCSVFile",[1332,27666,27667],{"class":2521},"(downloadDirectory, filename, csvData);\n",[107,27669,27671],{"id":27670},"manipulate-data-with-regex","Manipulate data with regex",[112,27673],{},[26,27675,27676,27677,27681],{},"Regular expressions match, search, and transform text. Each example below assumes the snippet is inside a ",[659,27678,27679],{"href":15650},[192,27680,15653],{}," step so the script runs once per row, but you can also build the loop into the snippet itself.",[21,27683,27685],{"id":27684},"extract-data","Extract data",[26,27687,2487,27688,27691,27692,3297],{},[145,27689,27690],{},"match"," to pull out the bit you want. The example pulls a number out of a string like ",[145,27693,27694],{},"115 Records",[2446,27696,27698],{"className":2498,"code":27697,"language":2500,"meta":67,"style":67},"\u002F\u002F Data scraped from a page, e.g. \"115 Records\".\nconst data = '[scrape-data?all&0]';\n\n\u002F\u002F Extract the digits.\nconst records = data.match(\u002F\\d+\u002F)[0];\n\n\u002F\u002F Return for the 'code-data' token.\nreturn records;\n",[145,27699,27700,27705,27718,27722,27727,27757,27761,27766],{"__ignoreMap":67},[1332,27701,27702],{"class":2455,"line":2131},[1332,27703,27704],{"class":2609},"\u002F\u002F Data scraped from a page, e.g. \"115 Records\".\n",[1332,27706,27707,27709,27711,27713,27716],{"class":2455,"line":670},[1332,27708,2508],{"class":2507},[1332,27710,12298],{"class":2511},[1332,27712,2515],{"class":2507},[1332,27714,27715],{"class":2462}," '[scrape-data?all&0]'",[1332,27717,4673],{"class":2521},[1332,27719,27720],{"class":2455,"line":68},[1332,27721,2588],{"emptyLinePlaceholder":75},[1332,27723,27724],{"class":2455,"line":1478},[1332,27725,27726],{"class":2609},"\u002F\u002F Extract the digits.\n",[1332,27728,27729,27731,27734,27736,27738,27740,27742,27744,27747,27749,27751,27753,27755],{"class":2455,"line":293},[1332,27730,2508],{"class":2507},[1332,27732,27733],{"class":2511}," records",[1332,27735,2515],{"class":2507},[1332,27737,26776],{"class":2521},[1332,27739,27690],{"class":2525},[1332,27741,1213],{"class":2521},[1332,27743,122],{"class":2462},[1332,27745,27746],{"class":2511},"\\d",[1332,27748,26660],{"class":2507},[1332,27750,122],{"class":2462},[1332,27752,9097],{"class":2521},[1332,27754,256],{"class":2511},[1332,27756,4931],{"class":2521},[1332,27758,27759],{"class":2455,"line":2237},[1332,27760,2588],{"emptyLinePlaceholder":75},[1332,27762,27763],{"class":2455,"line":2623},[1332,27764,27765],{"class":2609},"\u002F\u002F Return for the 'code-data' token.\n",[1332,27767,27768,27770],{"class":2455,"line":2637},[1332,27769,12963],{"class":2507},[1332,27771,27772],{"class":2521}," records;\n",[21,27774,27776],{"id":27775},"replace-data","Replace data",[26,27778,2487,27779,27781],{},[145,27780,9105],{}," to swap one substring for another. The example replaces an email domain:",[2446,27783,27785],{"className":2498,"code":27784,"language":2500,"meta":67,"style":67},"\u002F\u002F Data scraped from a page, e.g. \"axiom@example.com\".\nconst data = '[scrape-data?all&0]';\n\n\u002F\u002F Replace the domain.\nconst newEmail = data.replace(\u002F@[\\w.-]+$\u002F, '@newdomain.com');\n\n\u002F\u002F Return for the 'code-data' token.\nreturn newEmail;\n",[145,27786,27787,27792,27804,27808,27813,27846,27850,27854],{"__ignoreMap":67},[1332,27788,27789],{"class":2455,"line":2131},[1332,27790,27791],{"class":2609},"\u002F\u002F Data scraped from a page, e.g. \"axiom@example.com\".\n",[1332,27793,27794,27796,27798,27800,27802],{"class":2455,"line":670},[1332,27795,2508],{"class":2507},[1332,27797,12298],{"class":2511},[1332,27799,2515],{"class":2507},[1332,27801,27715],{"class":2462},[1332,27803,4673],{"class":2521},[1332,27805,27806],{"class":2455,"line":68},[1332,27807,2588],{"emptyLinePlaceholder":75},[1332,27809,27810],{"class":2455,"line":1478},[1332,27811,27812],{"class":2609},"\u002F\u002F Replace the domain.\n",[1332,27814,27815,27817,27820,27822,27824,27826,27828,27831,27834,27837,27839,27841,27844],{"class":2455,"line":293},[1332,27816,2508],{"class":2507},[1332,27818,27819],{"class":2511}," newEmail",[1332,27821,2515],{"class":2507},[1332,27823,26776],{"class":2521},[1332,27825,9105],{"class":2525},[1332,27827,1213],{"class":2521},[1332,27829,27830],{"class":2462},"\u002F@",[1332,27832,27833],{"class":2511},"[\\w.-]",[1332,27835,27836],{"class":2507},"+$",[1332,27838,122],{"class":2462},[1332,27840,4468],{"class":2521},[1332,27842,27843],{"class":2462},"'@newdomain.com'",[1332,27845,2583],{"class":2521},[1332,27847,27848],{"class":2455,"line":2237},[1332,27849,2588],{"emptyLinePlaceholder":75},[1332,27851,27852],{"class":2455,"line":2623},[1332,27853,27765],{"class":2609},[1332,27855,27856,27858],{"class":2455,"line":2637},[1332,27857,12963],{"class":2507},[1332,27859,27860],{"class":2521}," newEmail;\n",[21,27862,27864],{"id":27863},"validate-data","Validate data",[26,27866,2487,27867,27870],{},[145,27868,27869],{},"test"," to check whether a value matches a pattern. The example checks for a valid email:",[2446,27872,27874],{"className":2498,"code":27873,"language":2500,"meta":67,"style":67},"\u002F\u002F Data scraped from a page, e.g. \"example@example.com\".\nconst data = '[scrape-data?all&0]';\n\n\u002F\u002F Check if the email is valid.\nconst isValid = \u002F^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\u002F.test(data);\n\n\u002F\u002F Return for the 'code-data' token.\nreturn isValid;\n",[145,27875,27876,27881,27893,27897,27902,27957,27961,27965],{"__ignoreMap":67},[1332,27877,27878],{"class":2455,"line":2131},[1332,27879,27880],{"class":2609},"\u002F\u002F Data scraped from a page, e.g. \"example@example.com\".\n",[1332,27882,27883,27885,27887,27889,27891],{"class":2455,"line":670},[1332,27884,2508],{"class":2507},[1332,27886,12298],{"class":2511},[1332,27888,2515],{"class":2507},[1332,27890,27715],{"class":2462},[1332,27892,4673],{"class":2521},[1332,27894,27895],{"class":2455,"line":68},[1332,27896,2588],{"emptyLinePlaceholder":75},[1332,27898,27899],{"class":2455,"line":1478},[1332,27900,27901],{"class":2609},"\u002F\u002F Check if the email is valid.\n",[1332,27903,27904,27906,27909,27911,27914,27917,27919,27921,27924,27926,27929,27931,27933,27935,27937,27941,27943,27945,27947,27949,27951,27953,27955],{"class":2455,"line":293},[1332,27905,2508],{"class":2507},[1332,27907,27908],{"class":2511}," isValid",[1332,27910,2515],{"class":2507},[1332,27912,27913],{"class":2462}," \u002F",[1332,27915,27916],{"class":2507},"^",[1332,27918,19386],{"class":2511},[1332,27920,27916],{"class":2507},[1332,27922,27923],{"class":2511},"\\s@]",[1332,27925,26660],{"class":2507},[1332,27927,27928],{"class":2462},"@",[1332,27930,19386],{"class":2511},[1332,27932,27916],{"class":2507},[1332,27934,27923],{"class":2511},[1332,27936,26660],{"class":2507},[1332,27938,27940],{"class":27939},"sa8KN","\\.",[1332,27942,19386],{"class":2511},[1332,27944,27916],{"class":2507},[1332,27946,27923],{"class":2511},[1332,27948,27836],{"class":2507},[1332,27950,122],{"class":2462},[1332,27952,148],{"class":2521},[1332,27954,27869],{"class":2525},[1332,27956,27609],{"class":2521},[1332,27958,27959],{"class":2455,"line":2237},[1332,27960,2588],{"emptyLinePlaceholder":75},[1332,27962,27963],{"class":2455,"line":2623},[1332,27964,27765],{"class":2609},[1332,27966,27967,27969],{"class":2455,"line":2637},[1332,27968,12963],{"class":2507},[1332,27970,27971],{"class":2521}," isValid;\n",[21,27973,27975],{"id":27974},"reformat-data","Reformat data",[26,27977,2487,27978,27980],{},[145,27979,9105],{}," with capture groups to restructure a value. The example reformats a date:",[2446,27982,27984],{"className":2498,"code":27983,"language":2500,"meta":67,"style":67},"\u002F\u002F Data scraped from a page, e.g. \"01-02-2025\".\nconst data = '[scrape-data?all&0]';\n\n\u002F\u002F Reformat to \"01\u002F02\u002F2025\".\nconst formatted = data.replace(\u002F(\\d{4})-(\\d{2})-(\\d{2})\u002F, '$1\u002F$2\u002F$3');\n\n\u002F\u002F Return for the 'code-data' token.\nreturn formatted;\n",[145,27985,27986,27991,28003,28007,28012,28059,28063,28067],{"__ignoreMap":67},[1332,27987,27988],{"class":2455,"line":2131},[1332,27989,27990],{"class":2609},"\u002F\u002F Data scraped from a page, e.g. \"01-02-2025\".\n",[1332,27992,27993,27995,27997,27999,28001],{"class":2455,"line":670},[1332,27994,2508],{"class":2507},[1332,27996,12298],{"class":2511},[1332,27998,2515],{"class":2507},[1332,28000,27715],{"class":2462},[1332,28002,4673],{"class":2521},[1332,28004,28005],{"class":2455,"line":68},[1332,28006,2588],{"emptyLinePlaceholder":75},[1332,28008,28009],{"class":2455,"line":1478},[1332,28010,28011],{"class":2609},"\u002F\u002F Reformat to \"01\u002F02\u002F2025\".\n",[1332,28013,28014,28016,28019,28021,28023,28025,28027,28030,28032,28035,28038,28040,28043,28045,28047,28049,28052,28054,28057],{"class":2455,"line":293},[1332,28015,2508],{"class":2507},[1332,28017,28018],{"class":2511}," formatted",[1332,28020,2515],{"class":2507},[1332,28022,26776],{"class":2521},[1332,28024,9105],{"class":2525},[1332,28026,1213],{"class":2521},[1332,28028,28029],{"class":2462},"\u002F(",[1332,28031,27746],{"class":2511},[1332,28033,28034],{"class":2507},"{4}",[1332,28036,28037],{"class":2462},")-(",[1332,28039,27746],{"class":2511},[1332,28041,28042],{"class":2507},"{2}",[1332,28044,28037],{"class":2462},[1332,28046,27746],{"class":2511},[1332,28048,28042],{"class":2507},[1332,28050,28051],{"class":2462},")\u002F",[1332,28053,4468],{"class":2521},[1332,28055,28056],{"class":2462},"'$1\u002F$2\u002F$3'",[1332,28058,2583],{"class":2521},[1332,28060,28061],{"class":2455,"line":2237},[1332,28062,2588],{"emptyLinePlaceholder":75},[1332,28064,28065],{"class":2455,"line":2623},[1332,28066,27765],{"class":2609},[1332,28068,28069,28071],{"class":2455,"line":2637},[1332,28070,12963],{"class":2507},[1332,28072,28073],{"class":2521}," formatted;\n",[2819,28075,28076],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sa8KN, html code.shiki .sa8KN{--shiki-default:#116329;--shiki-default-font-weight:bold;--shiki-dark:#7EE787;--shiki-dark-font-weight:bold}",{"title":67,"searchDepth":68,"depth":68,"links":28078},[28079,28080,28081,28082,28083,28084],{"id":26548,"depth":670,"text":26549},{"id":26823,"depth":670,"text":26824},{"id":26910,"depth":670,"text":26911},{"id":27135,"depth":670,"text":27136},{"id":27225,"depth":670,"text":27226},{"id":27670,"depth":670,"text":27671,"children":28085},[28086,28087,28088,28089],{"id":27684,"depth":68,"text":27685},{"id":27775,"depth":68,"text":27776},{"id":27863,"depth":68,"text":27864},{"id":27974,"depth":68,"text":27975},"JavaScript snippets for manipulating data in axiom.ai automations, including dates, timestamps, constants, CSV exports, and regex transformations.",{"metaTitle":28092},"JavaScript snippets for working with data in automations","\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fdata",{"title":26540,"description":28090},"docs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fdata","sWf3sFAjgBE_CHzWJZnwjjTpEXLd-TYd4GB20e_aYxs",{"id":28098,"title":28099,"body":28100,"date":71,"description":28163,"extension":73,"meta":28164,"navigation":75,"order":2131,"path":26355,"seo":28166,"stem":28167,"__hash__":28168},"content\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Findex.md","JavaScript snippets",{"type":8,"value":28101,"toc":28160},[28102,28109,28111,28113,28153],[26,28103,2273,28104,28108],{},[659,28105,28106],{"href":19048},[192,28107,19051],{}," step lets you extend axiom.ai with custom JavaScript. The snippets in this section cover common patterns you can drop straight into a step, organised by category.",[107,28110,26462],{"id":26461},[112,28112],{},[186,28114,28115,28120,28127,28133,28140,28146],{},[189,28116,28117,28119],{},[659,28118,581],{"href":28093}," for manipulating dates, scraped values, and CSV exports.",[189,28121,28122,28126],{},[659,28123,28125],{"href":28124},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Finteraction","Interaction"," for clicking, typing, and reaching into the Shadow DOM.",[189,28128,28129,28132],{},[659,28130,2851],{"href":28131},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fnavigation"," for moving through browser history.",[189,28134,28135,28139],{},[659,28136,28138],{"href":28137},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fnetwork","Network"," for capturing network requests.",[189,28141,28142,28145],{},[659,28143,17816],{"href":28144},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fscrape"," for pulling data from a page.",[189,28147,28148,28152],{},[659,28149,28151],{"href":28150},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fpage-manipulation","Page manipulation"," for hiding or modifying page elements.",[26,28154,2222,28155,2226,28157,148],{},[659,28156,2225],{"href":1887},[659,28158,2231],{"href":2229,"rel":28159},[1218],{"title":67,"searchDepth":68,"depth":68,"links":28161},[28162],{"id":26461,"depth":670,"text":26462},"Ready-to-use JavaScript snippets for the Write javascript step, organised by category covering data, interaction, navigation, network, and scraping.",{"metaTitle":28165},"JavaScript snippets for axiom.ai automations",{"title":28099,"description":28163},"docs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Findex","DLt2wr2MhixiQUoVwsT4d9Vg-pGCUmEIoXu3-jwupbM",{"id":28170,"title":28171,"body":28172,"date":71,"description":28982,"extension":73,"meta":28983,"navigation":75,"order":670,"path":28124,"seo":28985,"stem":28986,"__hash__":28987},"content\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Finteraction.md","Interaction snippets",{"type":8,"value":28173,"toc":28975},[28174,28182,28186,28188,28191,28358,28362,28364,28371,28569,28584,28588,28590,28593,28621,28644,28648,28650,28653,28754,28758,28760,28763,28818,28821,28965,28972],[26,28175,28176,28177,28181],{},"Interaction snippets drive elements on the current page. Most of these are covered by the ",[659,28178,28180],{"href":28179},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002F#interact","Interact step category",", but JavaScript is useful when the no-code steps can't reach what you need.",[107,28183,28185],{"id":28184},"click-a-button-by-text","Click a button by text",[112,28187],{},[26,28189,28190],{},"Find a button by its visible text, click it, wait 5 seconds, and repeat until the button is no longer on the page. Useful for \"Load more\" buttons that pull in more results each click:",[2446,28192,28194],{"className":2498,"code":28193,"language":2500,"meta":67,"style":67},"const delay = ms => new Promise(res => setTimeout(res, ms));\n\nlet element = document.evaluate(\n    \"\u002F\u002Fbutton[contains(., 'Load more')]\",\n    document,\n    null,\n    XPathResult.FIRST_ORDERED_NODE_TYPE\n).singleNodeValue;\n\nwhile (element) {\n    element.click();\n    await delay(5000);\n    element = document.evaluate(\n        \"\u002F\u002Fbutton[contains(., 'Load more')]\",\n        document,\n        null,\n        XPathResult.FIRST_ORDERED_NODE_TYPE\n    ).singleNodeValue;\n}\n",[145,28195,28196,28226,28230,28247,28254,28259,28265,28273,28278,28282,28289,28298,28310,28323,28330,28335,28342,28349,28354],{"__ignoreMap":67},[1332,28197,28198,28200,28203,28205,28208,28210,28212,28214,28216,28219,28221,28223],{"class":2455,"line":2131},[1332,28199,2508],{"class":2507},[1332,28201,28202],{"class":2525}," delay",[1332,28204,2515],{"class":2507},[1332,28206,28207],{"class":2458}," ms",[1332,28209,10271],{"class":2507},[1332,28211,2697],{"class":2507},[1332,28213,2700],{"class":2511},[1332,28215,1213],{"class":2521},[1332,28217,28218],{"class":2458},"res",[1332,28220,10271],{"class":2507},[1332,28222,2715],{"class":2525},[1332,28224,28225],{"class":2521},"(res, ms));\n",[1332,28227,28228],{"class":2455,"line":670},[1332,28229,2588],{"emptyLinePlaceholder":75},[1332,28231,28232,28234,28237,28239,28242,28245],{"class":2455,"line":68},[1332,28233,26696],{"class":2507},[1332,28235,28236],{"class":2521}," element ",[1332,28238,5110],{"class":2507},[1332,28240,28241],{"class":2521}," document.",[1332,28243,28244],{"class":2525},"evaluate",[1332,28246,4878],{"class":2521},[1332,28248,28249,28252],{"class":2455,"line":1478},[1332,28250,28251],{"class":2462},"    \"\u002F\u002Fbutton[contains(., 'Load more')]\"",[1332,28253,6024],{"class":2521},[1332,28255,28256],{"class":2455,"line":293},[1332,28257,28258],{"class":2521},"    document,\n",[1332,28260,28261,28263],{"class":2455,"line":2237},[1332,28262,18876],{"class":2511},[1332,28264,6024],{"class":2521},[1332,28266,28267,28270],{"class":2455,"line":2623},[1332,28268,28269],{"class":2521},"    XPathResult.",[1332,28271,28272],{"class":2511},"FIRST_ORDERED_NODE_TYPE\n",[1332,28274,28275],{"class":2455,"line":2637},[1332,28276,28277],{"class":2521},").singleNodeValue;\n",[1332,28279,28280],{"class":2455,"line":2642},[1332,28281,2588],{"emptyLinePlaceholder":75},[1332,28283,28284,28286],{"class":2455,"line":2651},[1332,28285,14422],{"class":2507},[1332,28287,28288],{"class":2521}," (element) {\n",[1332,28290,28291,28294,28296],{"class":2455,"line":2673},[1332,28292,28293],{"class":2521},"    element.",[1332,28295,5473],{"class":2525},[1332,28297,2670],{"class":2521},[1332,28299,28300,28302,28304,28306,28308],{"class":2455,"line":2692},[1332,28301,2676],{"class":2507},[1332,28303,28202],{"class":2525},[1332,28305,1213],{"class":2521},[1332,28307,2721],{"class":2511},[1332,28309,2583],{"class":2521},[1332,28311,28312,28315,28317,28319,28321],{"class":2455,"line":2727},[1332,28313,28314],{"class":2521},"    element ",[1332,28316,5110],{"class":2507},[1332,28318,28241],{"class":2521},[1332,28320,28244],{"class":2525},[1332,28322,4878],{"class":2521},[1332,28324,28325,28328],{"class":2455,"line":2739},[1332,28326,28327],{"class":2462},"        \"\u002F\u002Fbutton[contains(., 'Load more')]\"",[1332,28329,6024],{"class":2521},[1332,28331,28332],{"class":2455,"line":2750},[1332,28333,28334],{"class":2521},"        document,\n",[1332,28336,28337,28340],{"class":2455,"line":2765},[1332,28338,28339],{"class":2511},"        null",[1332,28341,6024],{"class":2521},[1332,28343,28344,28347],{"class":2455,"line":2777},[1332,28345,28346],{"class":2521},"        XPathResult.",[1332,28348,28272],{"class":2511},[1332,28350,28351],{"class":2455,"line":2788},[1332,28352,28353],{"class":2521},"    ).singleNodeValue;\n",[1332,28355,28356],{"class":2455,"line":2799},[1332,28357,2802],{"class":2521},[107,28359,28361],{"id":28360},"interact-with-a-dropdown-using-arrow-keys","Interact with a dropdown using arrow keys",[112,28363],{},[26,28365,28366,28367,28370],{},"For dropdowns the ",[192,28368,28369],{},"Select option"," step can't drive directly, simulate arrow-key presses instead. Open the dropdown first (with a click or by tabbing into it), then arrow down the right number of times:",[2446,28372,28374],{"className":2498,"code":28373,"language":2500,"meta":67,"style":67},"\u002F\u002F First either 1) click to open the difficult select-list,\n\u002F\u002F or 2) use the Tab key to focus the element.\nlet marital = 'Single';\n\nasync function arrowDownTimes(times) {\n    for (var i = 0; i \u003C times; i++) {\n        await page.keyboard.press('ArrowDown');\n        await page.waitForTimeout(250);\n    }\n}\n\nswitch (marital) {\n    case 'Married':\n        break;\n    case 'Single':\n        arrowDownTimes(1);\n        break;\n    case 'Divorced':\n        arrowDownTimes(2);\n        break;\n}\n",[145,28375,28376,28381,28386,28400,28404,28420,28445,28462,28478,28482,28486,28490,28498,28508,28515,28523,28534,28540,28549,28559,28565],{"__ignoreMap":67},[1332,28377,28378],{"class":2455,"line":2131},[1332,28379,28380],{"class":2609},"\u002F\u002F First either 1) click to open the difficult select-list,\n",[1332,28382,28383],{"class":2455,"line":670},[1332,28384,28385],{"class":2609},"\u002F\u002F or 2) use the Tab key to focus the element.\n",[1332,28387,28388,28390,28393,28395,28398],{"class":2455,"line":68},[1332,28389,26696],{"class":2507},[1332,28391,28392],{"class":2521}," marital ",[1332,28394,5110],{"class":2507},[1332,28396,28397],{"class":2462}," 'Single'",[1332,28399,4673],{"class":2521},[1332,28401,28402],{"class":2455,"line":1478},[1332,28403,2588],{"emptyLinePlaceholder":75},[1332,28405,28406,28408,28410,28413,28415,28418],{"class":2455,"line":293},[1332,28407,3332],{"class":2507},[1332,28409,6458],{"class":2507},[1332,28411,28412],{"class":2525}," arrowDownTimes",[1332,28414,1213],{"class":2521},[1332,28416,28417],{"class":2458},"times",[1332,28419,6473],{"class":2521},[1332,28421,28422,28424,28426,28428,28430,28432,28434,28436,28438,28441,28443],{"class":2455,"line":2237},[1332,28423,27021],{"class":2507},[1332,28425,3842],{"class":2521},[1332,28427,26760],{"class":2507},[1332,28429,26763],{"class":2521},[1332,28431,5110],{"class":2507},[1332,28433,26768],{"class":2511},[1332,28435,26771],{"class":2521},[1332,28437,23299],{"class":2507},[1332,28439,28440],{"class":2521}," times; i",[1332,28442,26784],{"class":2507},[1332,28444,6473],{"class":2521},[1332,28446,28447,28449,28452,28455,28457,28460],{"class":2455,"line":2623},[1332,28448,3659],{"class":2507},[1332,28450,28451],{"class":2521}," page.keyboard.",[1332,28453,28454],{"class":2525},"press",[1332,28456,1213],{"class":2521},[1332,28458,28459],{"class":2462},"'ArrowDown'",[1332,28461,2583],{"class":2521},[1332,28463,28464,28466,28468,28471,28473,28476],{"class":2455,"line":2637},[1332,28465,3659],{"class":2507},[1332,28467,2679],{"class":2521},[1332,28469,28470],{"class":2525},"waitForTimeout",[1332,28472,1213],{"class":2521},[1332,28474,28475],{"class":2511},"250",[1332,28477,2583],{"class":2521},[1332,28479,28480],{"class":2455,"line":2642},[1332,28481,3810],{"class":2521},[1332,28483,28484],{"class":2455,"line":2651},[1332,28485,2802],{"class":2521},[1332,28487,28488],{"class":2455,"line":2673},[1332,28489,2588],{"emptyLinePlaceholder":75},[1332,28491,28492,28495],{"class":2455,"line":2692},[1332,28493,28494],{"class":2507},"switch",[1332,28496,28497],{"class":2521}," (marital) {\n",[1332,28499,28500,28503,28506],{"class":2455,"line":2727},[1332,28501,28502],{"class":2507},"    case",[1332,28504,28505],{"class":2462}," 'Married'",[1332,28507,5786],{"class":2521},[1332,28509,28510,28513],{"class":2455,"line":2739},[1332,28511,28512],{"class":2507},"        break",[1332,28514,4673],{"class":2521},[1332,28516,28517,28519,28521],{"class":2455,"line":2750},[1332,28518,28502],{"class":2507},[1332,28520,28397],{"class":2462},[1332,28522,5786],{"class":2521},[1332,28524,28525,28528,28530,28532],{"class":2455,"line":2765},[1332,28526,28527],{"class":2525},"        arrowDownTimes",[1332,28529,1213],{"class":2521},[1332,28531,19338],{"class":2511},[1332,28533,2583],{"class":2521},[1332,28535,28536,28538],{"class":2455,"line":2777},[1332,28537,28512],{"class":2507},[1332,28539,4673],{"class":2521},[1332,28541,28542,28544,28547],{"class":2455,"line":2788},[1332,28543,28502],{"class":2507},[1332,28545,28546],{"class":2462}," 'Divorced'",[1332,28548,5786],{"class":2521},[1332,28550,28551,28553,28555,28557],{"class":2455,"line":2799},[1332,28552,28527],{"class":2525},[1332,28554,1213],{"class":2521},[1332,28556,22781],{"class":2511},[1332,28558,2583],{"class":2521},[1332,28560,28561,28563],{"class":2455,"line":3751},[1332,28562,28512],{"class":2507},[1332,28564,4673],{"class":2521},[1332,28566,28567],{"class":2455,"line":3762},[1332,28568,2802],{"class":2521},[2093,28570,28571],{},[26,28572,28573,28575,28576,28578,28579,28581,28582,15415],{},[192,28574,2359],{}," This snippet uses the ",[659,28577,26484],{"href":26483},", which means it only runs when ",[145,28580,26470],{}," is enabled on the ",[192,28583,19051],{},[107,28585,28587],{"id":28586},"enter-text-from-a-data-token","Enter text from a data token",[112,28589],{},[26,28591,28592],{},"Set the value of an input directly from a data token:",[2446,28594,28596],{"className":2498,"code":28595,"language":2500,"meta":67,"style":67},"document.querySelector('input[placeholder=\"Search the BBC\"]').value = '[custom-data]';\n",[145,28597,28598],{"__ignoreMap":67},[1332,28599,28600,28603,28606,28608,28611,28614,28616,28619],{"class":2455,"line":2131},[1332,28601,28602],{"class":2521},"document.",[1332,28604,28605],{"class":2525},"querySelector",[1332,28607,1213],{"class":2521},[1332,28609,28610],{"class":2462},"'input[placeholder=\"Search the BBC\"]'",[1332,28612,28613],{"class":2521},").value ",[1332,28615,5110],{"class":2507},[1332,28617,28618],{"class":2462}," '[custom-data]'",[1332,28620,4673],{"class":2521},[2093,28622,28623],{},[26,28624,28625,28627,28628,28631,28632,2344,28635,28638,28639,28643],{},[192,28626,2359],{}," Setting ",[145,28629,28630],{},".value"," directly bypasses any input event listeners on the field. If the page relies on ",[145,28633,28634],{},"input",[145,28636,28637],{},"change"," events firing (most modern frameworks do), use the ",[659,28640,28641],{"href":17231},[192,28642,16065],{}," step or dispatch the events manually after setting the value.",[107,28645,28647],{"id":28646},"reach-into-the-shadow-dom","Reach into the Shadow DOM",[112,28649],{},[26,28651,28652],{},"Some pages attach a Shadow DOM tree to an element, hiding the internals from regular JavaScript and CSS. The selector tool can't reach inside Shadow DOM, but you can drill in manually:",[2446,28654,28656],{"className":2498,"code":28655,"language":2500,"meta":67,"style":67},"const shadowHost = document.querySelector('\u003CSELECTOR>');\n\nif (shadowHost) {\n    const shadowRoot = shadowHost.shadowRoot;\n\n    \u002F\u002F Locate the element inside the shadow root that you want to interact with.\n    const innerElm = shadowRoot.querySelector('\u003CSELECTOR>');\n\n    if (innerElm) {\n        \u002F\u002F Example: innerElm.click();\n    }\n}\n",[145,28657,28658,28678,28682,28689,28701,28705,28710,28730,28734,28741,28746,28750],{"__ignoreMap":67},[1332,28659,28660,28662,28665,28667,28669,28671,28673,28676],{"class":2455,"line":2131},[1332,28661,2508],{"class":2507},[1332,28663,28664],{"class":2511}," shadowHost",[1332,28666,2515],{"class":2507},[1332,28668,28241],{"class":2521},[1332,28670,28605],{"class":2525},[1332,28672,1213],{"class":2521},[1332,28674,28675],{"class":2462},"'\u003CSELECTOR>'",[1332,28677,2583],{"class":2521},[1332,28679,28680],{"class":2455,"line":670},[1332,28681,2588],{"emptyLinePlaceholder":75},[1332,28683,28684,28686],{"class":2455,"line":68},[1332,28685,6072],{"class":2507},[1332,28687,28688],{"class":2521}," (shadowHost) {\n",[1332,28690,28691,28693,28696,28698],{"class":2455,"line":1478},[1332,28692,2654],{"class":2507},[1332,28694,28695],{"class":2511}," shadowRoot",[1332,28697,2515],{"class":2507},[1332,28699,28700],{"class":2521}," shadowHost.shadowRoot;\n",[1332,28702,28703],{"class":2455,"line":293},[1332,28704,2588],{"emptyLinePlaceholder":75},[1332,28706,28707],{"class":2455,"line":2237},[1332,28708,28709],{"class":2609},"    \u002F\u002F Locate the element inside the shadow root that you want to interact with.\n",[1332,28711,28712,28714,28717,28719,28722,28724,28726,28728],{"class":2455,"line":2623},[1332,28713,2654],{"class":2507},[1332,28715,28716],{"class":2511}," innerElm",[1332,28718,2515],{"class":2507},[1332,28720,28721],{"class":2521}," shadowRoot.",[1332,28723,28605],{"class":2525},[1332,28725,1213],{"class":2521},[1332,28727,28675],{"class":2462},[1332,28729,2583],{"class":2521},[1332,28731,28732],{"class":2455,"line":2637},[1332,28733,2588],{"emptyLinePlaceholder":75},[1332,28735,28736,28738],{"class":2455,"line":2642},[1332,28737,5840],{"class":2507},[1332,28739,28740],{"class":2521}," (innerElm) {\n",[1332,28742,28743],{"class":2455,"line":2651},[1332,28744,28745],{"class":2609},"        \u002F\u002F Example: innerElm.click();\n",[1332,28747,28748],{"class":2455,"line":2673},[1332,28749,3810],{"class":2521},[1332,28751,28752],{"class":2455,"line":2692},[1332,28753,2802],{"class":2521},[107,28755,28757],{"id":28756},"add-an-event-listener","Add an event listener",[112,28759],{},[26,28761,28762],{},"Run code in response to events on the page. The example logs to the console every time an element is clicked:",[2446,28764,28766],{"className":2498,"code":28765,"language":2500,"meta":67,"style":67},"document.getElementById('custom-element').addEventListener('click', (e) => {\n    console.log('Custom element clicked');\n});\n",[145,28767,28768,28801,28814],{"__ignoreMap":67},[1332,28769,28770,28772,28775,28777,28780,28782,28785,28787,28790,28792,28795,28797,28799],{"class":2455,"line":2131},[1332,28771,28602],{"class":2521},[1332,28773,28774],{"class":2525},"getElementById",[1332,28776,1213],{"class":2521},[1332,28778,28779],{"class":2462},"'custom-element'",[1332,28781,3696],{"class":2521},[1332,28783,28784],{"class":2525},"addEventListener",[1332,28786,1213],{"class":2521},[1332,28788,28789],{"class":2462},"'click'",[1332,28791,27520],{"class":2521},[1332,28793,28794],{"class":2458},"e",[1332,28796,2709],{"class":2521},[1332,28798,2712],{"class":2507},[1332,28800,2648],{"class":2521},[1332,28802,28803,28805,28807,28809,28812],{"class":2455,"line":670},[1332,28804,2753],{"class":2521},[1332,28806,2575],{"class":2525},[1332,28808,1213],{"class":2521},[1332,28810,28811],{"class":2462},"'Custom element clicked'",[1332,28813,2583],{"class":2521},[1332,28815,28816],{"class":2455,"line":68},[1332,28817,2542],{"class":2521},[26,28819,28820],{},"You can also dispatch your own custom events:",[2446,28822,28824],{"className":2498,"code":28823,"language":2500,"meta":67,"style":67},"document.addEventListener('my-custom-listener', (e) => {\n    console.log('Custom event triggered:', e.detail);\n});\n\n\u002F\u002F Trigger the listener manually.\ndocument.dispatchEvent(new CustomEvent('my-custom-listener', { detail: { data: 'Test data' } }));\n\n\u002F\u002F Or trigger it from another listener.\ndocument.getElementById('custom-element').addEventListener('click', (e) => {\n    document.dispatchEvent(new CustomEvent('my-custom-listener', { detail: { data: 'Test data' } }));\n});\n",[145,28825,28826,28847,28861,28865,28869,28874,28901,28905,28910,28938,28961],{"__ignoreMap":67},[1332,28827,28828,28830,28832,28834,28837,28839,28841,28843,28845],{"class":2455,"line":2131},[1332,28829,28602],{"class":2521},[1332,28831,28784],{"class":2525},[1332,28833,1213],{"class":2521},[1332,28835,28836],{"class":2462},"'my-custom-listener'",[1332,28838,27520],{"class":2521},[1332,28840,28794],{"class":2458},[1332,28842,2709],{"class":2521},[1332,28844,2712],{"class":2507},[1332,28846,2648],{"class":2521},[1332,28848,28849,28851,28853,28855,28858],{"class":2455,"line":670},[1332,28850,2753],{"class":2521},[1332,28852,2575],{"class":2525},[1332,28854,1213],{"class":2521},[1332,28856,28857],{"class":2462},"'Custom event triggered:'",[1332,28859,28860],{"class":2521},", e.detail);\n",[1332,28862,28863],{"class":2455,"line":68},[1332,28864,2542],{"class":2521},[1332,28866,28867],{"class":2455,"line":1478},[1332,28868,2588],{"emptyLinePlaceholder":75},[1332,28870,28871],{"class":2455,"line":293},[1332,28872,28873],{"class":2609},"\u002F\u002F Trigger the listener manually.\n",[1332,28875,28876,28878,28881,28883,28885,28888,28890,28892,28895,28898],{"class":2455,"line":2237},[1332,28877,28602],{"class":2521},[1332,28879,28880],{"class":2525},"dispatchEvent",[1332,28882,1213],{"class":2521},[1332,28884,7049],{"class":2507},[1332,28886,28887],{"class":2525}," CustomEvent",[1332,28889,1213],{"class":2521},[1332,28891,28836],{"class":2462},[1332,28893,28894],{"class":2521},", { detail: { data: ",[1332,28896,28897],{"class":2462},"'Test data'",[1332,28899,28900],{"class":2521}," } }));\n",[1332,28902,28903],{"class":2455,"line":2623},[1332,28904,2588],{"emptyLinePlaceholder":75},[1332,28906,28907],{"class":2455,"line":2637},[1332,28908,28909],{"class":2609},"\u002F\u002F Or trigger it from another listener.\n",[1332,28911,28912,28914,28916,28918,28920,28922,28924,28926,28928,28930,28932,28934,28936],{"class":2455,"line":2642},[1332,28913,28602],{"class":2521},[1332,28915,28774],{"class":2525},[1332,28917,1213],{"class":2521},[1332,28919,28779],{"class":2462},[1332,28921,3696],{"class":2521},[1332,28923,28784],{"class":2525},[1332,28925,1213],{"class":2521},[1332,28927,28789],{"class":2462},[1332,28929,27520],{"class":2521},[1332,28931,28794],{"class":2458},[1332,28933,2709],{"class":2521},[1332,28935,2712],{"class":2507},[1332,28937,2648],{"class":2521},[1332,28939,28940,28943,28945,28947,28949,28951,28953,28955,28957,28959],{"class":2455,"line":2651},[1332,28941,28942],{"class":2521},"    document.",[1332,28944,28880],{"class":2525},[1332,28946,1213],{"class":2521},[1332,28948,7049],{"class":2507},[1332,28950,28887],{"class":2525},[1332,28952,1213],{"class":2521},[1332,28954,28836],{"class":2462},[1332,28956,28894],{"class":2521},[1332,28958,28897],{"class":2462},[1332,28960,28900],{"class":2521},[1332,28962,28963],{"class":2455,"line":2673},[1332,28964,2542],{"class":2521},[2093,28966,28967],{},[26,28968,28969,28971],{},[192,28970,2359],{}," Event listeners don't survive page navigations. If the automation moves to a new page, you'll need to set the listeners up again.",[2819,28973,28974],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}",{"title":67,"searchDepth":68,"depth":68,"links":28976},[28977,28978,28979,28980,28981],{"id":28184,"depth":670,"text":28185},{"id":28360,"depth":670,"text":28361},{"id":28586,"depth":670,"text":28587},{"id":28646,"depth":670,"text":28647},{"id":28756,"depth":670,"text":28757},"JavaScript snippets for interacting with page elements in axiom.ai automations, including clicks, dropdowns, text entry, Shadow DOM access, and event listeners.",{"metaTitle":28984},"JavaScript snippets for clicking, typing, and Shadow DOM",{"title":28171,"description":28982},"docs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Finteraction","Mn2ZSJU4oI7zlu6biqU68vn4OmYIG_Q2oByVO3B3i7I",{"id":28989,"title":28990,"body":28991,"date":71,"description":29056,"extension":73,"meta":29057,"navigation":75,"order":68,"path":28131,"seo":29059,"stem":29060,"__hash__":29061},"content\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fnavigation.md","Navigation snippets",{"type":8,"value":28992,"toc":29053},[28993,28996,29000,29002,29012,29027,29030,29050],[26,28994,28995],{},"Navigation snippets move the current tab through its history.",[107,28997,28999],{"id":28998},"move-through-browser-history","Move through browser history",[112,29001],{},[26,29003,29004,29005,29011],{},"Go back one page, equivalent to the ",[659,29006,29008],{"href":29007},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fback",[192,29009,29010],{},"Back"," step but available in JavaScript:",[2446,29013,29015],{"className":2498,"code":29014,"language":2500,"meta":67,"style":67},"window.history.back();\n",[145,29016,29017],{"__ignoreMap":67},[1332,29018,29019,29022,29025],{"class":2455,"line":2131},[1332,29020,29021],{"class":2521},"window.history.",[1332,29023,29024],{"class":2525},"back",[1332,29026,2670],{"class":2521},[26,29028,29029],{},"Go back a specific number of pages. The argument is a negative number for backward navigation, positive for forward:",[2446,29031,29033],{"className":2498,"code":29032,"language":2500,"meta":67,"style":67},"window.history.go(-2);\n",[145,29034,29035],{"__ignoreMap":67},[1332,29036,29037,29039,29042,29044,29046,29048],{"class":2455,"line":2131},[1332,29038,29021],{"class":2521},[1332,29040,29041],{"class":2525},"go",[1332,29043,1213],{"class":2521},[1332,29045,9555],{"class":2507},[1332,29047,22781],{"class":2511},[1332,29049,2583],{"class":2521},[2819,29051,29052],{},"html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}",{"title":67,"searchDepth":68,"depth":68,"links":29054},[29055],{"id":28998,"depth":670,"text":28999},"JavaScript snippets for moving through browser history in axiom.ai automations, including going back one or several pages.",{"metaTitle":29058},"JavaScript snippets for browser history navigation",{"title":28990,"description":29056},"docs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fnavigation","77KXLhRor2B1X6mofMulUPr7UAwYRu4asWE80OtLEds",{"id":29063,"title":29064,"body":29065,"date":71,"description":29186,"extension":73,"meta":29187,"navigation":75,"order":1478,"path":28137,"seo":29189,"stem":29190,"__hash__":29191},"content\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fnetwork.md","Network snippets",{"type":8,"value":29066,"toc":29183},[29067,29070,29074,29076,29090,29174,29180],[26,29068,29069],{},"Network snippets help you inspect, log, and react to the requests a page makes during a run.",[107,29071,29073],{"id":29072},"capture-network-requests","Capture network requests",[112,29075],{},[26,29077,29078,29079,29084,29085,29089],{},"Capture every network request a page has made using the ",[659,29080,29083],{"href":29081,"rel":29082},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FPerformance",[1218],"Performance API",". Add this snippet after a ",[659,29086,29087],{"href":17846},[192,29088,17849],{}," step:",[2446,29091,29093],{"className":2498,"code":29092,"language":2500,"meta":67,"style":67},"var resources = [];\nconst entries = window.performance.getEntriesByType('resource');\n\nentries.forEach(entry => {\n    resources.push([entry.entryType, entry.name]);\n});\n\nreturn resources;\n",[145,29094,29095,29107,29129,29133,29149,29159,29163,29167],{"__ignoreMap":67},[1332,29096,29097,29099,29102,29104],{"class":2455,"line":2131},[1332,29098,26760],{"class":2507},[1332,29100,29101],{"class":2521}," resources ",[1332,29103,5110],{"class":2507},[1332,29105,29106],{"class":2521}," [];\n",[1332,29108,29109,29111,29114,29116,29119,29122,29124,29127],{"class":2455,"line":670},[1332,29110,2508],{"class":2507},[1332,29112,29113],{"class":2511}," entries",[1332,29115,2515],{"class":2507},[1332,29117,29118],{"class":2521}," window.performance.",[1332,29120,29121],{"class":2525},"getEntriesByType",[1332,29123,1213],{"class":2521},[1332,29125,29126],{"class":2462},"'resource'",[1332,29128,2583],{"class":2521},[1332,29130,29131],{"class":2455,"line":68},[1332,29132,2588],{"emptyLinePlaceholder":75},[1332,29134,29135,29138,29140,29142,29145,29147],{"class":2455,"line":1478},[1332,29136,29137],{"class":2521},"entries.",[1332,29139,13486],{"class":2525},[1332,29141,1213],{"class":2521},[1332,29143,29144],{"class":2458},"entry",[1332,29146,10271],{"class":2507},[1332,29148,2648],{"class":2521},[1332,29150,29151,29154,29156],{"class":2455,"line":293},[1332,29152,29153],{"class":2521},"    resources.",[1332,29155,26794],{"class":2525},[1332,29157,29158],{"class":2521},"([entry.entryType, entry.name]);\n",[1332,29160,29161],{"class":2455,"line":2237},[1332,29162,2542],{"class":2521},[1332,29164,29165],{"class":2455,"line":2623},[1332,29166,2588],{"emptyLinePlaceholder":75},[1332,29168,29169,29171],{"class":2455,"line":2637},[1332,29170,12963],{"class":2507},[1332,29172,29173],{"class":2521}," resources;\n",[26,29175,29176,29177,29179],{},"The list of resources is available in the ",[145,29178,27107],{}," token for use in later steps.",[2819,29181,29182],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":67,"searchDepth":68,"depth":68,"links":29184},[29185],{"id":29072,"depth":670,"text":29073},"JavaScript snippets for inspecting and capturing network activity in axiom.ai automations using the Performance API.",{"metaTitle":29188},"JavaScript snippets for capturing network requests",{"title":29064,"description":29186},"docs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fnetwork","eZIRGuwkE71r32hkaxpDrW8bbDAHv-2eA9gOLSMUxIs",{"id":29193,"title":29194,"body":29195,"date":71,"description":29312,"extension":73,"meta":29313,"navigation":75,"order":293,"path":28150,"seo":29315,"stem":29316,"__hash__":29317},"content\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fpage-manipulation.md","Page manipulation snippets",{"type":8,"value":29196,"toc":29309},[29197,29200,29204,29206,29209,29234,29237,29306],[26,29198,29199],{},"Page manipulation snippets modify the current page directly, useful when something on the page (a popup, an overlay, an autoplaying video) is getting in the automation's way.",[107,29201,29203],{"id":29202},"hide-page-elements","Hide page elements",[112,29205],{},[26,29207,29208],{},"Hide the first element matching a selector. Useful for popups or overlays that block elements you need to click:",[2446,29210,29212],{"className":2498,"code":29211,"language":2500,"meta":67,"style":67},"document.querySelector('\u003CSELECTOR>').style.display = 'none';\n",[145,29213,29214],{"__ignoreMap":67},[1332,29215,29216,29218,29220,29222,29224,29227,29229,29232],{"class":2455,"line":2131},[1332,29217,28602],{"class":2521},[1332,29219,28605],{"class":2525},[1332,29221,1213],{"class":2521},[1332,29223,28675],{"class":2462},[1332,29225,29226],{"class":2521},").style.display ",[1332,29228,5110],{"class":2507},[1332,29230,29231],{"class":2462}," 'none'",[1332,29233,4673],{"class":2521},[26,29235,29236],{},"Hide every element matching a selector:",[2446,29238,29240],{"className":2498,"code":29239,"language":2500,"meta":67,"style":67},"var els = document.querySelectorAll('\u003CSELECTOR>');\nfor (var i = 0; i \u003C els.length; i++) {\n    els[i].style.display = 'none';\n}\n",[145,29241,29242,29262,29291,29302],{"__ignoreMap":67},[1332,29243,29244,29246,29249,29251,29253,29256,29258,29260],{"class":2455,"line":2131},[1332,29245,26760],{"class":2507},[1332,29247,29248],{"class":2521}," els ",[1332,29250,5110],{"class":2507},[1332,29252,28241],{"class":2521},[1332,29254,29255],{"class":2525},"querySelectorAll",[1332,29257,1213],{"class":2521},[1332,29259,28675],{"class":2462},[1332,29261,2583],{"class":2521},[1332,29263,29264,29266,29268,29270,29272,29274,29276,29278,29280,29283,29285,29287,29289],{"class":2455,"line":670},[1332,29265,22087],{"class":2507},[1332,29267,3842],{"class":2521},[1332,29269,26760],{"class":2507},[1332,29271,26763],{"class":2521},[1332,29273,5110],{"class":2507},[1332,29275,26768],{"class":2511},[1332,29277,26771],{"class":2521},[1332,29279,23299],{"class":2507},[1332,29281,29282],{"class":2521}," els.",[1332,29284,13473],{"class":2511},[1332,29286,26781],{"class":2521},[1332,29288,26784],{"class":2507},[1332,29290,6473],{"class":2521},[1332,29292,29293,29296,29298,29300],{"class":2455,"line":68},[1332,29294,29295],{"class":2521},"    els[i].style.display ",[1332,29297,5110],{"class":2507},[1332,29299,29231],{"class":2462},[1332,29301,4673],{"class":2521},[1332,29303,29304],{"class":2455,"line":1478},[1332,29305,2802],{"class":2521},[2819,29307,29308],{},"html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}",{"title":67,"searchDepth":68,"depth":68,"links":29310},[29311],{"id":29202,"depth":670,"text":29203},"JavaScript snippets for manipulating the current page during an axiom.ai automation, including hiding elements that block other interactions.",{"metaTitle":29314},"JavaScript snippets for hiding and modifying page elements",{"title":29194,"description":29312},"docs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fpage-manipulation","spfJjMjX99cGkty0G3Tvsa2TDZTA1q6Wzv0JTKilTnU",{"id":29319,"title":29320,"body":29321,"date":71,"description":29927,"extension":73,"meta":29928,"navigation":75,"order":2237,"path":28144,"seo":29930,"stem":29931,"__hash__":29932},"content\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fscrape.md","Scrape snippets",{"type":8,"value":29322,"toc":29921},[29323,29326,29330,29332,29335,29583,29587,29589,29598,29690,29694,29696,29699,29721,29725,29727,29730,29733,29774,29777,29901,29918],[26,29324,29325],{},"Scrape snippets pull data out of the current page when the no-code scrape steps don't fit the shape of the data.",[107,29327,29329],{"id":29328},"scrape-an-html-table","Scrape an HTML table",[112,29331],{},[26,29333,29334],{},"Pull header cells and row data from an HTML table, returning headers and rows as a single 2D array ready to write to a Google Sheet:",[2446,29336,29338],{"className":2498,"code":29337,"language":2500,"meta":67,"style":67},"const headers = Array.prototype.map.call(\n    document.querySelectorAll('#org-insight__a11y-table tr'),\n    function (tr) {\n        return Array.prototype.map.call(tr.querySelectorAll('th'), function (th) {\n            return th.textContent.trim();\n        });\n    }\n);\n\nconst table = Array.prototype.map.call(\n    document.querySelectorAll('#org-insight__a11y-table tr'),\n    function (tr) {\n        return Array.prototype.map.call(tr.querySelectorAll('td'), function (td) {\n            return td.textContent.trim();\n        });\n    }\n);\n\nconst data = headers.concat(table);\n\nreturn data;\n",[145,29339,29340,29365,29379,29390,29424,29436,29441,29445,29449,29453,29474,29486,29496,29529,29540,29544,29548,29552,29556,29573,29577],{"__ignoreMap":67},[1332,29341,29342,29344,29347,29349,29352,29354,29357,29360,29363],{"class":2455,"line":2131},[1332,29343,2508],{"class":2507},[1332,29345,29346],{"class":2511}," headers",[1332,29348,2515],{"class":2507},[1332,29350,29351],{"class":2511}," Array",[1332,29353,148],{"class":2521},[1332,29355,29356],{"class":2511},"prototype",[1332,29358,29359],{"class":2521},".map.",[1332,29361,29362],{"class":2525},"call",[1332,29364,4878],{"class":2521},[1332,29366,29367,29369,29371,29373,29376],{"class":2455,"line":670},[1332,29368,28942],{"class":2521},[1332,29370,29255],{"class":2525},[1332,29372,1213],{"class":2521},[1332,29374,29375],{"class":2462},"'#org-insight__a11y-table tr'",[1332,29377,29378],{"class":2521},"),\n",[1332,29380,29381,29384,29386,29388],{"class":2455,"line":68},[1332,29382,29383],{"class":2507},"    function",[1332,29385,3842],{"class":2521},[1332,29387,4595],{"class":2458},[1332,29389,6473],{"class":2521},[1332,29391,29392,29394,29396,29398,29400,29402,29404,29407,29409,29411,29414,29416,29418,29420,29422],{"class":2455,"line":1478},[1332,29393,5936],{"class":2507},[1332,29395,29351],{"class":2511},[1332,29397,148],{"class":2521},[1332,29399,29356],{"class":2511},[1332,29401,29359],{"class":2521},[1332,29403,29362],{"class":2525},[1332,29405,29406],{"class":2521},"(tr.",[1332,29408,29255],{"class":2525},[1332,29410,1213],{"class":2521},[1332,29412,29413],{"class":2462},"'th'",[1332,29415,22585],{"class":2521},[1332,29417,27275],{"class":2507},[1332,29419,3842],{"class":2521},[1332,29421,4598],{"class":2458},[1332,29423,6473],{"class":2521},[1332,29425,29426,29428,29431,29434],{"class":2455,"line":293},[1332,29427,27412],{"class":2507},[1332,29429,29430],{"class":2521}," th.textContent.",[1332,29432,29433],{"class":2525},"trim",[1332,29435,2670],{"class":2521},[1332,29437,29438],{"class":2455,"line":2237},[1332,29439,29440],{"class":2521},"        });\n",[1332,29442,29443],{"class":2455,"line":2623},[1332,29444,3810],{"class":2521},[1332,29446,29447],{"class":2455,"line":2637},[1332,29448,2583],{"class":2521},[1332,29450,29451],{"class":2455,"line":2642},[1332,29452,2588],{"emptyLinePlaceholder":75},[1332,29454,29455,29457,29460,29462,29464,29466,29468,29470,29472],{"class":2455,"line":2651},[1332,29456,2508],{"class":2507},[1332,29458,29459],{"class":2511}," table",[1332,29461,2515],{"class":2507},[1332,29463,29351],{"class":2511},[1332,29465,148],{"class":2521},[1332,29467,29356],{"class":2511},[1332,29469,29359],{"class":2521},[1332,29471,29362],{"class":2525},[1332,29473,4878],{"class":2521},[1332,29475,29476,29478,29480,29482,29484],{"class":2455,"line":2673},[1332,29477,28942],{"class":2521},[1332,29479,29255],{"class":2525},[1332,29481,1213],{"class":2521},[1332,29483,29375],{"class":2462},[1332,29485,29378],{"class":2521},[1332,29487,29488,29490,29492,29494],{"class":2455,"line":2692},[1332,29489,29383],{"class":2507},[1332,29491,3842],{"class":2521},[1332,29493,4595],{"class":2458},[1332,29495,6473],{"class":2521},[1332,29497,29498,29500,29502,29504,29506,29508,29510,29512,29514,29516,29519,29521,29523,29525,29527],{"class":2455,"line":2727},[1332,29499,5936],{"class":2507},[1332,29501,29351],{"class":2511},[1332,29503,148],{"class":2521},[1332,29505,29356],{"class":2511},[1332,29507,29359],{"class":2521},[1332,29509,29362],{"class":2525},[1332,29511,29406],{"class":2521},[1332,29513,29255],{"class":2525},[1332,29515,1213],{"class":2521},[1332,29517,29518],{"class":2462},"'td'",[1332,29520,22585],{"class":2521},[1332,29522,27275],{"class":2507},[1332,29524,3842],{"class":2521},[1332,29526,4610],{"class":2458},[1332,29528,6473],{"class":2521},[1332,29530,29531,29533,29536,29538],{"class":2455,"line":2739},[1332,29532,27412],{"class":2507},[1332,29534,29535],{"class":2521}," td.textContent.",[1332,29537,29433],{"class":2525},[1332,29539,2670],{"class":2521},[1332,29541,29542],{"class":2455,"line":2750},[1332,29543,29440],{"class":2521},[1332,29545,29546],{"class":2455,"line":2765},[1332,29547,3810],{"class":2521},[1332,29549,29550],{"class":2455,"line":2777},[1332,29551,2583],{"class":2521},[1332,29553,29554],{"class":2455,"line":2788},[1332,29555,2588],{"emptyLinePlaceholder":75},[1332,29557,29558,29560,29562,29564,29567,29570],{"class":2455,"line":2799},[1332,29559,2508],{"class":2507},[1332,29561,12298],{"class":2511},[1332,29563,2515],{"class":2507},[1332,29565,29566],{"class":2521}," headers.",[1332,29568,29569],{"class":2525},"concat",[1332,29571,29572],{"class":2521},"(table);\n",[1332,29574,29575],{"class":2455,"line":3751},[1332,29576,2588],{"emptyLinePlaceholder":75},[1332,29578,29579,29581],{"class":2455,"line":3762},[1332,29580,12963],{"class":2507},[1332,29582,26812],{"class":2521},[107,29584,29586],{"id":29585},"scrape-element-attributes","Scrape element attributes",[112,29588],{},[26,29590,29591,29592,29594,29595,29597],{},"Pull a specific attribute from every element matching a selector. The example collects the ",[145,29593,6802],{}," attribute from every ",[145,29596,28634],{}," inside a div:",[2446,29599,29601],{"className":2498,"code":29600,"language":2500,"meta":67,"style":67},"let results = [];\nlet els = document.querySelectorAll('div:nth-child(1) > input');\n\nfor (const el of els) {\n    results.push([el.getAttribute('name')]);\n}\n\nreturn results;\n",[145,29602,29603,29614,29633,29637,29654,29675,29679,29683],{"__ignoreMap":67},[1332,29604,29605,29607,29610,29612],{"class":2455,"line":2131},[1332,29606,26696],{"class":2507},[1332,29608,29609],{"class":2521}," results ",[1332,29611,5110],{"class":2507},[1332,29613,29106],{"class":2521},[1332,29615,29616,29618,29620,29622,29624,29626,29628,29631],{"class":2455,"line":670},[1332,29617,26696],{"class":2507},[1332,29619,29248],{"class":2521},[1332,29621,5110],{"class":2507},[1332,29623,28241],{"class":2521},[1332,29625,29255],{"class":2525},[1332,29627,1213],{"class":2521},[1332,29629,29630],{"class":2462},"'div:nth-child(1) > input'",[1332,29632,2583],{"class":2521},[1332,29634,29635],{"class":2455,"line":68},[1332,29636,2588],{"emptyLinePlaceholder":75},[1332,29638,29639,29641,29643,29645,29648,29651],{"class":2455,"line":1478},[1332,29640,22087],{"class":2507},[1332,29642,3842],{"class":2521},[1332,29644,2508],{"class":2507},[1332,29646,29647],{"class":2511}," el",[1332,29649,29650],{"class":2507}," of",[1332,29652,29653],{"class":2521}," els) {\n",[1332,29655,29656,29659,29661,29664,29667,29669,29672],{"class":2455,"line":293},[1332,29657,29658],{"class":2521},"    results.",[1332,29660,26794],{"class":2525},[1332,29662,29663],{"class":2521},"([el.",[1332,29665,29666],{"class":2525},"getAttribute",[1332,29668,1213],{"class":2521},[1332,29670,29671],{"class":2462},"'name'",[1332,29673,29674],{"class":2521},")]);\n",[1332,29676,29677],{"class":2455,"line":2237},[1332,29678,2802],{"class":2521},[1332,29680,29681],{"class":2455,"line":2623},[1332,29682,2588],{"emptyLinePlaceholder":75},[1332,29684,29685,29687],{"class":2455,"line":2637},[1332,29686,12963],{"class":2507},[1332,29688,29689],{"class":2521}," results;\n",[107,29691,29693],{"id":29692},"scrape-the-entire-page-body","Scrape the entire page body",[112,29695],{},[26,29697,29698],{},"Return the page's full HTML, useful for AI-driven extraction or downstream parsing:",[2446,29700,29702],{"className":2498,"code":29701,"language":2500,"meta":67,"style":67},"return [[document.querySelector('body').innerHTML]];\n",[145,29703,29704],{"__ignoreMap":67},[1332,29705,29706,29708,29711,29713,29715,29718],{"class":2455,"line":2131},[1332,29707,12963],{"class":2507},[1332,29709,29710],{"class":2521}," [[document.",[1332,29712,28605],{"class":2525},[1332,29714,1213],{"class":2521},[1332,29716,29717],{"class":2462},"'body'",[1332,29719,29720],{"class":2521},").innerHTML]];\n",[107,29722,29724],{"id":29723},"get-meta-tags-from-a-page","Get meta tags from a page",[112,29726],{},[26,29728,29729],{},"Read meta tags (Open Graph and others) from the current page. Make sure the automation is on the page you want to scrape before this snippet runs.",[26,29731,29732],{},"Return a single meta attribute by name:",[2446,29734,29736],{"className":2498,"code":29735,"language":2500,"meta":67,"style":67},"let ogTitle = document.querySelector(\"meta[property='og:title']\").getAttribute('content');\nreturn ogTitle;\n",[145,29737,29738,29767],{"__ignoreMap":67},[1332,29739,29740,29742,29745,29747,29749,29751,29753,29756,29758,29760,29762,29765],{"class":2455,"line":2131},[1332,29741,26696],{"class":2507},[1332,29743,29744],{"class":2521}," ogTitle ",[1332,29746,5110],{"class":2507},[1332,29748,28241],{"class":2521},[1332,29750,28605],{"class":2525},[1332,29752,1213],{"class":2521},[1332,29754,29755],{"class":2462},"\"meta[property='og:title']\"",[1332,29757,3696],{"class":2521},[1332,29759,29666],{"class":2525},[1332,29761,1213],{"class":2521},[1332,29763,29764],{"class":2462},"'content'",[1332,29766,2583],{"class":2521},[1332,29768,29769,29771],{"class":2455,"line":670},[1332,29770,12963],{"class":2507},[1332,29772,29773],{"class":2521}," ogTitle;\n",[26,29775,29776],{},"Return the name and content of every meta tag on the page:",[2446,29778,29780],{"className":2498,"code":29779,"language":2500,"meta":67,"style":67},"let metaTags = document.getElementsByTagName('meta');\nlet metaContent = [];\n\nfor (var i = 0; i \u003C metaTags.length; i++) {\n    metaContent.push([\n        metaTags[i].getAttribute('name'),\n        metaTags[i].getAttribute('content')\n    ]);\n}\n\nreturn metaContent;\n",[145,29781,29782,29803,29814,29818,29847,29856,29869,29881,29886,29890,29894],{"__ignoreMap":67},[1332,29783,29784,29786,29789,29791,29793,29796,29798,29801],{"class":2455,"line":2131},[1332,29785,26696],{"class":2507},[1332,29787,29788],{"class":2521}," metaTags ",[1332,29790,5110],{"class":2507},[1332,29792,28241],{"class":2521},[1332,29794,29795],{"class":2525},"getElementsByTagName",[1332,29797,1213],{"class":2521},[1332,29799,29800],{"class":2462},"'meta'",[1332,29802,2583],{"class":2521},[1332,29804,29805,29807,29810,29812],{"class":2455,"line":670},[1332,29806,26696],{"class":2507},[1332,29808,29809],{"class":2521}," metaContent ",[1332,29811,5110],{"class":2507},[1332,29813,29106],{"class":2521},[1332,29815,29816],{"class":2455,"line":68},[1332,29817,2588],{"emptyLinePlaceholder":75},[1332,29819,29820,29822,29824,29826,29828,29830,29832,29834,29836,29839,29841,29843,29845],{"class":2455,"line":1478},[1332,29821,22087],{"class":2507},[1332,29823,3842],{"class":2521},[1332,29825,26760],{"class":2507},[1332,29827,26763],{"class":2521},[1332,29829,5110],{"class":2507},[1332,29831,26768],{"class":2511},[1332,29833,26771],{"class":2521},[1332,29835,23299],{"class":2507},[1332,29837,29838],{"class":2521}," metaTags.",[1332,29840,13473],{"class":2511},[1332,29842,26781],{"class":2521},[1332,29844,26784],{"class":2507},[1332,29846,6473],{"class":2521},[1332,29848,29849,29852,29854],{"class":2455,"line":293},[1332,29850,29851],{"class":2521},"    metaContent.",[1332,29853,26794],{"class":2525},[1332,29855,20665],{"class":2521},[1332,29857,29858,29861,29863,29865,29867],{"class":2455,"line":2237},[1332,29859,29860],{"class":2521},"        metaTags[i].",[1332,29862,29666],{"class":2525},[1332,29864,1213],{"class":2521},[1332,29866,29671],{"class":2462},[1332,29868,29378],{"class":2521},[1332,29870,29871,29873,29875,29877,29879],{"class":2455,"line":2623},[1332,29872,29860],{"class":2521},[1332,29874,29666],{"class":2525},[1332,29876,1213],{"class":2521},[1332,29878,29764],{"class":2462},[1332,29880,5174],{"class":2521},[1332,29882,29883],{"class":2455,"line":2637},[1332,29884,29885],{"class":2521},"    ]);\n",[1332,29887,29888],{"class":2455,"line":2642},[1332,29889,2802],{"class":2521},[1332,29891,29892],{"class":2455,"line":2651},[1332,29893,2588],{"emptyLinePlaceholder":75},[1332,29895,29896,29898],{"class":2455,"line":2673},[1332,29897,12963],{"class":2507},[1332,29899,29900],{"class":2521}," metaContent;\n",[2093,29902,29903],{},[26,29904,29905,29907,29908,29910,29911,29914,29915,29917],{},[192,29906,2359],{}," Some meta tags don't have a ",[145,29909,6802],{}," attribute (Open Graph tags use ",[145,29912,29913],{},"property"," instead). The second snippet returns ",[145,29916,8822],{}," for those, which is fine for most uses, but worth handling if your downstream step is strict about empty values.",[2819,29919,29920],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":67,"searchDepth":68,"depth":68,"links":29922},[29923,29924,29925,29926],{"id":29328,"depth":670,"text":29329},{"id":29585,"depth":670,"text":29586},{"id":29692,"depth":670,"text":29693},{"id":29723,"depth":670,"text":29724},"JavaScript snippets for scraping data in axiom.ai automations, including HTML tables, element attributes, page body, and meta tags.",{"metaTitle":29929},"JavaScript snippets for scraping data from web pages",{"title":29320,"description":29927},"docs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fscrape","7R4KfK9eRrVTnC3FfrdhfSdktBOQsy44_cFq1b8kRMg",{"id":29934,"title":25114,"body":29935,"date":71,"description":30022,"extension":73,"meta":30023,"navigation":75,"order":670,"path":25113,"seo":30025,"stem":30026,"__hash__":30027},"content\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fpuppeteer\u002Findex.md",{"type":8,"value":29936,"toc":30019},[29937,29961,29973,29975,29977,29991,30012],[26,29938,29939,29942,29943,29946,29947,29951,29952,29955,29956,148],{},[659,29940,25095],{"href":25093,"rel":29941},[1218]," is a Node.js library that provides a high-level API for controlling Chrome and Chromium. axiom.ai exposes Puppeteer's ",[145,29944,29945],{},"Page"," class inside the ",[659,29948,29949],{"href":19048},[192,29950,19051],{}," step, so you can use it to extend the no-code ",[659,29953,29954],{"href":28179},"Interact steps"," when you need behaviour those steps don't cover. For background on what Puppeteer can do with a page, see the ",[659,29957,29960],{"href":29958,"rel":29959},"https:\u002F\u002Fpptr.dev\u002Fguides\u002Fpage-interactions",[1218],"Page interactions reference",[2093,29962,29963],{},[26,29964,29965,29967,29968,28581,29970,29972],{},[192,29966,2359],{}," Puppeteer snippets only work when ",[145,29969,26470],{},[192,29971,19051],{}," step, and only on desktop runs. Cloud runs can't use Puppeteer.",[107,29974,26462],{"id":26461},[112,29976],{},[186,29978,29979,29985],{},[189,29980,29981,29984],{},[659,29982,28125],{"href":29983},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fpuppeteer\u002Finteraction"," for scrolling, locating, and filtering elements with Puppeteer's locator API.",[189,29986,29987,29990],{},[659,29988,28138],{"href":29989},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fpuppeteer\u002Fnetwork"," for intercepting and blocking network requests during a run.",[2093,29992,29993],{},[26,29994,29995,29997,29998,30003,30004,30006,30007,148],{},[192,29996,2172],{}," For event-driven workflows, the ",[659,29999,30002],{"href":30000,"rel":30001},"https:\u002F\u002Fpptr.dev\u002Fapi\u002Fpuppeteer.eventemitter",[1218],"EventEmitter"," class is also accessible from the ",[192,30005,19051],{}," step. For a worked example, see Nitay Neeman's ",[659,30008,30011],{"href":30009,"rel":30010},"https:\u002F\u002Fnitayneeman.com\u002Fblog\u002Fgetting-to-know-puppeteer-using-practical-examples\u002F#handling-events",[1218],"Puppeteer event handling examples",[26,30013,2222,30014,2226,30016,148],{},[659,30015,2225],{"href":1887},[659,30017,2231],{"href":2229,"rel":30018},[1218],{"title":67,"searchDepth":68,"depth":68,"links":30020},[30021],{"id":26461,"depth":670,"text":26462},"Ready-to-use Puppeteer snippets for the Write javascript step in axiom.ai, organised into interaction and network categories.",{"metaTitle":30024},"Puppeteer snippets for axiom.ai automations",{"title":25114,"description":30022},"docs\u002Fdeveloper-hub\u002Fsnippets\u002Fpuppeteer\u002Findex","Ys0ZsrP22Aa6jLu9N67tFXimdZt0Rb3HC287VCpgA7w",{"id":30029,"title":28171,"body":30030,"date":71,"description":30157,"extension":73,"meta":30158,"navigation":75,"order":2131,"path":29983,"seo":30160,"stem":30161,"__hash__":30162},"content\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fpuppeteer\u002Finteraction.md",{"type":8,"value":30031,"toc":30153},[30032,30038,30042,30044,30047,30092,30096,30098,30104,30147,30150],[26,30033,30034,30035,30037],{},"Interaction snippets drive elements on the current page using Puppeteer's locator API. Use these when the no-code ",[659,30036,29954],{"href":28179}," don't cover the pattern you need.",[107,30039,30041],{"id":30040},"scroll-a-container","Scroll a container",[112,30043],{},[26,30045,30046],{},"Scroll a specific element by its CSS class. Useful for elements that scroll independently of the page itself, such as modal contents or chat panels:",[2446,30048,30050],{"className":2498,"code":30049,"language":2500,"meta":67,"style":67},"await page.locator('container').scroll({\n    scrollLeft: 30,\n    scrollTop: 10\n});\n",[145,30051,30052,30072,30081,30088],{"__ignoreMap":67},[1332,30053,30054,30056,30058,30060,30062,30065,30067,30070],{"class":2455,"line":2131},[1332,30055,3020],{"class":2507},[1332,30057,2679],{"class":2521},[1332,30059,3688],{"class":2525},[1332,30061,1213],{"class":2521},[1332,30063,30064],{"class":2462},"'container'",[1332,30066,3696],{"class":2521},[1332,30068,30069],{"class":2525},"scroll",[1332,30071,2529],{"class":2521},[1332,30073,30074,30077,30079],{"class":2455,"line":670},[1332,30075,30076],{"class":2521},"    scrollLeft: ",[1332,30078,5887],{"class":2511},[1332,30080,6024],{"class":2521},[1332,30082,30083,30086],{"class":2455,"line":68},[1332,30084,30085],{"class":2521},"    scrollTop: ",[1332,30087,14052],{"class":2511},[1332,30089,30090],{"class":2455,"line":1478},[1332,30091,2542],{"class":2521},[107,30093,30095],{"id":30094},"filter-elements-by-text","Filter elements by text",[112,30097],{},[26,30099,30100,30101,3297],{},"When several elements share the same selector, filter them by their content before interacting. The example clicks only the button whose inner text is ",[145,30102,30103],{},"Add to basket",[2446,30105,30107],{"className":2498,"code":30106,"language":2500,"meta":67,"style":67},"await page.locator('button').filter(button => button.innerText === 'Add to basket').click();\n",[145,30108,30109],{"__ignoreMap":67},[1332,30110,30111,30113,30115,30117,30119,30122,30124,30127,30129,30131,30133,30136,30138,30141,30143,30145],{"class":2455,"line":2131},[1332,30112,3020],{"class":2507},[1332,30114,2679],{"class":2521},[1332,30116,3688],{"class":2525},[1332,30118,1213],{"class":2521},[1332,30120,30121],{"class":2462},"'button'",[1332,30123,3696],{"class":2521},[1332,30125,30126],{"class":2525},"filter",[1332,30128,1213],{"class":2521},[1332,30130,662],{"class":2458},[1332,30132,10271],{"class":2507},[1332,30134,30135],{"class":2521}," button.innerText ",[1332,30137,9291],{"class":2507},[1332,30139,30140],{"class":2462}," 'Add to basket'",[1332,30142,3696],{"class":2521},[1332,30144,5473],{"class":2525},[1332,30146,2670],{"class":2521},[26,30148,30149],{},"This pattern is useful for e-commerce pages, search results, and any UI where multiple elements share a class but have different text.",[2819,30151,30152],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}",{"title":67,"searchDepth":68,"depth":68,"links":30154},[30155,30156],{"id":30040,"depth":670,"text":30041},{"id":30094,"depth":670,"text":30095},"Puppeteer snippets for interacting with page elements in axiom.ai automations, including scrolling and filtering elements with the locator API.",{"metaTitle":30159},"Puppeteer snippets for scrolling and filtering elements",{"title":28171,"description":30157},"docs\u002Fdeveloper-hub\u002Fsnippets\u002Fpuppeteer\u002Finteraction","syDdFzXAOG8Fs6T-oMU-FXP9FGULj551GNNYppwx7k4",{"id":30164,"title":29064,"body":30165,"date":71,"description":30507,"extension":73,"meta":30508,"navigation":75,"order":670,"path":29989,"seo":30510,"stem":30511,"__hash__":30512},"content\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fpuppeteer\u002Fnetwork.md",{"type":8,"value":30166,"toc":30504},[30167,30170,30174,30176,30192,30199,30357,30360,30406,30409,30452,30455,30481,30489,30501],[26,30168,30169],{},"Network snippets intercept network requests during a run. Use them to block specific resources for speed, or to log and test requests during development.",[107,30171,30173],{"id":30172},"block-resources","Block resources",[112,30175],{},[26,30177,30178,30179,30183,30184,30187,30188,29089],{},"Blocking unnecessary resources (images, fonts, ad libraries) speeds up runs by skipping content the automation doesn't need. Add this snippet at the start of a ",[659,30180,30181],{"href":19048},[192,30182,19051],{}," step that runs ",[26030,30185,30186],{},"before"," the ",[659,30189,30190],{"href":17846},[192,30191,17849],{},[2093,30193,30194],{},[26,30195,30196,30198],{},[192,30197,2099],{}," Blocking resources can break pages, particularly if scripts are blocked. Test thoroughly after changing what's blocked.",[2446,30200,30202],{"className":2498,"code":30201,"language":2500,"meta":67,"style":67},"await page.setRequestInterception(true);\n\npage.on('request', request => {\n    \u002F\u002F Skip if another listener already handled the request.\n    if (request.isInterceptResolutionHandled()) return;\n\n    \u002F\u002F Block any request ending in '.png' or '.jpg'.\n    if (request.url().endsWith('.png') || request.url().endsWith('.jpg')) {\n        request.abort('failed', 0);\n    } else {\n        request.continue();\n    }\n});\n",[145,30203,30204,30219,30223,30243,30248,30265,30269,30274,30313,30332,30340,30349,30353],{"__ignoreMap":67},[1332,30205,30206,30208,30210,30213,30215,30217],{"class":2455,"line":2131},[1332,30207,3020],{"class":2507},[1332,30209,2679],{"class":2521},[1332,30211,30212],{"class":2525},"setRequestInterception",[1332,30214,1213],{"class":2521},[1332,30216,1548],{"class":2511},[1332,30218,2583],{"class":2521},[1332,30220,30221],{"class":2455,"line":670},[1332,30222,2588],{"emptyLinePlaceholder":75},[1332,30224,30225,30228,30230,30232,30235,30237,30239,30241],{"class":2455,"line":68},[1332,30226,30227],{"class":2521},"page.",[1332,30229,7462],{"class":2525},[1332,30231,1213],{"class":2521},[1332,30233,30234],{"class":2462},"'request'",[1332,30236,4468],{"class":2521},[1332,30238,12501],{"class":2458},[1332,30240,10271],{"class":2507},[1332,30242,2648],{"class":2521},[1332,30244,30245],{"class":2455,"line":1478},[1332,30246,30247],{"class":2609},"    \u002F\u002F Skip if another listener already handled the request.\n",[1332,30249,30250,30252,30255,30258,30261,30263],{"class":2455,"line":293},[1332,30251,5840],{"class":2507},[1332,30253,30254],{"class":2521}," (request.",[1332,30256,30257],{"class":2525},"isInterceptResolutionHandled",[1332,30259,30260],{"class":2521},"()) ",[1332,30262,12963],{"class":2507},[1332,30264,4673],{"class":2521},[1332,30266,30267],{"class":2455,"line":2237},[1332,30268,2588],{"emptyLinePlaceholder":75},[1332,30270,30271],{"class":2455,"line":2623},[1332,30272,30273],{"class":2609},"    \u002F\u002F Block any request ending in '.png' or '.jpg'.\n",[1332,30275,30276,30278,30280,30282,30284,30287,30289,30292,30294,30296,30299,30301,30303,30305,30307,30310],{"class":2455,"line":2637},[1332,30277,5840],{"class":2507},[1332,30279,30254],{"class":2521},[1332,30281,13749],{"class":2525},[1332,30283,17561],{"class":2521},[1332,30285,30286],{"class":2525},"endsWith",[1332,30288,1213],{"class":2521},[1332,30290,30291],{"class":2462},"'.png'",[1332,30293,2709],{"class":2521},[1332,30295,27355],{"class":2507},[1332,30297,30298],{"class":2521}," request.",[1332,30300,13749],{"class":2525},[1332,30302,17561],{"class":2521},[1332,30304,30286],{"class":2525},[1332,30306,1213],{"class":2521},[1332,30308,30309],{"class":2462},"'.jpg'",[1332,30311,30312],{"class":2521},")) {\n",[1332,30314,30315,30318,30321,30323,30326,30328,30330],{"class":2455,"line":2642},[1332,30316,30317],{"class":2521},"        request.",[1332,30319,30320],{"class":2525},"abort",[1332,30322,1213],{"class":2521},[1332,30324,30325],{"class":2462},"'failed'",[1332,30327,4468],{"class":2521},[1332,30329,256],{"class":2511},[1332,30331,2583],{"class":2521},[1332,30333,30334,30336,30338],{"class":2455,"line":2651},[1332,30335,3780],{"class":2521},[1332,30337,27559],{"class":2507},[1332,30339,2648],{"class":2521},[1332,30341,30342,30344,30347],{"class":2455,"line":2673},[1332,30343,30317],{"class":2521},[1332,30345,30346],{"class":2525},"continue",[1332,30348,2670],{"class":2521},[1332,30350,30351],{"class":2455,"line":2692},[1332,30352,3810],{"class":2521},[1332,30354,30355],{"class":2455,"line":2727},[1332,30356,2542],{"class":2521},[26,30358,30359],{},"The example above blocks images by file extension. The same pattern works for blocking by URL prefix:",[2446,30361,30363],{"className":2498,"code":30362,"language":2500,"meta":67,"style":67},"if (request.url().startsWith('https:\u002F\u002Fgoogle.com')) {\n    request.abort('failed', 0);\n}\n",[145,30364,30365,30385,30402],{"__ignoreMap":67},[1332,30366,30367,30369,30371,30373,30375,30378,30380,30383],{"class":2455,"line":2131},[1332,30368,6072],{"class":2507},[1332,30370,30254],{"class":2521},[1332,30372,13749],{"class":2525},[1332,30374,17561],{"class":2521},[1332,30376,30377],{"class":2525},"startsWith",[1332,30379,1213],{"class":2521},[1332,30381,30382],{"class":2462},"'https:\u002F\u002Fgoogle.com'",[1332,30384,30312],{"class":2521},[1332,30386,30387,30390,30392,30394,30396,30398,30400],{"class":2455,"line":670},[1332,30388,30389],{"class":2521},"    request.",[1332,30391,30320],{"class":2525},[1332,30393,1213],{"class":2521},[1332,30395,30325],{"class":2462},[1332,30397,4468],{"class":2521},[1332,30399,256],{"class":2511},[1332,30401,2583],{"class":2521},[1332,30403,30404],{"class":2455,"line":68},[1332,30405,2802],{"class":2521},[26,30407,30408],{},"Or by resource type:",[2446,30410,30412],{"className":2498,"code":30411,"language":2500,"meta":67,"style":67},"if (request.resourceType() === 'font') {\n    request.abort('failed', 0);\n}\n",[145,30413,30414,30432,30448],{"__ignoreMap":67},[1332,30415,30416,30418,30420,30423,30425,30427,30430],{"class":2455,"line":2131},[1332,30417,6072],{"class":2507},[1332,30419,30254],{"class":2521},[1332,30421,30422],{"class":2525},"resourceType",[1332,30424,26591],{"class":2521},[1332,30426,9291],{"class":2507},[1332,30428,30429],{"class":2462}," 'font'",[1332,30431,6473],{"class":2521},[1332,30433,30434,30436,30438,30440,30442,30444,30446],{"class":2455,"line":670},[1332,30435,30389],{"class":2521},[1332,30437,30320],{"class":2525},[1332,30439,1213],{"class":2521},[1332,30441,30325],{"class":2462},[1332,30443,4468],{"class":2521},[1332,30445,256],{"class":2511},[1332,30447,2583],{"class":2521},[1332,30449,30450],{"class":2455,"line":68},[1332,30451,2802],{"class":2521},[26,30453,30454],{},"Common resource types you might want to block:",[186,30456,30457,30463,30469,30475],{},[189,30458,30459,30462],{},[145,30460,30461],{},"font"," blocks fonts.",[189,30464,30465,30468],{},[145,30466,30467],{},"image"," blocks images.",[189,30470,30471,30474],{},[145,30472,30473],{},"media"," blocks audio and video.",[189,30476,30477,30480],{},[145,30478,30479],{},"script"," blocks JavaScript files. Not recommended on most pages, since it usually breaks them.",[26,30482,30483,30484,148],{},"For the full list of resource types, see Mozilla's ",[659,30485,30488],{"href":30486,"rel":30487},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FMozilla\u002FAdd-ons\u002FWebExtensions\u002FAPI\u002FwebRequest\u002FResourceType",[1218],"ResourceType reference",[2093,30490,30491],{},[26,30492,30493,30495,30496,30500],{},[192,30494,2172],{}," For non-Puppeteer alternatives, see the ",[659,30497,30499],{"href":30498},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fblock-resources","block resources"," setting, which gives you a no-code way to block resources by domain or URL pattern.",[2819,30502,30503],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":67,"searchDepth":68,"depth":68,"links":30505},[30506],{"id":30172,"depth":670,"text":30173},"Puppeteer snippets for axiom.ai automations to intercept, log, or block network requests by URL, file extension, or resource type.",{"metaTitle":30509},"Puppeteer snippets for intercepting and blocking network requests",{"title":29064,"description":30507},"docs\u002Fdeveloper-hub\u002Fsnippets\u002Fpuppeteer\u002Fnetwork","iGFRi24fBltYOQDWFJs1PlEDmiKmhxh9zCOcgo6yO5E",{"id":30514,"title":30515,"body":30516,"date":71,"description":30721,"extension":73,"meta":30722,"navigation":75,"order":670,"path":30724,"seo":30725,"stem":30726,"__hash__":30727},"content\u002Fdocs\u002Fdeveloper-hub\u002Ftroubleshooting\u002Fapi.md","API errors",{"type":8,"value":30517,"toc":30714},[30518,30524,30528,30530,30536,30544,30558,30562,30564,30569,30574,30583,30587,30589,30594,30601,30610,30614,30616,30621,30628,30633,30637,30639,30644,30651,30656,30707,30712],[26,30519,30520,30521,148],{},"The errors on this page are returned by the axiom.ai API when triggering automations. For background on the API, see the ",[659,30522,30523],{"href":5562},"API documentation",[107,30525,30527],{"id":30526},"missing-api-key","Missing API key",[112,30529],{},[26,30531,30532,30535],{},[192,30533,30534],{},"Error:"," Unable to authenticate, you must send an API key.",[26,30537,30538,30541,30542,4360],{},[192,30539,30540],{},"Problem:"," The request payload doesn't contain a ",[145,30543,4359],{},[26,30545,30546,30548,30549,30552,30553,30557],{},[192,30547,25693],{}," Add ",[145,30550,30551],{},"\"key\": \"\u003CAPI_KEY>\""," to the payload. See ",[659,30554,30556],{"href":30555},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frequests","API requests"," for the full payload format.",[107,30559,30561],{"id":30560},"invalid-api-key","Invalid API key",[112,30563],{},[26,30565,30566,30568],{},[192,30567,30534],{}," Unable to authenticate, please check your API key and try again.",[26,30570,30571,30573],{},[192,30572,30540],{}," The API key in the payload doesn't match a valid axiom.ai key. Common causes are an expired or regenerated key, or a copy-paste error.",[26,30575,30576,30578,30579,30582],{},[192,30577,25693],{}," Open the axiom.ai extension, navigate to the ",[659,30580,30581],{"href":3097},"API key dashboard",", and copy the current key into your request.",[107,30584,30586],{"id":30585},"missing-automation-name","Missing automation name",[112,30588],{},[26,30590,30591,30593],{},[192,30592,30534],{}," Missing task name, you must send the name of the task that you wish to trigger.",[26,30595,30596,30541,30598,30600],{},[192,30597,30540],{},[145,30599,6802],{}," field. The API needs the automation name to know which automation to trigger.",[26,30602,30603,30548,30605,30552,30608,30557],{},[192,30604,25693],{},[145,30606,30607],{},"\"name\": \"\u003CAUTOMATION_NAME>\"",[659,30609,30556],{"href":30555},[107,30611,30613],{"id":30612},"automation-not-found","Automation not found",[112,30615],{},[26,30617,30618,30620],{},[192,30619,30534],{}," Task not found, please check the name and try again.",[26,30622,30623,24126,30625,30627],{},[192,30624,30540],{},[145,30626,6802],{}," field in the payload doesn't match any automation in the connected account. The match is case-sensitive.",[26,30629,30630,30632],{},[192,30631,25693],{}," Open the axiom.ai extension and copy the automation name exactly as it appears in the dashboard, including capitalisation and spacing.",[107,30634,30636],{"id":30635},"data-format-incorrect","Data format incorrect",[112,30638],{},[26,30640,30641,30643],{},[192,30642,30534],{}," Data must be sent as an array of arrays.",[26,30645,30646,24126,30648,30650],{},[192,30647,30540],{},[145,30649,580],{}," field in the payload isn't formatted as a 2D array. The API expects every row to be its own array, even when there's only one row.",[26,30652,30653,30655],{},[192,30654,25693],{}," Wrap the payload data as an array of arrays, where each inner array is one row:",[2446,30657,30659],{"className":6112,"code":30658,"language":5926,"meta":67,"style":67},"{\n  \"data\": [\n    [\"Row 1 - Column 1\", \"Row 1 - Column 2\"],\n    [\"Row 2 - Column 1\", \"Row 2 - Column 2\"]\n  ]\n}\n",[145,30660,30661,30665,30671,30685,30699,30703],{"__ignoreMap":67},[1332,30662,30663],{"class":2455,"line":2131},[1332,30664,6120],{"class":2521},[1332,30666,30667,30669],{"class":2455,"line":670},[1332,30668,11900],{"class":6125},[1332,30670,10506],{"class":2521},[1332,30672,30673,30675,30678,30680,30683],{"class":2455,"line":68},[1332,30674,10516],{"class":2521},[1332,30676,30677],{"class":2462},"\"Row 1 - Column 1\"",[1332,30679,4468],{"class":2521},[1332,30681,30682],{"class":2462},"\"Row 1 - Column 2\"",[1332,30684,6167],{"class":2521},[1332,30686,30687,30689,30692,30694,30697],{"class":2455,"line":1478},[1332,30688,10516],{"class":2521},[1332,30690,30691],{"class":2462},"\"Row 2 - Column 1\"",[1332,30693,4468],{"class":2521},[1332,30695,30696],{"class":2462},"\"Row 2 - Column 2\"",[1332,30698,5164],{"class":2521},[1332,30700,30701],{"class":2455,"line":293},[1332,30702,10545],{"class":2521},[1332,30704,30705],{"class":2455,"line":2237},[1332,30706,2802],{"class":2521},[26,30708,30709,30710,148],{},"For the full payload structure, see ",[659,30711,30556],{"href":30555},[2819,30713,8243],{},{"title":67,"searchDepth":68,"depth":68,"links":30715},[30716,30717,30718,30719,30720],{"id":30526,"depth":670,"text":30527},{"id":30560,"depth":670,"text":30561},{"id":30585,"depth":670,"text":30586},{"id":30612,"depth":670,"text":30613},{"id":30635,"depth":670,"text":30636},"Errors returned by the axiom.ai API when triggering automations, including authentication failures, missing fields, and incorrect data formats.",{"metaTitle":30723},"Fix common errors when using the axiom.ai API","\u002Fdocs\u002Fdeveloper-hub\u002Ftroubleshooting\u002Fapi",{"title":30515,"description":30721},"docs\u002Fdeveloper-hub\u002Ftroubleshooting\u002Fapi","a2X6BKYaXoDOTGVQPmdUmAdPQ83B0rivtbdATA--XUw",{"id":30729,"title":30730,"body":30731,"date":71,"description":30845,"extension":73,"meta":30846,"navigation":75,"order":2131,"path":3238,"seo":30848,"stem":30849,"__hash__":30850},"content\u002Fdocs\u002Fdeveloper-hub\u002Ftroubleshooting\u002Fdebug.md","Debug developer features",{"type":8,"value":30732,"toc":30838},[30733,30745,30749,30751,30761,30766,30770,30772,30778,30782,30790,30802,30809,30813,30825],[26,30734,30735,30736,30740,30741,148],{},"Debugging the API and any custom code is essential when extending axiom.ai with the API or ",[659,30737,30738],{"href":19048},[192,30739,19051],{}," step. The pages here cover patterns specific to those tools. For general automation debugging that applies to every plan, see ",[659,30742,30744],{"href":30743},"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Fhow-to-debug","Debug an automation",[107,30746,30748],{"id":30747},"test-the-api","Test the API",[112,30750],{},[26,30752,30753,6205,30756,30760],{},[659,30754,30755],{"href":5562},"Postman",[659,30757,30759],{"href":30758},"\u002Fguides\u002Fcurl","cURL"," are both good tools for testing the API outside your automation or production system. Both are free.",[26,30762,30763,30764,148],{},"For common errors when calling the API, see ",[659,30765,30515],{"href":30724},[107,30767,30769],{"id":30768},"debug-custom-code","Debug custom code",[112,30771],{},[26,30773,30774,30775,30777],{},"Custom code in the ",[192,30776,19051],{}," step extends axiom.ai with logic the no-code steps don't cover. Two patterns help when something goes wrong: console logging and returning values for conditional checks.",[21,30779,30781],{"id":30780},"use-console-logs","Use console logs",[26,30783,30784,30786,30787,30789],{},[145,30785,3456],{}," works inside the ",[192,30788,19051],{}," step and shows output in Chrome DevTools.",[2093,30791,30792],{},[26,30793,30794,30796,30797,30801],{},[192,30795,2359],{}," Console logs are only visible during desktop runs. Cloud runs close the browser when they finish, so the console is gone before you can read it. To inspect console output after a desktop run completes, add a ",[659,30798,30799],{"href":21702},[192,30800,18065],{}," step at the end of the automation so the browser stays open long enough.",[26,30803,30804,30805,148],{},"For background on opening DevTools and reading the console, see ",[659,30806,30808],{"href":30807},"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Fhow-to-debug#use-chrome-devtools","use Chrome DevTools",[21,30810,30812],{"id":30811},"return-values-for-conditional-checks","Return values for conditional checks",[26,30814,2273,30815,30817,30818,30824],{},[192,30816,19051],{}," step can return a value, which you can then route on with a ",[659,30819,30821],{"href":30820},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcontinue-if-condition-met",[192,30822,30823],{},"Continue only if a condition is met"," step. This is useful when the script can succeed in different ways and the rest of the automation needs to react accordingly.",[26,30826,30827,30828,30831,30832,30834,30835,30837],{},"For example, a script might extract an email address from a page, returning the string ",[145,30829,30830],{},"no email found"," when nothing matches. Add a ",[192,30833,30823],{}," step after it that checks for ",[145,30836,30830],{}," and stops or branches the automation when that string is returned.",{"title":67,"searchDepth":68,"depth":68,"links":30839},[30840,30841],{"id":30747,"depth":670,"text":30748},{"id":30768,"depth":670,"text":30769,"children":30842},[30843,30844],{"id":30780,"depth":68,"text":30781},{"id":30811,"depth":68,"text":30812},"Test the axiom.ai API with Postman or cURL, and debug custom code in Write javascript steps using console logs and conditional checks.",{"metaTitle":30847},"Debug the axiom.ai API and Write javascript step",{"title":30730,"description":30845},"docs\u002Fdeveloper-hub\u002Ftroubleshooting\u002Fdebug","pIQM7EV5p5qV1M3p8S7Yd6uTcAbMFakmlLDK_XRs8SM",{"id":30852,"title":30853,"body":30854,"date":71,"description":30890,"extension":73,"meta":30891,"navigation":75,"order":1478,"path":26365,"seo":30893,"stem":30894,"__hash__":30895},"content\u002Fdocs\u002Fdeveloper-hub\u002Ftroubleshooting\u002Findex.md","Developer troubleshooting",{"type":8,"value":30855,"toc":30887},[30856,30869,30873,30875,30878,30880],[26,30857,30858,30859,30861,30862,30866,30867,148],{},"The pages in this section cover debugging the developer-facing parts of axiom.ai: the ",[659,30860,5345],{"href":5562}," and the ",[659,30863,30864],{"href":19048},[192,30865,19051],{}," step. For general automation debugging that applies to every plan, see ",[659,30868,30744],{"href":30743},[107,30870,30872],{"id":30871},"developer-troubleshooting-pages","Developer troubleshooting pages",[112,30874],{},[26,30876,30877],{},"Start with the debugging guide for patterns and tools that apply across the API and custom code. Use the API errors reference when you need to look up a specific error message returned by the API and find its fix.",[2218,30879],{},[26,30881,2222,30882,2226,30884,148],{},[659,30883,2225],{"href":1887},[659,30885,2231],{"href":2229,"rel":30886},[1218],{"title":67,"searchDepth":68,"depth":68,"links":30888},[30889],{"id":30871,"depth":670,"text":30872},"Debug and fix issues specific to the axiom.ai API and custom code, including JavaScript and Puppeteer steps, plus a reference of common API errors.",{"metaTitle":30892},"Debug API and custom code issues in axiom.ai automations",{"title":30853,"description":30890},"docs\u002Fdeveloper-hub\u002Ftroubleshooting\u002Findex","GDKPEqe8sS9UvfqImHJAVqkXQ0guZw1Jja_XTrRZ-2Y",{"id":30897,"title":30898,"body":30899,"date":71,"description":31249,"extension":73,"meta":31250,"navigation":75,"order":670,"path":31252,"seo":31253,"stem":31254,"__hash__":31255},"content\u002Fdocs\u002Ffaq\u002Fgeneral.md","General FAQ",{"type":8,"value":30900,"toc":31233},[30901,30905,30907,30913,30917,30919,30926,30930,30932,30938,30942,30944,30950,30954,30956,30959,30985,30991,30995,30997,31000,31006,31013,31017,31019,31025,31029,31031,31034,31038,31072,31075,31105,31117,31121,31123,31126,31132,31139,31143,31145,31148,31151,31175,31182,31186,31188,31226],[107,30902,30904],{"id":30903},"do-you-have-an-affiliate-program","Do you have an affiliate program?",[112,30906],{},[26,30908,30909,30910,2679],{},"Yes. To learn more and join, see the ",[659,30911,30912],{"href":1404},"axiom.ai affiliate program",[107,30914,30916],{"id":30915},"do-you-have-an-api","Do you have an API?",[112,30918],{},[26,30920,30921,30922,30925],{},"Yes. The ",[659,30923,30924],{"href":5562},"axiom.ai API"," lets you trigger automations and pass data to them. The API requires a Pro subscription or higher.",[107,30927,30929],{"id":30928},"does-axiomai-come-with-a-desktop-app","Does axiom.ai come with a desktop app?",[112,30931],{},[26,30933,2273,30934,30937],{},[659,30935,30936],{"href":26107},"desktop application"," is optional. It's required for automations that upload or download files. Every subscription tier can use it. The desktop app is available for macOS, Windows, and Linux.",[107,30939,30941],{"id":30940},"does-axiomai-work-with-zapier","Does axiom.ai work with Zapier?",[112,30943],{},[26,30945,30946,30947,30949],{},"Yes. Pro subscribers and above can trigger automations from Zapier and pass data between axiom.ai and ",[659,30948,1134],{"href":1084}," in either direction. Any tool that can send or receive webhooks can be integrated.",[107,30951,30953],{"id":30952},"can-you-help-me-build-an-automation","Can you help me build an automation?",[112,30955],{},[26,30957,30958],{},"Yes. To help you efficiently, send us as much context as possible:",[1923,30960,30961,30964,30970,30979],{},[189,30962,30963],{},"A screen recording of the task you want to automate.",[189,30965,30966,30967,30969],{},"Any Google Sheets used in the automation, shared with ",[145,30968,2364],{}," with editor permission.",[189,30971,30972,30973,30978],{},"The target webpage exported as HTML (the ",[659,30974,30977],{"href":30975,"rel":30976},"https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Fsave-page-we\u002Fdhhpefjklgkmgeafimnjhojgjamoafof",[1218],"Save Page WE"," extension works well for this).",[189,30980,30981,30982,148],{},"The axiom.ai automation file if you've started one. See ",[659,30983,30984],{"href":25877},"import or download an automation",[26,30986,30987,30990],{},[659,30988,30989],{"href":1887},"Contact support"," with the details.",[107,30992,30994],{"id":30993},"how-does-axiomai-handle-my-data","How does axiom.ai handle my data?",[112,30996],{},[26,30998,30999],{},"axiom.ai doesn't store user data and doesn't train models on user data. When automations run on the desktop app, no data leaves your network. When automations run in the cloud, the data is processed in a private container that's destroyed when the run finishes.",[26,31001,31002,31003,31005],{},"axiom.ai stores only essential information: automation names, runtime usage, and basic account details. Text typed manually into an ",[192,31004,16065],{}," step is stored encrypted, so no one at axiom.ai can read it. Data passed in from a data source (a Google Sheet, a webhook, an API call) isn't stored.",[26,31007,31008,31009,148],{},"For full details, see the ",[659,31010,31012],{"href":31011},"\u002Fprivacy-policy","privacy policy",[107,31014,31016],{"id":31015},"what-if-axiomai-doesnt-have-the-feature-i-need","What if axiom.ai doesn't have the feature I need?",[112,31018],{},[26,31020,31021,31022,31024],{},"Email feature requests to ",[659,31023,2364],{"href":2363},". User feedback drives the roadmap.",[107,31026,31028],{"id":31027},"how-can-i-record-my-screen-to-share-with-support","How can I record my screen to share with support?",[112,31030],{},[26,31032,31033],{},"Use the built-in screen recorder for your operating system.",[21,31035,31037],{"id":31036},"windows-10-and-windows-11","Windows 10 and Windows 11",[1923,31039,31040,31047,31056,31062],{},[189,31041,31042,31043,31046],{},"Press ",[192,31044,31045],{},"Win + G"," to open the Game Bar.",[189,31048,1927,31049,31052,31053,148],{},[192,31050,31051],{},"Start recording",", or press ",[192,31054,31055],{},"Win + Alt + R",[189,31057,31058,31059,148],{},"When you're done, click ",[192,31060,31061],{},"Stop recording",[189,31063,31064,31065,31068,31069,148],{},"The video saves to ",[192,31066,31067],{},"Videos"," → ",[192,31070,31071],{},"Captures",[21,31073,7797],{"id":31074},"macos",[1923,31076,31077,31083,31095,31102],{},[189,31078,31042,31079,31082],{},[192,31080,31081],{},"Cmd + Shift + 5"," to open the screenshot toolbar.",[189,31084,1927,31085,2344,31088,31091,31092,148],{},[192,31086,31087],{},"Record entire screen",[192,31089,31090],{},"Record selected portion",", then click ",[192,31093,31094],{},"Record",[189,31096,31097,31098,31101],{},"To stop, click the ",[192,31099,31100],{},"Stop"," button in the menu bar.",[189,31103,31104],{},"The video saves to your Desktop, or wherever you've configured screenshots to save.",[26,31106,31107,31108,31110,31111,31116],{},"Email the recording to support, or share it via Google Drive (with ",[145,31109,2364],{}," granted access). ",[659,31112,31115],{"href":31113,"rel":31114},"https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Floom-%E2%80%93-screen-recorder-sc\u002Fliecbddmkiiihnedobmlmillhodjkdmb",[1218],"Loom"," is a good cross-platform alternative.",[107,31118,31120],{"id":31119},"is-axiomai-hipaa-compliant","Is axiom.ai HIPAA compliant?",[112,31122],{},[26,31124,31125],{},"No. axiom.ai does not offer HIPAA compliance, doesn't sign Business Associate Agreements (BAAs), and shouldn't be used to handle, store, or process protected health information in the cloud.",[26,31127,31128,31129,31131],{},"If your organisation requires HIPAA compliance, use the ",[659,31130,26108],{"href":26107}," only and never run automations in the cloud. With the desktop app, data stays on your network and never reaches axiom.ai's servers, but HIPAA compliance still remains your organisation's responsibility.",[26,31133,31134,31135,31138],{},"For details on how axiom.ai handles user data in general, see ",[659,31136,30994],{"href":31137},"#how-does-axiom-ai-handle-my-data"," above.",[107,31140,31142],{"id":31141},"can-i-host-axiomai-on-a-server","Can I host axiom.ai on a server?",[112,31144],{},[26,31146,31147],{},"Yes. Running axiom.ai on a server is a good option when you need unattended runs combined with desktop-only features (file downloads, file uploads, local session storage, or specific JavaScript steps).",[26,31149,31150],{},"To set up axiom.ai on a server:",[1923,31152,31153,31156,31163],{},[189,31154,31155],{},"Install Chrome.",[189,31157,31158,31159,148],{},"Install the ",[659,31160,31162],{"href":31161},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Finstall","axiom.ai extension",[189,31164,31165,31166,2344,31169,31172,31173,148],{},"If you'll use ",[192,31167,31168],{},"Download a file",[192,31170,31171],{},"Upload a file"," steps, also install the ",[659,31174,30936],{"href":31161},[26,31176,31177,31178,31181],{},"Once installed, axiom.ai works on the server just as it does on a local computer. When scheduling automations, enable ",[145,31179,31180],{},"Run on this computer"," so they run locally on the server rather than in the cloud.",[107,31183,31185],{"id":31184},"how-do-i-uninstall-the-desktop-app","How do I uninstall the desktop app?",[112,31187],{},[186,31189,31190,31204],{},[189,31191,31192,31195,31196,31199,31200,31203],{},[192,31193,31194],{},"macOS:"," Navigate to the ",[192,31197,31198],{},"Applications"," folder and remove the ",[192,31201,31202],{},"axiom-desktop"," application.",[189,31205,31206,31209,31210,31068,31213,31068,31216,31219,31220,31222,31223,148],{},[192,31207,31208],{},"Windows:"," Navigate to ",[192,31211,31212],{},"Control Panel",[192,31214,31215],{},"Programs",[192,31217,31218],{},"Programs and Features",". Find ",[192,31221,31202],{},", right-click it, and choose ",[192,31224,31225],{},"Uninstall",[26,31227,31228,31229,148],{},"If you have problems after uninstalling, see ",[659,31230,31232],{"href":31231},"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Finstallation","installation errors",{"title":67,"searchDepth":68,"depth":68,"links":31234},[31235,31236,31237,31238,31239,31240,31241,31242,31246,31247,31248],{"id":30903,"depth":670,"text":30904},{"id":30915,"depth":670,"text":30916},{"id":30928,"depth":670,"text":30929},{"id":30940,"depth":670,"text":30941},{"id":30952,"depth":670,"text":30953},{"id":30993,"depth":670,"text":30994},{"id":31015,"depth":670,"text":31016},{"id":31027,"depth":670,"text":31028,"children":31243},[31244,31245],{"id":31036,"depth":68,"text":31037},{"id":31074,"depth":68,"text":7797},{"id":31119,"depth":670,"text":31120},{"id":31141,"depth":670,"text":31142},{"id":31184,"depth":670,"text":31185},"Answers to common general questions about axiom.ai including affiliate program, API, desktop app, data handling, HIPAA compliance, and screen recording.",{"metaTitle":31251},"General questions about axiom.ai, data handling, and platform support","\u002Fdocs\u002Ffaq\u002Fgeneral",{"title":30898,"description":31249},"docs\u002Ffaq\u002Fgeneral","jWx16MzxR0-8Ug4Fk7BmCiE0wfJvfwrhWVGAafBrAw0",{"id":31257,"title":384,"body":31258,"date":71,"description":31309,"extension":73,"meta":31310,"navigation":75,"order":293,"path":1877,"seo":31312,"stem":31313,"__hash__":31314},"content\u002Fdocs\u002Ffaq\u002Findex.md",{"type":8,"value":31259,"toc":31306},[31260,31269,31273,31275,31297,31299],[26,31261,31262,31263,31265,31266,148],{},"The FAQ is split into five sections: general questions, runtime and scheduling, subscriptions and accounts, the Builder, and third-party tools. Browse the full list below. If you can't find an answer here, ",[659,31264,26195],{"href":1887}," or post in the ",[659,31267,2231],{"href":2229,"rel":31268},[1218],[107,31270,31272],{"id":31271},"all-questions","All questions",[112,31274],{},[26,31276,31277,31278,31281,31282,31284,31285,31288,31289,31292,31293,31296],{},"The categories below group questions by topic. ",[192,31279,31280],{},"General"," covers data handling, the desktop app, and screen recording. ",[192,31283,10785],{}," covers the no-code Builder, JavaScript, and login automation. ",[192,31286,31287],{},"Runtime and scheduling"," covers running, scheduling, scraping, and triggering automations. ",[192,31290,31291],{},"Subscriptions and accounts"," covers plans, billing, and team setup. ",[192,31294,31295],{},"Third-party tools"," covers questions specific to apps that need a particular setup, like Slack.",[2218,31298],{},[26,31300,2222,31301,2226,31303,148],{},[659,31302,2225],{"href":1887},[659,31304,2231],{"href":2229,"rel":31305},[1218],{"title":67,"searchDepth":68,"depth":68,"links":31307},[31308],{"id":31271,"depth":670,"text":31272},"Answers to common questions about axiom.ai across general use, runtime and scheduling, subscriptions and accounts, the Builder, and third-party tools.",{"metaTitle":31311},"Frequently asked questions about axiom.ai",{"title":384,"description":31309},"docs\u002Ffaq\u002Findex","zzDdkGU4SLrdPblAxof-rf_rAh8fgDM7EEQhlHle2os",{"id":31316,"title":31317,"body":31318,"date":71,"description":31557,"extension":73,"meta":31558,"navigation":75,"order":2131,"path":31560,"seo":31561,"stem":31562,"__hash__":31563},"content\u002Fdocs\u002Ffaq\u002Fno-code-builder.md","Builder FAQ",{"type":8,"value":31319,"toc":31542},[31320,31324,31326,31336,31340,31342,31353,31357,31359,31367,31371,31373,31386,31390,31392,31409,31413,31415,31418,31422,31424,31429,31433,31435,31438,31464,31468,31470,31477,31481,31483,31490,31494,31496,31507,31514,31518,31520,31530,31534,31536],[107,31321,31323],{"id":31322},"can-i-write-code-to-control-automations-or-process-data","Can I write code to control automations or process data?",[112,31325],{},[26,31327,31328,31329,31333,31334,148],{},"Yes. axiom.ai supports ",[659,31330,31332],{"href":31331},"\u002Fdocs\u002Ftutorials\u002Fjavascript","JavaScript"," and a subset of Google's ",[659,31335,26484],{"href":26483},[107,31337,31339],{"id":31338},"how-do-i-bypass-captchas","How do I bypass captchas?",[112,31341],{},[26,31343,31344,31345,31349,31350,31352],{},"axiom.ai doesn't have an in-house ",[659,31346,31348],{"href":31347},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fsolve-captcha","captcha"," solver but integrates with ",[659,31351,824],{"href":771}," for the most common captcha types.",[107,31354,31356],{"id":31355},"how-do-i-get-started-building-an-automation","How do I get started building an automation?",[112,31358],{},[26,31360,31361,31362,31366],{},"Follow the guide for ",[659,31363,31365],{"href":31364},"\u002Fdocs\u002Fno-code-tool\u002Fget-started","your first automation in the browser"," and pick a starting point that matches your use case.",[107,31368,31370],{"id":31369},"how-do-i-get-my-automation-to-log-in-to-a-site","How do I get my automation to log in to a site?",[112,31372],{},[26,31374,31375,31376,31380,31381,31385],{},"When you trigger an automation from the Chrome extension on the desktop, axiom.ai uses your ",[659,31377,31379],{"href":31378},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Fsessions","local browser session",", so you're already logged in. When triggering remotely (via the API, a webhook, or a schedule), you'll need to handle login as part of the automation. See the full ",[659,31382,31384],{"href":31383},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin","login guide"," for the available approaches.",[107,31387,31389],{"id":31388},"how-do-i-make-a-loop","How do I make a loop?",[112,31391],{},[26,31393,31394,31395,31399,31400,31404,31405,148],{},"axiom.ai supports conditional ",[659,31396,31398],{"href":31397},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogic","logic",", a dedicated ",[659,31401,31402],{"href":15650},[192,31403,15653],{}," step, and complex patterns built with jump steps. For details, see the ",[659,31406,31408],{"href":31407},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Floop","loop documentation",[107,31410,31412],{"id":31411},"can-a-deleted-automation-be-restored","Can a deleted automation be restored?",[112,31414],{},[26,31416,31417],{},"No. Deleted automations are permanently removed and can't be recovered.",[107,31419,31421],{"id":31420},"can-i-share-an-automation-with-another-user","Can I share an automation with another user?",[112,31423],{},[26,31425,31426,31427,148],{},"Yes. Download the automation as a JSON file and the other user can import it into their own account. See ",[659,31428,30984],{"href":25877},[107,31430,31432],{"id":31431},"how-do-i-deal-with-google-token-expiry","How do I deal with Google token expiry?",[112,31434],{},[26,31436,31437],{},"Google revokes tokens periodically as a security measure. The most common triggers are password changes and high-frequency reads or writes. When a token expires:",[1923,31439,31440,31446,31455],{},[189,31441,31442,31445],{},[192,31443,31444],{},"Re-authenticate."," Reconnect your Google account in axiom.ai. Token expiry can't be resolved automatically.",[189,31447,31448,31451,31452,31454],{},[192,31449,31450],{},"Set up notifications."," Enable ",[659,31453,25745],{"href":24685}," so you find out as soon as a token-related run fails.",[189,31456,31457,31460,31461,31463],{},[192,31458,31459],{},"Reduce read\u002Fwrite frequency."," Frequent reads and writes correlate with token expiry. If your token expires often, run the automation less frequently. If you're not sure how to reduce frequency without breaking the automation, ",[659,31462,26195],{"href":1887}," with details of your sheet usage.",[107,31465,31467],{"id":31466},"can-i-automate-a-chrome-extension","Can I automate a Chrome extension?",[112,31469],{},[26,31471,31472,31473,31476],{},"Limited support. axiom.ai can interact with ",[659,31474,31475],{"href":23872},"extensions that modify pages directly"," (for example, by injecting buttons or fields into the DOM). Extensions whose UI lives in popups or dedicated windows aren't accessible to axiom.ai.",[107,31478,31480],{"id":31479},"can-i-use-python","Can I use Python?",[112,31482],{},[26,31484,31485,31486,148],{},"No. JavaScript is the only scripting language supported in steps. For the JavaScript step, see ",[659,31487,31488],{"href":19048},[192,31489,19051],{},[107,31491,31493],{"id":31492},"how-do-i-insert-line-breaks-in-the-enter-text-step","How do I insert line breaks in the Enter text step?",[112,31495],{},[26,31497,1934,31498,31502,31503,31506],{},[659,31499,31500],{"href":17231},[192,31501,16065],{}," step, toggle ",[145,31504,31505],{},"Custom line break"," on and record a unique key sequence. Make sure all whitespace is removed from the recording, then use the recorded sequence wherever you want a line break in the text.",[26,31508,31509,31510,148],{},"For step-by-step instructions, see the ",[659,31511,31513],{"href":31512},"\u002Fguides\u002Fline-breaks","insert line breaks guide",[107,31515,31517],{"id":31516},"can-i-trigger-an-automation-from-a-google-apps-script","Can I trigger an automation from a Google Apps Script?",[112,31519],{},[26,31521,31522,31523,31525,31526,148],{},"Yes. Use the axiom.ai ",[659,31524,5345],{"href":5562}," from your Apps Script. For a worked example, see the ",[659,31527,31529],{"href":31528},"\u002Fguides\u002Fgoogle-apps-script","Google Apps Script trigger guide",[107,31531,31533],{"id":31532},"how-can-i-send-multiple-paragraphs-in-one-message-when-i-add-spaces-they-send-separately","How can I send multiple paragraphs in one message? When I add spaces, they send separately.",[112,31535],{},[26,31537,31538,31539,31541],{},"This is common on social platforms like Instagram and Facebook, where pressing Enter sends the message instead of inserting a line break. Follow the ",[659,31540,31513],{"href":31512}," for the workaround.",{"title":67,"searchDepth":68,"depth":68,"links":31543},[31544,31545,31546,31547,31548,31549,31550,31551,31552,31553,31554,31555,31556],{"id":31322,"depth":670,"text":31323},{"id":31338,"depth":670,"text":31339},{"id":31355,"depth":670,"text":31356},{"id":31369,"depth":670,"text":31370},{"id":31388,"depth":670,"text":31389},{"id":31411,"depth":670,"text":31412},{"id":31420,"depth":670,"text":31421},{"id":31431,"depth":670,"text":31432},{"id":31466,"depth":670,"text":31467},{"id":31479,"depth":670,"text":31480},{"id":31492,"depth":670,"text":31493},{"id":31516,"depth":670,"text":31517},{"id":31532,"depth":670,"text":31533},"Answers to common questions about the axiom.ai No-Code Tool, including JavaScript support, captchas, login automation, loops, and Chrome extension automation.",{"metaTitle":31559},"Common questions about the axiom.ai Builder and No-Code Tool","\u002Fdocs\u002Ffaq\u002Fno-code-builder",{"title":31317,"description":31557},"docs\u002Ffaq\u002Fno-code-builder","tzXistat-3zOa6oJ8YEHUWVqfyIQD4Zcds2ZnL7xks4",{"id":31565,"title":31566,"body":31567,"date":71,"description":32156,"extension":73,"meta":32157,"navigation":75,"order":68,"path":32159,"seo":32160,"stem":32161,"__hash__":32162},"content\u002Fdocs\u002Ffaq\u002Fruntime-and-scheduling.md","Runtime and scheduling FAQ",{"type":8,"value":31568,"toc":32128},[31569,31573,31575,31578,31582,31584,31587,31591,31593,31596,31604,31622,31626,31628,31641,31645,31647,31650,31670,31674,31676,31686,31690,31692,31703,31707,31709,31712,31716,31718,31721,31725,31727,31730,31734,31736,31739,31761,31765,31767,31774,31778,31780,31798,31805,31809,31811,31818,31840,31844,31846,31849,31872,31876,31878,31881,31883,31898,31903,31907,31909,31916,31926,31937,31945,31949,31951,31956,31973,31984,31988,31990,31998,32003,32007,32009,32012,32019,32023,32025,32033,32037,32039,32045,32049,32051,32059,32063,32065,32073,32077,32079,32082,32108,32115,32119,32121],[107,31570,31572],{"id":31571},"do-failed-or-stopped-runs-use-up-runtime","Do failed or stopped runs use up runtime?",[112,31574],{},[26,31576,31577],{},"No. Only successful runs count against your runtime allowance, on both desktop and cloud.",[107,31579,31581],{"id":31580},"how-do-i-stop-axiomai-from-auto-starting-on-my-computer","How do I stop axiom.ai from auto-starting on my computer?",[112,31583],{},[26,31585,31586],{},"Every operating system has its own way to remove apps from the startup list. Search \"remove from startup\" plus your operating system name for current instructions.",[107,31588,31590],{"id":31589},"my-automation-is-slow-how-do-i-speed-it-up","My automation is slow. How do I speed it up?",[112,31592],{},[26,31594,31595],{},"The right fix depends on what's slowing things down. axiom.ai prioritises reliability and accuracy over raw speed, so always test changes after applying them.",[26,31597,31598,31599,31603],{},"For a full walkthrough, see ",[659,31600,31602],{"href":31601},"\u002Fdocs\u002Ftutorials\u002Fspeed-up-run","speed up an automation run",". Common quick wins:",[186,31605,31606,31611],{},[189,31607,2487,31608,31610],{},[659,31609,30499],{"href":30498}," to skip images, fonts, and ads on heavy pages.",[189,31612,31613,31614,31617,31618,148],{},"Lower the ",[145,31615,31616],{},"Number of retries"," in the step's ",[659,31619,31621],{"href":31620},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fget-data\u002Fconfiguring-your-scraper","scraper configuration",[107,31623,31625],{"id":31624},"how-do-i-continue-when-a-button-isnt-always-present","How do I continue when a button isn't always present?",[112,31627],{},[26,31629,7407,31630,31635,31636,31640],{},[659,31631,31633],{"href":31632},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fclicks",[192,31634,15781],{}," step throws an error if the button isn't found. To skip the error and continue to the next step, enable ",[659,31637,31639],{"href":31638},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fclicks#automate-a-click-when-the-button-is-not-always-found-optional-click","optional click"," in the step settings.",[107,31642,31644],{"id":31643},"my-scheduled-automation-runs-at-the-wrong-time-what-should-i-do","My scheduled automation runs at the wrong time. What should I do?",[112,31646],{},[26,31648,31649],{},"Cloud runs use UTC by default. If the time of the run doesn't match the timezone of the site you're automating, change the timezone setting:",[1923,31651,31652,31656,31661,31667],{},[189,31653,25628,31654,25631],{},[192,31655,24349],{},[189,31657,4245,31658,2264],{},[192,31659,31660],{},"Run options",[189,31662,4245,31663,2264],{},[659,31664,31665],{"href":24760},[192,31666,24761],{},[189,31668,31669],{},"Pick the timezone the schedule should use.",[107,31671,31673],{"id":31672},"how-do-i-speed-up-the-scraper","How do I speed up the scraper?",[112,31675],{},[26,31677,31678,31679,31682,31683,31685],{},"The scraper has ",[659,31680,31681],{"href":31620},"configuration settings"," that affect speed. The most impactful is ",[145,31684,31616],{},". Lowering it makes the step faster but less tolerant of slow-loading pages.",[107,31687,31689],{"id":31688},"can-axiomai-run-in-my-current-chrome-tab","Can axiom.ai run in my current Chrome tab?",[112,31691],{},[26,31693,31694,31695,15704,31699,31702],{},"By default, axiom.ai launches a new Chromium window. To attach to an existing Chrome window instead, use ",[659,31696,31698],{"href":31697},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fbypass-bot-detection","bypass bot detection",[192,31700,31701],{},"Attach to existing Chrome"," option. This requires starting Chrome with the remote-debugging flag.",[107,31704,31706],{"id":31705},"does-unused-runtime-carry-over-between-billing-periods","Does unused runtime carry over between billing periods?",[112,31708],{},[26,31710,31711],{},"No. Runtime resets at the start of each billing period and unused minutes don't roll over. Every period starts with the full runtime allowance for your plan.",[107,31713,31715],{"id":31714},"when-does-runtime-refresh","When does runtime refresh?",[112,31717],{},[26,31719,31720],{},"Runtime refreshes on the day of the month you subscribed. For example, if you subscribed on the 4th of January, your runtime refreshes on the 4th of every following month, or the closest available date in months with fewer days. Unused runtime doesn't roll over.",[107,31722,31724],{"id":31723},"can-i-schedule-an-automation-more-than-once-a-day","Can I schedule an automation more than once a day?",[112,31726],{},[26,31728,31729],{},"Locally, yes. The desktop scheduler can run automations as often as every minute. In the cloud, the maximum frequency depends on your plan; some plans cap cloud runs at once per day.",[107,31731,31733],{"id":31732},"my-new-runtime-isnt-showing-after-upgrading-what-should-i-do","My new runtime isn't showing after upgrading. What should I do?",[112,31735],{},[26,31737,31738],{},"Try these in order:",[1923,31740,31741,31747,31753],{},[189,31742,31743,31746],{},[192,31744,31745],{},"Restart your browser."," Close Chrome completely and reopen it.",[189,31748,31749,31752],{},[192,31750,31751],{},"Sign out and back in."," Sign out of axiom.ai, then sign in again.",[189,31754,31755,31758,31759,148],{},[192,31756,31757],{},"Contact support."," If neither of the above works, email ",[145,31760,2364],{},[107,31762,31764],{"id":31763},"which-plans-support-scheduling","Which plans support scheduling?",[112,31766],{},[26,31768,31769,31773],{},[659,31770,31772],{"href":31771},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fschedule","Scheduling"," is available on the Pro plan and higher.",[107,31775,31777],{"id":31776},"my-automation-runs-but-no-data-is-written-to-google-sheets","My automation runs but no data is written to Google Sheets",[112,31779],{},[26,31781,31782,31783,31788,31789,31791,31792,7176,31795,31797],{},"The most common cause is that the ",[659,31784,31786],{"href":31785},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fgoogle-sheets#write-data-to-a-google-sheet",[192,31787,22113],{}," step has no ",[145,31790,581],{}," value set. Open the step, click ",[192,31793,31794],{},"Insert data",[145,31796,581],{},", and pick the variable from the previous step you want to write.",[26,31799,31800,31801,148],{},"For background on moving data between steps, see ",[659,31802,31804],{"href":31803},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fpass","pass data between steps",[107,31806,31808],{"id":31807},"page-elements-load-slowly-how-do-i-make-the-scraper-wait","Page elements load slowly. How do I make the scraper wait?",[112,31810],{},[26,31812,31813,31814,31817],{},"axiom.ai waits for page changes by default, but some pages load slower than the detection allows. To force a longer wait, increase ",[145,31815,31816],{},"Minimum wait before scraping (ms)"," in the step's scraper configuration:",[1923,31819,31820,31823,31826,31834],{},[189,31821,31822],{},"Open the automation.",[189,31824,31825],{},"Open the scrape step you want to adjust.",[189,31827,1927,31828,148],{},[659,31829,31831],{"href":31830},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fget-data\u002Fconfiguring-your-scraper#minimum-wait-before-scraping-ms",[192,31832,31833],{},"Configure scraper",[189,31835,31836,31837,31839],{},"Set ",[145,31838,31816],{}," to your desired wait. 1000 ms equals 1 second.",[107,31841,31843],{"id":31842},"the-scraper-returns-inconsistent-results-across-pages","The scraper returns inconsistent results across pages",[112,31845],{},[26,31847,31848],{},"This is most often caused by CSS selectors that don't generalise across pages. Try these in order:",[1923,31850,31851,31859,31867],{},[189,31852,31853,31854,31858],{},"Switch to ",[659,31855,31857],{"href":31856},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fcustom-css-selectors","custom CSS selectors"," that target stable attributes.",[189,31860,31861,31862,31866],{},"Use the ",[659,31863,31865],{"href":31864},"\u002Fguides\u002Fai-proofreading","AI web scraper template"," (requires an OpenAI API key).",[189,31868,31869,31871],{},[659,31870,30989],{"href":1887}," with examples of pages that work and pages that don't.",[107,31873,31875],{"id":31874},"my-automation-is-stuck-on-running","My automation is stuck on Running",[112,31877],{},[26,31879,31880],{},"The most common cause is that the computer or network connection dropped while the automation was running. The run actually stopped, but the extension didn't receive the status update.",[26,31882,31738],{},[1923,31884,31885,31888,31891],{},[189,31886,31887],{},"Refresh the dashboard tab and reopen axiom.ai.",[189,31889,31890],{},"If that doesn't work, restart Chrome.",[189,31892,31893,31894,148],{},"If that doesn't work, see ",[659,31895,31897],{"href":31896},"\u002Fdocs\u002Ftutorials\u002Fstop-bot-runs","stop a run",[26,31899,31900,31901,148],{},"If the run is still stuck after all three, ",[659,31902,26195],{"href":1887},[107,31904,31906],{"id":31905},"pages-dont-load-through-my-proxy","Pages don't load through my proxy",[112,31908],{},[26,31910,31911,31912,31915],{},"If a ",[659,31913,31914],{"href":24705},"proxy"," is configured correctly but the target page won't load, the most likely cause is that the proxy's IP has been blocked or blocklisted by the target site. Many sites maintain lists of known proxy and datacenter IPs and refuse traffic from them.",[26,31917,31918,31919,31921,31922,31925],{},"To confirm, change the ",[192,31920,17849],{}," step to a different URL (something like ",[145,31923,31924],{},"https:\u002F\u002Fexample.com",") and run the automation again. If the test page loads, your proxy works in general but is blocked by the original target site. Try these in order:",[1923,31927,31928,31931,31934],{},[189,31929,31930],{},"Switch to a different proxy or proxy region. Residential proxies are less likely to be blocked than datacenter proxies.",[189,31932,31933],{},"Ask your proxy provider whether they offer a region or pool tuned for the target site.",[189,31935,31936],{},"If the issue persists across multiple proxies, the target site may simply not allow proxied traffic.",[26,31938,31939,31940,31944],{},"If the test page also fails to load, the issue is with the proxy connection itself. See the ",[659,31941,31943],{"href":31942},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fproxy#troubleshooting","proxy troubleshooting section"," for the next steps.",[107,31946,31948],{"id":31947},"how-do-i-make-an-automation-ignore-all-errors","How do I make an automation ignore all errors?",[112,31950],{},[26,31952,25742,31953,3297],{},[659,31954,31955],{"href":23812},"continue on error",[1923,31957,31958,31963,31967],{},[189,31959,25628,31960,31962],{},[192,31961,24349],{}," icon.",[189,31964,4245,31965,2264],{},[192,31966,23813],{},[189,31968,31969,31970,31972],{},"Toggle ",[145,31971,23813],{}," on.",[2093,31974,31975],{},[26,31976,31977,31979,31980,31983],{},[192,31978,2359],{}," With this setting on, every run reports as ",[192,31981,31982],{},"successful"," at the end regardless of how many errors occurred. Errors appear as warnings in run reports.",[107,31985,31987],{"id":31986},"are-runs-ever-queued","Are runs ever queued?",[112,31989],{},[26,31991,31992,31993,31997],{},"Yes. Runs triggered by Zapier, Make, n8n, or the API are queued when your account exceeds its ",[659,31994,31996],{"href":31995},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fconcurrency","concurrency"," limit. Queued runs retry every five minutes until they can run.",[26,31999,32000,32001,148],{},"If you regularly hit the concurrency limit, runs may take a long time to complete or never run at all. For a custom concurrency package, email ",[145,32002,2364],{},[107,32004,32006],{"id":32005},"can-i-run-multiple-instances-of-the-same-automation-in-parallel","Can I run multiple instances of the same automation in parallel?",[112,32008],{},[26,32010,32011],{},"By default, no. Each automation can only have one instance running at a time. The same account can run different automations in parallel up to its concurrency limit, but not the same automation twice.",[26,32013,32014,32015,32018],{},"To run the same logic concurrently, use ",[192,32016,32017],{},"Save as duplicate"," from the Builder menu to create as many copies of the automation as you need parallel runs. Each duplicate counts as a separate automation and can run independently of the others.",[107,32020,32022],{"id":32021},"can-i-trigger-an-automation-with-apple-shortcuts","Can I trigger an automation with Apple Shortcuts?",[112,32024],{},[26,32026,32027,32028,32032],{},"Yes. You can trigger axiom.ai automations from ",[659,32029,32031],{"href":32030},"\u002Fguides\u002Fapple-shortcuts","Apple Shortcuts on macOS or iOS",". You can also run shortcuts from the command line, or pin them to the macOS Dock.",[107,32034,32036],{"id":32035},"can-i-run-an-automation-on-an-iphone","Can I run an automation on an iPhone?",[112,32038],{},[26,32040,32041,32042,148],{},"You can trigger an automation from an iPhone (typically via Apple Shortcuts), but the automation itself runs on the axiom.ai cloud, not on the iPhone. See the ",[659,32043,32044],{"href":32030},"Apple Shortcuts guide",[107,32046,32048],{"id":32047},"can-i-pause-an-automation-mid-run","Can I pause an automation mid-run?",[112,32050],{},[26,32052,31861,32053,32058],{},[659,32054,32056],{"href":32055},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fwait",[192,32057,18065],{}," step to pause for a fixed duration. There's no manual pause control during a run.",[107,32060,32062],{"id":32061},"can-i-interact-with-the-browser-during-a-run","Can I interact with the browser during a run?",[112,32064],{},[26,32066,32067,32068,32072],{},"On the desktop and on a VPS, yes. In the cloud, no. Interaction with the cloud browser isn't permitted for security reasons. When interacting with the desktop browser during a run, consider adding a ",[659,32069,32070],{"href":32055},[192,32071,18065],{}," step so the automation pauses while you act.",[107,32074,32076],{"id":32075},"can-zapier-trigger-a-desktop-run","Can Zapier trigger a desktop run?",[112,32078],{},[26,32080,32081],{},"Not directly, because Zapier triggers are web-based and the desktop runner doesn't have a public webhook endpoint. The standard workaround uses Google Sheets as a middleman:",[1923,32083,32084,32087,32090,32098],{},[189,32085,32086],{},"In Zapier, write a new row to a Google Sheet when you want the automation to run.",[189,32088,32089],{},"Schedule the axiom.ai automation to run every minute on the desktop.",[189,32091,32092,32093,32097],{},"The first step in the automation reads the sheet with ",[659,32094,32095],{"href":24142},[192,32096,22098],{},". If a row exists, the automation continues.",[189,32099,32100,32101,32107],{},"The last step deletes the row with ",[659,32102,32104],{"href":32103},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdelete-rows-from-a-google-sheet",[192,32105,32106],{},"Delete rows from a Google Sheet"," so the same trigger doesn't fire twice.",[26,32109,32110,32111,148],{},"For more, see ",[659,32112,32114],{"href":32113},"\u002Fguides\u002Ftrigger-desktop","trigger a desktop run with webhooks",[107,32116,32118],{"id":32117},"can-i-share-my-runtime-with-my-team","Can I share my runtime with my team?",[112,32120],{},[26,32122,32123,32124,148],{},"Yes. Ultimate subscribers can share runtime by setting up a ",[659,32125,32127],{"href":32126},"\u002Fdocs\u002Faccount\u002Faccount#set-up-a-team-account","team account",{"title":67,"searchDepth":68,"depth":68,"links":32129},[32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,32153,32154,32155],{"id":31571,"depth":670,"text":31572},{"id":31580,"depth":670,"text":31581},{"id":31589,"depth":670,"text":31590},{"id":31624,"depth":670,"text":31625},{"id":31643,"depth":670,"text":31644},{"id":31672,"depth":670,"text":31673},{"id":31688,"depth":670,"text":31689},{"id":31705,"depth":670,"text":31706},{"id":31714,"depth":670,"text":31715},{"id":31723,"depth":670,"text":31724},{"id":31732,"depth":670,"text":31733},{"id":31763,"depth":670,"text":31764},{"id":31776,"depth":670,"text":31777},{"id":31807,"depth":670,"text":31808},{"id":31842,"depth":670,"text":31843},{"id":31874,"depth":670,"text":31875},{"id":31905,"depth":670,"text":31906},{"id":31947,"depth":670,"text":31948},{"id":31986,"depth":670,"text":31987},{"id":32005,"depth":670,"text":32006},{"id":32021,"depth":670,"text":32022},{"id":32035,"depth":670,"text":32036},{"id":32047,"depth":670,"text":32048},{"id":32061,"depth":670,"text":32062},{"id":32075,"depth":670,"text":32076},{"id":32117,"depth":670,"text":32118},"Answers to common questions about runtime allowances, scheduling, automation speed, concurrency, queueing, and triggering automations from external tools.",{"metaTitle":32158},"Common questions about runtime, scheduling, and automation behaviour","\u002Fdocs\u002Ffaq\u002Fruntime-and-scheduling",{"title":31566,"description":32156},"docs\u002Ffaq\u002Fruntime-and-scheduling","iF-FFgtOVWeBq3sBt97xHkABFStsXNVeGgLU4F0Bwoo",{"id":32164,"title":32165,"body":32166,"date":71,"description":32335,"extension":73,"meta":32336,"navigation":75,"order":1478,"path":32338,"seo":32339,"stem":32340,"__hash__":32341},"content\u002Fdocs\u002Ffaq\u002Fsubscriptions-and-accounts.md","Subscriptions and accounts FAQ",{"type":8,"value":32167,"toc":32322},[32168,32172,32174,32177,32181,32183,32193,32197,32199,32210,32214,32216,32219,32222,32226,32228,32234,32241,32245,32247,32250,32257,32261,32263,32266,32276,32280,32282,32285,32289,32291,32298,32302,32304,32310,32314,32316],[107,32169,32171],{"id":32170},"does-axiomai-have-a-free-tier","Does axiom.ai have a free tier?",[112,32173],{},[26,32175,32176],{},"axiom.ai has a free trial, not a free tier. You can build an automation and run it successfully for up to 2 hours. Failed runs don't count against the trial.",[107,32178,32180],{"id":32179},"how-do-i-cancel-my-subscription","How do I cancel my subscription?",[112,32182],{},[26,32184,32185,32186,32190,32191,148],{},"Cancel from the ",[659,32187,32189],{"href":2297,"rel":32188},[1218],"Stripe payment portal",". The portal is also accessible from the account page in the Chrome extension. For the full process, see ",[659,32192,2206],{"href":2108},[107,32194,32196],{"id":32195},"how-do-i-download-invoices","How do I download invoices?",[112,32198],{},[26,32200,32201,32202,32205,32206,148],{},"Download invoices from the ",[659,32203,32189],{"href":2297,"rel":32204},[1218],". The portal is also accessible from the account page in the Chrome extension. For step-by-step instructions, see ",[659,32207,32209],{"href":32208},"\u002Fdocs\u002Faccount\u002Fsubscription#download-invoices","download invoices",[107,32211,32213],{"id":32212},"how-do-upgrades-work","How do upgrades work?",[112,32215],{},[26,32217,32218],{},"When you upgrade mid-cycle, the unused portion of your current plan applies as a discount toward the new plan. This is called proration.",[26,32220,32221],{},"For example, if you've paid $15 on Starter and immediately upgrade to Pro ($50), the full $15 applies as credit and you pay $35 to upgrade. If you upgrade two-thirds of the way through the month, only $5 of the $15 remains, so you pay $45 to upgrade.",[107,32223,32225],{"id":32224},"can-i-manage-other-users-from-my-account","Can I manage other users from my account?",[112,32227],{},[26,32229,32230,32231,32233],{},"axiom.ai doesn't have built-in user management. You can share account credentials so multiple users access the same subscription and the same automations, but there's no per-user permissioning. For shared usage, see the ",[659,32232,32127],{"href":32126}," feature on the Ultimate plan.",[2093,32235,32236],{},[26,32237,32238,32240],{},[192,32239,2359],{}," Sharing credentials means everyone who has them can read and modify everything in the account. Use a team account on Ultimate for properly shared access.",[107,32242,32244],{"id":32243},"if-i-downgrade-will-my-scheduled-automations-still-work","If I downgrade, will my scheduled automations still work?",[112,32246],{},[26,32248,32249],{},"Downgrades to Starter or Free cancel all scheduled runs.",[26,32251,32252,32253,32256],{},"Downgrades from Ultimate or Pro Max to Pro can change the maximum ",[659,32254,32255],{"href":31771},"scheduling frequency"," you have access to.",[107,32258,32260],{"id":32259},"can-an-axiomai-account-be-shared","Can an axiom.ai account be shared?",[112,32262],{},[26,32264,32265],{},"Yes. Multiple users can sign in with the same credentials and access the shared subscription and shared automations.",[2093,32267,32268],{},[26,32269,32270,32272,32273,32275],{},[192,32271,2099],{}," Sharing credentials means everyone who has them has full access. For team usage with proper separation, set up a ",[659,32274,32127],{"href":32126}," on Ultimate.",[107,32277,32279],{"id":32278},"do-you-offer-student-discounts","Do you offer student discounts?",[112,32281],{},[26,32283,32284],{},"Not at this time.",[107,32286,32288],{"id":32287},"do-you-offer-yearly-subscriptions","Do you offer yearly subscriptions?",[112,32290],{},[26,32292,32293,32294,32297],{},"Yes. Email ",[659,32295,32296],{"href":1887},"customer support"," to set one up.",[107,32299,32301],{"id":32300},"i-cant-sign-in-to-the-stripe-payment-portal","I can't sign in to the Stripe payment portal",[112,32303],{},[26,32305,32306,32307,148],{},"The most common cause is that you're using a different email address than the one your subscription is registered against. Try signing in with your other email addresses. If none of them work, ",[659,32308,32309],{"href":1887},"contact customer support",[107,32311,32313],{"id":32312},"is-there-a-team-subscription","Is there a team subscription?",[112,32315],{},[26,32317,32318,32319,148],{},"Yes. Ultimate subscribers can share their account using the ",[659,32320,32321],{"href":32126},"team account feature",{"title":67,"searchDepth":68,"depth":68,"links":32323},[32324,32325,32326,32327,32328,32329,32330,32331,32332,32333,32334],{"id":32170,"depth":670,"text":32171},{"id":32179,"depth":670,"text":32180},{"id":32195,"depth":670,"text":32196},{"id":32212,"depth":670,"text":32213},{"id":32224,"depth":670,"text":32225},{"id":32243,"depth":670,"text":32244},{"id":32259,"depth":670,"text":32260},{"id":32278,"depth":670,"text":32279},{"id":32287,"depth":670,"text":32288},{"id":32300,"depth":670,"text":32301},{"id":32312,"depth":670,"text":32313},"Answers to common questions about axiom.ai subscriptions, including free trials, cancellation, upgrades, downgrades, team accounts, and Stripe portal access.",{"metaTitle":32337},"Common questions about axiom.ai subscriptions, billing, and account management","\u002Fdocs\u002Ffaq\u002Fsubscriptions-and-accounts",{"title":32165,"description":32335},"docs\u002Ffaq\u002Fsubscriptions-and-accounts","f3jmLlOjnhDx40c5kSDV6We2vWMXsdtUHoAC1vP4MOg",{"id":32343,"title":32344,"body":32345,"date":71,"description":32370,"extension":73,"meta":32371,"navigation":75,"order":293,"path":32373,"seo":32374,"stem":32375,"__hash__":32376},"content\u002Fdocs\u002Ffaq\u002Fthird-party.md","Third-party tools FAQ",{"type":8,"value":32346,"toc":32367},[32347,32351,32353,32360],[107,32348,32350],{"id":32349},"can-i-use-axiomai-to-automate-slack","Can I use axiom.ai to automate Slack?",[112,32352],{},[26,32354,32355,32356,32359],{},"Yes, but only on the desktop. Slack blocks Chromium, which is the browser axiom.ai uses by default both locally and in the cloud. To automate Slack, run the automation on the desktop pointed at your local Chrome installation. See ",[659,32357,32358],{"href":23852},"set executable path"," for the setup.",[2093,32361,32362],{},[26,32363,32364,32366],{},[192,32365,2359],{}," This isn't currently possible in the cloud. The cloud runner uses Chromium and the browser can't be swapped.",{"title":67,"searchDepth":68,"depth":68,"links":32368},[32369],{"id":32349,"depth":670,"text":32350},"Answers to common questions about using axiom.ai with third-party services, including Slack, that have specific browser or platform restrictions.",{"metaTitle":32372},"Common questions about axiom.ai with third-party tools","\u002Fdocs\u002Ffaq\u002Fthird-party",{"title":32344,"description":32370},"docs\u002Ffaq\u002Fthird-party","v4X_h0myX6aw_40ogZav4JpMwbMonxvhGQLzt2ov_JA",{"id":32378,"title":32379,"body":32380,"date":71,"description":32417,"extension":73,"meta":32418,"navigation":75,"order":71,"path":32419,"seo":32420,"stem":32421,"__hash__":32422},"content\u002Fdocs\u002Findex.md","Browser Automation Documentation: No-Code, Code, API | axiom",{"type":8,"value":32381,"toc":32415},[32382,32386,32393,32402,32408,32411],[11,32383],{"description":32384,"headline":32385}," Learn how to automate the browser using a visual builder or code.","Documentation",[32387,32388],"search-dialog",{"className":32389,"variant":738},[32390,32391,32392],"mt-11!","lg:max-w-2xl","lg:mx-auto",[32394,32395],"docs-link-section",{":groups":32396,"ctaText":32397,"ctaTo":32398,"description":32399,"shape":32400,"title":32401},"[{\"title\":\"Get started\",\"description\":\"New to bot building, pick a starting point and we will guide you through.\",\"links\":[{\"text\":\"The builder\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder\"},{\"text\":\"Get started\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fget-started\"},{\"text\":\"Passing data between steps\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fpass\"},{\"text\":\"The selector tool\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\"},{\"text\":\"Sharing automations\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fsharing\"}]},{\"title\":\"How it works\",\"description\":\"Learn advanced building techniques like looping and logic.\",\"links\":[{\"text\":\"Looping\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Floop\"},{\"text\":\"Logic\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogic\"},{\"text\":\"Integrate AI\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fintegrate-ai\"},{\"text\":\"Custom code\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fjavascript\"},{\"text\":\"Run and schedule\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\"}]},{\"title\":\"Use cases\",\"description\":\"Common starting points for your first bots.\",\"links\":[{\"text\":\"Web scraping\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fget-data\"},{\"text\":\"Data entry\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata\"},{\"text\":\"Scrape a page into a Google Sheet\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fget-started\u002Fscrape-to-sheet\"},{\"text\":\"Fill a form from a spreadsheet\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fget-started\u002Fform-filling\"},{\"text\":\"Loop through a list of URLs\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fget-started\u002Floop-urls\"}]},{\"title\":\"Reference\",\"description\":\"Running bots securely on desktop or in the cloud.\",\"links\":[{\"text\":\"Schedule\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\"},{\"text\":\"Desktop\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Frun\"},{\"text\":\"Cloud\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Frun\"},{\"text\":\"Settings\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\"},{\"text\":\"API\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\"}]},{\"title\":\"Troubleshooting\",\"description\":\"Learn how to debug and fix your bots.\",\"links\":[{\"text\":\"How to debug\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Fhow-to-debug\"},{\"text\":\"Errors\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\"},{\"text\":\"Handling errors\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferror-handling\"}]}]","No-code documentation","\u002Fdocs\u002Fno-code-tool","Documentation for mastering the No-code tool. Learn how to build bots, avoid not blocking and runs bots on cloud or desktop.","pillar","Build with no-code",[32394,32403],{":groups":32404,"ctaText":32405,"ctaTo":3109,"description":32406,"shape":510,"title":265,"sectionId":32407},"[{\"title\":\"Code Dashboard\",\"description\":\"Code Dashboard for browser bots. Write Puppeteer scripts in your stack and connect to axiom.ai, no local browser setup.\",\"links\":[{\"text\":\"Dashboard\",\"to\":\"\u002Fdocs\u002Fcode\u002Fdashboard\"},{\"text\":\"Live editor\",\"to\":\"\u002Fdocs\u002Fcode\u002Flive-editor\"},{\"text\":\"Scripting a bot\",\"to\":\"\u002Fdocs\u002Fcode\u002Fcreate-scripts\"},{\"text\":\"Running bots\",\"to\":\"\u002Fdocs\u002Fcode\u002Frunning-scripts\"},{\"text\":\"Monitoring runs\",\"to\":\"\u002Fdocs\u002Fcode\u002Frun-reports\"},{\"text\":\"Keys and API\",\"to\":\"\u002Fdocs\u002Fcode\u002Ftoken-generation\"}]},{\"title\":\"API\",\"description\":\"Trigger no-code automations via REST API. Integrate with Zapier, Make, cURL, or your own apps.\",\"links\":[{\"text\":\"API documentation\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\"},{\"text\":\"Chrome API\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fcdp\"},{\"text\":\"Step API\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\"},{\"text\":\"Responses\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Freference\u002Fresponses\"},{\"text\":\"Queue\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fusage-and-limits\u002Fqueue-and-concurrency\"},{\"text\":\"Rate limits\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fusage-and-limits\u002Frate-limits\"}]},{\"title\":\"Snippets\",\"description\":\"Copy-paste examples for JavaScript, Puppeteer, and common integration patterns.\",\"links\":[{\"text\":\"JavaScript snippets\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\"},{\"text\":\"Puppeteer snippets\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fpuppeteer\"},{\"text\":\"Axiom structure\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fdeep-dives\u002Faxiom-structure\"},{\"text\":\"Chromium\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fdeep-dives\u002Fchromium\"}]},{\"title\":\"Troubleshooting\",\"description\":\"Debug API issues and integration problems.\",\"links\":[{\"text\":\"API troubleshooting\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Ftroubleshooting\u002Fapi\"},{\"text\":\"Debugging\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Ftroubleshooting\u002Fdebug\"}]}]","Developer documentation","Developer documentation for building and integrating with axiom.ai's tools and infrastructure. Explore APIs, SDKs, and examples in the Developer Hub.","dev-docs",[63,32409],{"className":32410,"headline":1759,"linkText":119,"linkTo":174,"text":1448},[35,747],[400,32412],{":links":32413,"className":32414},"[{\"eyebrow\":\"Docs\",\"title\":\"Get started with no-code\",\"to\":\"\u002Fdocs\u002Fno-code-tool\"},{\"eyebrow\":\"Docs\",\"title\":\"Get started with code\",\"to\":\"\u002Fdocs\u002Fcode\"}]",[35,747],{"title":67,"searchDepth":68,"depth":68,"links":32416},[],"Official documentation for axiom.ai. Build browser automations in the no-code Chrome extension, in code with our SDK, or against our REST and MCP APIs. Step references, guides, and integrations.",{},"\u002Fdocs",{"title":32379,"description":32417},"docs\u002Findex","tLr8B9OF36NbeJp5awnBSg_5QE8ZQIeP2MwlG1rXC98",{"id":32424,"title":32425,"body":32426,"date":71,"description":32579,"extension":73,"meta":32580,"navigation":75,"order":670,"path":32582,"seo":32583,"stem":32584,"__hash__":32585},"content\u002Fdocs\u002Fno-code-tool\u002Fget-started\u002Fform-filling.md","Fill a form from a spreadsheet",{"type":8,"value":32427,"toc":32573},[32428,32435,32439,32441,32444,32472,32476,32478,32516,32519,32523,32525,32551,32555,32557],[26,32429,32430,32431,32434],{},"A good second bot, once you're comfortable with scraping. You'll read rows from a Google Sheet and, for each row, fill in a form on a website. This is where you meet ",[192,32432,32433],{},"Loop"," for the first time - the step that repeats work across every row of data.",[107,32436,32438],{"id":32437},"what-youll-build","What you'll build",[112,32440],{},[26,32442,32443],{},"A bot with four steps:",[186,32445,32446,32451,32456,32466],{},[189,32447,32448,32450],{},[192,32449,22098],{}," - pulls in the rows.",[189,32452,32453,32455],{},[192,32454,15653],{}," - repeats the next steps once per row.",[189,32457,32458,32459,4468,32461,4468,32463,32465],{},"Inside the loop: ",[192,32460,17849],{},[192,32462,16065],{},[192,32464,15781],{}," - the steps that fill the form.",[189,32467,32468,32469,32471],{},"Optionally, a final ",[192,32470,22127],{}," or log step to confirm each submission.",[107,32473,32475],{"id":32474},"build-the-bot","Build the bot",[112,32477],{},[1923,32479,32480,32485,32494,32500,32508,32513],{},[189,32481,15620,32482,32484],{},[192,32483,22098],{}," step. Point it at the sheet that contains your form data - one row per form submission.",[189,32486,15620,32487,32489,32490,32493],{},[192,32488,15653],{}," step. Reference the sheet data from step 1 with ",[192,32491,32492],{},"Insert Data",". Every step you place inside this loop runs once per row.",[189,32495,32496,32497,32499],{},"Inside the loop, add a ",[192,32498,17849],{}," step pointing at the form.",[189,32501,11513,32502,32504,32505,32507],{},[192,32503,16065],{}," step for each form field. Use ",[192,32506,32492],{}," to pull the value from the current loop row.",[189,32509,15620,32510,32512],{},[192,32511,15781],{}," step for the submit button.",[189,32514,32515],{},"Run the bot. Check the form submissions.",[26,32517,32518],{},"The shape: read data → loop once per row → do the work → repeat.",[107,32520,32522],{"id":32521},"things-worth-knowing","Things worth knowing",[112,32524],{},[186,32526,32527,32538,32544],{},[189,32528,32529,32530,32533,32534,32537],{},"Loops run steps ",[192,32531,32532],{},"once per row"," in the data you passed in. Inside the loop, ",[145,32535,32536],{},"[sheet-data]"," refers to the current row, not all rows.",[189,32539,32540,32541,32543],{},"Between iterations you may need a ",[192,32542,18065],{}," step - some forms rate-limit fast submissions.",[189,32545,32546,32547,148],{},"If a form uses CAPTCHAs, dropdowns that load dynamically, or multi-step wizards, you'll need extra steps. See ",[659,32548,32550],{"href":32549},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions","Browser actions",[107,32552,32554],{"id":32553},"next","Next",[112,32556],{},[186,32558,32559,32566],{},[189,32560,32561,32562,32565],{},"Read the ",[659,32563,15653],{"href":32564},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Floop-through-data"," reference for the loop mechanics.",[189,32567,32568,32569,32572],{},"Follow a full walkthrough with a template: see the ",[659,32570,32571],{"href":338},"form-filling guides"," on the Guides site.",{"title":67,"searchDepth":68,"depth":68,"links":32574},[32575,32576,32577,32578],{"id":32437,"depth":670,"text":32438},{"id":32474,"depth":670,"text":32475},{"id":32521,"depth":670,"text":32522},{"id":32553,"depth":670,"text":32554},"Read rows from a spreadsheet and, for each row, fill a form on a website.",{"metaTitle":32581},"Fill a web form from a Google Sheet | axiom.ai","\u002Fdocs\u002Fno-code-tool\u002Fget-started\u002Fform-filling",{"title":32425,"description":32579},"docs\u002Fno-code-tool\u002Fget-started\u002Fform-filling","YXIv7KHtKt3mVQQENeCnmsj7_4eywmrpgSAQIcsupxg",{"id":32587,"title":153,"body":32588,"date":71,"description":32651,"extension":73,"meta":32652,"navigation":75,"order":68,"path":31364,"seo":32654,"stem":32655,"__hash__":32656},"content\u002Fdocs\u002Fno-code-tool\u002Fget-started\u002Findex.md",{"type":8,"value":32589,"toc":32646},[32590,32596,32611,32613,32617,32619,32622,32626,32628,32631,32635,32637,32640],[26,32591,32592,32593,148],{},"Three common starting points for your first bot. Each one walks through the main moves, links to the relevant reference pages when you want more depth, and points you to a full walkthrough in our ",[659,32594,32595],{"href":338},"Guides",[26,32597,32598,32599,4468,32603,10147,32607,148],{},"Jump to ",[659,32600,32602],{"href":32601},"#scrape-a-page-into-a-google-sheet","scrape a page into a Google Sheet",[659,32604,32606],{"href":32605},"#fill-a-form-from-a-spreadsheet","fill a form from a spreadsheet",[659,32608,32610],{"href":32609},"#loop-through-a-list-of-urls","loop through a list of URLs",[2218,32612],{},[107,32614,32616],{"id":32615},"web-scraping","Web scraping",[112,32618],{},[2218,32620],{"path":32621},"scrape-to-sheet",[107,32623,32625],{"id":32624},"data-entry","Data entry",[112,32627],{},[2218,32629],{"path":32630},"form-filling",[107,32632,32634],{"id":32633},"looping","Looping",[112,32636],{},[2218,32638],{"path":32639},"loop-urls",[26,32641,32642,32643,148],{},"Ready for a full walkthrough with a downloadable template? Browse all ",[659,32644,32645],{"href":338},"browser automation guides",{"title":67,"searchDepth":68,"depth":68,"links":32647},[32648,32649,32650],{"id":32615,"depth":670,"text":32616},{"id":32624,"depth":670,"text":32625},{"id":32633,"depth":670,"text":32634},"Three short starting points for your first bot - scrape a page, fill a form, or loop through a list of URLs.",{"metaTitle":32653},"Get started with browser automation in axiom.ai | axiom.ai",{"title":153,"description":32651},"docs\u002Fno-code-tool\u002Fget-started\u002Findex","5bxPkgoAPAWiovrPAZLUCxdbxOCuMhGnRUKoALYgroY",{"id":32658,"title":32659,"body":32660,"date":71,"description":32811,"extension":73,"meta":32812,"navigation":75,"order":68,"path":32814,"seo":32815,"stem":32816,"__hash__":32817},"content\u002Fdocs\u002Fno-code-tool\u002Fget-started\u002Floop-urls.md","Loop through a list of URLs",{"type":8,"value":32661,"toc":32805},[32662,32665,32667,32669,32672,32701,32703,32705,32749,32752,32754,32756,32783,32785,32787],[26,32663,32664],{},"When the thing you're automating needs to happen on lots of pages, not one. You'll pass in a list of URLs, visit each one, and run the same actions on every page. Useful for product-page scraping, bulk screenshots, and any \"do this thing 200 times\" task.",[107,32666,32438],{"id":32437},[112,32668],{},[26,32670,32671],{},"A bot with three or four steps:",[186,32673,32674,32688,32693,32698],{},[189,32675,32676,32677,32679,32680,32683,32684,32687],{},"A data source - a ",[192,32678,26048],{},", a ",[192,32681,32682],{},"CSV",", or a ",[192,32685,32686],{},"Get a list of links from a URL"," scrape.",[189,32689,32690,32692],{},[192,32691,15653],{}," - repeats the next steps once per URL.",[189,32694,32458,32695,32697],{},[192,32696,17849],{}," - opens each URL.",[189,32699,32700],{},"Inside the loop: whatever you want the bot to do on each page.",[107,32702,32475],{"id":32474},[112,32704],{},[1923,32706,32707,32728,32735,32740,32746],{},[189,32708,32709,32710],{},"Get your URLs into a step. The three usual sources:\n",[186,32711,32712,32717,32723],{},[189,32713,7407,32714,32716],{},[192,32715,22098],{}," step pointing at a column of URLs.",[189,32718,7429,32719,32722],{},[192,32720,32721],{},"Import CSV file"," step if the URLs live in a CSV.",[189,32724,7407,32725,32727],{},[192,32726,32686],{}," step if you want to scrape the URLs off a listing page first.",[189,32729,15620,32730,32732,32733,148],{},[192,32731,15653],{}," step. Reference the URL data with ",[192,32734,32492],{},[189,32736,32496,32737,32739],{},[192,32738,17849],{}," step. Insert the current loop value as the URL - this is what makes the bot visit a different page each iteration.",[189,32741,32742,32743,32745],{},"Add whatever steps should run on each page - scrape, click, fill, screenshot - below the ",[192,32744,17849],{}," step, still inside the loop.",[189,32747,32748],{},"Run the bot and watch it work through the list.",[26,32750,32751],{},"The shape: get URLs → loop once per URL → go to that URL → do the work.",[107,32753,32522],{"id":32521},[112,32755],{},[186,32757,32758,32771,32777],{},[189,32759,32760,32761,32763,32764,32767,32768,32770],{},"The whole job of the ",[192,32762,17849],{}," step inside a loop is to use the ",[26030,32765,32766],{},"current"," URL, not the first or last one. Always use ",[192,32769,32492],{}," to reference the loop row, never paste a hard-coded URL.",[189,32772,32773,32774,32776],{},"Lots of sites rate-limit or detect bots when hit in quick succession. A ",[192,32775,18065],{}," step inside the loop is usually a good idea.",[189,32778,32779,32780,32782],{},"If any single URL fails, the whole loop stops. Wrap the page work in a ",[192,32781,22049],{}," if you'd rather skip bad URLs and keep going.",[107,32784,32554],{"id":32553},[112,32786],{},[186,32788,32789,32794,32800],{},[189,32790,32791,32793],{},[659,32792,15653],{"href":32564}," reference covers the loop mechanics.",[189,32795,32796,32799],{},[659,32797,22049],{"href":32798},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Ftry-catch"," for handling failures mid-loop.",[189,32801,32802,32803,148],{},"Full walkthroughs with templates: ",[659,32804,32645],{"href":338},{"title":67,"searchDepth":68,"depth":68,"links":32806},[32807,32808,32809,32810],{"id":32437,"depth":670,"text":32438},{"id":32474,"depth":670,"text":32475},{"id":32521,"depth":670,"text":32522},{"id":32553,"depth":670,"text":32554},"Start with a list of URLs, visit each one, and do something on every page.",{"metaTitle":32813},"Loop through URLs with browser automation | axiom.ai","\u002Fdocs\u002Fno-code-tool\u002Fget-started\u002Floop-urls",{"title":32659,"description":32811},"docs\u002Fno-code-tool\u002Fget-started\u002Floop-urls","iNn84QGq53VDBKUeWRyUrstcrGp5xWhHVnOyESwJFtY",{"id":32819,"title":32820,"body":32821,"date":71,"description":32931,"extension":73,"meta":32932,"navigation":75,"order":2131,"path":32934,"seo":32935,"stem":32936,"__hash__":32937},"content\u002Fdocs\u002Fno-code-tool\u002Fget-started\u002Fscrape-to-sheet.md","Scrape a page into a Google Sheet",{"type":8,"value":32822,"toc":32925},[32823,32826,32828,32830,32833,32849,32851,32853,32880,32883,32885,32887,32905,32907,32909],[26,32824,32825],{},"A good first bot. You'll scrape a table or list off a page and write every row into a Google Sheet. By the end you'll understand how data flows from one step to another in axiom.ai - the mental model that underpins every bot you build after this.",[107,32827,32438],{"id":32437},[112,32829],{},[26,32831,32832],{},"A bot with three steps:",[186,32834,32835,32841,32846],{},[189,32836,32837,32840],{},[192,32838,32839],{},"Get data from a URL"," - scrapes the page.",[189,32842,32843,32845],{},[192,32844,22113],{}," - saves each scraped row.",[189,32847,32848],{},"Optionally, a scheduler so the bot runs every hour, day, or week.",[107,32850,32475],{"id":32474},[112,32852],{},[1923,32854,32855,32860,32866,32872,32877],{},[189,32856,15620,32857,32859],{},[192,32858,32839],{}," step. Enter the URL of the page you want to scrape, then use the selector tool to click on the data. Axiom auto-detects repeating rows.",[189,32861,32862,32863,32865],{},"Connect your Google account and add a ",[192,32864,22113],{}," step. Point it at a sheet.",[189,32867,32868,32869,32871],{},"In the sheet step, use the ",[192,32870,32492],{}," button to reference the scraped data from step 1. Pick which columns you want written.",[189,32873,1927,32874,32876],{},[192,32875,3137],{}," to test. Check the sheet.",[189,32878,32879],{},"If it works, schedule the bot to run automatically.",[26,32881,32882],{},"That's the whole shape. Scrape data → reference it in the next step → write it out.",[107,32884,32522],{"id":32521},[112,32886],{},[186,32888,32889,32896,32899],{},[189,32890,32891,32892,32895],{},"Scraped data is returned as a ",[192,32893,32894],{},"2D array"," (rows and columns). Every step that reads data from another step reads it in this shape.",[189,32897,32898],{},"The selector tool looks for repeating patterns. Click one item and the bot finds the rest. Click a second example if the first click doesn't capture everything.",[189,32900,32901,32902,32904],{},"If the page loads slowly, the ",[192,32903,31833],{}," settings on the scrape step let you add wait time. Worth knowing if you see missing rows.",[107,32906,32554],{"id":32553},[112,32908],{},[186,32910,32911,32919],{},[189,32912,32913,32914,32918],{},"Read the full ",[659,32915,32917],{"href":32916},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fscrape-data","Scrape data"," reference for every scraper option.",[189,32920,32921,32922,32572],{},"Follow the full guide with a downloadable template: ",[659,32923,32924],{"href":338},"How to scrape links to a Google Sheet",{"title":67,"searchDepth":68,"depth":68,"links":32926},[32927,32928,32929,32930],{"id":32437,"depth":670,"text":32438},{"id":32474,"depth":670,"text":32475},{"id":32521,"depth":670,"text":32522},{"id":32553,"depth":670,"text":32554},"Pull structured data off any webpage and write it straight to a Google Sheet in five steps.",{"metaTitle":32933},"Scrape a webpage into a Google Sheet | axiom.ai","\u002Fdocs\u002Fno-code-tool\u002Fget-started\u002Fscrape-to-sheet",{"title":32820,"description":32931},"docs\u002Fno-code-tool\u002Fget-started\u002Fscrape-to-sheet","vYKD92IrRRJG2PG5TOA8PENOH3P0iwlAR42Cu4pZZCU",{"id":32939,"title":32940,"body":32941,"date":71,"description":33159,"extension":73,"meta":33160,"navigation":75,"order":71,"path":33162,"seo":33163,"stem":33164,"__hash__":33165},"content\u002Fdocs\u002Fno-code-tool\u002Fget-started\u002Fwebforms.md","How to automate web forms",{"type":8,"value":32942,"toc":33144},[32943,32946,32949,32953,32955,32958,32976,32980,32982,32985,33002,33006,33008,33011,33014,33017,33021,33024,33040,33044,33047,33060,33063,33067,33070,33074,33082,33099,33103,33105,33108,33112,33119,33122,33126,33128,33131,33134,33138,33141],[26,32944,32945],{},"To get started automating your web form, we have a choice of great starting points, including snippets, templates, or starting from blank.",[32947,32948],"hero-media",{},[107,32950,32952],{"id":32951},"start-from-snippet","Start from Snippet",[112,32954],{},[26,32956,32957],{},"Snippets are step combinations useful for starting an automation. We have a snippet called \"Fill in a form\" that adds steps you can build on. To add this snippet:",[32959,32960,32961,32972],"tutorial",{},[1923,32962,32963,32966,32969],{},[189,32964,32965],{},"Click \"New Automation\".",[189,32967,32968],{},"Then click \"Add first step\".",[189,32970,32971],{},"Finally, select the \"Fill in a form\" snippet.",[32973,32974],"you-tube-dialog",{"url":32975},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Ft5YD7ahWDOc?rel=0&start=24&end=978",[107,32977,32979],{"id":32978},"start-from-template","Start from Template",[112,32981],{},[26,32983,32984],{},"We have some pre-made templates with video guides to help get you started. These templates have a base set of steps you can add to complete your automation. You can add templates from the builder or our website:",[32959,32986,32987,32999],{},[1923,32988,32989,32994],{},[189,32990,32991],{},[659,32992,32993],{"href":1014},"How to automate data entry from a Google Sheet.",[189,32995,32996],{},[659,32997,32998],{"href":1185},"How to automate data entry without an API using Zapier.",[32973,33000],{"url":33001},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Ft5YD7ahWDOc?rel=0&start=270&end=978",[107,33003,33005],{"id":33004},"how-to-start-from-blank","How to start from blank",[112,33007],{},[26,33009,33010],{},"We recommend when automating forms to focus on the web form itself as a starting point. Ignore importing the data for now.",[26,33012,33013],{},"It may sound counterintuitive, but it’s better to set up the steps required to automate your form with dummy data. Test and prove you can automate the form in the browser. Then, when it’s working, invest your time in connecting your data source.",[26,33015,33016],{},"To get started, click \"New Automation\" then \"Add first step\". Make sure you have axiom.ai open on the web page with the form open.",[21,33018,33020],{"id":33019},"add-a-go-to-page-step","Add a \"Go to page\" step",[26,33022,33023],{},"The first step to add is the \"Go to page\" step. This loads the URL of the web form you wish to automate. To add this step:",[32959,33025,33026,33037],{},[1923,33027,33028,33031,33034],{},[189,33029,33030],{},"Open the step finder and search for \"Go\".",[189,33032,33033],{},"Click and add the \"Go to page\" step.",[189,33035,33036],{},"Insert the web form URL.",[32973,33038],{"url":33039},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Ft5YD7ahWDOc?rel=0&start=497&end=978",[21,33041,33043],{"id":33042},"now-add-the-steps-to-automate-the-form","Now add the steps to automate the form",[26,33045,33046],{},"We have a range of steps you can select from, including steps to enter text, click buttons, and interact with select lists.",[32959,33048,33049,33057],{},[1923,33050,33051,33054],{},[189,33052,33053],{},"Open the step finder, scroll down and click \"Interact\".",[189,33055,33056],{},"Select the step you wish to use from the interact list.",[32973,33058],{"url":33059},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Ft5YD7ahWDOc?rel=0&start=551&end=978",[26,33061,33062],{},"For example, you can add the \"Enter text\" step to input data into a text field.",[21,33064,33066],{"id":33065},"testing","Testing",[26,33068,33069],{},"We recommend testing at regular intervals when adding steps as you set up the automation. It's best to test your automation running locally so you can observe the run and resolve any issues that may occur.",[21,33071,33073],{"id":33072},"connecting-your-data","Connecting your data",[26,33075,33076,33077,33081],{},"When ready to ",[659,33078,33080],{"href":33079},"\u002Fdocs\u002Ftutorials\u002Fdata","connect your data",", choose from one of the steps below. Once added, you can easily pass data into the steps you have already added by going back through them and clicking \"Insert Data\".",[32959,33083,33084],{},[1923,33085,33086,33093],{},[189,33087,33088,33089],{},"Pass data from a ",[659,33090,33092],{"href":33091},"\u002Fguides\u002Fdata-input","Google Sheet.",[189,33094,33095,33096],{},"From a webhook or ",[659,33097,33098],{"href":1185},"Zapier.",[107,33100,33102],{"id":33101},"advanced-techniques-for-web-forms","Advanced techniques for web forms",[112,33104],{},[26,33106,33107],{},"When automating large forms, there are some steps\u002Ftechniques that will prove helpful.",[21,33109,33111],{"id":33110},"try-catch","Try catch",[26,33113,2273,33114,33118],{},[659,33115,33117],{"href":33116},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogic#try-catch","try catch"," lets you attempt to execute a set of steps. If successful, the automation continues; if unsuccessful, it will execute a different set of steps.",[32973,33120],{"url":33121},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Ft5YD7ahWDOc?rel=0&start=847&end=978",[21,33123,33125],{"id":33124},"get-data-from-bots-current-page-and-conditionally-jump-to-another-step-steps","\"Get data from bot's current page\" and \"Conditionally jump to another step\" steps",[112,33127],{},[26,33129,33130],{},"If you need to check for a value and present a different set of steps, we recommend using a \"Get data from bot's current page\" to scrape for that value. Then use the \"Conditionally jump to another step\" to execute a specific set of steps if the value is found.",[32973,33132],{"url":33133},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Ft5YD7ahWDOc?rel=0&start=882&end=978",[21,33135,33137],{"id":33136},"grouping-steps","Grouping steps",[26,33139,33140],{},"If you are automating a form with multiple pages, we recommend using the \"Loop data\" step to nest steps and arrange your automation by the pages of the web form.",[32973,33142],{"url":33143},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Ft5YD7ahWDOc?rel=0&start=780&end=978",{"title":67,"searchDepth":68,"depth":68,"links":33145},[33146,33147,33148,33154],{"id":32951,"depth":670,"text":32952},{"id":32978,"depth":670,"text":32979},{"id":33004,"depth":670,"text":33005,"children":33149},[33150,33151,33152,33153],{"id":33019,"depth":68,"text":33020},{"id":33042,"depth":68,"text":33043},{"id":33065,"depth":68,"text":33066},{"id":33072,"depth":68,"text":33073},{"id":33101,"depth":670,"text":33102,"children":33155},[33156,33157,33158],{"id":33110,"depth":68,"text":33111},{"id":33124,"depth":68,"text":33125},{"id":33136,"depth":68,"text":33137},"Learn how to automate data entry into web forms by combining steps using the axiom.ai No-code tool.",{"video":33161},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Ft5YD7ahWDOc?rel=0&start=0&end=978","\u002Fdocs\u002Fno-code-tool\u002Fget-started\u002Fwebforms",{"title":32940,"description":33159},"docs\u002Fno-code-tool\u002Fget-started\u002Fwebforms","2oM0OlkWYuHiPRVB0Dc7HUnY0pXLcwat7zadzfrbnLo",{"id":33167,"title":33168,"body":33169,"date":71,"description":33246,"extension":73,"meta":33247,"navigation":75,"order":2765,"path":33249,"seo":33250,"stem":33251,"__hash__":33252},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fcheckbox.md","Tick a checkbox",{"type":8,"value":33170,"toc":33239},[33171,33178,33182,33184,33192,33200,33204,33206,33212,33216,33230,33232],[26,33172,33173,33174,15415],{},"To tick a checkbox, use the ",[659,33175,33176],{"href":15778},[192,33177,15781],{},[107,33179,33181],{"id":33180},"use-the-click-element-step","Use the Click element step",[112,33183],{},[26,33185,33186,33187,33189,33190,15415],{},"Open the step finder, search for ",[192,33188,5473],{},", and add the ",[192,33191,15781],{},[1923,33193,33194],{},[189,33195,1927,33196,33199],{},[192,33197,33198],{},"Select"," and choose the checkbox.",[107,33201,33203],{"id":33202},"fallback-methods","Fallback methods",[112,33205],{},[26,33207,33208,33209,33211],{},"If the ",[192,33210,15781],{}," step doesn't work for your checkbox, try these alternatives.",[21,33213,33215],{"id":33214},"press-keys-step","Press key(s) step",[26,33217,2273,33218,33222,33223,33225,33226,33229],{},[659,33219,33220],{"href":19561},[192,33221,19564],{}," step records keystrokes. For example, press ",[192,33224,19687],{}," to move focus to the checkbox and ",[192,33227,33228],{},"Space"," to tick it.",[21,33231,31332],{"id":2964},[26,33233,2273,33234,33238],{},[659,33235,33236],{"href":31331},[192,33237,19051],{}," step can tick checkboxes directly.",{"title":67,"searchDepth":68,"depth":68,"links":33240},[33241,33242],{"id":33180,"depth":670,"text":33181},{"id":33202,"depth":670,"text":33203,"children":33243},[33244,33245],{"id":33214,"depth":68,"text":33215},{"id":2964,"depth":68,"text":31332},"Tick checkboxes in a web form using the Click element step, with fallback methods for tricky cases.",{"metaTitle":33248},"Tick a checkbox in a web form with the Click element step","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fcheckbox",{"title":33168,"description":33246},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fcheckbox","u3h_Q5sAQl6xNY1TGR_FwXutt31OX5ajXjFhT418trs",{"id":33254,"title":33255,"body":33256,"date":71,"description":33689,"extension":73,"meta":33690,"navigation":75,"order":670,"path":31632,"seo":33693,"stem":33694,"__hash__":33695},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fclicks.md","Automate a button click",{"type":8,"value":33257,"toc":33676},[33258,33266,33268,33272,33274,33281,33285,33288,33307,33311,33320,33342,33346,33352,33369,33373,33375,33385,33389,33391,33409,33413,33415,33423,33427,33430,33494,33504,33508,33583,33589,33615,33618,33643,33646,33673],[26,33259,33260,33261,33265],{},"There are several ways to automate clicking a button in a web app. The primary method is the ",[659,33262,33263],{"href":15778},[192,33264,15781],{}," step, but you can also record key presses or fall back to JavaScript.",[32947,33267],{},[107,33269,33271],{"id":33270},"click-with-the-click-element-step","Click with the Click element step",[112,33273],{},[26,33275,33186,33276,33189,33278,33280],{},[192,33277,5473],{},[192,33279,15781],{}," step. Then choose the button using one of the methods below.",[21,33282,33284],{"id":33283},"choose-the-button-with-the-selector-tool","Choose the button with the selector tool",[26,33286,33287],{},"Point and click on the page to select the button.",[1923,33289,33290,33299,33302],{},[189,33291,1927,33292,33294,33295,148],{},[192,33293,33198],{}," to open the ",[659,33296,33298],{"href":33297},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fsingle","single selector tool",[189,33300,33301],{},"Hover over the button and click to select it.",[189,33303,1927,33304,148],{},[192,33305,33306],{},"Complete",[21,33308,33310],{"id":33309},"select-by-text","Select by text",[26,33312,33313,33314,2344,33316,33319],{},"If a button has unique text on the page (for example ",[192,33315,1943],{},[192,33317,33318],{},"Message","), select it by its text. This is the most reliable method when it's available.",[1923,33321,33322,33327,33332,33338],{},[189,33323,1927,33324,33326],{},[192,33325,33198],{}," to open the single selector tool.",[189,33328,1927,33329,148],{},[192,33330,33331],{},"Custom",[189,33333,33334,33335,148],{},"Tick ",[192,33336,33337],{},"Use element text instead of HTML",[189,33339,1927,33340,148],{},[192,33341,33306],{},[21,33343,33345],{"id":33344},"use-a-custom-css-selector","Use a custom CSS selector",[26,33347,33348,33349,148],{},"If you're comfortable with CSS, use a ",[659,33350,33351],{"href":31856},"custom selector",[1923,33353,33354,33358,33362,33365],{},[189,33355,1927,33356,33326],{},[192,33357,33198],{},[189,33359,1927,33360,148],{},[192,33361,33331],{},[189,33363,33364],{},"Enter your CSS selector in the text box.",[189,33366,1927,33367,148],{},[192,33368,33306],{},[107,33370,33372],{"id":33371},"click-only-if-the-button-is-present-optional-click","Click only if the button is present (optional click)",[112,33374],{},[26,33376,33377,33378,33380,33381,33384],{},"If a button doesn't always appear on the page, the ",[192,33379,15781],{}," step throws an error and stops the run. To make the click optional, tick ",[145,33382,33383],{},"Optional click",". The run continues regardless, and the button is clicked only when present.",[107,33386,33388],{"id":33387},"click-with-the-press-keys-step","Click with the Press key(s) step",[112,33390],{},[26,33392,2273,33393,33397,33398,33400,33401,33404,33405,148],{},[659,33394,33395],{"href":19561},[192,33396,19564],{}," step records and replays keystrokes. For example, record ",[192,33399,19687],{}," to move focus to a button and ",[192,33402,33403],{},"Return"," to click it. See the ",[659,33406,33408],{"href":33407},"\u002Fguides\u002Fkeyboard-short-cuts#examples-of-keyboard-workarounds","keyboard shortcut examples",[107,33410,33412],{"id":33411},"click-with-javascript","Click with JavaScript",[112,33414],{},[26,33416,33417,33418,33422],{},"If you're comfortable with JavaScript, the ",[659,33419,33420],{"href":31331},[192,33421,19051],{}," step can click elements that the no-code steps can't. Use this as a last resort.",[21,33424,33426],{"id":33425},"click-every-element-containing-some-text","Click every element containing some text",[26,33428,33429],{},"Useful when you want to click items in a list that share a common pattern.",[2446,33431,33433],{"className":2498,"code":33432,"language":2500,"meta":67,"style":67},"document.querySelectorAll(\"INPUT SELECTOR HERE\").forEach(function(el) {\n    if (el.outerHTML.includes(\"TEXT\")) {\n        el.click();\n    }\n});\n",[145,33434,33435,33461,33477,33486,33490],{"__ignoreMap":67},[1332,33436,33437,33439,33441,33443,33446,33448,33450,33452,33454,33456,33459],{"class":2455,"line":2131},[1332,33438,28602],{"class":2521},[1332,33440,29255],{"class":2525},[1332,33442,1213],{"class":2521},[1332,33444,33445],{"class":2462},"\"INPUT SELECTOR HERE\"",[1332,33447,3696],{"class":2521},[1332,33449,13486],{"class":2525},[1332,33451,1213],{"class":2521},[1332,33453,27275],{"class":2507},[1332,33455,1213],{"class":2521},[1332,33457,33458],{"class":2458},"el",[1332,33460,6473],{"class":2521},[1332,33462,33463,33465,33468,33470,33472,33475],{"class":2455,"line":670},[1332,33464,5840],{"class":2507},[1332,33466,33467],{"class":2521}," (el.outerHTML.",[1332,33469,27345],{"class":2525},[1332,33471,1213],{"class":2521},[1332,33473,33474],{"class":2462},"\"TEXT\"",[1332,33476,30312],{"class":2521},[1332,33478,33479,33482,33484],{"class":2455,"line":68},[1332,33480,33481],{"class":2521},"        el.",[1332,33483,5473],{"class":2525},[1332,33485,2670],{"class":2521},[1332,33487,33488],{"class":2455,"line":1478},[1332,33489,3810],{"class":2521},[1332,33491,33492],{"class":2455,"line":293},[1332,33493,2542],{"class":2521},[26,33495,2545,33496,33499,33500,33503],{},[145,33497,33498],{},"INPUT SELECTOR HERE"," with the selector for the elements you want to scan, and ",[145,33501,33502],{},"TEXT"," with the text you want to match. You can also pass data into this step from earlier steps to replace the hardcoded value.",[21,33505,33507],{"id":33506},"click-a-link-or-button-inside-a-row-containing-text","Click a link or button inside a row containing text",[2446,33509,33511],{"className":2498,"code":33510,"language":2500,"meta":67,"style":67},"document.querySelectorAll(\"CUSTOM SELECTOR HERE\").forEach(function(el) {\n    if (el.outerHTML.includes('TEXT')) {\n        el.getElementsByTagName('a')[0].click();\n    }\n});\n",[145,33512,33513,33538,33553,33575,33579],{"__ignoreMap":67},[1332,33514,33515,33517,33519,33521,33524,33526,33528,33530,33532,33534,33536],{"class":2455,"line":2131},[1332,33516,28602],{"class":2521},[1332,33518,29255],{"class":2525},[1332,33520,1213],{"class":2521},[1332,33522,33523],{"class":2462},"\"CUSTOM SELECTOR HERE\"",[1332,33525,3696],{"class":2521},[1332,33527,13486],{"class":2525},[1332,33529,1213],{"class":2521},[1332,33531,27275],{"class":2507},[1332,33533,1213],{"class":2521},[1332,33535,33458],{"class":2458},[1332,33537,6473],{"class":2521},[1332,33539,33540,33542,33544,33546,33548,33551],{"class":2455,"line":670},[1332,33541,5840],{"class":2507},[1332,33543,33467],{"class":2521},[1332,33545,27345],{"class":2525},[1332,33547,1213],{"class":2521},[1332,33549,33550],{"class":2462},"'TEXT'",[1332,33552,30312],{"class":2521},[1332,33554,33555,33557,33559,33561,33564,33566,33568,33571,33573],{"class":2455,"line":68},[1332,33556,33481],{"class":2521},[1332,33558,29795],{"class":2525},[1332,33560,1213],{"class":2521},[1332,33562,33563],{"class":2462},"'a'",[1332,33565,9097],{"class":2521},[1332,33567,256],{"class":2511},[1332,33569,33570],{"class":2521},"].",[1332,33572,5473],{"class":2525},[1332,33574,2670],{"class":2521},[1332,33576,33577],{"class":2455,"line":1478},[1332,33578,3810],{"class":2521},[1332,33580,33581],{"class":2455,"line":293},[1332,33582,2542],{"class":2521},[26,33584,33585,33586,33588],{},"This clicks the first ",[145,33587,659],{}," tag inside each matching row. To click a different one, change the index:",[2446,33590,33592],{"className":2498,"code":33591,"language":2500,"meta":67,"style":67},"el.getElementsByTagName('a')[1].click();\n",[145,33593,33594],{"__ignoreMap":67},[1332,33595,33596,33599,33601,33603,33605,33607,33609,33611,33613],{"class":2455,"line":2131},[1332,33597,33598],{"class":2521},"el.",[1332,33600,29795],{"class":2525},[1332,33602,1213],{"class":2521},[1332,33604,33563],{"class":2462},[1332,33606,9097],{"class":2521},[1332,33608,19338],{"class":2511},[1332,33610,33570],{"class":2521},[1332,33612,5473],{"class":2525},[1332,33614,2670],{"class":2521},[26,33616,33617],{},"To click a different element type, change the tag name:",[2446,33619,33621],{"className":2498,"code":33620,"language":2500,"meta":67,"style":67},"el.getElementsByTagName('button')[0].click();\n",[145,33622,33623],{"__ignoreMap":67},[1332,33624,33625,33627,33629,33631,33633,33635,33637,33639,33641],{"class":2455,"line":2131},[1332,33626,33598],{"class":2521},[1332,33628,29795],{"class":2525},[1332,33630,1213],{"class":2521},[1332,33632,30121],{"class":2462},[1332,33634,9097],{"class":2521},[1332,33636,256],{"class":2511},[1332,33638,33570],{"class":2521},[1332,33640,5473],{"class":2525},[1332,33642,2670],{"class":2521},[26,33644,33645],{},"To select by class name:",[2446,33647,33649],{"className":2498,"code":33648,"language":2500,"meta":67,"style":67},"el.getElementsByClassName('red')[0].click();\n",[145,33650,33651],{"__ignoreMap":67},[1332,33652,33653,33655,33658,33660,33663,33665,33667,33669,33671],{"class":2455,"line":2131},[1332,33654,33598],{"class":2521},[1332,33656,33657],{"class":2525},"getElementsByClassName",[1332,33659,1213],{"class":2521},[1332,33661,33662],{"class":2462},"'red'",[1332,33664,9097],{"class":2521},[1332,33666,256],{"class":2511},[1332,33668,33570],{"class":2521},[1332,33670,5473],{"class":2525},[1332,33672,2670],{"class":2521},[2819,33674,33675],{},"html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}",{"title":67,"searchDepth":68,"depth":68,"links":33677},[33678,33683,33684,33685],{"id":33270,"depth":670,"text":33271,"children":33679},[33680,33681,33682],{"id":33283,"depth":68,"text":33284},{"id":33309,"depth":68,"text":33310},{"id":33344,"depth":68,"text":33345},{"id":33371,"depth":670,"text":33372},{"id":33387,"depth":670,"text":33388},{"id":33411,"depth":670,"text":33412,"children":33686},[33687,33688],{"id":33425,"depth":68,"text":33426},{"id":33506,"depth":68,"text":33507},"Click buttons in a web app using the Click element step, the Press key(s) step, or custom JavaScript.",{"metaTitle":33691,"video":33692},"Automate clicking a button on a webpage","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1749&end=1838",{"title":33255,"description":33689},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fclicks","ZyrOOd3iMih-q_BiR8JjS3EINfLGART-Q_vs7s0jbrE",{"id":33697,"title":33698,"body":33699,"date":71,"description":33727,"extension":73,"meta":33728,"navigation":75,"order":2750,"path":33731,"seo":33732,"stem":33733,"__hash__":33734},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fcurrent-url.md","Get the current URL",{"type":8,"value":33700,"toc":33724},[33701,33709,33711,33715,33717],[26,33702,33703,33704,15415],{},"To capture the URL of the page the automation is on, use the ",[659,33705,33706],{"href":21993},[192,33707,33708],{},"Get current URL",[32947,33710],{},[107,33712,33714],{"id":33713},"use-the-get-current-url-step","Use the Get current URL step",[112,33716],{},[26,33718,33186,33719,33189,33721,33723],{},[192,33720,32766],{},[192,33722,33708],{}," step. The step doesn't need any configuration. It outputs the URL as a variable that any later step can use.",{"title":67,"searchDepth":68,"depth":68,"links":33725},[33726],{"id":33713,"depth":670,"text":33714},"Use the Get current URL step to capture the URL of the page the automation is on, for use in later steps.",{"metaTitle":33729,"video":33730},"Capture the current page URL during an automation","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&amp;start=1864&end=1885","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fcurrent-url",{"title":33698,"description":33727},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fcurrent-url","7_OS4NdpKeMo6b0jomQeAmcugpZstAPwV3rTNebM7PE",{"id":33736,"title":33737,"body":33738,"date":71,"description":33853,"extension":73,"meta":33854,"navigation":75,"order":2739,"path":33857,"seo":33858,"stem":33859,"__hash__":33860},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fdate-picker.md","Use a date picker",{"type":8,"value":33739,"toc":33849},[33740,33747,33749,33753,33755,33762,33786,33790,33792,33799,33837,33843],[26,33741,33742,33743,148],{},"Date pickers vary widely. Some accept typed input, others are calendar widgets that need clicking through. axiom.ai handles both. For more on the topic, see the blog post on ",[659,33744,33746],{"href":33745},"\u002Fblog\u002Fhow-to-automate-a-date-picker","automating date pickers",[32947,33748],{},[107,33750,33752],{"id":33751},"type-the-date-into-an-input-field","Type the date into an input field",[112,33754],{},[26,33756,33757,33758,15415],{},"If the date picker is a regular input field that accepts typed dates, use the ",[659,33759,33760],{"href":17231},[192,33761,16065],{},[1923,33763,33764,33771,33776],{},[189,33765,33186,33766,33189,33769,15415],{},[192,33767,33768],{},"enter",[192,33770,16065],{},[189,33772,1927,33773,33775],{},[192,33774,33198],{}," and choose the date input field.",[189,33777,33778,33779,33782,33783,33785],{},"Type the date into ",[145,33780,33781],{},"Text",", or click ",[192,33784,31794],{}," to pass a date in from earlier steps.",[107,33787,33789],{"id":33788},"click-through-a-calendar-widget","Click through a calendar widget",[112,33791],{},[26,33793,33794,33795,15415],{},"When the date picker is a calendar widget, use the ",[659,33796,33797],{"href":16968},[192,33798,16957],{},[1923,33800,33801,33808,33813,33825,33831],{},[189,33802,33186,33803,33189,33806,15415],{},[192,33804,33805],{},"date",[192,33807,16957],{},[189,33809,1927,33810,33812],{},[192,33811,33198],{}," and choose the text element showing the current month on the picker.",[189,33814,1927,33815,33817,33818,2344,33821,33824],{},[192,33816,33198],{}," and choose the ",[192,33819,33820],{},"Previous month",[192,33822,33823],{},"Next month"," button (depending on whether you're going back or forward in time).",[189,33826,33827,33828,148],{},"Type the name of the target month in ",[145,33829,33830],{},"Month",[189,33832,33833,33834,148],{},"Type the target day in ",[145,33835,33836],{},"Day",[26,33838,33839,33840,148],{},"For a step-by-step walkthrough, see the ",[659,33841,33842],{"href":33745},"date picker blog post",[26,33844,33845,33846,33848],{},"If you find a date picker that none of these methods can handle, email it to ",[659,33847,2364],{"href":2363},". We enjoy a challenge.",{"title":67,"searchDepth":68,"depth":68,"links":33850},[33851,33852],{"id":33751,"depth":670,"text":33752},{"id":33788,"depth":670,"text":33789},"Pick dates from a calendar widget or text input using the Date picker step or the Enter text step.",{"metaTitle":33855,"video":33856},"Automate date picker fields in web forms","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FtOJci-fiIB8?rel=0","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fdate-picker",{"title":33737,"description":33853},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fdate-picker","RgS79ixLr7ytgc_2WcaQ7dDfMkA_lvss9BmlDHnAd3g",{"id":33862,"title":33863,"body":33864,"date":71,"description":34103,"extension":73,"meta":34104,"navigation":75,"order":2777,"path":34107,"seo":34108,"stem":34109,"__hash__":34110},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fdownload-cloud.md","Download files to Google Drive",{"type":8,"value":33865,"toc":34091},[33866,33876,33880,33882,33884,33892,33920,33923,33927,33929,33932,33973,33977,33979,33982,34026,34030,34032,34038,34042,34048,34052,34057,34061,34066,34070,34072,34075,34079,34081],[26,33867,33868,33869,33875],{},"To save files to Google Drive from a cloud automation, use the ",[659,33870,33872],{"href":33871},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-files-to-google-drive",[192,33873,33874],{},"Download a file to Google Drive"," step. It works without code and runs in the cloud or on the desktop.",[107,33877,33879],{"id":33878},"download-a-single-file","Download a single file",[112,33881],{},[32947,33883],{},[26,33885,15620,33886,33888,33889,33891],{},[192,33887,17849],{}," step that loads the page containing the file, then add ",[192,33890,33874],{}," below it.",[1923,33893,33894,33899,33908,33914],{},[189,33895,33896,33897,148],{},"Open the step finder and add ",[192,33898,33874],{},[189,33900,31836,33901,33904,33905,33907],{},[145,33902,33903],{},"Select file"," by clicking ",[192,33906,33198],{}," and choosing the file element on the page.",[189,33909,31836,33910,33913],{},[145,33911,33912],{},"Drive folder URL"," to the URL of the destination folder in Google Drive.",[189,33915,31836,33916,33919],{},[145,33917,33918],{},"File name"," to the name you want the saved file to have.",[32973,33921],{"url":33922},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=2833&end=2915",[107,33924,33926],{"id":33925},"download-files-from-multiple-pages","Download files from multiple pages",[112,33928],{},[26,33930,33931],{},"To download a file from each page in a list, store the URLs in a Google Sheet and loop through them. The pattern works best when every page uses the same template.",[1923,33933,33934,33941,33948,33956,33962],{},[189,33935,15620,33936,33940],{},[659,33937,33938],{"href":24142},[192,33939,22098],{}," step pointing at a sheet of page URLs.",[189,33942,15620,33943,33947],{},[659,33944,33945],{"href":31407},[192,33946,15653],{}," step using the sheet data.",[189,33949,32496,33950,33952,33953,33955],{},[192,33951,17849],{}," step. Set the URL by clicking ",[192,33954,31794],{}," and choosing the URL column.",[189,33957,33958,33959,33961],{},"Add ",[192,33960,33874],{}," as the next sub-step.",[189,33963,31836,33964,33966,33967,33969,33970,33972],{},[145,33965,33903],{}," to the file element. Set ",[145,33968,33912],{}," to the destination folder. Set ",[145,33971,33918],{}," as desired.",[107,33974,33976],{"id":33975},"download-multiple-files-from-one-page","Download multiple files from one page",[112,33978],{},[26,33980,33981],{},"To download several files from a single page, list their custom CSS selectors in a Google Sheet and loop through them.",[1923,33983,33984,33989,33993,33998,34003,34019],{},[189,33985,15620,33986,33988],{},[192,33987,22098],{}," step pointing at a sheet of one CSS selector per row.",[189,33990,15620,33991,33947],{},[192,33992,15653],{},[189,33994,32496,33995,33997],{},[192,33996,17849],{}," step (only needed once per loop iteration if the URL changes; skip if it doesn't).",[189,33999,33958,34000,34002],{},[192,34001,33874],{}," as a sub-step.",[189,34004,34005,34006,34008,34009,34011,34012,34014,34015,34018],{},"In ",[145,34007,33903],{},", click ",[192,34010,33198],{},", choose ",[192,34013,33331],{},", tick ",[192,34016,34017],{},"Set selector from data",", and pick the column with the CSS selectors.",[189,34020,31836,34021,6205,34023,34025],{},[145,34022,33912],{},[145,34024,33918],{},". axiom.ai appends a unique number to each file when the name is reused.",[107,34027,34029],{"id":34028},"advanced-settings","Advanced settings",[112,34031],{},[26,34033,34034],{},[1906,34035],{"alt":34036,"src":34037},"The advanced settings panel for the Download a file to Google Drive step","\u002Fdocs\u002Ftutorials\u002Ffiles-advanced-settings.jpg",[21,34039,34041],{"id":34040},"force-download","Force download",[26,34043,34044,34045,34047],{},"Some files open in the browser instead of downloading. Toggle ",[145,34046,34041],{}," on and tick the box to force them. If the issue persists, contact support.",[21,34049,34051],{"id":34050},"auto-convert","Auto convert",[26,34053,31969,34054,34056],{},[145,34055,34051],{}," on and tick the box to convert the file into a Google Docs editor format on download.",[21,34058,34060],{"id":34059},"download-start-wait-time","Download start wait time",[26,34062,31969,34063,34065],{},[145,34064,34060],{}," on to set how long axiom.ai waits for the download to begin. The value is in hundredths of a second.",[107,34067,34069],{"id":34068},"troubleshooting","Troubleshooting",[112,34071],{},[26,34073,34074],{},"If the file doesn't download, the most common cause is an incorrect Drive folder path. Double-check the folder URL is correct and you have write access.",[107,34076,34078],{"id":34077},"download-to-a-local-folder-instead","Download to a local folder instead",[112,34080],{},[26,34082,2273,34083,34085,34086,34090],{},[192,34084,33874],{}," step can also save files locally when running in the desktop app. See ",[659,34087,34089],{"href":34088},"\u002Fdocs\u002Ftutorials\u002Ffiles\u002Fdownload-local#download-locally-with-the-google-drive-step","download files locally"," for instructions.",{"title":67,"searchDepth":68,"depth":68,"links":34092},[34093,34094,34095,34096,34101,34102],{"id":33878,"depth":670,"text":33879},{"id":33925,"depth":670,"text":33926},{"id":33975,"depth":670,"text":33976},{"id":34028,"depth":670,"text":34029,"children":34097},[34098,34099,34100],{"id":34040,"depth":68,"text":34041},{"id":34050,"depth":68,"text":34051},{"id":34059,"depth":68,"text":34060},{"id":34068,"depth":670,"text":34069},{"id":34077,"depth":670,"text":34078},"Use the Download a file to Google Drive step to save files from any webpage to a Google Drive folder, including looped downloads.",{"metaTitle":34105,"video":34106},"Download files to Google Drive in cloud automations","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&amp;start=2833&end=2915","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fdownload-cloud",{"title":33863,"description":34103},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fdownload-cloud","unbL6fyDB9GYhMU2rD4M4oemN8NpO9q0zulSjyQRVM8",{"id":34112,"title":34113,"body":34114,"date":71,"description":34398,"extension":73,"meta":34399,"navigation":75,"order":2788,"path":34401,"seo":34402,"stem":34403,"__hash__":34404},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fdownload-local.md","Download files to your computer",{"type":8,"value":34115,"toc":34385},[34116,34138,34141,34145,34147,34157,34174,34176,34178,34181,34219,34223,34225,34230,34233,34253,34255,34259,34261,34264,34295,34299,34301,34306,34308,34339,34348,34350,34352,34357,34361,34366,34368,34372,34374,34378,34380,34382],[26,34117,34118,34119,4468,34125,10147,34131,34135,34136,148],{},"To save files to a local folder, use one of three steps: ",[659,34120,34122],{"href":34121},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-file-step",[192,34123,34124],{},"Download file",[659,34126,34128],{"href":34127},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-files",[192,34129,34130],{},"Download files",[659,34132,34133],{"href":21933},[192,34134,21936],{},". All three require running the automation in the ",[659,34137,7421],{"href":26107},[32947,34139],{"video":34140},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=2988&end=3055",[107,34142,34144],{"id":34143},"download-files-from-the-current-page","Download files from the current page",[112,34146],{},[26,34148,15620,34149,33888,34151,34153,34154,34156],{},[192,34150,17849],{},[192,34152,34124],{}," (single file) or ",[192,34155,34130],{}," (multiple).",[1923,34158,34159,34164,34170],{},[189,34160,1927,34161,34163],{},[192,34162,33198],{}," and choose the file element on the page.",[189,34165,1927,34166,34169],{},[192,34167,34168],{},"Click to select"," and choose the destination folder, or enter a path.",[189,34171,31836,34172,33919],{},[145,34173,33918],{},[107,34175,33926],{"id":33925},[112,34177],{},[26,34179,34180],{},"To download a file from each page in a list, store the URLs in a Google Sheet and loop through them.",[1923,34182,34183,34189,34195,34203,34209],{},[189,34184,15620,34185,33940],{},[659,34186,34187],{"href":24142},[192,34188,22098],{},[189,34190,15620,34191,33947],{},[659,34192,34193],{"href":31407},[192,34194,15653],{},[189,34196,32496,34197,34199,34200,34202],{},[192,34198,17849],{}," step. Set the URL using ",[192,34201,31794],{}," to pick the column.",[189,34204,33958,34205,2344,34207,33961],{},[192,34206,34124],{},[192,34208,34130],{},[189,34210,1927,34211,34213,34214,34216,34217,148],{},[192,34212,33198],{}," and choose the file element. Click ",[192,34215,34168],{}," for the folder. Set ",[145,34218,33918],{},[107,34220,34222],{"id":34221},"download-a-file-from-a-url","Download a file from a URL",[112,34224],{},[26,34226,34227,34228,15415],{},"When you have direct file URLs (rather than pages that contain files), use the ",[192,34229,21936],{},[32947,34231],{"video":34232},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=2913&end=2984",[1923,34234,34235,34239,34244,34249],{},[189,34236,33896,34237,148],{},[192,34238,21936],{},[189,34240,34241,34242,148],{},"Enter the file URL in ",[145,34243,4603],{},[189,34245,1927,34246,34248],{},[192,34247,34168],{}," and choose the destination folder.",[189,34250,31836,34251,148],{},[145,34252,33918],{},[32973,34254],{"url":34232},[107,34256,34258],{"id":34257},"download-files-from-multiple-urls","Download files from multiple URLs",[112,34260],{},[26,34262,34263],{},"To download files from a list of URLs:",[1923,34265,34266,34271,34275,34279,34286,34290],{},[189,34267,15620,34268,34270],{},[192,34269,22098],{}," step pointing at a sheet of file URLs.",[189,34272,15620,34273,33947],{},[192,34274,15653],{},[189,34276,32496,34277,15415],{},[192,34278,21936],{},[189,34280,31836,34281,33904,34283,34285],{},[145,34282,4603],{},[192,34284,31794],{}," and selecting the URL column.",[189,34287,1927,34288,34248],{},[192,34289,34168],{},[189,34291,31836,34292,34294],{},[145,34293,33918],{},". axiom.ai appends a unique number when the name is reused.",[107,34296,34298],{"id":34297},"download-locally-with-the-google-drive-step","Download locally with the Google Drive step",[112,34300],{},[26,34302,2273,34303,34305],{},[192,34304,33874],{}," step can also save files locally when running in the desktop app. This is useful when you want a single step that works in both cloud and desktop modes.",[32947,34307],{"video":33922},[1923,34309,34310,34315,34319,34324,34329,34333],{},[189,34311,15620,34312,34314],{},[192,34313,17849],{}," step that loads the page containing the file.",[189,34316,33896,34317,148],{},[192,34318,33874],{},[189,34320,1927,34321,34323],{},[192,34322,33198],{}," and choose the file element.",[189,34325,31836,34326,34328],{},[145,34327,33912],{}," to the destination folder in Google Drive.",[189,34330,31836,34331,148],{},[145,34332,33918],{},[189,34334,31969,34335,34338],{},[145,34336,34337],{},"Local folder"," on and set a local folder path.",[2093,34340,34341],{},[26,34342,34343,24126,34345,34347],{},[192,34344,2359],{},[145,34346,34337],{}," setting only takes effect when running the automation in the desktop app.",[107,34349,34029],{"id":34028},[112,34351],{},[26,34353,34354],{},[1906,34355],{"alt":34356,"src":34037},"The advanced settings panel for download steps",[21,34358,34360],{"id":34359},"overwrite-existing-file","Overwrite existing file",[26,34362,31969,34363,34365],{},[145,34364,34360],{}," on and tick the box to replace files with the same name instead of renaming the new download.",[21,34367,34041],{"id":34040},[26,34369,34044,34370,34047],{},[145,34371,34041],{},[21,34373,34060],{"id":34059},[26,34375,31969,34376,34065],{},[145,34377,34060],{},[107,34379,34069],{"id":34068},[112,34381],{},[26,34383,34384],{},"If the file doesn't download, check that the file path is correct and the destination folder has write permission set for the local user.",{"title":67,"searchDepth":68,"depth":68,"links":34386},[34387,34388,34389,34390,34391,34392,34397],{"id":34143,"depth":670,"text":34144},{"id":33925,"depth":670,"text":33926},{"id":34221,"depth":670,"text":34222},{"id":34257,"depth":670,"text":34258},{"id":34297,"depth":670,"text":34298},{"id":34028,"depth":670,"text":34029,"children":34393},[34394,34395,34396],{"id":34359,"depth":68,"text":34360},{"id":34040,"depth":68,"text":34041},{"id":34059,"depth":68,"text":34060},{"id":34068,"depth":670,"text":34069},"Save files from any website to a local folder using the Download file, Download files, or Download file from URL steps.",{"metaTitle":34400},"Download files locally from any website with axiom.ai","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fdownload-local",{"title":34113,"description":34398},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fdownload-local","zS5d084qrA7kTgWdAbsHSCcawCEFlHsRLb9Yq_4uHsQ",{"id":34406,"title":34407,"body":34408,"date":71,"description":34509,"extension":73,"meta":34510,"navigation":75,"order":1478,"path":34513,"seo":34514,"stem":34515,"__hash__":34516},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fenter-text.md","Enter text into an input field",{"type":8,"value":34409,"toc":34504},[34410,34418,34420,34424,34426,34432,34447,34451,34453,34469,34487,34491,34493],[26,34411,34412,34413,34417],{},"To type text into a form field, use the ",[659,34414,34415],{"href":17231},[192,34416,16065],{}," step. You can type a static string, or pass data in from an earlier step.",[32947,34419],{},[107,34421,34423],{"id":34422},"use-the-enter-text-step","Use the Enter text step",[112,34425],{},[26,34427,33186,34428,33189,34430,15415],{},[192,34429,33768],{},[192,34431,16065],{},[1923,34433,34434,34439],{},[189,34435,1927,34436,34438],{},[192,34437,33198],{}," and choose the input field.",[189,34440,34441,34442,33782,34444,34446],{},"Type the text into ",[145,34443,33781],{},[192,34445,31794],{}," to pass data in from an earlier step.",[107,34448,34450],{"id":34449},"insert-line-breaks","Insert line breaks",[112,34452],{},[26,34454,34455,34456,34458,34459,34462,34463,34465,34466,148],{},"Some fields accept a regular ",[192,34457,33403],{}," key as a line break, others need a different key combination (for example ",[192,34460,34461],{},"Shift + Enter","). Use the ",[145,34464,31505],{}," setting to map your line breaks to whatever the site expects. For a worked example, see ",[659,34467,34468],{"href":31512},"How to insert line breaks when entering text",[1923,34470,34471,34478,34481],{},[189,34472,1934,34473,34475,34476,148],{},[192,34474,16065],{}," step, click ",[192,34477,31505],{},[189,34479,34480],{},"Record the key sequence the site uses for line breaks.",[189,34482,34483,34484,34486],{},"Use regular line breaks in the ",[145,34485,33781],{}," field. axiom.ai converts them to the recorded sequence at runtime.",[107,34488,34490],{"id":34489},"enter-text-with-javascript","Enter text with JavaScript",[112,34492],{},[26,34494,34495,34496,34498,34499,34503],{},"For cases where the ",[192,34497,16065],{}," step doesn't fit, the ",[659,34500,34501],{"href":31331},[192,34502,19051],{}," step can set field values directly. Use this as a last resort.",{"title":67,"searchDepth":68,"depth":68,"links":34505},[34506,34507,34508],{"id":34422,"depth":670,"text":34423},{"id":34449,"depth":670,"text":34450},{"id":34489,"depth":670,"text":34490},"Use the Enter text step to type into form fields, with optional support for line breaks and dynamic data.",{"metaTitle":34511,"video":34512},"Type text into a form field with the Enter text step","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&amp;start=2001&end=2113","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fenter-text",{"title":34407,"description":34509},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fenter-text","YtMILY-962Zbkn0UcTQTozmab-3gWLd7Pojh2c3XAy4",{"id":34518,"title":34519,"body":34520,"date":71,"description":34556,"extension":73,"meta":34557,"navigation":75,"order":2131,"path":32549,"seo":34559,"stem":34560,"__hash__":34561},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Findex.md","Interact with the browser",{"type":8,"value":34521,"toc":34553},[34522,34538,34542,34544,34546],[26,34523,34524,34525,6205,34528,34531,34532,34534,34535,148],{},"These tutorials cover the most common browser actions you'll automate in axiom.ai, from ",[659,34526,34527],{"href":31632},"clicks",[659,34529,34530],{"href":34513},"text input"," to file uploads, downloads, and date pickers. If there's an action you'd like to automate that isn't covered here, contact ",[659,34533,2225],{"href":1887}," or post in our ",[659,34536,2231],{"href":2229,"rel":34537},[1218],[107,34539,34541],{"id":34540},"browser-action-tutorials","Browser action tutorials",[112,34543],{},[2218,34545],{},[26,34547,2222,34548,2226,34550,148],{},[659,34549,2225],{"href":1887},[659,34551,2231],{"href":2229,"rel":34552},[1218],{"title":67,"searchDepth":68,"depth":68,"links":34554},[34555],{"id":34540,"depth":670,"text":34541},"Tutorials for automating the most common browser actions, including clicks, text input, file uploads, downloads, tabs, and date pickers.",{"metaTitle":34558},"Automate clicks, text input, file uploads, and more",{"title":34519,"description":34556},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Findex","TiaVLhHPRCIe8YzL9d8JyH4Zv2FhIQj4sM9P9JaP7f8",{"id":34563,"title":34564,"body":34565,"date":71,"description":34625,"extension":73,"meta":34626,"navigation":75,"order":2727,"path":34629,"seo":34630,"stem":34631,"__hash__":34632},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fkey-strokes.md","Record keystrokes",{"type":8,"value":34566,"toc":34621},[34567,34574,34576,34580,34582,34588,34601,34608,34612,34614],[26,34568,34569,34570,15415],{},"To automate any keystroke or key combination, record it with the ",[659,34571,34572],{"href":19561},[192,34573,19564],{},[32947,34575],{},[107,34577,34579],{"id":34578},"use-the-press-keys-step","Use the Press key(s) step",[112,34581],{},[26,34583,33186,34584,33189,34586,15415],{},[192,34585,28454],{},[192,34587,19564],{},[1923,34589,34590,34594,34597],{},[189,34591,1927,34592,148],{},[192,34593,31094],{},[189,34595,34596],{},"Press the key or combination you want to record.",[189,34598,1927,34599,148],{},[192,34600,31061],{},[26,34602,34603,34604,148],{},"For worked examples, see the ",[659,34605,34607],{"href":34606},"\u002Fguides\u002Fkeyboard-short-cuts","keyboard shortcut guide",[107,34609,34611],{"id":34610},"send-keystrokes-with-javascript","Send keystrokes with JavaScript",[112,34613],{},[26,34615,2273,34616,34620],{},[659,34617,34618],{"href":31331},[192,34619,19051],{}," step can also simulate keystrokes. For security reasons, JavaScript-based keystrokes only work on the current web page.",{"title":67,"searchDepth":68,"depth":68,"links":34622},[34623,34624],{"id":34578,"depth":670,"text":34579},{"id":34610,"depth":670,"text":34611},"Record any single key or combination of keys using the Press key(s) step, then replay it during an automation.",{"metaTitle":34627,"video":34628},"Record and replay keyboard shortcuts with the Press key(s) step","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&amp;start=101&end=166","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fkey-strokes",{"title":34564,"description":34625},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fkey-strokes","hY7HvD4lV1th6CNccXU6zoi2TqJnWEw2gomQqqSguIs",{"id":34634,"title":34635,"body":34636,"date":71,"description":34673,"extension":73,"meta":34674,"navigation":75,"order":2692,"path":34677,"seo":34678,"stem":34679,"__hash__":34680},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fmouse-drag.md","Drag the mouse",{"type":8,"value":34637,"toc":34670},[34638,34647,34649,34653,34655,34662],[26,34639,34640,34641,34646],{},"To click and drag an element on a page, use the ",[659,34642,34644],{"href":34643},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fmouse-click-and-drag",[192,34645,16099],{}," step. It emulates the action between two sets of coordinates.",[32947,34648],{},[107,34650,34652],{"id":34651},"use-the-mouse-click-drag-step","Use the Mouse click & drag step",[112,34654],{},[26,34656,33186,34657,33189,34660,15415],{},[192,34658,34659],{},"drag",[192,34661,16099],{},[1923,34663,34664,34667],{},[189,34665,34666],{},"Set the coordinates of the initial mouse click.",[189,34668,34669],{},"Set the coordinates to drag the mouse to.",{"title":67,"searchDepth":68,"depth":68,"links":34671},[34672],{"id":34651,"depth":670,"text":34652},"Emulate a click-and-drag mouse interaction using start and end coordinates with the Mouse click and drag step.",{"metaTitle":34675,"video":34676},"Click and drag the mouse with the Mouse click and drag step","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&amp;start=190&end=225","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fmouse-drag",{"title":34635,"description":34673},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fmouse-drag","VvIYcg8K9gY-0MUOHPGCmReWtI08pTUgVLdv8aeurYw",{"id":34682,"title":34683,"body":34684,"date":71,"description":34884,"extension":73,"meta":34885,"navigation":75,"order":68,"path":34888,"seo":34889,"stem":34890,"__hash__":34891},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fmulti-click.md","Click multiple buttons",{"type":8,"value":34685,"toc":34878},[34686,34689,34691,34695,34697,34704,34730,34733,34737,34739,34742,34787,34792,34796,34798,34815,34841,34843,34845,34852,34871],[26,34687,34688],{},"axiom.ai gives you several ways to click more than one button in a single automation, depending on whether the buttons share a pattern or you need to repeat the same click many times.",[32947,34690],{},[107,34692,34694],{"id":34693},"use-the-click-multiple-elements-step","Use the Click multiple elements step",[112,34696],{},[26,34698,2273,34699,34703],{},[659,34700,34701],{"href":16493},[192,34702,16496],{}," step clicks every element matching a selector. Useful for clicking each item in a list.",[1923,34705,34706,34710,34715,34724],{},[189,34707,33896,34708,148],{},[192,34709,16496],{},[189,34711,1927,34712,34714],{},[192,34713,33198],{}," and use the selector tool to choose the elements.",[189,34716,34717,34718,2344,34721,148],{},"Set the click action to ",[192,34719,34720],{},"Left click",[192,34722,34723],{},"Right click",[189,34725,31836,34726,34729],{},[145,34727,34728],{},"Maximum clicks"," to cap the number of clicks.",[26,34731,34732],{},"This step doesn't support clicking a button, doing some other actions, then clicking the next button. For that pattern, loop through CSS selectors instead.",[107,34734,34736],{"id":34735},"loop-through-css-selectors","Loop through CSS selectors",[112,34738],{},[26,34740,34741],{},"When you need to click a button, perform actions, then move on to the next button, store the buttons' CSS selectors in a Google Sheet and loop through them.",[1923,34743,34744,34747,34754,34764,34770,34783],{},[189,34745,34746],{},"Create a Google Sheet with one CSS selector per row.",[189,34748,15620,34749,34753],{},[659,34750,34751],{"href":24142},[192,34752,22098],{}," step pointing at the sheet.",[189,34755,15620,34756,25110,34760,34763],{},[659,34757,34758],{"href":31407},[192,34759,15653],{},[145,34761,34762],{},"[google-sheet-data]"," token.",[189,34765,32496,34766,15415],{},[659,34767,34768],{"href":15778},[192,34769,15781],{},[189,34771,1934,34772,34475,34774,34011,34776,34014,34778,34780,34781,34763],{},[192,34773,15781],{},[192,34775,33198],{},[192,34777,33331],{},[192,34779,34017],{},", and pick the ",[145,34782,34762],{},[189,34784,1927,34785,148],{},[192,34786,33306],{},[26,34788,34789,34790,148],{},"For more on this pattern, see ",[659,34791,31857],{"href":31856},[107,34793,34795],{"id":34794},"repeat-a-single-click-with-a-jump-step","Repeat a single click with a jump step",[112,34797],{},[26,34799,34800,34801,8621,34803,2344,34809,15415],{},"To click the same button several times in a row, pair ",[192,34802,15781],{},[659,34804,34806],{"href":34805},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fjump-step",[192,34807,34808],{},"Jump to another step",[659,34810,34812],{"href":34811},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fconditionall-jump-step",[192,34813,34814],{},"Conditionally jump to another step",[1923,34816,34817,34822,34835],{},[189,34818,15620,34819,34821],{},[192,34820,15781],{}," step and configure it with the selector tool.",[189,34823,15620,34824,2344,34826,34828,34829,34832,34833,15415],{},[192,34825,34808],{},[192,34827,34814],{}," step. Set ",[145,34830,34831],{},"Jump to step"," to the ",[192,34834,15781],{},[189,34836,31836,34837,34840],{},[145,34838,34839],{},"Maximum cycles"," (or, for the conditional version, configure the condition).",[107,34842,33412],{"id":33411},[112,34844],{},[26,34846,2273,34847,34851],{},[659,34848,34849],{"href":31331},[192,34850,19051],{}," step gives you full control when the no-code steps don't fit. Two common approaches:",[186,34853,34854,34865],{},[189,34855,34856,34857,34864],{},"The native ",[659,34858,34861],{"href":34859,"rel":34860},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FHTMLElement\u002Fclick",[1218],[145,34862,34863],{},"HTMLElement.click()"," method.",[189,34866,2273,34867,34870],{},[659,34868,34869],{"href":26483},"Puppeteer integration"," for more complex interactions.",[26,34872,34873,34874,148],{},"For starting points, see the ",[659,34875,34877],{"href":34876},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fjavascript-snippets","JavaScript snippets reference",{"title":67,"searchDepth":68,"depth":68,"links":34879},[34880,34881,34882,34883],{"id":34693,"depth":670,"text":34694},{"id":34735,"depth":670,"text":34736},{"id":34794,"depth":670,"text":34795},{"id":33411,"depth":670,"text":33412},"Click many buttons at once with Click multiple elements, loop through CSS selectors, or use jump steps to repeat a click.",{"metaTitle":34886,"video":34887},"Click multiple elements on a page in one automation","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&amp;start=3192&end=3222","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fmulti-click",{"title":34683,"description":34884},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fmulti-click","cDp5VMfS6S5Mj_uB4BqGE-bS0IYiFJqo23DwrtBnSWE",{"id":34893,"title":34894,"body":34895,"date":71,"description":34972,"extension":73,"meta":34973,"navigation":75,"order":2673,"path":34975,"seo":34976,"stem":34977,"__hash__":34978},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fradio-buttons.md","Click a radio button",{"type":8,"value":34896,"toc":34964},[34897,34904,34906,34908,34914,34921,34923,34925,34930,34932,34944,34948,34955,34957],[26,34898,34899,34900,15415],{},"To click a radio button, use the ",[659,34901,34902],{"href":15778},[192,34903,15781],{},[107,34905,33181],{"id":33180},[112,34907],{},[26,34909,33186,34910,33189,34912,15415],{},[192,34911,5473],{},[192,34913,15781],{},[1923,34915,34916],{},[189,34917,1927,34918,34920],{},[192,34919,33198],{}," and choose the radio button.",[107,34922,33203],{"id":33202},[112,34924],{},[26,34926,33208,34927,34929],{},[192,34928,15781],{}," step doesn't work for your radio button, try these alternatives.",[21,34931,33215],{"id":33214},[26,34933,2273,34934,33222,34938,34940,34941,34943],{},[659,34935,34936],{"href":19561},[192,34937,19564],{},[192,34939,19687],{}," to move focus to the radio button and ",[192,34942,33228],{}," to select it.",[21,34945,34947],{"id":34946},"css-selector-loop","CSS selector loop",[26,34949,34950,34951,34954],{},"Use the attribute selector or another ",[659,34952,34953],{"href":31856},"custom CSS selector"," to match the right radio button when the visual picker can't.",[21,34956,31332],{"id":2964},[26,34958,2273,34959,34963],{},[659,34960,34961],{"href":31331},[192,34962,19051],{}," step can click radio buttons directly.",{"title":67,"searchDepth":68,"depth":68,"links":34965},[34966,34967],{"id":33180,"depth":670,"text":33181},{"id":33202,"depth":670,"text":33203,"children":34968},[34969,34970,34971],{"id":33214,"depth":68,"text":33215},{"id":34946,"depth":68,"text":34947},{"id":2964,"depth":68,"text":31332},"Click radio buttons in a web form using the Click element step, with fallback methods for tricky cases.",{"metaTitle":34974},"Click radio buttons in a form with the Click element step","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fradio-buttons",{"title":34894,"description":34972},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fradio-buttons","wqQ3bybsI5T4c7Vhg7H-nondNMgknC3x8XtlPUXV8Ls",{"id":34980,"title":34981,"body":34982,"date":71,"description":35431,"extension":73,"meta":35432,"navigation":75,"order":2651,"path":35435,"seo":35436,"stem":35437,"__hash__":35438},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Frollover.md","Trigger a rollover",{"type":8,"value":34983,"toc":35424},[34984,34992,34994,34998,35000,35007,35014,35018,35020,35032,35036,35243,35247,35418,35421],[26,34985,34986,34987,15415],{},"To trigger a mouse hover or rollover (for example, to reveal a dropdown menu), use the ",[659,34988,34990],{"href":34989},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Frollover-element",[192,34991,18107],{},[32947,34993],{},[107,34995,34997],{"id":34996},"use-the-rollover-element-step","Use the Rollover element step",[112,34999],{},[26,35001,33186,35002,33189,35005,15415],{},[192,35003,35004],{},"roll",[192,35006,18107],{},[1923,35008,35009],{},[189,35010,1927,35011,35013],{},[192,35012,33198],{}," and choose the element to hover over.",[107,35015,35017],{"id":35016},"trigger-a-rollover-with-javascript","Trigger a rollover with JavaScript",[112,35019],{},[26,35021,25535,35022,35024,35025,35027,35028,15415],{},[192,35023,18107],{}," step doesn't trigger the desired behaviour, dispatch a ",[145,35026,18100],{}," event from the ",[659,35029,35030],{"href":31331},[192,35031,19051],{},[21,35033,35035],{"id":35034},"example-html","Example HTML",[2446,35037,35041],{"className":35038,"code":35039,"language":35040,"meta":67,"style":67},"language-html shiki shiki-themes github-light-default github-dark-default","\u003Cnav>\n    \u003Cul>\n        \u003Cli class=\"menu-item\">\n            \u003Ca href=\"#\" class=\"your-hover-element\">Menu\u003C\u002Fa>\n            \u003Cul class=\"submenu\">\n                \u003Cli>\u003Ca href=\"#\">Option 1\u003C\u002Fa>\u003C\u002Fli>\n                \u003Cli>\u003Ca href=\"#\">Option 2\u003C\u002Fa>\u003C\u002Fli>\n                \u003Cli>\u003Ca href=\"#\">Option 3\u003C\u002Fa>\u003C\u002Fli>\n            \u003C\u002Ful>\n        \u003C\u002Fli>\n    \u003C\u002Ful>\n\u003C\u002Fnav>\n","html",[145,35042,35043,35053,35062,35079,35108,35123,35153,35180,35207,35216,35225,35234],{"__ignoreMap":67},[1332,35044,35045,35047,35050],{"class":2455,"line":2131},[1332,35046,23299],{"class":2521},[1332,35048,35049],{"class":6125},"nav",[1332,35051,35052],{"class":2521},">\n",[1332,35054,35055,35058,35060],{"class":2455,"line":670},[1332,35056,35057],{"class":2521},"    \u003C",[1332,35059,186],{"class":6125},[1332,35061,35052],{"class":2521},[1332,35063,35064,35067,35069,35072,35074,35077],{"class":2455,"line":68},[1332,35065,35066],{"class":2521},"        \u003C",[1332,35068,189],{"class":6125},[1332,35070,35071],{"class":2511}," class",[1332,35073,5110],{"class":2521},[1332,35075,35076],{"class":2462},"\"menu-item\"",[1332,35078,35052],{"class":2521},[1332,35080,35081,35084,35086,35089,35091,35094,35096,35098,35101,35104,35106],{"class":2455,"line":1478},[1332,35082,35083],{"class":2521},"            \u003C",[1332,35085,659],{"class":6125},[1332,35087,35088],{"class":2511}," href",[1332,35090,5110],{"class":2521},[1332,35092,35093],{"class":2462},"\"#\"",[1332,35095,35071],{"class":2511},[1332,35097,5110],{"class":2521},[1332,35099,35100],{"class":2462},"\"your-hover-element\"",[1332,35102,35103],{"class":2521},">Menu\u003C\u002F",[1332,35105,659],{"class":6125},[1332,35107,35052],{"class":2521},[1332,35109,35110,35112,35114,35116,35118,35121],{"class":2455,"line":293},[1332,35111,35083],{"class":2521},[1332,35113,186],{"class":6125},[1332,35115,35071],{"class":2511},[1332,35117,5110],{"class":2521},[1332,35119,35120],{"class":2462},"\"submenu\"",[1332,35122,35052],{"class":2521},[1332,35124,35125,35128,35130,35133,35135,35137,35139,35141,35144,35146,35149,35151],{"class":2455,"line":2237},[1332,35126,35127],{"class":2521},"                \u003C",[1332,35129,189],{"class":6125},[1332,35131,35132],{"class":2521},">\u003C",[1332,35134,659],{"class":6125},[1332,35136,35088],{"class":2511},[1332,35138,5110],{"class":2521},[1332,35140,35093],{"class":2462},[1332,35142,35143],{"class":2521},">Option 1\u003C\u002F",[1332,35145,659],{"class":6125},[1332,35147,35148],{"class":2521},">\u003C\u002F",[1332,35150,189],{"class":6125},[1332,35152,35052],{"class":2521},[1332,35154,35155,35157,35159,35161,35163,35165,35167,35169,35172,35174,35176,35178],{"class":2455,"line":2623},[1332,35156,35127],{"class":2521},[1332,35158,189],{"class":6125},[1332,35160,35132],{"class":2521},[1332,35162,659],{"class":6125},[1332,35164,35088],{"class":2511},[1332,35166,5110],{"class":2521},[1332,35168,35093],{"class":2462},[1332,35170,35171],{"class":2521},">Option 2\u003C\u002F",[1332,35173,659],{"class":6125},[1332,35175,35148],{"class":2521},[1332,35177,189],{"class":6125},[1332,35179,35052],{"class":2521},[1332,35181,35182,35184,35186,35188,35190,35192,35194,35196,35199,35201,35203,35205],{"class":2455,"line":2637},[1332,35183,35127],{"class":2521},[1332,35185,189],{"class":6125},[1332,35187,35132],{"class":2521},[1332,35189,659],{"class":6125},[1332,35191,35088],{"class":2511},[1332,35193,5110],{"class":2521},[1332,35195,35093],{"class":2462},[1332,35197,35198],{"class":2521},">Option 3\u003C\u002F",[1332,35200,659],{"class":6125},[1332,35202,35148],{"class":2521},[1332,35204,189],{"class":6125},[1332,35206,35052],{"class":2521},[1332,35208,35209,35212,35214],{"class":2455,"line":2642},[1332,35210,35211],{"class":2521},"            \u003C\u002F",[1332,35213,186],{"class":6125},[1332,35215,35052],{"class":2521},[1332,35217,35218,35221,35223],{"class":2455,"line":2651},[1332,35219,35220],{"class":2521},"        \u003C\u002F",[1332,35222,189],{"class":6125},[1332,35224,35052],{"class":2521},[1332,35226,35227,35230,35232],{"class":2455,"line":2673},[1332,35228,35229],{"class":2521},"    \u003C\u002F",[1332,35231,186],{"class":6125},[1332,35233,35052],{"class":2521},[1332,35235,35236,35239,35241],{"class":2455,"line":2692},[1332,35237,35238],{"class":2521},"\u003C\u002F",[1332,35240,35049],{"class":6125},[1332,35242,35052],{"class":2521},[21,35244,35246],{"id":35245},"example-javascript","Example JavaScript",[2446,35248,35250],{"className":2962,"code":35249,"language":2964,"meta":67,"style":67},"\u002F\u002F Select the menu item\nconst menuItem = document.querySelector('.your-hover-element');\n\n\u002F\u002F Trigger mouseover event\nconst mouseOverEvent = new MouseEvent('mouseover', {\n    bubbles: true,\n    cancelable: true,\n    view: window\n});\n\nmenuItem.dispatchEvent(mouseOverEvent);\n\n\u002F\u002F Optionally, click the first submenu option after hover\nsetTimeout(() => {\n    const firstOption = document.querySelector('.submenu li a');\n    if (firstOption) {\n        firstOption.click();\n    }\n}, 1000);\n",[145,35251,35252,35257,35277,35281,35286,35307,35316,35325,35330,35334,35338,35348,35352,35357,35368,35388,35395,35404,35408],{"__ignoreMap":67},[1332,35253,35254],{"class":2455,"line":2131},[1332,35255,35256],{"class":2609},"\u002F\u002F Select the menu item\n",[1332,35258,35259,35261,35264,35266,35268,35270,35272,35275],{"class":2455,"line":670},[1332,35260,2508],{"class":2507},[1332,35262,35263],{"class":2511}," menuItem",[1332,35265,2515],{"class":2507},[1332,35267,28241],{"class":2521},[1332,35269,28605],{"class":2525},[1332,35271,1213],{"class":2521},[1332,35273,35274],{"class":2462},"'.your-hover-element'",[1332,35276,2583],{"class":2521},[1332,35278,35279],{"class":2455,"line":68},[1332,35280,2588],{"emptyLinePlaceholder":75},[1332,35282,35283],{"class":2455,"line":1478},[1332,35284,35285],{"class":2609},"\u002F\u002F Trigger mouseover event\n",[1332,35287,35288,35290,35293,35295,35297,35300,35302,35305],{"class":2455,"line":293},[1332,35289,2508],{"class":2507},[1332,35291,35292],{"class":2511}," mouseOverEvent",[1332,35294,2515],{"class":2507},[1332,35296,2697],{"class":2507},[1332,35298,35299],{"class":2525}," MouseEvent",[1332,35301,1213],{"class":2521},[1332,35303,35304],{"class":2462},"'mouseover'",[1332,35306,6505],{"class":2521},[1332,35308,35309,35312,35314],{"class":2455,"line":2237},[1332,35310,35311],{"class":2521},"    bubbles: ",[1332,35313,1548],{"class":2511},[1332,35315,6024],{"class":2521},[1332,35317,35318,35321,35323],{"class":2455,"line":2623},[1332,35319,35320],{"class":2521},"    cancelable: ",[1332,35322,1548],{"class":2511},[1332,35324,6024],{"class":2521},[1332,35326,35327],{"class":2455,"line":2637},[1332,35328,35329],{"class":2521},"    view: window\n",[1332,35331,35332],{"class":2455,"line":2642},[1332,35333,2542],{"class":2521},[1332,35335,35336],{"class":2455,"line":2651},[1332,35337,2588],{"emptyLinePlaceholder":75},[1332,35339,35340,35343,35345],{"class":2455,"line":2673},[1332,35341,35342],{"class":2521},"menuItem.",[1332,35344,28880],{"class":2525},[1332,35346,35347],{"class":2521},"(mouseOverEvent);\n",[1332,35349,35350],{"class":2455,"line":2692},[1332,35351,2588],{"emptyLinePlaceholder":75},[1332,35353,35354],{"class":2455,"line":2727},[1332,35355,35356],{"class":2609},"\u002F\u002F Optionally, click the first submenu option after hover\n",[1332,35358,35359,35361,35364,35366],{"class":2455,"line":2739},[1332,35360,22569],{"class":2525},[1332,35362,35363],{"class":2521},"(() ",[1332,35365,2712],{"class":2507},[1332,35367,2648],{"class":2521},[1332,35369,35370,35372,35375,35377,35379,35381,35383,35386],{"class":2455,"line":2750},[1332,35371,2654],{"class":2507},[1332,35373,35374],{"class":2511}," firstOption",[1332,35376,2515],{"class":2507},[1332,35378,28241],{"class":2521},[1332,35380,28605],{"class":2525},[1332,35382,1213],{"class":2521},[1332,35384,35385],{"class":2462},"'.submenu li a'",[1332,35387,2583],{"class":2521},[1332,35389,35390,35392],{"class":2455,"line":2765},[1332,35391,5840],{"class":2507},[1332,35393,35394],{"class":2521}," (firstOption) {\n",[1332,35396,35397,35400,35402],{"class":2455,"line":2777},[1332,35398,35399],{"class":2521},"        firstOption.",[1332,35401,5473],{"class":2525},[1332,35403,2670],{"class":2521},[1332,35405,35406],{"class":2455,"line":2788},[1332,35407,3810],{"class":2521},[1332,35409,35410,35413,35416],{"class":2455,"line":2799},[1332,35411,35412],{"class":2521},"}, ",[1332,35414,35415],{"class":2511},"1000",[1332,35417,2583],{"class":2521},[26,35419,35420],{},"This script triggers the rollover, reveals the submenu, then clicks the first option after a one-second delay.",[2819,35422,35423],{},"html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}",{"title":67,"searchDepth":68,"depth":68,"links":35425},[35426,35427],{"id":34996,"depth":670,"text":34997},{"id":35016,"depth":670,"text":35017,"children":35428},[35429,35430],{"id":35034,"depth":68,"text":35035},{"id":35245,"depth":68,"text":35246},"Trigger a mouseover event on a dropdown menu or other hover-activated element using the Rollover element step or JavaScript.",{"metaTitle":35433,"video":35434},"Trigger a mouse hover or rollover with the Rollover element step","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&amp;start=484&end=505","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Frollover",{"title":34981,"description":35431},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Frollover","7XB-zNhitYMft98uVzNtOa-auVurQneiGZMF9tZ9hyo",{"id":35440,"title":35441,"body":35442,"date":71,"description":35576,"extension":73,"meta":35577,"navigation":75,"order":2642,"path":35580,"seo":35581,"stem":35582,"__hash__":35583},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fselect-lists.md","Use a select list",{"type":8,"value":35443,"toc":35570},[35444,35455,35457,35461,35463,35469,35485,35489,35491,35494,35519,35523,35525,35528,35556,35560,35562],[26,35445,35446,35447,35451,35452,35454],{},"The primary way to interact with a dropdown menu is the ",[659,35448,35449],{"href":20850},[192,35450,17202],{}," step. When that doesn't work (for example, on custom dropdowns that don't use a real ",[145,35453,18586],{}," element), there are two fallback patterns.",[32947,35456],{},[107,35458,35460],{"id":35459},"use-the-select-list-step","Use the Select list step",[112,35462],{},[26,35464,33186,35465,33189,35467,15415],{},[192,35466,15831],{},[192,35468,17202],{},[1923,35470,35471,35476],{},[189,35472,1927,35473,35475],{},[192,35474,33198],{}," and choose the dropdown.",[189,35477,31836,35478,35481,35482,35484],{},[145,35479,35480],{},"Option"," to the value you want to select, or click ",[192,35483,31794],{}," to pass a value in from earlier steps.",[107,35486,35488],{"id":35487},"type-the-value-with-click-element-and-enter-text","Type the value with Click element and Enter text",[112,35490],{},[26,35492,35493],{},"If the dropdown is searchable (it filters as you type), click into it and type the option you want.",[1923,35495,35496,35501,35508,35514],{},[189,35497,15620,35498,35500],{},[192,35499,17849],{}," step (or another step that loads the page).",[189,35502,15620,35503,35507],{},[659,35504,35505],{"href":15778},[192,35506,15781],{}," step and select the dropdown.",[189,35509,11513,35510,15415],{},[659,35511,35512],{"href":17231},[192,35513,16065],{},[189,35515,34005,35516,35518],{},[145,35517,33781],{},", enter the option you want.",[107,35520,35522],{"id":35521},"navigate-with-click-element-and-press-keys","Navigate with Click element and Press key(s)",[112,35524],{},[26,35526,35527],{},"If the dropdown isn't searchable, open it with a click and use arrow keys to pick an option.",[1923,35529,35530,35534,35539,35545],{},[189,35531,15620,35532,35500],{},[192,35533,17849],{},[189,35535,15620,35536,35538],{},[192,35537,15781],{}," step and select the dropdown to open it.",[189,35540,15620,35541,15415],{},[659,35542,35543],{"href":19561},[192,35544,19564],{},[189,35546,35547,35548,4468,35551,4468,35553,35555],{},"Record the keys needed to reach the right option. For example, ",[192,35549,35550],{},"Arrow down",[192,35552,35550],{},[192,35554,19684],{}," to select the second option.",[107,35557,35559],{"id":35558},"use-a-select-list-with-javascript","Use a select list with JavaScript",[112,35561],{},[26,35563,35564,35565,35569],{},"For cases where none of the steps above fit, the ",[659,35566,35567],{"href":31331},[192,35568,19051],{}," step can set the value directly.",{"title":67,"searchDepth":68,"depth":68,"links":35571},[35572,35573,35574,35575],{"id":35459,"depth":670,"text":35460},{"id":35487,"depth":670,"text":35488},{"id":35521,"depth":670,"text":35522},{"id":35558,"depth":670,"text":35559},"Pick an option from a dropdown using the Select list step, or fall back to combinations of Click element with Enter text or Press key(s).",{"metaTitle":35578,"video":35579},"Choose an option from a dropdown menu with the Select list step","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&amp;start=922&end=1096","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fselect-lists",{"title":35441,"description":35576},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fselect-lists","ZvvH4a-ukkoL0CP3B7sP_9bp1g-eFTNypVtG799Er4M",{"id":35585,"title":35586,"body":35587,"date":71,"description":35656,"extension":73,"meta":35657,"navigation":75,"order":2637,"path":35660,"seo":35661,"stem":35662,"__hash__":35663},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fsocial-media-buttons.md","Click likes and follows",{"type":8,"value":35588,"toc":35651},[35589,35598,35600,35604,35606,35613,35626,35628,35630,35638,35642,35644],[26,35590,35591,35592,35597],{},"To automate likes and follows on social media, use the ",[659,35593,35594],{"href":16434},[192,35595,35596],{},"Click social media buttons"," step. It detects whether the content is already liked or followed, so it won't click twice.",[32947,35599],{},[107,35601,35603],{"id":35602},"use-the-click-social-media-buttons-step","Use the Click social media buttons step",[112,35605],{},[26,35607,33186,35608,33189,35611,15415],{},[192,35609,35610],{},"social",[192,35612,35596],{},[1923,35614,35615,35620],{},[189,35616,1927,35617,35619],{},[192,35618,33198],{}," and choose the like or follow button.",[189,35621,31836,35622,35625],{},[145,35623,35624],{},"Value to check"," so the step can detect the already-clicked state.",[107,35627,33181],{"id":33180},[112,35629],{},[26,35631,35632,35633,35637],{},"If the targeted button doesn't have a clear \"already-clicked\" state, the standard ",[659,35634,35635],{"href":15778},[192,35636,15781],{}," step works just as well.",[107,35639,35641],{"id":35640},"click-likes-and-follows-with-javascript","Click likes and follows with JavaScript",[112,35643],{},[26,35645,35646,35647,15415],{},"For cases where neither step fits, fall back to the ",[659,35648,35649],{"href":31331},[192,35650,19051],{},{"title":67,"searchDepth":68,"depth":68,"links":35652},[35653,35654,35655],{"id":35602,"depth":670,"text":35603},{"id":33180,"depth":670,"text":33181},{"id":35640,"depth":670,"text":35641},"Use the Click social media buttons step to like and follow posts, with detection so already-liked content isn't clicked twice.",{"metaTitle":35658,"video":35659},"Click social media like and follow buttons in an automation","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&amp;start=3247&end=3312","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fsocial-media-buttons",{"title":35586,"description":35656},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fsocial-media-buttons","4HY8X5osMODay-b-2MAEJ44ex3JU2SKNOwqxNm6_w1A",{"id":35665,"title":35666,"body":35667,"date":71,"description":35749,"extension":73,"meta":35750,"navigation":75,"order":2623,"path":31347,"seo":35753,"stem":35754,"__hash__":35755},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fsolve-captcha.md","Solve a captcha",{"type":8,"value":35668,"toc":35744},[35669,35676,35678,35682,35684,35691,35711,35717,35721,35723,35732,35736,35738],[26,35670,35671,35672,35675],{},"There are three ways to handle a captcha during an automation: solve it automatically through the ",[659,35673,35674],{"href":771},"2Captcha integration",", solve it manually using the desktop app, or avoid triggering it by enabling anti-bot blocking.",[32947,35677],{},[107,35679,35681],{"id":35680},"solve-a-captcha-with-2captcha","Solve a captcha with 2Captcha",[112,35683],{},[26,35685,31861,35686,35690],{},[659,35687,35688],{"href":771},[192,35689,21025],{}," step to solve captchas automatically. You'll need a 2Captcha account, and there's a small per-captcha charge.",[1923,35692,35693,35701,35708],{},[189,35694,35695,35696,148],{},"Sign up for a ",[659,35697,35700],{"href":35698,"rel":35699},"https:\u002F\u002F2captcha.com\u002Fenterpage?from=23090729",[1218],"2Captcha account",[189,35702,33186,35703,33189,35706,15415],{},[192,35704,35705],{},"solve",[192,35707,21025],{},[189,35709,35710],{},"Enter your 2Captcha API key in the step.",[26,35712,35713,35714,148],{},"The integration supports reCAPTCHA v2, reCAPTCHA v3, and invisible reCAPTCHA. For more, see the ",[659,35715,35716],{"href":771},"2Captcha integration docs",[107,35718,35720],{"id":35719},"solve-a-captcha-manually","Solve a captcha manually",[112,35722],{},[26,35724,35725,35726,35728,35729,35731],{},"When running on the ",[659,35727,26108],{"href":26107},", you can interact with the browser during a run. This is called attended automation. Add a ",[192,35730,18065],{}," step before the captcha so you have time to solve it manually before the automation continues.",[107,35733,35735],{"id":35734},"avoid-captchas-with-anti-bot-blocking","Avoid captchas with anti-bot blocking",[112,35737],{},[26,35739,2273,35740,35743],{},[659,35741,35742],{"href":31697},"bot blocking"," setting can stop captchas from appearing in the first place. If a captcha is triggered every run, try enabling anti-bot blocking before reaching for one of the methods above.",{"title":67,"searchDepth":68,"depth":68,"links":35745},[35746,35747,35748],{"id":35680,"depth":670,"text":35681},{"id":35719,"depth":670,"text":35720},{"id":35734,"depth":670,"text":35735},"Solve reCAPTCHA and similar challenges using the 2Captcha integration, manual interaction, or anti-bot blocking settings.",{"metaTitle":35751,"video":35752},"Solve captchas inside an automation with 2Captcha or manually","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&amp;start=842&end=870",{"title":35666,"description":35749},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fsolve-captcha","GmPJye85CJHMFcOM0CHLm8iKMLVt9szGATYdlhMwhqE",{"id":35757,"title":35758,"body":35759,"date":71,"description":35891,"extension":73,"meta":35892,"navigation":75,"order":2237,"path":35894,"seo":35895,"stem":35896,"__hash__":35897},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Ftabs.md","Switch and close browser tabs",{"type":8,"value":35760,"toc":35886},[35761,35764,35768,35770,35781,35784,35801,35805,35807,35816,35819,35831,35835,35837,35844,35847,35867,35870,35883],[26,35762,35763],{},"When pages open or close tabs during a run, use these no-code steps to manage them.",[107,35765,35767],{"id":35766},"switch-to-a-tab","Switch to a tab",[112,35769],{},[26,35771,35772,35773,33189,35776,15415],{},"To switch to a different tab during a run, open the step finder, search for ",[192,35774,35775],{},"tab",[659,35777,35779],{"href":35778},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fswitch-browser-tab",[192,35780,18071],{},[32947,35782],{"video":35783},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1211&end=1238",[1923,35785,35786],{},[189,35787,31836,35788,9879,35791,35794,35795,35797,35798,35800],{},[145,35789,35790],{},"Tab position",[192,35792,35793],{},"Last opened tab",", or specify the tab number. ",[145,35796,19338],{}," is the leftmost tab, ",[145,35799,22781],{}," is the second from the left, and so on.",[107,35802,35804],{"id":35803},"close-a-tab","Close a tab",[112,35806],{},[26,35808,35809,35810,33189,35812,15415],{},"To close a tab during a run, open the step finder, search for ",[192,35811,35775],{},[659,35813,35814],{"href":21784},[192,35815,21787],{},[32947,35817],{"video":35818},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1839&end=1864",[1923,35820,35821],{},[189,35822,31836,35823,9879,35825,35794,35827,35797,35829,35800],{},[145,35824,35790],{},[192,35826,35793],{},[145,35828,19338],{},[145,35830,22781],{},[107,35832,35834],{"id":35833},"manage-tabs-with-javascript","Manage tabs with JavaScript",[112,35836],{},[26,35838,2273,35839,35843],{},[659,35840,35841],{"href":31331},[192,35842,19051],{}," step can also open and close tabs.",[26,35845,35846],{},"To open a tab:",[2446,35848,35850],{"className":2498,"code":35849,"language":2500,"meta":67,"style":67},"window.open('https:\u002F\u002Fwww.example.com');\n",[145,35851,35852],{"__ignoreMap":67},[1332,35853,35854,35857,35860,35862,35865],{"class":2455,"line":2131},[1332,35855,35856],{"class":2521},"window.",[1332,35858,35859],{"class":2525},"open",[1332,35861,1213],{"class":2521},[1332,35863,35864],{"class":2462},"'https:\u002F\u002Fwww.example.com'",[1332,35866,2583],{"class":2521},[26,35868,35869],{},"To close a tab:",[2446,35871,35873],{"className":2498,"code":35872,"language":2500,"meta":67,"style":67},"window.close();\n",[145,35874,35875],{"__ignoreMap":67},[1332,35876,35877,35879,35881],{"class":2455,"line":2131},[1332,35878,35856],{"class":2521},[1332,35880,2734],{"class":2525},[1332,35882,2670],{"class":2521},[2819,35884,35885],{},"html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":67,"searchDepth":68,"depth":68,"links":35887},[35888,35889,35890],{"id":35766,"depth":670,"text":35767},{"id":35803,"depth":670,"text":35804},{"id":35833,"depth":670,"text":35834},"Use the Switch browser tab and Close browser tab steps to interact with multiple tabs during a run.",{"metaTitle":35893},"Switch between and close browser tabs in an automation","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Ftabs",{"title":35758,"description":35891},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Ftabs","jA5ZPPE4PUCcTkOT3jzyfccK-wudmrLo9y1T4IT-TRo",{"id":35899,"title":35900,"body":35901,"date":71,"description":36057,"extension":73,"meta":36058,"navigation":75,"order":2799,"path":36061,"seo":36062,"stem":36063,"__hash__":36064},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fupload-cloud.md","Upload files from Google Drive",{"type":8,"value":35902,"toc":36051},[35903,35917,35921,35923,35925,35932,35950,35953,35957,35959,35962,35998,36002,36004,36007,36044,36046,36048],[26,35904,35905,35906,35912,35913,148],{},"To upload files from Google Drive in a cloud automation, use the ",[659,35907,35909],{"href":35908},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fupload-file-google-drive",[192,35910,35911],{},"Upload a file from Google Drive"," step. This step requires running the automation in the cloud. To upload from local storage instead, see ",[659,35914,35916],{"href":35915},"\u002Fdocs\u002Ftutorials\u002Ffiles\u002Fupload-local","upload files from your computer",[107,35918,35920],{"id":35919},"upload-a-single-file","Upload a single file",[112,35922],{},[32947,35924],{},[26,35926,15620,35927,35929,35930,33891],{},[192,35928,17849],{}," step that loads the page with the upload field, then add ",[192,35931,35911],{},[1923,35933,35934,35938,35944],{},[189,35935,33896,35936,148],{},[192,35937,35911],{},[189,35939,1927,35940,35943],{},[145,35941,35942],{},"File input field"," and select the file field on the page.",[189,35945,31836,35946,35949],{},[145,35947,35948],{},"Google Drive file URL"," to the URL of the file in Google Drive.",[32973,35951],{"url":35952},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=3312&end=3860",[107,35954,35956],{"id":35955},"upload-multiple-files-to-the-same-field","Upload multiple files to the same field",[112,35958],{},[26,35960,35961],{},"To upload several files to a single input field, store the file URLs in a Google Sheet and loop through them.",[1923,35963,35964,35970,35975,35981,35987,35991],{},[189,35965,15620,35966,34270],{},[659,35967,35968],{"href":24142},[192,35969,22098],{},[189,35971,15620,35972,35974],{},[192,35973,17849],{}," step that loads the page with the upload field.",[189,35976,15620,35977,33947],{},[659,35978,35979],{"href":31407},[192,35980,15653],{},[189,35982,35983,35984,35986],{},"Inside the loop, add an ",[192,35985,35911],{}," sub-step.",[189,35988,1927,35989,35943],{},[145,35990,35942],{},[189,35992,1927,35993,7176,35995,35997],{},[192,35994,31794],{},[145,35996,35948],{}," and pick the column with the file URLs.",[107,35999,36001],{"id":36000},"upload-files-to-multiple-pages","Upload files to multiple pages",[112,36003],{},[26,36005,36006],{},"To upload files to a series of pages that share the same template (for example, product pages in a CMS), loop through both URLs and file paths.",[1923,36008,36009,36012,36016,36020,36028,36032,36037],{},[189,36010,36011],{},"Add a Google Sheet with one row per page, containing the page URL and the file URL.",[189,36013,15620,36014,34753],{},[192,36015,22098],{},[189,36017,15620,36018,33947],{},[192,36019,15653],{},[189,36021,32496,36022,36024,36025,36027],{},[192,36023,17849],{}," step. Click ",[192,36026,31794],{}," and pick the URL column.",[189,36029,11513,36030,35986],{},[192,36031,35911],{},[189,36033,1927,36034,36036],{},[145,36035,35942],{}," and select the upload field.",[189,36038,1927,36039,7176,36041,36043],{},[192,36040,31794],{},[145,36042,35948],{}," and pick the file URL column.",[107,36045,34069],{"id":34068},[112,36047],{},[26,36049,36050],{},"If the file doesn't upload, check that the filename and Google Drive URL are correct, and that the file is present at the specified location.",{"title":67,"searchDepth":68,"depth":68,"links":36052},[36053,36054,36055,36056],{"id":35919,"depth":670,"text":35920},{"id":35955,"depth":670,"text":35956},{"id":36000,"depth":670,"text":36001},{"id":34068,"depth":670,"text":34069},"Use the Upload a file from Google Drive step to upload files from Google Drive to any web form, including looped uploads.",{"metaTitle":36059,"video":36060},"Upload files from Google Drive in cloud automations","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&amp;start=3312&end=3860","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fupload-cloud",{"title":35900,"description":36057},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fupload-cloud","UQ853gWDH1szMVWKsLQMQhBFuYAclDTrfv6UO3oZRro",{"id":36066,"title":36067,"body":36068,"date":71,"description":36279,"extension":73,"meta":36280,"navigation":75,"order":3751,"path":36283,"seo":36284,"stem":36285,"__hash__":36286},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fupload-local.md","Upload files from your computer",{"type":8,"value":36069,"toc":36272},[36070,36086,36088,36090,36092,36098,36120,36123,36125,36127,36130,36165,36167,36169,36171,36205,36209,36211,36216,36242,36244,36254,36256,36258,36261],[26,36071,36072,36073,36078,36079,36081,36082,148],{},"To upload files from your local computer, use the ",[659,36074,36076],{"href":36075},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fupload-file",[192,36077,31171],{}," step. This step requires running the automation in the ",[659,36080,7421],{"href":26107},". To upload from Google Drive in the cloud instead, see ",[659,36083,36085],{"href":36084},"\u002Fdocs\u002Ftutorials\u002Ffiles\u002Fupload-cloud","upload files from Google Drive",[32947,36087],{},[107,36089,35920],{"id":35919},[112,36091],{},[26,36093,15620,36094,35929,36096,33891],{},[192,36095,17849],{},[192,36097,31171],{},[1923,36099,36100,36104,36108],{},[189,36101,33896,36102,148],{},[192,36103,31171],{},[189,36105,1927,36106,35943],{},[145,36107,35942],{},[189,36109,31836,36110,36113,36114,36116,36117,36119],{},[145,36111,36112],{},"File path",". Click ",[192,36115,31794],{}," to use a path from earlier steps, or click ",[192,36118,34168],{}," to pick a file manually.",[32973,36121],{"url":36122},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=3384&end=3860",[107,36124,35956],{"id":35955},[112,36126],{},[26,36128,36129],{},"To upload several files to a single input field, store the file paths in a Google Sheet and loop through them.",[1923,36131,36132,36139,36143,36149,36153,36158],{},[189,36133,15620,36134,36138],{},[659,36135,36136],{"href":24142},[192,36137,22098],{}," step pointing at a sheet of file paths.",[189,36140,15620,36141,35974],{},[192,36142,17849],{},[189,36144,15620,36145,33947],{},[659,36146,36147],{"href":31407},[192,36148,15653],{},[189,36150,35983,36151,35986],{},[192,36152,31171],{},[189,36154,1927,36155,36157],{},[145,36156,35942],{}," and select the upload field on the page.",[189,36159,1927,36160,7176,36162,36164],{},[192,36161,31794],{},[145,36163,36112],{}," and pick the column with the file paths.",[107,36166,36001],{"id":36000},[112,36168],{},[26,36170,36006],{},[1923,36172,36173,36176,36180,36184,36190,36194,36198],{},[189,36174,36175],{},"Add a Google Sheet with one row per page, containing the page URL and the file path.",[189,36177,15620,36178,34753],{},[192,36179,22098],{},[189,36181,15620,36182,33947],{},[192,36183,15653],{},[189,36185,32496,36186,36024,36188,36027],{},[192,36187,17849],{},[192,36189,31794],{},[189,36191,11513,36192,35986],{},[192,36193,31171],{},[189,36195,1927,36196,36036],{},[145,36197,35942],{},[189,36199,1927,36200,7176,36202,36204],{},[192,36201,31794],{},[145,36203,36112],{}," and pick the file path column.",[107,36206,36208],{"id":36207},"upload-local-files-with-the-google-drive-step","Upload local files with the Google Drive step",[112,36210],{},[26,36212,2273,36213,36215],{},[192,36214,35911],{}," step can also upload from a local folder when running in the desktop app. This is useful when you want a single step that works in both cloud and desktop modes.",[1923,36217,36218,36222,36228,36232,36237],{},[189,36219,15620,36220,35974],{},[192,36221,17849],{},[189,36223,33896,36224,148],{},[659,36225,36226],{"href":35908},[192,36227,35911],{},[189,36229,1927,36230,36036],{},[145,36231,35942],{},[189,36233,31836,36234,36236],{},[145,36235,35948],{}," to the file URL.",[189,36238,31969,36239,36241],{},[145,36240,34337],{}," on and enter a local folder path.",[32973,36243],{"url":35952},[2093,36245,36246],{},[26,36247,36248,36250,36251,36253],{},[192,36249,2099],{}," Don't use this configuration when running in the cloud. The ",[145,36252,34337],{}," setting only works in the desktop app.",[107,36255,34069],{"id":34068},[112,36257],{},[26,36259,36260],{},"If the file doesn't upload, check that the filename and path are correct, the file is present at that location, and your local user has read access to the folder.",[2093,36262,36263],{},[26,36264,36265,24126,36267,36269,36270,15415],{},[192,36266,2359],{},[192,36268,31171],{}," step only runs in the desktop app. To upload in the cloud, use the ",[192,36271,35911],{},{"title":67,"searchDepth":68,"depth":68,"links":36273},[36274,36275,36276,36277,36278],{"id":35919,"depth":670,"text":35920},{"id":35955,"depth":670,"text":35956},{"id":36000,"depth":670,"text":36001},{"id":36207,"depth":670,"text":36208},{"id":34068,"depth":670,"text":34069},"Use the Upload a file step to upload files from your local computer to any web form, with optional support for loops.",{"metaTitle":36281,"video":36282},"Upload local files to a web form with axiom.ai","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&amp;start=3384&end=3860","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fupload-local",{"title":36067,"description":36279},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fupload-local","SZJ3MwhnyniajfU61XAdyERgghF3JPa-RTM_kAjvl4g",{"id":36288,"title":36289,"body":36290,"date":71,"description":36336,"extension":73,"meta":36337,"navigation":75,"order":293,"path":32055,"seo":36340,"stem":36341,"__hash__":36342},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fwait.md","Pause an automation",{"type":8,"value":36291,"toc":36333},[36292,36295,36297,36301,36303,36312,36327],[26,36293,36294],{},"There are several reasons to pause an automation: to interact with the page (for example to enter a password), to give a slow-loading page time to render, or to vary timing to look more human. Note that you can only interact with the browser when running on the desktop, not in the cloud.",[32947,36296],{},[107,36298,36300],{"id":36299},"use-the-wait-step","Use the Wait step",[112,36302],{},[26,36304,36305,36306,33189,36308,15415],{},"To pause an automation, open the step finder, search for ",[192,36307,5482],{},[659,36309,36310],{"href":21702},[192,36311,18065],{},[1923,36313,36314],{},[189,36315,31836,36316,9879,36319,36322,36323,36326],{},[145,36317,36318],{},"Wait type",[192,36320,36321],{},"Fixed length"," for a specific duration, or ",[192,36324,36325],{},"Random length"," to vary it.",[26,36328,36329,36330,36332],{},"The automation pauses when it reaches the ",[192,36331,18065],{}," step, not before.",{"title":67,"searchDepth":68,"depth":68,"links":36334},[36335],{"id":36299,"depth":670,"text":36300},"Pause an automation to interact with the page, give content time to load, or mimic human-like timing.",{"metaTitle":36338,"video":36339},"Add a pause to an automation with the Wait step","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&amp;start=1096&end=1131",{"title":36289,"description":36336},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fwait","lPMIRYGNo734WRdmDt-HBfyUmtO868TmJabdUOE5tKM",{"id":36344,"title":36345,"body":36346,"date":71,"description":36521,"extension":73,"meta":36522,"navigation":75,"order":71,"path":36524,"seo":36525,"stem":36526,"__hash__":36527},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata\u002Fdynamically_write.md","How to write data to a specific row",{"type":8,"value":36347,"toc":36515},[36348,36351,36355,36357,36368,36372,36374,36377,36381,36385,36387,36396,36430,36439,36449,36472,36475,36508,36510,36512],[26,36349,36350],{},"Learn how to append data to a specific row in a Google Sheet by combining a few steps using our builder. This design pattern is useful when you have a list of links and want to append some data to the same row where the link is located.",[107,36352,36354],{"id":36353},"design-pattern-write-to-same-google-sheet-row","Design pattern: Write to same Google Sheet row",[112,36356],{},[186,36358,36359,36362,36365],{},[189,36360,36361],{},"Read data from Google Sheet",[189,36363,36364],{},"Scrape data (or other actions)",[189,36366,36367],{},"Write data to the correct row in Google Sheet",[107,36369,36371],{"id":36370},"set-up-a-google-sheet","Set up a Google Sheet",[112,36373],{},[26,36375,36376],{},"Prepare your Google Sheet by creating a separate column with the row numbers.",[1906,36378],{"src":36379,"alt":36380},"\u002Fdocs\u002Ftutorials\u002Fgoogle-sheet-example-row-numbers.png","Google Sheet with Row Numbers",[107,36382,36384],{"id":36383},"add-the-following-steps-in-your-bot","Add the following steps in your bot",[112,36386],{},[186,36388,36389],{},[189,36390,36391,5210,36394],{},[192,36392,36393],{},"1.0",[145,36395,36361],{},[186,36397,36398,36404,36410,36420],{},[189,36399,36400,36403],{},[145,36401,36402],{},"Spreadsheet",": Select your Google Sheet.",[189,36405,36406,36409],{},[145,36407,36408],{},"Sheet name",": Choose the relevant worksheet.",[189,36411,36412,36415,36416,36419],{},[145,36413,36414],{},"First cell",": Specify the starting cell (e.g. ",[145,36417,36418],{},"A2"," if your sheet has headers).",[189,36421,36422,36425,36426,36429],{},[145,36423,36424],{},"Last cell",": Specify the last cell to limit your test range (e.g. ",[145,36427,36428],{},"B5"," for columns A and B, rows 2–5).",[186,36431,36432],{},[189,36433,36434,5210,36437],{},[192,36435,36436],{},"2.0",[145,36438,15653],{},[186,36440,36441],{},[189,36442,36443,36446,36447,34763],{},[145,36444,36445],{},"Token",": Select the ",[145,36448,34762],{},[186,36450,36451,36464],{},[189,36452,36453,5210,36456,36459],{},[192,36454,36455],{},"2.1",[145,36457,36458],{},"Add browser actions",[186,36460,36461],{},[189,36462,36463],{},"Add any steps needed between reading and writing, such as scraping a page or clicking buttons.",[189,36465,36466,5210,36469],{},[192,36467,36468],{},"2.2",[145,36470,36471],{},"Write to Google Sheet",[1906,36473],{"src":36474,"alt":22113},"\u002Fdocs\u002Ftutorials\u002Fwrite-data-to-google-sheet-correct-row.png",[186,36476,36477,36482,36487,36495],{},[189,36478,36479,36481],{},[145,36480,36402],{},": Select the same Google Sheet as above.",[189,36483,36484,36486],{},[145,36485,36408],{},": Use the same worksheet, or a different one if needed.",[189,36488,36489,36492,36493,3696],{},[145,36490,36491],{},"DATA",": Select the token containing the data to write (often ",[145,36494,27218],{},[189,36496,36497,36500,36501,2344,36504,36507],{},[145,36498,36499],{},"Write options",": Choose the target column (e.g. ",[145,36502,36503],{},"C",[145,36505,36506],{},"D","). Click \"Insert data\", then use the row number token from the \"Read data\" step to write to the correct row.",[107,36509,24962],{"id":24961},[112,36511],{},[26,36513,36514],{},"Create an automation that reads your sheet, processes data, and writes results to the exact row using.",{"title":67,"searchDepth":68,"depth":68,"links":36516},[36517,36518,36519,36520],{"id":36353,"depth":670,"text":36354},{"id":36370,"depth":670,"text":36371},{"id":36383,"depth":670,"text":36384},{"id":24961,"depth":670,"text":24962},"Learn how to select and write data to a specific row in a Google Sheet when automating the browser.",{"metaTitle":36523},"Write automation data to a specific Google Sheet row","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata\u002Fdynamically_write",{"title":36345,"description":36521},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata\u002Fdynamically_write","c_wVFknfz1xL12JjrpLIuHlc95D9imRfKCGs6zmk_us",{"id":36529,"title":36530,"body":36531,"date":71,"description":36608,"extension":73,"meta":36609,"navigation":75,"order":670,"path":36611,"seo":36612,"stem":36613,"__hash__":36614},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata\u002Fexport.md","How to export data from axiom.ai",{"type":8,"value":36532,"toc":36603},[36533,36536,36540,36542,36545,36556,36559,36563,36565,36568,36576,36579,36583,36585,36588,36596],[26,36534,36535],{},"You can export data from axiom.ai using various methods, such as writing data to a Google Sheet or posting data via apps like Zapier, Make, or Airtable.",[107,36537,36539],{"id":36538},"export-data-using-write-data-to-a-google-sheet","Export data using \"Write data to a Google Sheet\"",[112,36541],{},[26,36543,36544],{},"To extract data to a Google Sheet, use the Step Finder to search for \"Write data\" and add the step.",[1923,36546,36547,36550,36553],{},[189,36548,36549],{},"First, select a Google Sheet to write to.",[189,36551,36552],{},"Next, specify a sheet name to write to.",[189,36554,36555],{},"Lastly, select the data to write, click and select the variable to use.",[26,36557,36558],{},"If looping your automation, we recommend inserting the step inside the loop.",[107,36560,36562],{"id":36561},"export-using-export-to-csv","Export using \"Export to CSV\"",[112,36564],{},[26,36566,36567],{},"To write data into a CSV file, use the Step Finder to search for \"Export to\" and add the step.",[1923,36569,36570,36573],{},[189,36571,36572],{},"First, select \"Export to CSV,\" click \"Insert Data,\" and choose the variable to use.",[189,36574,36575],{},"Next, enter a name to save the file as.",[26,36577,36578],{},"The file will be saved in your downloads folder. Note that this step is only for the desktop runner.",[107,36580,36582],{"id":36581},"export-data-using-a-webhook","Export data using a webhook",[112,36584],{},[26,36586,36587],{},"Integrate with any site that supports webhooks by sending them whatever data you want using our \"Trigger webhook\" step. Use the Step Finder to search for \"Webhook\" and add the step.",[1923,36589,36590,36593],{},[189,36591,36592],{},"Set your Endpoint.",[189,36594,36595],{},"Enter your payload, valid JSON only.",[26,36597,36598,36599,148],{},"To see examples and learn more about webhooks ",[659,36600,36602],{"href":36601},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fwebhooks","click here",{"title":67,"searchDepth":68,"depth":68,"links":36604},[36605,36606,36607],{"id":36538,"depth":670,"text":36539},{"id":36561,"depth":670,"text":36562},{"id":36581,"depth":670,"text":36582},"Learn how to extract data from your automation into CSVs and Google Sheets, and even post to apps like Zapier, Retool, Airtable, and Make using our API and webhooks.",{"metaTitle":36610},"Export automation data to Google Sheets, CSV, and webhooks","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata\u002Fexport",{"title":36530,"description":36608},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata\u002Fexport","Q4iN-B8rROFaf9cSEM9x5deXJDuQNTeHe-jUoO20Chg",{"id":36616,"title":36617,"body":36618,"date":71,"description":36722,"extension":73,"meta":36723,"navigation":75,"order":2131,"path":36725,"seo":36726,"stem":36727,"__hash__":36728},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata\u002Fimport.md","How to import data to use in your automation",{"type":8,"value":36619,"toc":36716},[36620,36623,36627,36629,36632,36643,36650,36654,36656,36659,36667,36670,36674,36676,36679,36690,36696,36700,36702,36705,36710],[26,36621,36622],{},"You can import data into axiom.ai for your browser automation through various methods, such as web scraping, reading data from Google Sheets or posting data via apps like Zapier, Make, or Airtable.",[107,36624,36626],{"id":36625},"import-using-read-data-from-a-google-sheet","Import using \"Read data from a Google Sheet\"",[112,36628],{},[26,36630,36631],{},"To import data from a Google Sheet, use the Step Finder to search for \"Read\" and add the step.",[1923,36633,36634,36637,36640],{},[189,36635,36636],{},"First, select a Google Sheet to read from.",[189,36638,36639],{},"Next, specify the sheet name to read from.",[189,36641,36642],{},"Lastly, if you wish to set a cell range, enter values in \"First cell\" and \"Last cell\".",[26,36644,36645,36646,148],{},"Once set up, you will see a preview output of the first three rows, and a token will be available to pass that data into any other step. If you wish to loop through your data, ",[659,36647,36649],{"href":36648},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Floop#loop-using-the-loop-through-data-step","see here",[107,36651,36653],{"id":36652},"import-using-import-csv-file","Import using \"Import CSV file\"",[112,36655],{},[26,36657,36658],{},"To import data from a CSV, use the Step Finder to search for \"CSV\" and add the step.",[1923,36660,36661,36664],{},[189,36662,36663],{},"First, select CSV file to upload.",[189,36665,36666],{},"Next, if you wish to set a cell range, enter values in \"First cell\" and \"Last cell\".",[26,36668,36669],{},"Once set up, you will see a preview output of the first three rows, and a token will be available to pass that data into any other step. This step only works with the desktop runner.",[107,36671,36673],{"id":36672},"import-data-using-get-data-from-a-url","Import data using \"Get data from a URL\"",[112,36675],{},[26,36677,36678],{},"To scrape data from a webpage, use the Step Finder to search for \"Get data from a URL\" and add the step.",[1923,36680,36681,36684,36687],{},[189,36682,36683],{},"First, set the URL to scrape.",[189,36685,36686],{},"Second, select the data to scrape.",[189,36688,36689],{},"Lastly, set the number of results to scrape.",[26,36691,36692,36693,148],{},"Once set up, you will see a preview output of the first three rows, and a token will be available to pass that data into any other step. To learn more about scraping data, ",[659,36694,36602],{"href":36695},"\u002Fguides\u002Fweb-scraping",[107,36697,36699],{"id":36698},"import-data-from-other-web-apps","Import data from other web apps",[112,36701],{},[26,36703,36704],{},"To import data from other apps such as Zapier, Make, Retool, and Airtable, use the \"Receive data from another app\" feature and the axiom.ai API. Use the Step Finder to search for \"Receive data\" and add the step.",[26,36706,36707,36708,148],{},"For examples and to learn more about passing data from other apps, ",[659,36709,36602],{"href":31803},[26,36711,36712,36713,148],{},"If you need help or want to suggest an alternative way of importing data into axiom.ai, please ",[659,36714,36715],{"href":1887},"let support know",{"title":67,"searchDepth":68,"depth":68,"links":36717},[36718,36719,36720,36721],{"id":36625,"depth":670,"text":36626},{"id":36652,"depth":670,"text":36653},{"id":36672,"depth":670,"text":36673},{"id":36698,"depth":670,"text":36699},"Learn how to import data from Google Sheets, CSVs, and web apps like Zapier, Make, Retool, and Airtable.",{"metaTitle":36724},"Import data from Google Sheets, CSVs, and webhooks","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata\u002Fimport",{"title":36617,"description":36722},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata\u002Fimport","byIu2N-92NpjThSVvoqc4WqCUmrhal0CMlMI5TyRVmY",{"id":36730,"title":36731,"body":36732,"date":71,"description":36770,"extension":73,"meta":36771,"navigation":75,"order":68,"path":36772,"seo":36773,"stem":36774,"__hash__":36775},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata\u002Findex.md","Work with data",{"type":8,"value":36733,"toc":36767},[36734,36754,36758,36760],[26,36735,36736,36737,36741,36742,36745,36746,6205,36750,148],{},"Working with data is central to building effective bots. These tutorials cover the full data lifecycle — from ",[659,36738,36740],{"href":36739},"\u002Fdocs\u002Ftutorials\u002Fdata\u002Fimport","importing data"," into your bot and ",[659,36743,36744],{"href":31803},"passing it between steps",", to ",[659,36747,36749],{"href":36748},"\u002Fdocs\u002Ftutorials\u002Fdata\u002Ftransform","transforming",[659,36751,36753],{"href":36752},"\u002Fdocs\u002Ftutorials\u002Fdata\u002Fexport","exporting the results",[107,36755,36757],{"id":36756},"data-tutorials","Data tutorials",[2218,36759],{},[26,36761,2222,36762,2226,36764,148],{},[659,36763,2225],{"href":1887},[659,36765,2231],{"href":2229,"rel":36766},[1218],{"title":67,"searchDepth":68,"depth":68,"links":36768},[36769],{"id":36756,"depth":670,"text":36757},"Import data from a CSV or Google Sheet, pass it between steps, and transform it along the way.",{},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata",{"title":36731,"description":36770},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata\u002Findex","Hh7A3-51gStE1sFHVm1dMyof7EKfWumQF3EGTFamMCY",{"id":36777,"title":36778,"body":36779,"date":71,"description":37406,"extension":73,"meta":37407,"navigation":75,"order":68,"path":37409,"seo":37410,"stem":37411,"__hash__":37412},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata\u002Ftransform.md","Transforming data during the run",{"type":8,"value":36780,"toc":37369},[36781,36784,36788,36790,36804,36812,36826,36829,36832,36838,36844,36848,36850,36862,36869,36895,36898,36901,36903,36910,36914,36916,36928,36935,36942,36945,36948,36951,36954,36958,36960,36972,36979,37010,37013,37016,37019,37022,37026,37028,37040,37047,37069,37072,37075,37078,37081,37085,37087,37099,37106,37119,37122,37125,37128,37131,37135,37137,37147,37154,37167,37170,37173,37176,37182,37186,37188,37200,37207,37227,37230,37233,37236,37239,37243,37245,37255,37262,37280,37283,37286,37291,37294,37298,37300,37312,37319,37326,37329,37332,37337,37340,37344,37346,37355,37360,37364,37366],[26,36782,36783],{},"We offer a range of steps to help you transform your data, including appending, filtering, replacing, removing, and deduplication. Data can be passed into all of these steps simply by clicking \"Insert Data\" when configuring the step. This group of steps also output their transformed data in a variable.",[107,36785,36787],{"id":36786},"how-to-append-or-merge-two-or-more-data-variables","How to append or merge two or more data variables",[112,36789],{},[26,36791,36792,36793,36799,36800,36803],{},"Merge two pieces of data together by appending one to the other. You can append either horizontally, which merges rows, or vertically, which adds all the columns in the second set to the end of the first. To do this add the ",[659,36794,36796],{"href":36795},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fappend-or-merge-data",[192,36797,36798],{},"\"Append or merge data\""," step, use the Step Finder to search for ",[192,36801,36802],{},"\"Append\""," and add the step.",[1923,36805,36806],{},[189,36807,36808,36811],{},[145,36809,36810],{},"Append or merge data"," step",[186,36813,36814,36820],{},[189,36815,36816,36819],{},[145,36817,36818],{},"Data A",": Click \"Insert data\" and select the data to append to.",[189,36821,36822,36825],{},[145,36823,36824],{},"Data B",": Click \"Insert data\" and select the data to append.",[32973,36827],{"url":36828},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1634&end=1690?rel=0",[26,36830,36831],{},"The variable output of this step will be the joined data in a list or table. To append more data use additional steps.",[21,36833,36835,36836,36811],{"id":36834},"example-of-using-the-append-or-merge-data-step","Example of using the ",[192,36837,36798],{},[26,36839,36840,36841,36843],{},"We often use this step to combine data from two different sources. For example, we have created an automation that reads URLs from a Google Sheet, then scrapes data from those pages. We use an ",[192,36842,36802],{}," step to merge the URLs with the scraped data before writing it to a Google Sheet.",[107,36845,36847],{"id":36846},"how-to-join-different-data-sources-based-on-matching-columns","How to join different data sources based on matching columns",[112,36849],{},[26,36851,36852,36853,36799,36859,36803],{},"Join data gathered from different sources together using a shared column. For example, you can use this to join product information from different e-commerce sites. To do this add the ",[659,36854,36856],{"href":36855},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fjoin-different-data-sources",[192,36857,36858],{},"\"Join different data sources based on matching columns\"",[192,36860,36861],{},"\"Join\"",[1923,36863,36864],{},[189,36865,36866,36811],{},[145,36867,36868],{},"Join different data sources based on matching columns",[186,36870,36871,36877,36883,36889],{},[189,36872,36873,36876],{},[145,36874,36875],{},"Base data",": Enter the base data to join with another.",[189,36878,36879,36882],{},[145,36880,36881],{},"Base data column",": Set column of data to use as the basis of the join.",[189,36884,36885,36888],{},[145,36886,36887],{},"Join data",": Enter the data you want to join with the base data.",[189,36890,36891,36894],{},[145,36892,36893],{},"Column",": Specify a particular column of the base data to always match against.",[32973,36896],{"url":36897},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=661&end=706&rel=0",[26,36899,36900],{},"The variable output of this step will be the merged data.",[21,36902,12784],{"id":12783},[26,36904,36905,36906,36909],{},"We often see users utilizing this step to ",[192,36907,36908],{},"merge CSV files"," together before entering data into a webform.",[107,36911,36913],{"id":36912},"how-to-remove-duplicates-from-your-data","How to remove duplicates from your data",[112,36915],{},[26,36917,36918,36919,36799,36925,36803],{},"Remove duplicates from the specified data. This can be limited to particular columns. To do this add the ",[659,36920,36922],{"href":36921},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fremove-duplicates",[192,36923,36924],{},"\"Remove duplicates\"",[192,36926,36927],{},"\"Remove\"",[1923,36929,36930],{},[189,36931,36932,36811],{},[145,36933,36934],{},"Remove duplicates",[186,36936,36937],{},[189,36938,36939,36941],{},[145,36940,581],{},": Select the data to deduplicate.",[32973,36943],{"url":36944},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=366&end=395?rel=0",[26,36946,36947],{},"The variable output of this step will be the deduplicated data.",[21,36949,12784],{"id":36950},"example-1",[26,36952,36953],{},"This step can be useful for deduplicating data sets before you run your browser automations.",[107,36955,36957],{"id":36956},"how-to-remove-results-that-contain-certain-words","How to remove results that contain certain words",[112,36959],{},[26,36961,36962,36963,36969,36970,36803],{},"Filter out rows from your data that contain particular words. To do this, add the ",[659,36964,36966],{"href":36965},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fremove-results-that-contain-certain-words",[192,36967,36968],{},"\"Remove results that contain certain words\""," step using the Step Finder to search for ",[192,36971,36927],{},[1923,36973,36974],{},[189,36975,36976,36811],{},[145,36977,36978],{},"Remove results that contain certain words",[186,36980,36981,36986,36992,37004],{},[189,36982,36983,36985],{},[145,36984,581],{},": Select the data you wish to remove rows from.",[189,36987,36988,36991],{},[145,36989,36990],{},"Words (comma separated)",": Enter either a list of any number of words to check for, separated by commas, or data containing a list of words, one in each row.",[189,36993,36994,36997,36998,2344,37001,148],{},[145,36995,36996],{},"Word matching mode",": Set to ",[192,36999,37000],{},"\"All\"",[192,37002,37003],{},"\"Any\"",[189,37005,37006,37009],{},[145,37007,37008],{},"Match on word boundary",": Check this to match only when the complete word appears in the data.",[32973,37011],{"url":37012},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=2195&end=2255?rel=0",[26,37014,37015],{},"The variable output of this step will be the data minus the rows matching the words.",[21,37017,12784],{"id":37018},"example-2",[26,37020,37021],{},"When doing large scale scrapes of sites, whilst searching for particular data this step can be used to filter out data that you do not want written to the Google Sheet.",[107,37023,37025],{"id":37024},"how-to-remove-results-which-do-not-contain-certain-words","How to remove results which do not contain certain words",[112,37027],{},[26,37029,37030,37031,36969,37037,36803],{},"Filter out rows from your data that do not contain particular words. To do this, add the ",[659,37032,37034],{"href":37033},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fremove-results-which-do-not-contain-certain-words",[192,37035,37036],{},"\"Remove results which do not contain certain words\"",[192,37038,37039],{},"\"Do not\"",[1923,37041,37042],{},[189,37043,37044,36811],{},[145,37045,37046],{},"Remove results that do not contain certain words",[186,37048,37049,37053,37057,37065],{},[189,37050,37051,36985],{},[145,37052,581],{},[189,37054,37055,36991],{},[145,37056,36990],{},[189,37058,37059,36997,37061,2344,37063,148],{},[145,37060,36996],{},[192,37062,37000],{},[192,37064,37003],{},[189,37066,37067,37009],{},[145,37068,37008],{},[32973,37070],{"url":37071},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=2255&end=2315?rel=0",[26,37073,37074],{},"The variable output of this step will be the data with the matching words.",[21,37076,12784],{"id":37077},"example-3",[26,37079,37080],{},"This is often used when extracting product data from e-commerce sites, to isolate products with SKUs from the scraped data.",[107,37082,37084],{"id":37083},"how-to-select-data-randomly","How to select data randomly",[112,37086],{},[26,37088,37089,37090,36969,37096,36803],{},"Select random rows from a given data set and create a new data set containing them. To do this, add the ",[659,37091,37093],{"href":37092},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fselect-random-rows",[192,37094,37095],{},"\"Select random rows\"",[192,37097,37098],{},"\"andom\"",[1923,37100,37101],{},[189,37102,37103,36811],{},[145,37104,37105],{},"Select random rows",[186,37107,37108,37114],{},[189,37109,37110,37113],{},[145,37111,37112],{},"Rows",": Enter the number of rows to select.",[189,37115,37116,37118],{},[145,37117,36491],{},": Select the data to get rows from.",[32973,37120],{"url":37121},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=3222&end=3247?rel=0",[26,37123,37124],{},"The variable output of this step will be the specified number of rows, randomly picked from the data source.",[21,37126,12784],{"id":37127},"example-4",[26,37129,37130],{},"This step can be used to randomly enter a number value into an input field.",[107,37132,37134],{"id":37133},"how-to-extract-data-from-a-string","How to extract data from a string",[112,37136],{},[26,37138,37139,37140,37146],{},"Split data into parts using a delimiter that you specify. To do this, add the ",[659,37141,37143],{"href":37142},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsplit-by-character",[192,37144,37145],{},"\"Split by character\""," step using the Step Finder to search for \"Split\" and add the step.",[1923,37148,37149],{},[189,37150,37151,36811],{},[145,37152,37153],{},"Split by character",[186,37155,37156,37162],{},[189,37157,37158,37161],{},[145,37159,37160],{},"Character",": Enter a character or word to split on.",[189,37163,37164,37166],{},[145,37165,36491],{},": Select the data that should be split.",[32973,37168],{"url":37169},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=810&end=840?rel=0",[26,37171,37172],{},"The variable output of this step will be the characters before or after the split.",[21,37174,12784],{"id":37175},"example-5",[26,37177,37178,37179,37181],{},"This step is useful when you need to extract specific data from within a string. For instance, if you are scraping data that is embedded within a larger string, you can use two ",[192,37180,37145],{}," steps. The first step removes the unwanted characters before your desired data, and the second step removes the unwanted characters after your desired data, effectively isolating the information you need.",[107,37183,37185],{"id":37184},"how-to-replace-text","How to replace text",[112,37187],{},[26,37189,37190,37191,36969,37197,36803],{},"Replace one piece of text with another within a dataset. To do this, add the ",[659,37192,37194],{"href":37193},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Freplace-text-step",[192,37195,37196],{},"\"Replace text\"",[192,37198,37199],{},"\"Replace\"",[1923,37201,37202],{},[189,37203,37204,36811],{},[145,37205,37206],{},"Replace text",[186,37208,37209,37215,37221],{},[189,37210,37211,37214],{},[145,37212,37213],{},"Data to replace words",": Select the data within which you want to replace text.",[189,37216,37217,37220],{},[145,37218,37219],{},"Text to replace",": Enter the text you want to replace.",[189,37222,37223,37226],{},[145,37224,37225],{},"Replace with",": Enter what you want to replace the text with, or leave blank to whipe clean.",[32973,37228],{"url":37229},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=427&end=484?rel=0",[26,37231,37232],{},"The variable output of this step will be the data with the specified text replaced.",[21,37234,12784],{"id":37235},"example-6",[26,37237,37238],{},"Often, when extracting data for reporting, the data needs to be relabeled before being placed in the report. This step can be used to relabel the data.",[107,37240,37242],{"id":37241},"how-to-split-names-for-use-in-text","How to split names for use in text",[112,37244],{},[26,37246,37247,37248,37254],{},"Split any full name into its parts: title, first name, last name, and additional names. To do this, add the ",[659,37249,37251],{"href":37250},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsplit-a-name-into-columns",[192,37252,37253],{},"\"Split a name into columns\""," step using the Step Finder to search for \"Name\" and add the step.",[1923,37256,37257],{},[189,37258,37259,36811],{},[145,37260,37261],{},"Split a name into columns",[186,37263,37264,37269,37274],{},[189,37265,37266,37268],{},[145,37267,36491],{},": Select data to expand.",[189,37270,37271,37273],{},[145,37272,36893],{},": Enter the column in the data where the names can be found. You can enter either a number (starting from 1) or a capital letter (starting from A).",[189,37275,37276,37279],{},[145,37277,37278],{},"Fields",": Select the fields to split the name into.",[32973,37281],{"url":37282},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1146&end=1211?rel=0",[26,37284,37285],{},"The variable output of this step will be the data split into columns. This can be used for data other than names.",[21,37287,36835,37289,36811],{"id":37288},"example-of-using-the-split-a-name-into-columns-step",[192,37290,37253],{},[26,37292,37293],{},"This step is useful when sending DMs in LinkedIn Sales Navigator. We scrape the whole name to record the data, then split the name and use the first name to personalize the message.",[107,37295,37297],{"id":37296},"how-to-remove-html-code","How to remove HTML code",[112,37299],{},[26,37301,37302,37303,36969,37309,36803],{},"Strip all the HTML from a set of data. To do this, add the ",[659,37304,37306],{"href":37305},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fremove-html-code",[192,37307,37308],{},"\"Remove HTML code\"",[192,37310,37311],{},"\"HTML\"",[1923,37313,37314],{},[189,37315,37316,36811],{},[145,37317,37318],{},"Remove HTML code",[186,37320,37321],{},[189,37322,37323,37325],{},[145,37324,36491],{},": Select the data to remove HTML from.",[32973,37327],{"url":37328},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=395&end=427?rel=0",[26,37330,37331],{},"The variable output of this step will be the data minus any HTML.",[21,37333,36835,37335,36811],{"id":37334},"example-of-using-the-remove-html-code-step",[192,37336,37308],{},[26,37338,37339],{},"If you are scraping hidden data often it will be tangled in HTML this step can be used to remove the code.",[107,37341,37343],{"id":37342},"using-javascript-to-transform-data","Using Javascript to transform data",[112,37345],{},[26,37347,37348,37349,37352,37353,148],{},"If you wish, you can use all of JavaScript's functions to transform and manipulate your data in axiom.ai. To do this, add the ",[192,37350,37351],{},"\"Write javascript\""," step using the Step Finder to search for \"Javascript\" and add the step. Data can be passed into this step by clicking \"Insert Data\". To learn more about using JavaScript in your automation, ",[659,37354,36602],{"href":31331},[26,37356,37357,37358,148],{},"If you need help or want to suggest an alternative way of transforming data in axiom.ai, please ",[659,37359,36715],{"href":1887},[107,37361,37363],{"id":37362},"concatenate-strings-without-code","Concatenate strings without code",[112,37365],{},[26,37367,37368],{},"Concatenate strings using the \"Custom data\" step - to add dynamic data, use the \"Insert data\" option to insert data tokens containing the information you wish to concatenate. For example, dynamically creating file names.",{"title":67,"searchDepth":68,"depth":68,"links":37370},[37371,37375,37378,37381,37384,37387,37390,37393,37396,37400,37404,37405],{"id":36786,"depth":670,"text":36787,"children":37372},[37373],{"id":36834,"depth":68,"text":37374},"Example of using the \"Append or merge data\" step",{"id":36846,"depth":670,"text":36847,"children":37376},[37377],{"id":12783,"depth":68,"text":12784},{"id":36912,"depth":670,"text":36913,"children":37379},[37380],{"id":36950,"depth":68,"text":12784},{"id":36956,"depth":670,"text":36957,"children":37382},[37383],{"id":37018,"depth":68,"text":12784},{"id":37024,"depth":670,"text":37025,"children":37385},[37386],{"id":37077,"depth":68,"text":12784},{"id":37083,"depth":670,"text":37084,"children":37388},[37389],{"id":37127,"depth":68,"text":12784},{"id":37133,"depth":670,"text":37134,"children":37391},[37392],{"id":37175,"depth":68,"text":12784},{"id":37184,"depth":670,"text":37185,"children":37394},[37395],{"id":37235,"depth":68,"text":12784},{"id":37241,"depth":670,"text":37242,"children":37397},[37398],{"id":37288,"depth":68,"text":37399},"Example of using the \"Split a name into columns\" step",{"id":37296,"depth":670,"text":37297,"children":37401},[37402],{"id":37334,"depth":68,"text":37403},"Example of using the \"Remove HTML code\" step",{"id":37342,"depth":670,"text":37343},{"id":37362,"depth":670,"text":37363},"Learn how to use a range of steps to help you transform your data, including appending, filtering, replacing, removing, and deduplication.",{"metaTitle":37408},"Transform data during a run with append, filter, and replace steps","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata\u002Ftransform",{"title":36778,"description":37406},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata\u002Ftransform","_EC7JcfYJRfEvo_ylU8B84ysxu5AfHN7lYsS9NbsB5o",{"id":37414,"title":32917,"body":37415,"date":71,"description":37641,"extension":73,"meta":37642,"navigation":75,"order":68,"path":37644,"seo":37645,"stem":37646,"__hash__":37647},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fget-data.md",{"type":8,"value":37416,"toc":37626},[37417,37420,37424,37426,37434,37443,37449,37453,37455,37458,37473,37484,37488,37490,37493,37512,37519,37523,37525,37531,37545,37549,37551,37554,37559,37564,37568,37571,37575,37578,37584,37587,37590,37594,37597,37601,37604,37608,37611,37615,37617,37620],[26,37418,37419],{},"Use the web scraping steps to pull structured data (tables, lists, product grids, search results) from any webpage. This page walks you through adding a scrape step, selecting the data you want, handling pagination, and tuning the scraper for speed.",[107,37421,37423],{"id":37422},"add-get-data-from-a-url","Add Get data from a URL",[112,37425],{},[26,37427,33896,37428,37430,37431,37433],{},[192,37429,32839],{},". It includes a built-in ",[145,37432,17849],{}," field so you can enter the URL directly.",[26,37435,37436,37437,37439,37440,37442],{},"If your automation already has a ",[192,37438,17849],{}," step, add ",[192,37441,20136],{}," instead. It scrapes whichever page the automation is on when it runs.",[26,37444,37445],{},[1906,37446],{"alt":37447,"src":37448},"The Get data from a URL step added to an automation in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Fweb-scraper-configuration.jpg",[107,37450,37452],{"id":37451},"select-the-data","Select the data",[112,37454],{},[26,37456,37457],{},"Use the selector tool to tell the automation which data to extract.",[1923,37459,37460,37464,37467,37470],{},[189,37461,1927,37462,148],{},[192,37463,33198],{},[189,37465,37466],{},"Click the first piece of data on the page.",[189,37468,37469],{},"Click a second matching element. The selector tool uses both clicks to generate a selector that matches every similar element on the page.",[189,37471,37472],{},"For the most reliable selector, pick one element near the top of the list and another near the bottom. This helps capture the full set.",[2093,37474,37475],{},[26,37476,37477,37479,37480,148],{},[192,37478,2359],{}," For a deeper walkthrough, see the ",[659,37481,37483],{"href":37482},"\u002Fdocs\u002Freference\u002Fselector-tool","selector tool guide",[107,37485,37487],{"id":37486},"set-a-pager","Set a pager",[112,37489],{},[26,37491,37492],{},"If the results span multiple pages, set a pager so the automation moves through all of them.",[1923,37494,37495,37500,37506],{},[189,37496,1927,37497,148],{},[192,37498,37499],{},"Set pager",[189,37501,37502,37503,37505],{},"Select the pagination element, usually a ",[192,37504,32554],{}," button or a page number link.",[189,37507,37508,37509,37511],{},"Selecting the pager by its text (for example, the word ",[145,37510,32554],{},") is often the most reliable option.",[26,37513,37514,37515,148],{},"Learn more about ",[659,37516,37518],{"href":37517},"\u002Fdocs\u002Ftutorials\u002Fpager","setting a pager",[107,37520,37522],{"id":37521},"cap-the-number-of-rows","Cap the number of rows",[112,37524],{},[26,37526,31861,37527,37530],{},[145,37528,37529],{},"Max results"," field to cap how many rows the step returns.",[186,37532,37533,37539,37542],{},[189,37534,37535,37536,37538],{},"Set it to ",[145,37537,19338],{}," when you only need a single row of data. This is much faster than scraping the full page.",[189,37540,37541],{},"Leave it blank to scrape every match the selector finds.",[189,37543,37544],{},"Set it dynamically from data in a previous step when the limit changes per run.",[107,37546,37548],{"id":37547},"configure-the-scraper-for-speed","Configure the scraper for speed",[112,37550],{},[26,37552,37553],{},"The web scraping steps default to settings that favour accuracy over speed. Pages often keep loading data for several seconds after they first appear, and scraping too quickly can miss content.",[26,37555,31969,37556,37558],{},[192,37557,31833],{}," on to expose the options below. After changing any of them, run your automation and check that the output is correct.",[26,37560,37561],{},[1906,37562],{"alt":37563,"src":37448},"The web scraper configuration panel in the axiom.ai Builder showing each option",[21,37565,37567],{"id":37566},"wait-time-between-scrolls-ms","Wait time between scrolls (ms)",[26,37569,37570],{},"How long the automation waits between scrolls. Some pages load more content as you scroll, and the default handles most of them. Increase this value if content is loading too slowly to be captured.",[21,37572,37574],{"id":37573},"number-of-attempts-when-results-not-found","Number of attempts when results not found",[26,37576,37577],{},"How many times the step retries the scrape when it can't find matching elements. Many dynamic sites update content after the page first appears, so retries improve accuracy.",[26,37579,37580,37581,37583],{},"Reducing retries is the single biggest speed improvement you can make. If the earlier steps in your automation already give the page time to load, try setting this to ",[145,37582,256],{},". Test the result carefully: too few retries can cause missed data.",[21,37585,31816],{"id":37586},"minimum-wait-before-scraping-ms",[26,37588,37589],{},"How long the step pauses before each scrape. Lower values run faster. If content is still loading when the scrape starts, it can be missed, so test any reduction.",[21,37591,37593],{"id":37592},"page-number-to-start-scraping-on","Page number to start scraping on",[26,37595,37596],{},"On paginated pages, set the page number to start scraping from. Useful for resuming a partial run or skipping early pages.",[21,37598,37600],{"id":37599},"specify-exact-number-of-pixels-to-scroll-instead-of-auto-scrolling","Specify exact number of pixels to scroll instead of auto-scrolling",[26,37602,37603],{},"By default, the step auto-scrolls: it scrolls down to load content, waits, scrapes, then scrolls again. Use this field to override that behaviour and scroll a fixed number of pixels each time instead. You rarely need to change this.",[21,37605,37607],{"id":37606},"force-a-re-scrape-after-each-page-change","Force a re-scrape after each page change",[26,37609,37610],{},"Tick this box when the step returns the same data on every loop iteration. It's a rare edge case, but forcing a re-scrape resolves it.",[107,37612,37614],{"id":37613},"use-the-output","Use the output",[112,37616],{},[26,37618,37619],{},"The step renders a preview of up to three rows below it in the Builder, so you can check the shape of what you scraped before running the full automation.",[26,37621,37622,37623,37625],{},"Scraped data is returned as a 2D array of rows and columns. Each matching element on the page becomes a row; each piece of data you selected becomes a column. Reference the output with the ",[192,37624,31794],{}," button in any later step and pick either a single column or multiple columns to pass through.",{"title":67,"searchDepth":68,"depth":68,"links":37627},[37628,37629,37630,37631,37632,37640],{"id":37422,"depth":670,"text":37423},{"id":37451,"depth":670,"text":37452},{"id":37486,"depth":670,"text":37487},{"id":37521,"depth":670,"text":37522},{"id":37547,"depth":670,"text":37548,"children":37633},[37634,37635,37636,37637,37638,37639],{"id":37566,"depth":68,"text":37567},{"id":37573,"depth":68,"text":37574},{"id":37586,"depth":68,"text":31816},{"id":37592,"depth":68,"text":37593},{"id":37599,"depth":68,"text":37600},{"id":37606,"depth":68,"text":37607},{"id":37613,"depth":670,"text":37614},"Extract data from any webpage using browser automation, then tune the scraper for speed and accuracy.",{"metaTitle":37643},"Scrape data from any website with browser automation","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fget-data",{"title":32917,"description":37641},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fget-data","ZBXXcxgwXALDhfmEXnDycB9VSnXOeSrj1rKVag0YwlU",{"id":37649,"title":37650,"body":37651,"date":71,"description":37810,"extension":73,"meta":37811,"navigation":75,"order":71,"path":37812,"seo":37813,"stem":37814,"__hash__":37815},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fget-started.md","Make automations with our no-code tool",{"type":8,"value":37652,"toc":37800},[37653,37664,37668,37670,37679,37683,37688,37691,37693,37696,37700,37704,37706,37710,37713,37717,37721,37723,37727,37730,37735,37739,37741,37745,37748,37751,37755,37757,37764,37769,37773,37775,37783,37787,37789,37795],[26,37654,37655,37656,37659,37660,37663],{},"This guide walks you through installation, creating your account, offers starting points for your first automation, shows you how to use our No-code tool, and helps you run your ",[659,37657,37658],{"href":31364},"first automation",". If you're a novice eager to Learn how, explore our tutorials on all of axiom.ai's features. Experts aiming for mastery should check out our How to ",[659,37661,37662],{"href":338},"guides"," for design patterns.",[107,37665,37667],{"id":37666},"install-axiomai-in-seconds","Install axiom.ai in seconds",[112,37669],{},[26,37671,37672,37673,37678],{},"As a Chrome extension, axiom.ai is very quick to install - visit our ",[659,37674,37677],{"href":37675,"rel":37676},"https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Faxiom-browser-automation\u002Fcpgamigjcbffkaiciiepndmonbfdimbb?",[1218],"chrome store"," page. It's free to try, no credit card required, and all new accounts get 120 minutes of runtime.",[1906,37680],{"src":37681,"alt":37682},"\u002Fdocs\u002Ftutorials\u002Fchrome-store-axiom.ai.jpg","Install axiom.ai from our chrome store page",[26,37684,37685],{},[659,37686,37687],{"href":31161},"Learn how",[107,37689,2138],{"id":37690},"create-an-account",[112,37692],{},[26,37694,37695],{},"After the extension is installed, create a free account to start automating.",[26,37697,37698],{},[659,37699,37687],{"href":2186},[107,37701,37703],{"id":37702},"start-your-first-automation","Start your first automation",[112,37705],{},[1906,37707],{"src":37708,"alt":37709},"\u002Fdocs\u002Ftutorials\u002Fquick-builder.jpg","axiom.ai's new quick builder in beta",[26,37711,37712],{},"Scaffold your automations with the Quick builder. Alternatively if you're a beginner, start with a snippet or template. Experts can begin from scratch. To find the best starting point for you, please read our getting started guide.",[26,37714,37715],{},[659,37716,37687],{"href":31364},[107,37718,37720],{"id":37719},"using-our-dashboard","Using our dashboard",[112,37722],{},[1906,37724],{"src":37725,"alt":37726},"\u002Fdocs\u002Ftutorials\u002Faxiom-dashboard.jpg","axiom.ai's dashboard",[26,37728,37729],{},"Learn the basics of axiom.ai's No-code tool, starting with how to open the builder, create a new automation, combine steps to replicate your tasks, and export your automation to share with colleagues.",[26,37731,37732],{},[659,37733,37687],{"href":37734},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fdashboard",[107,37736,37738],{"id":37737},"using-our-no-code-tool","Using our No-code tool",[112,37740],{},[1906,37742],{"src":37743,"alt":37744},"\u002Fdocs\u002Ftutorials\u002Faxiom-builder.jpg","axiom.ai's no-code bot builder",[26,37746,37747],{},"Learn the basics of axiom.ai's No-code tool, starting with how to open the builder, create a new automation, combine steps to replicate your tasks, and export your axiom.ai to share with colleagues.",[26,37749,37750],{},"[Learn how](\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder",[107,37752,37754],{"id":37753},"running-your-automations","Running your automations",[112,37756],{},[26,37758,37759,37760,37763],{},"Once you've built your automation, running it is straightforward; click ",[192,37761,37762],{},"\"Run\""," and choose between the desktop or the cloud. If you want to learn how about scheduling your automations or understanding runtime options, please read on.",[26,37765,37766],{},[659,37767,37687],{"href":37768},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Frun",[107,37770,37772],{"id":37771},"how-to-share-your-automation","How to share your automation",[112,37774],{},[26,37776,37777,37778,37782],{},"You can ",[659,37779,37781],{"href":37780},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fsharing","share"," automations you make with collegaues as often as you like.",[107,37784,37786],{"id":37785},"need-help-get-in-touch","Need help get in touch",[112,37788],{},[26,37790,37791,37792,37794],{},"We always love hearing from our customers. Your feedback helps us improve our product. Whether you need ",[659,37793,2225],{"href":1887},", want a new feature, or are curious about how to automate your use case, please get in touch. We offer varying degrees of support, including a dedicated Slack channel.",[26,37796,37797],{},[659,37798,37687],{"href":37799},"\u002Fdocs\u002Fsupport",{"title":67,"searchDepth":68,"depth":68,"links":37801},[37802,37803,37804,37805,37806,37807,37808,37809],{"id":37666,"depth":670,"text":37667},{"id":37690,"depth":670,"text":2138},{"id":37702,"depth":670,"text":37703},{"id":37719,"depth":670,"text":37720},{"id":37737,"depth":670,"text":37738},{"id":37753,"depth":670,"text":37754},{"id":37771,"depth":670,"text":37772},{"id":37785,"depth":670,"text":37786},"Learn how to start making your first bot to automate your tasks in the chrome browser.",{},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fget-started",{"title":37650,"description":37810},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fget-started","mrvLM3WNN4lRQJNynG3zLYgp_iPDm6AzzhYmRUVC2oA",{"id":37817,"title":1376,"body":37818,"date":71,"description":37988,"extension":73,"meta":37989,"navigation":75,"order":670,"path":37991,"seo":37992,"stem":37993,"__hash__":37994},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Findex.md",{"type":8,"value":37819,"toc":37976},[37820,37863,37866,37868,37871,37873,37876,37878,37881,37884,37887,37889,37892,37894,37897,37899,37902,37905,37908,37910,37913,37915,37919,37921,37924,37927,37930,37932,37935,37938,37940,37942,37945,37947,37951,37953,37956,37958,37962,37964,37967,37969],[26,37821,37822,37823,4468,37827,4468,37831,4468,37835,4468,37839,4468,37842,4468,37846,4468,37850,4468,37854,10147,37858,37862],{},"Everything a bot can do in axiom.ai, grouped by topic. Jump to ",[659,37824,37826],{"href":37825},"#browser-actions","browser actions",[659,37828,37830],{"href":37829},"#scrape-data","scrape data",[659,37832,37834],{"href":37833},"#work-with-data","work with data",[659,37836,37838],{"href":37837},"#loop-through-data","loop through data",[659,37840,31398],{"href":37841},"#logic",[659,37843,37845],{"href":37844},"#log-in","log in",[659,37847,37849],{"href":37848},"#integrate-ai","integrate AI",[659,37851,37853],{"href":37852},"#webhooks","webhooks",[659,37855,37857],{"href":37856},"#custom-code","custom code",[659,37859,37861],{"href":37860},"#schedule-and-run","schedule and run"," - each section below links to a guide for that capability.",[107,37864,32550],{"id":37865},"browser-actions",[112,37867],{},[26,37869,37870],{},"Control what the bot does on a page - click buttons, type into fields, scroll, navigate between tabs, and upload files.",[2218,37872],{"path":37865},[107,37874,32917],{"id":37875},"scrape-data",[112,37877],{},[26,37879,37880],{},"Pull structured data out of any webpage - tables, lists, product grids, search results - and hand it off to the next step.",[2218,37882],{"path":37883},"get-data",[107,37885,36731],{"id":37886},"work-with-data",[112,37888],{},[26,37890,37891],{},"Import data from a CSV or Google Sheet, pass it between steps, transform it, and export the result.",[2218,37893],{"path":580,":file":1548},[107,37895,15653],{"id":37896},"loop-through-data",[112,37898],{},[26,37900,37901],{},"Repeat a set of steps for every row of data - scrape every page of results, message every contact, or process every row in a sheet.",[2218,37903],{"path":37904},"loop",[107,37906,37907],{"id":31398},"Logic",[112,37909],{},[26,37911,37912],{},"Branch a bot based on data, jump to another step, or stop a run early when a condition is met.",[2218,37914],{"path":31398},[107,37916,37918],{"id":37917},"log-in","Log in",[112,37920],{},[26,37922,37923],{},"Keep a bot signed in to the sites it visits, so runs don't break on login walls.",[2218,37925],{"path":37926},"login",[107,37928,19124],{"id":37929},"integrate-ai",[112,37931],{},[26,37933,37934],{},"Plug Claude, ChatGPT, or another LLM into a bot to extract fields from unstructured text or generate new content.",[2218,37936],{"path":37929,"scope":37937},"file",[107,37939,229],{"id":37853},[112,37941],{},[26,37943,37944],{},"Trigger a bot from another app, or send data out to Zapier, Make, or any webhook URL when a run finishes.",[2218,37946],{"path":37853},[107,37948,37950],{"id":37949},"custom-code","Custom code",[112,37952],{},[26,37954,37955],{},"Drop into JavaScript when the no-code steps don't cover what you need - transform data, control flow, or reach parts of a page the visual steps can't.",[2218,37957],{"path":2964,"scope":37937},[107,37959,37961],{"id":37960},"schedule-and-run","Schedule and run",[112,37963],{},[26,37965,37966],{},"Run a bot manually, on a schedule, or trigger it from Zapier, Make, or an incoming webhook.",[2218,37968],{"path":37960},[26,37970,2222,37971,2226,37973,148],{},[659,37972,2225],{"href":1887},[659,37974,2231],{"href":2229,"rel":37975},[1218],{"title":67,"searchDepth":68,"depth":68,"links":37977},[37978,37979,37980,37981,37982,37983,37984,37985,37986,37987],{"id":37865,"depth":670,"text":32550},{"id":37875,"depth":670,"text":32917},{"id":37886,"depth":670,"text":36731},{"id":37896,"depth":670,"text":15653},{"id":31398,"depth":670,"text":37907},{"id":37917,"depth":670,"text":37918},{"id":37929,"depth":670,"text":19124},{"id":37853,"depth":670,"text":229},{"id":37949,"depth":670,"text":37950},{"id":37960,"depth":670,"text":37961},"Learn how bots click, scrape, loop, branch on logic, handle logins, and run on a schedule in axiom.ai.",{"metaTitle":37990},"How browser automation works in axiom.ai | axiom.ai","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works",{"title":1376,"description":37988},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Findex","ds2px2DuGwvlCpjnHAh2vbf_dHINN4IsCmSHke0f_xQ",{"id":37996,"title":19124,"body":37997,"date":71,"description":38152,"extension":73,"meta":38153,"navigation":75,"order":2623,"path":38155,"seo":38156,"stem":38157,"__hash__":38158},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fintegrate-ai.md",{"type":8,"value":37998,"toc":38139},[37999,38004,38008,38010,38014,38018,38020,38032,38036,38038,38045,38049,38051,38057,38059,38062,38074,38077,38083,38094,38099,38114,38116,38118,38124,38127,38133,38136],[26,38000,31861,38001,38003],{},[192,38002,19124],{}," step to plug a large language model into your automation. Pass in data from an earlier step and either extract structured fields from it or generate new content. The result is returned as data that any later step can use.",[107,38005,38007],{"id":38006},"add-the-step","Add the step",[112,38009],{},[26,38011,33896,38012,148],{},[192,38013,19124],{},[107,38015,38017],{"id":38016},"pick-a-function","Pick a function",[112,38019],{},[26,38021,31861,38022,38025,38026,2344,38028,38031],{},[145,38023,38024],{},"Function"," toggle at the top of the step to choose what the model does with your data: ",[192,38027,27685],{},[192,38029,38030],{},"Generate data",". Your choice changes what the prompt area below looks like.",[107,38033,38035],{"id":38034},"choose-a-model","Choose a model",[112,38037],{},[26,38039,38040,38041,38044],{},"Pick an LLM provider from the ",[145,38042,38043],{},"LLM"," dropdown. Supported providers include Claude and ChatGPT. You'll need an API key for the provider you choose.",[107,38046,38048],{"id":38047},"write-the-prompt","Write the prompt",[112,38050],{},[26,38052,38053,38054,38056],{},"Reference data from an earlier step with the ",[192,38055,31794],{}," button, or pick a built-in template from the template dropdown. What you enter depends on the function you picked.",[21,38058,27685],{"id":27684},[26,38060,38061],{},"Give the model a comma-separated list of items to extract. The step returns each item as its own column.",[26,38063,38064,38066,38067,38069,38070,38073],{},[192,38065,12784],{},": You scrape a page of job listings as a single block of text. Pass it into ",[192,38068,19124],{}," and ask for ",[145,38071,38072],{},"job title, company, salary, location",". The step returns a row with those four columns, ready to write to a Google Sheet.",[21,38075,38030],{"id":38076},"generate-data",[26,38078,38079,38080,38082],{},"Write a free-form prompt describing what you want the model to produce. Use the ",[192,38081,31794],{}," button to drop in tokens that reference data from previous steps. The tokens are replaced with real values when the automation runs. The step returns the generated text.",[26,38084,38085,38087,38088,38090,38091,38093],{},[192,38086,12784],{},": A previous ",[192,38089,32917],{}," step pulls a list of new customer sign-ups, with columns for name and product. Inside a loop over that data, you pass those columns into ",[192,38092,19124],{}," with a prompt like:",[26,38095,38096],{},[145,38097,38098],{},"Write a short welcome email to [scrape-data?all&0] who just signed up for [scrape-data?all&1]",[26,38100,38101,38102,6205,38105,38108,38109,38111,38112,148],{},"The tokens ",[145,38103,38104],{},"[scrape-data?all&0]",[145,38106,38107],{},"[scrape-data?all&1]"," are inserted via the ",[192,38110,31794],{}," button and reference the first and second columns of the scraped data. The step returns the drafted email, which the next step sends via ",[192,38113,22127],{},[107,38115,37614],{"id":37613},[112,38117],{},[26,38119,38120,38121,38123],{},"The step's output is available to every step that runs after it. Reference it with the ",[192,38122,31794],{}," button. The shape depends on the function you picked.",[21,38125,27685],{"id":38126},"extract-data-1",[26,38128,38129,38130,38132],{},"The output is a 2D array with one column per item in your extraction list. Asking for ",[145,38131,38072],{}," gives you a four-column dataset where each row is one item extracted from the source text. Each column is referenceable on its own in later steps.",[21,38134,38030],{"id":38135},"generate-data-1",[26,38137,38138],{},"The output is a string containing whatever the model produced from your prompt.",{"title":67,"searchDepth":68,"depth":68,"links":38140},[38141,38142,38143,38144,38148],{"id":38006,"depth":670,"text":38007},{"id":38016,"depth":670,"text":38017},{"id":38034,"depth":670,"text":38035},{"id":38047,"depth":670,"text":38048,"children":38145},[38146,38147],{"id":27684,"depth":68,"text":27685},{"id":38076,"depth":68,"text":38030},{"id":37613,"depth":670,"text":37614,"children":38149},[38150,38151],{"id":38126,"depth":68,"text":27685},{"id":38135,"depth":68,"text":38030},"Pass data to Claude, ChatGPT, or another LLM inside an automation to extract structured fields or generate new content.",{"metaTitle":38154},"Integrate AI into a browser automation","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fintegrate-ai",{"title":19124,"description":38152},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fintegrate-ai","fyfVrEe0VzGhEhK-QIczGtbJrTv_b7qAIlCDzVPZz4E",{"id":38160,"title":38161,"body":38162,"date":71,"description":39279,"extension":73,"meta":39280,"navigation":75,"order":2642,"path":39282,"seo":39283,"stem":39284,"__hash__":39285},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fjavascript.md","Run custom JavaScript",{"type":8,"value":38163,"toc":39261},[38164,38170,38176,38178,38180,38185,38232,38235,38239,38241,38244,38389,38393,38395,38401,38430,38434,38437,38473,38477,38480,38515,38519,38521,38524,38585,38589,38591,38601,38604,38656,38659,38701,38705,38707,38712,38729,38740,38743,38745,38751,38755,38764,38981,38985,38994,38998,39006,39018,39125,39136,39140,39151,39211,39219,39221,39223,39226,39243,39258],[26,38165,38166,38167,38169],{},"Mix no-code and code in the same automation. The ",[192,38168,19051],{}," step lets you drop into a JavaScript editor to manipulate data, call APIs, or reach parts of a page the visual steps can't. For the best experience, run automations that use this step in the axiom.ai desktop app.",[26,38171,38172,38173,38175],{},"For more ready-to-use code, see the ",[659,38174,28099],{"href":26355}," reference.",[107,38177,38007],{"id":38006},[112,38179],{},[26,38181,33896,38182,38184],{},[192,38183,19051],{},". The step provides a basic code editor where you write a standard JavaScript script.",[2446,38186,38188],{"className":2962,"code":38187,"language":2964,"meta":67,"style":67},"const greeting = \"Hello, World!\";\n\nif (greeting === \"Hello, World!\") {\n  return greeting;\n}\n",[145,38189,38190,38204,38208,38221,38228],{"__ignoreMap":67},[1332,38191,38192,38194,38197,38199,38202],{"class":2455,"line":2131},[1332,38193,2508],{"class":2507},[1332,38195,38196],{"class":2511}," greeting",[1332,38198,2515],{"class":2507},[1332,38200,38201],{"class":2462}," \"Hello, World!\"",[1332,38203,4673],{"class":2521},[1332,38205,38206],{"class":2455,"line":670},[1332,38207,2588],{"emptyLinePlaceholder":75},[1332,38209,38210,38212,38215,38217,38219],{"class":2455,"line":68},[1332,38211,6072],{"class":2507},[1332,38213,38214],{"class":2521}," (greeting ",[1332,38216,9291],{"class":2507},[1332,38218,38201],{"class":2462},[1332,38220,6473],{"class":2521},[1332,38222,38223,38225],{"class":2455,"line":1478},[1332,38224,6556],{"class":2507},[1332,38226,38227],{"class":2521}," greeting;\n",[1332,38229,38230],{"class":2455,"line":293},[1332,38231,2802],{"class":2521},[26,38233,38234],{},"You can also paste code in from your usual IDE.",[107,38236,38238],{"id":38237},"define-functions","Define functions",[112,38240],{},[26,38242,38243],{},"Use functions to keep complex scripts readable.",[2446,38245,38247],{"className":2962,"code":38246,"language":2964,"meta":67,"style":67},"const data = [scrape-data];\n\nfunction evaluate(item1, item2) {\n  return item1 === item2;\n}\n\nconst duplicate = evaluate(data[0][0], data[1][0]);\nif (duplicate) {\n  console.log(`${data[0][0]} is a duplicate of ${data[1][0]}`);\n}\n",[145,38248,38249,38263,38267,38286,38298,38302,38306,38337,38344,38385],{"__ignoreMap":67},[1332,38250,38251,38253,38255,38257,38259,38261],{"class":2455,"line":2131},[1332,38252,2508],{"class":2507},[1332,38254,12298],{"class":2511},[1332,38256,2515],{"class":2507},[1332,38258,26965],{"class":2521},[1332,38260,9555],{"class":2507},[1332,38262,26970],{"class":2521},[1332,38264,38265],{"class":2455,"line":670},[1332,38266,2588],{"emptyLinePlaceholder":75},[1332,38268,38269,38271,38274,38276,38279,38281,38284],{"class":2455,"line":68},[1332,38270,27275],{"class":2507},[1332,38272,38273],{"class":2525}," evaluate",[1332,38275,1213],{"class":2521},[1332,38277,38278],{"class":2458},"item1",[1332,38280,4468],{"class":2521},[1332,38282,38283],{"class":2458},"item2",[1332,38285,6473],{"class":2521},[1332,38287,38288,38290,38293,38295],{"class":2455,"line":1478},[1332,38289,6556],{"class":2507},[1332,38291,38292],{"class":2521}," item1 ",[1332,38294,9291],{"class":2507},[1332,38296,38297],{"class":2521}," item2;\n",[1332,38299,38300],{"class":2455,"line":293},[1332,38301,2802],{"class":2521},[1332,38303,38304],{"class":2455,"line":2237},[1332,38305,2588],{"emptyLinePlaceholder":75},[1332,38307,38308,38310,38313,38315,38317,38320,38322,38324,38326,38329,38331,38333,38335],{"class":2455,"line":2623},[1332,38309,2508],{"class":2507},[1332,38311,38312],{"class":2511}," duplicate",[1332,38314,2515],{"class":2507},[1332,38316,38273],{"class":2525},[1332,38318,38319],{"class":2521},"(data[",[1332,38321,256],{"class":2511},[1332,38323,19391],{"class":2521},[1332,38325,256],{"class":2511},[1332,38327,38328],{"class":2521},"], data[",[1332,38330,19338],{"class":2511},[1332,38332,19391],{"class":2521},[1332,38334,256],{"class":2511},[1332,38336,19800],{"class":2521},[1332,38338,38339,38341],{"class":2455,"line":2637},[1332,38340,6072],{"class":2507},[1332,38342,38343],{"class":2521}," (duplicate) {\n",[1332,38345,38346,38348,38350,38352,38354,38356,38358,38360,38362,38364,38366,38369,38371,38373,38375,38377,38379,38381,38383],{"class":2455,"line":2642},[1332,38347,3405],{"class":2521},[1332,38349,2575],{"class":2525},[1332,38351,1213],{"class":2521},[1332,38353,6492],{"class":2462},[1332,38355,580],{"class":2521},[1332,38357,19386],{"class":2462},[1332,38359,256],{"class":2511},[1332,38361,19391],{"class":2462},[1332,38363,256],{"class":2511},[1332,38365,5133],{"class":2462},[1332,38367,38368],{"class":2462},"} is a duplicate of ${",[1332,38370,580],{"class":2521},[1332,38372,19386],{"class":2462},[1332,38374,19338],{"class":2511},[1332,38376,19391],{"class":2462},[1332,38378,256],{"class":2511},[1332,38380,5133],{"class":2462},[1332,38382,6502],{"class":2462},[1332,38384,2583],{"class":2521},[1332,38386,38387],{"class":2455,"line":2651},[1332,38388,2802],{"class":2521},[107,38390,38392],{"id":38391},"use-data-tokens","Use data tokens",[112,38394],{},[26,38396,38397,38398,38400],{},"Reference data from earlier steps in your script using data tokens. Click ",[192,38399,31794],{}," and select a token, or type the token in manually. axiom.ai replaces each token with the data from the referenced step at run time, just like in any other step.",[2446,38402,38404],{"className":2498,"code":38403,"language":2500,"meta":67,"style":67},"const data = [scrape-data];\nreturn data[0];\n",[145,38405,38406,38420],{"__ignoreMap":67},[1332,38407,38408,38410,38412,38414,38416,38418],{"class":2455,"line":2131},[1332,38409,2508],{"class":2507},[1332,38411,12298],{"class":2511},[1332,38413,2515],{"class":2507},[1332,38415,26965],{"class":2521},[1332,38417,9555],{"class":2507},[1332,38419,26970],{"class":2521},[1332,38421,38422,38424,38426,38428],{"class":2455,"line":670},[1332,38423,12963],{"class":2507},[1332,38425,12432],{"class":2521},[1332,38427,256],{"class":2511},[1332,38429,4931],{"class":2521},[21,38431,38433],{"id":38432},"arrays","Arrays",[26,38435,38436],{},"When a token references multiple rows, axiom.ai replaces it with a 2D array:",[2446,38438,38440],{"className":2498,"code":38439,"language":2500,"meta":67,"style":67},"const data = [scrape-data];\nconsole.log(data);\n\n\u002F\u002F Output: [[\"A\", \"B\", \"C\"], [\"D\", \"E\", \"F\"]]\n",[145,38441,38442,38456,38464,38468],{"__ignoreMap":67},[1332,38443,38444,38446,38448,38450,38452,38454],{"class":2455,"line":2131},[1332,38445,2508],{"class":2507},[1332,38447,12298],{"class":2511},[1332,38449,2515],{"class":2507},[1332,38451,26965],{"class":2521},[1332,38453,9555],{"class":2507},[1332,38455,26970],{"class":2521},[1332,38457,38458,38460,38462],{"class":2455,"line":670},[1332,38459,2572],{"class":2521},[1332,38461,2575],{"class":2525},[1332,38463,27609],{"class":2521},[1332,38465,38466],{"class":2455,"line":68},[1332,38467,2588],{"emptyLinePlaceholder":75},[1332,38469,38470],{"class":2455,"line":1478},[1332,38471,38472],{"class":2609},"\u002F\u002F Output: [[\"A\", \"B\", \"C\"], [\"D\", \"E\", \"F\"]]\n",[21,38474,38476],{"id":38475},"strings","Strings",[26,38478,38479],{},"When a token references a single value, axiom.ai replaces it with a string. Wrap the token in quotes so the replacement is syntactically valid JavaScript:",[2446,38481,38483],{"className":2498,"code":38482,"language":2500,"meta":67,"style":67},"const data = '[scrape-data]';\nconsole.log(data);\n\n\u002F\u002F Output: \"A\"\n",[145,38484,38485,38498,38506,38510],{"__ignoreMap":67},[1332,38486,38487,38489,38491,38493,38496],{"class":2455,"line":2131},[1332,38488,2508],{"class":2507},[1332,38490,12298],{"class":2511},[1332,38492,2515],{"class":2507},[1332,38494,38495],{"class":2462}," '[scrape-data]'",[1332,38497,4673],{"class":2521},[1332,38499,38500,38502,38504],{"class":2455,"line":670},[1332,38501,2572],{"class":2521},[1332,38503,2575],{"class":2525},[1332,38505,27609],{"class":2521},[1332,38507,38508],{"class":2455,"line":68},[1332,38509,2588],{"emptyLinePlaceholder":75},[1332,38511,38512],{"class":2455,"line":1478},[1332,38513,38514],{"class":2609},"\u002F\u002F Output: \"A\"\n",[107,38516,38518],{"id":38517},"manipulate-data","Manipulate data",[112,38520],{},[26,38522,38523],{},"Once a token has been replaced with a variable, manipulate the data however you need to.",[2446,38525,38527],{"className":2498,"code":38526,"language":2500,"meta":67,"style":67},"let data = [scrape-data];\ndata[0][1] = \"X\";\nconsole.log(data);\n\n\u002F\u002F Original: [[\"A\", \"B\", \"C\"], [\"D\", \"E\", \"F\"]]\n\u002F\u002F Output:   [[\"A\", \"X\", \"C\"], [\"D\", \"E\", \"F\"]]\n",[145,38528,38529,38543,38563,38571,38575,38580],{"__ignoreMap":67},[1332,38530,38531,38533,38535,38537,38539,38541],{"class":2455,"line":2131},[1332,38532,26696],{"class":2507},[1332,38534,5843],{"class":2521},[1332,38536,5110],{"class":2507},[1332,38538,26965],{"class":2521},[1332,38540,9555],{"class":2507},[1332,38542,26970],{"class":2521},[1332,38544,38545,38548,38550,38552,38554,38556,38558,38561],{"class":2455,"line":670},[1332,38546,38547],{"class":2521},"data[",[1332,38549,256],{"class":2511},[1332,38551,19391],{"class":2521},[1332,38553,19338],{"class":2511},[1332,38555,4952],{"class":2521},[1332,38557,5110],{"class":2507},[1332,38559,38560],{"class":2462}," \"X\"",[1332,38562,4673],{"class":2521},[1332,38564,38565,38567,38569],{"class":2455,"line":68},[1332,38566,2572],{"class":2521},[1332,38568,2575],{"class":2525},[1332,38570,27609],{"class":2521},[1332,38572,38573],{"class":2455,"line":1478},[1332,38574,2588],{"emptyLinePlaceholder":75},[1332,38576,38577],{"class":2455,"line":293},[1332,38578,38579],{"class":2609},"\u002F\u002F Original: [[\"A\", \"B\", \"C\"], [\"D\", \"E\", \"F\"]]\n",[1332,38581,38582],{"class":2455,"line":2237},[1332,38583,38584],{"class":2609},"\u002F\u002F Output:   [[\"A\", \"X\", \"C\"], [\"D\", \"E\", \"F\"]]\n",[107,38586,38588],{"id":38587},"return-data","Return data",[112,38590],{},[26,38592,38593,38594,2344,38597,38600],{},"Return any variable you want to pass to later steps. axiom.ai accepts two output shapes: a 2D array or a string. Any other type is coerced to a string when later steps read it. A returned boolean arrives downstream as the string ",[145,38595,38596],{},"\"true\"",[145,38598,38599],{},"\"false\"",", a number arrives as its string form, and so on.",[26,38602,38603],{},"Return a 2D array when the data is tabular:",[2446,38605,38607],{"className":2962,"code":38606,"language":2964,"meta":67,"style":67},"let data = [scrape-data];\ndata[0][1] = \"X\";\nreturn data;\n\n\u002F\u002F Returned: [[\"A\", \"X\", \"C\"], [\"D\", \"E\", \"F\"]]\n",[145,38608,38609,38623,38641,38647,38651],{"__ignoreMap":67},[1332,38610,38611,38613,38615,38617,38619,38621],{"class":2455,"line":2131},[1332,38612,26696],{"class":2507},[1332,38614,5843],{"class":2521},[1332,38616,5110],{"class":2507},[1332,38618,26965],{"class":2521},[1332,38620,9555],{"class":2507},[1332,38622,26970],{"class":2521},[1332,38624,38625,38627,38629,38631,38633,38635,38637,38639],{"class":2455,"line":670},[1332,38626,38547],{"class":2521},[1332,38628,256],{"class":2511},[1332,38630,19391],{"class":2521},[1332,38632,19338],{"class":2511},[1332,38634,4952],{"class":2521},[1332,38636,5110],{"class":2507},[1332,38638,38560],{"class":2462},[1332,38640,4673],{"class":2521},[1332,38642,38643,38645],{"class":2455,"line":68},[1332,38644,12963],{"class":2507},[1332,38646,26812],{"class":2521},[1332,38648,38649],{"class":2455,"line":1478},[1332,38650,2588],{"emptyLinePlaceholder":75},[1332,38652,38653],{"class":2455,"line":293},[1332,38654,38655],{"class":2609},"\u002F\u002F Returned: [[\"A\", \"X\", \"C\"], [\"D\", \"E\", \"F\"]]\n",[26,38657,38658],{},"Return a string when the data is a single value:",[2446,38660,38662],{"className":2962,"code":38661,"language":2964,"meta":67,"style":67},"let data = [scrape-data];\nreturn data[0][0];\n\n\u002F\u002F Returned: \"A\"\n",[145,38663,38664,38678,38692,38696],{"__ignoreMap":67},[1332,38665,38666,38668,38670,38672,38674,38676],{"class":2455,"line":2131},[1332,38667,26696],{"class":2507},[1332,38669,5843],{"class":2521},[1332,38671,5110],{"class":2507},[1332,38673,26965],{"class":2521},[1332,38675,9555],{"class":2507},[1332,38677,26970],{"class":2521},[1332,38679,38680,38682,38684,38686,38688,38690],{"class":2455,"line":670},[1332,38681,12963],{"class":2507},[1332,38683,12432],{"class":2521},[1332,38685,256],{"class":2511},[1332,38687,19391],{"class":2521},[1332,38689,256],{"class":2511},[1332,38691,4931],{"class":2521},[1332,38693,38694],{"class":2455,"line":68},[1332,38695,2588],{"emptyLinePlaceholder":75},[1332,38697,38698],{"class":2455,"line":1478},[1332,38699,38700],{"class":2609},"\u002F\u002F Returned: \"A\"\n",[107,38702,38704],{"id":38703},"run-in-the-app","Run in the app",[112,38706],{},[26,38708,31969,38709,38711],{},[145,38710,26470],{}," on to run the code inside the axiom.ai desktop app instead of the browser. Running in the app unlocks:",[186,38713,38714,38723],{},[189,38715,2273,38716,3842,38720,38722],{},[659,38717,38719],{"href":38718},"#use-the-nodejs-filesystem-api","Node.js filesystem API",[145,38721,26496],{},") for reading and writing local files.",[189,38724,2273,38725,38728],{},[659,38726,26484],{"href":38727},"#use-the-puppeteer-api"," for browser control beyond the no-code steps.",[26,38730,38731,38733,38734,38736,38737,38739],{},[145,38732,26470],{}," is off by default. With it off, ",[145,38735,3456],{}," writes to the browser console, which is useful when debugging. With it on, ",[145,38738,3456],{}," is disabled because the code no longer runs in the browser.",[107,38741,519],{"id":38742},"use-cases",[112,38744],{},[26,38746,38747,38748,38750],{},"A few things developers commonly reach for ",[192,38749,19051],{}," to do.",[21,38752,38754],{"id":38753},"send-data-to-an-api","Send data to an API",[26,38756,38757,38758,38760,38761,38763],{},"Use JavaScript when you need more control than the ",[192,38759,13063],{}," step offers. This snippet sends scraped data to an endpoint and returns the response as the ",[145,38762,27107],{}," token for later steps:",[2446,38765,38767],{"className":2498,"code":38766,"language":2500,"meta":67,"style":67},"const data = [scrape-data];\n\nasync function postData() {\n  try {\n    let response = await fetch('\u003CAPI_ENDPOINT>', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application\u002Fjson' },\n      body: JSON.stringify(data),\n    });\n\n    if (response.ok) {\n      const result = await response.json();\n      return [[JSON.stringify(result)]];\n    } else {\n      console.error(\"Error:\", response.status, response.statusText);\n    }\n  } catch (error) {\n    console.error(error);\n    return error;\n  }\n}\n\nreturn postData();\n",[145,38768,38769,38783,38787,38799,38806,38827,38835,38847,38860,38864,38868,38875,38892,38908,38916,38931,38935,38945,38954,38961,38965,38969,38973],{"__ignoreMap":67},[1332,38770,38771,38773,38775,38777,38779,38781],{"class":2455,"line":2131},[1332,38772,2508],{"class":2507},[1332,38774,12298],{"class":2511},[1332,38776,2515],{"class":2507},[1332,38778,26965],{"class":2521},[1332,38780,9555],{"class":2507},[1332,38782,26970],{"class":2521},[1332,38784,38785],{"class":2455,"line":670},[1332,38786,2588],{"emptyLinePlaceholder":75},[1332,38788,38789,38791,38793,38796],{"class":2455,"line":68},[1332,38790,3332],{"class":2507},[1332,38792,6458],{"class":2507},[1332,38794,38795],{"class":2525}," postData",[1332,38797,38798],{"class":2521},"() {\n",[1332,38800,38801,38804],{"class":2455,"line":1478},[1332,38802,38803],{"class":2507},"  try",[1332,38805,2648],{"class":2521},[1332,38807,38808,38811,38814,38816,38818,38820,38822,38825],{"class":2455,"line":293},[1332,38809,38810],{"class":2507},"    let",[1332,38812,38813],{"class":2521}," response ",[1332,38815,5110],{"class":2507},[1332,38817,2518],{"class":2507},[1332,38819,6487],{"class":2525},[1332,38821,1213],{"class":2521},[1332,38823,38824],{"class":2462},"'\u003CAPI_ENDPOINT>'",[1332,38826,6505],{"class":2521},[1332,38828,38829,38831,38833],{"class":2455,"line":2237},[1332,38830,12890],{"class":2521},[1332,38832,9017],{"class":2462},[1332,38834,6024],{"class":2521},[1332,38836,38837,38839,38841,38843,38845],{"class":2455,"line":2623},[1332,38838,12899],{"class":2521},[1332,38840,9026],{"class":2462},[1332,38842,5260],{"class":2521},[1332,38844,9031],{"class":2462},[1332,38846,6531],{"class":2521},[1332,38848,38849,38851,38853,38855,38857],{"class":2455,"line":2637},[1332,38850,12913],{"class":2521},[1332,38852,6539],{"class":2511},[1332,38854,148],{"class":2521},[1332,38856,6544],{"class":2525},[1332,38858,38859],{"class":2521},"(data),\n",[1332,38861,38862],{"class":2455,"line":2642},[1332,38863,3613],{"class":2521},[1332,38865,38866],{"class":2455,"line":2651},[1332,38867,2588],{"emptyLinePlaceholder":75},[1332,38869,38870,38872],{"class":2455,"line":2673},[1332,38871,5840],{"class":2507},[1332,38873,38874],{"class":2521}," (response.ok) {\n",[1332,38876,38877,38879,38881,38883,38885,38888,38890],{"class":2455,"line":2692},[1332,38878,6819],{"class":2507},[1332,38880,6857],{"class":2511},[1332,38882,2515],{"class":2507},[1332,38884,2518],{"class":2507},[1332,38886,38887],{"class":2521}," response.",[1332,38889,5926],{"class":2525},[1332,38891,2670],{"class":2521},[1332,38893,38894,38896,38899,38901,38903,38905],{"class":2455,"line":2727},[1332,38895,6877],{"class":2507},[1332,38897,38898],{"class":2521}," [[",[1332,38900,6539],{"class":2511},[1332,38902,148],{"class":2521},[1332,38904,6544],{"class":2525},[1332,38906,38907],{"class":2521},"(result)]];\n",[1332,38909,38910,38912,38914],{"class":2455,"line":2739},[1332,38911,3780],{"class":2521},[1332,38913,27559],{"class":2507},[1332,38915,2648],{"class":2521},[1332,38917,38918,38921,38923,38925,38928],{"class":2455,"line":2750},[1332,38919,38920],{"class":2521},"      console.",[1332,38922,2782],{"class":2525},[1332,38924,1213],{"class":2521},[1332,38926,38927],{"class":2462},"\"Error:\"",[1332,38929,38930],{"class":2521},", response.status, response.statusText);\n",[1332,38932,38933],{"class":2455,"line":2765},[1332,38934,3810],{"class":2521},[1332,38936,38937,38940,38942],{"class":2455,"line":2777},[1332,38938,38939],{"class":2521},"  } ",[1332,38941,2771],{"class":2507},[1332,38943,38944],{"class":2521}," (error) {\n",[1332,38946,38947,38949,38951],{"class":2455,"line":2788},[1332,38948,2753],{"class":2521},[1332,38950,2782],{"class":2525},[1332,38952,38953],{"class":2521},"(error);\n",[1332,38955,38956,38958],{"class":2455,"line":2799},[1332,38957,27289],{"class":2507},[1332,38959,38960],{"class":2521}," error;\n",[1332,38962,38963],{"class":2455,"line":3751},[1332,38964,6194],{"class":2521},[1332,38966,38967],{"class":2455,"line":3762},[1332,38968,2802],{"class":2521},[1332,38970,38971],{"class":2455,"line":3777},[1332,38972,2588],{"emptyLinePlaceholder":75},[1332,38974,38975,38977,38979],{"class":2455,"line":3787},[1332,38976,12963],{"class":2507},[1332,38978,38795],{"class":2525},[1332,38980,2670],{"class":2521},[21,38982,38984],{"id":38983},"use-the-puppeteer-api","Use the Puppeteer API",[26,38986,38987,38988,38990,38991,38993],{},"Requires ",[145,38989,26470],{}," to be on. See the ",[659,38992,34869],{"href":26483}," page for setup and examples.",[21,38995,38997],{"id":38996},"use-the-nodejs-filesystem-api","Use the Node.js filesystem API",[26,38999,38987,39000,39002,39003,39005],{},[145,39001,26470],{}," to be on. The ",[145,39004,26496],{}," module lets an automation read and write files on the local machine.",[26,39007,39008,39009,39011,39012,39014,39015,39017],{},"axiom.ai's JavaScript step uses promises, while ",[145,39010,26496],{}," uses callbacks. Wrap ",[145,39013,26496],{}," calls in a promise so ",[145,39016,3020],{}," works:",[2446,39019,39021],{"className":2498,"code":39020,"language":2500,"meta":67,"style":67},"let result = await new Promise(resolve => {\n  fs.readFile('\u002FUsers\u002Fjoe\u002Ftest.txt', 'utf8', (err, data) => {\n    if (err) {\n      resolve([[err.message]]);\n    } else {\n      resolve([[data]]);\n    }\n  });\n});\nreturn result;\n",[145,39022,39023,39046,39077,39083,39091,39099,39106,39110,39114,39118],{"__ignoreMap":67},[1332,39024,39025,39027,39030,39032,39034,39036,39038,39040,39042,39044],{"class":2455,"line":2131},[1332,39026,26696],{"class":2507},[1332,39028,39029],{"class":2521}," result ",[1332,39031,5110],{"class":2507},[1332,39033,2518],{"class":2507},[1332,39035,2697],{"class":2507},[1332,39037,2700],{"class":2511},[1332,39039,1213],{"class":2521},[1332,39041,2706],{"class":2458},[1332,39043,10271],{"class":2507},[1332,39045,2648],{"class":2521},[1332,39047,39048,39051,39054,39056,39059,39061,39063,39065,39067,39069,39071,39073,39075],{"class":2455,"line":670},[1332,39049,39050],{"class":2521},"  fs.",[1332,39052,39053],{"class":2525},"readFile",[1332,39055,1213],{"class":2521},[1332,39057,39058],{"class":2462},"'\u002FUsers\u002Fjoe\u002Ftest.txt'",[1332,39060,4468],{"class":2521},[1332,39062,27517],{"class":2462},[1332,39064,27520],{"class":2521},[1332,39066,27523],{"class":2458},[1332,39068,4468],{"class":2521},[1332,39070,580],{"class":2458},[1332,39072,2709],{"class":2521},[1332,39074,2712],{"class":2507},[1332,39076,2648],{"class":2521},[1332,39078,39079,39081],{"class":2455,"line":68},[1332,39080,5840],{"class":2507},[1332,39082,27536],{"class":2521},[1332,39084,39085,39088],{"class":2455,"line":1478},[1332,39086,39087],{"class":2525},"      resolve",[1332,39089,39090],{"class":2521},"([[err.message]]);\n",[1332,39092,39093,39095,39097],{"class":2455,"line":293},[1332,39094,3780],{"class":2521},[1332,39096,27559],{"class":2507},[1332,39098,2648],{"class":2521},[1332,39100,39101,39103],{"class":2455,"line":2237},[1332,39102,39087],{"class":2525},[1332,39104,39105],{"class":2521},"([[data]]);\n",[1332,39107,39108],{"class":2455,"line":2623},[1332,39109,3810],{"class":2521},[1332,39111,39112],{"class":2455,"line":2637},[1332,39113,3368],{"class":2521},[1332,39115,39116],{"class":2455,"line":2642},[1332,39117,2542],{"class":2521},[1332,39119,39120,39122],{"class":2455,"line":2651},[1332,39121,12963],{"class":2507},[1332,39123,39124],{"class":2521}," result;\n",[26,39126,39127,39128,148],{},"For a full reference, see the ",[659,39129,39132,39133,39135],{"href":39130,"rel":39131},"https:\u002F\u002Fnodejs.org\u002Fapi\u002Ffs.html",[1218],"Node.js ",[145,39134,26496],{}," documentation",[21,39137,39139],{"id":39138},"call-chatgpt-directly","Call ChatGPT directly",[26,39141,38987,39142,39144,39145,6205,39148,39150],{},[145,39143,26470],{}," to be on. When the ",[192,39146,39147],{},"Extract data with ChatGPT",[192,39149,19146],{}," steps don't fit, call ChatGPT from JavaScript instead.",[2446,39152,39154],{"className":2498,"code":39153,"language":2500,"meta":67,"style":67},"const key = '\u003CAPI_KEY>';\nconst prompt = 'Write a short introduction to browser automation.';\n\nlet result = await chatGPT(key, prompt);\nreturn [[result]];\n",[145,39155,39156,39170,39184,39188,39204],{"__ignoreMap":67},[1332,39157,39158,39160,39163,39165,39168],{"class":2455,"line":2131},[1332,39159,2508],{"class":2507},[1332,39161,39162],{"class":2511}," key",[1332,39164,2515],{"class":2507},[1332,39166,39167],{"class":2462}," '\u003CAPI_KEY>'",[1332,39169,4673],{"class":2521},[1332,39171,39172,39174,39177,39179,39182],{"class":2455,"line":670},[1332,39173,2508],{"class":2507},[1332,39175,39176],{"class":2511}," prompt",[1332,39178,2515],{"class":2507},[1332,39180,39181],{"class":2462}," 'Write a short introduction to browser automation.'",[1332,39183,4673],{"class":2521},[1332,39185,39186],{"class":2455,"line":68},[1332,39187,2588],{"emptyLinePlaceholder":75},[1332,39189,39190,39192,39194,39196,39198,39201],{"class":2455,"line":1478},[1332,39191,26696],{"class":2507},[1332,39193,39029],{"class":2521},[1332,39195,5110],{"class":2507},[1332,39197,2518],{"class":2507},[1332,39199,39200],{"class":2525}," chatGPT",[1332,39202,39203],{"class":2521},"(key, prompt);\n",[1332,39205,39206,39208],{"class":2455,"line":293},[1332,39207,12963],{"class":2507},[1332,39209,39210],{"class":2521}," [[result]];\n",[26,39212,39213,39214,148],{},"Get an API key from your ",[659,39215,39218],{"href":39216,"rel":39217},"https:\u002F\u002Fplatform.openai.com\u002Faccount",[1218],"OpenAI account",[107,39220,37614],{"id":37613},[112,39222],{},[26,39224,39225],{},"The step returns whatever your script returns, coerced to one of the two shapes axiom.ai supports:",[186,39227,39228,39237],{},[189,39229,39230,39233,39234,39236],{},[192,39231,39232],{},"2D array."," A table of rows and columns. Reference it with the ",[192,39235,31794],{}," button in any later step and pick one or multiple columns.",[189,39238,39239,39242],{},[192,39240,39241],{},"String."," A single value. Reference it directly in any later step.",[26,39244,39245,39246,39248,39249,39251,39252,39254,39255,39257],{},"Anything else the script returns (booleans, numbers, objects) is converted to its string form before later steps see it. A returned ",[145,39247,1548],{}," becomes the string ",[145,39250,38596],{},", a returned ",[145,39253,13866],{}," becomes ",[145,39256,10622],{},". If the script returns nothing, the step produces no output for later steps to reference.",[2819,39259,39260],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}",{"title":67,"searchDepth":68,"depth":68,"links":39262},[39263,39264,39265,39269,39270,39271,39272,39278],{"id":38006,"depth":670,"text":38007},{"id":38237,"depth":670,"text":38238},{"id":38391,"depth":670,"text":38392,"children":39266},[39267,39268],{"id":38432,"depth":68,"text":38433},{"id":38475,"depth":68,"text":38476},{"id":38517,"depth":670,"text":38518},{"id":38587,"depth":670,"text":38588},{"id":38703,"depth":670,"text":38704},{"id":38742,"depth":670,"text":519,"children":39273},[39274,39275,39276,39277],{"id":38753,"depth":68,"text":38754},{"id":38983,"depth":68,"text":38984},{"id":38996,"depth":68,"text":38997},{"id":39138,"depth":68,"text":39139},{"id":37613,"depth":670,"text":37614},"Use the Write javascript step to run your own code inside an automation, transform data, call APIs, and reach parts of a page the no-code steps can't.",{"metaTitle":39281},"Run custom JavaScript inside a browser automation","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fjavascript",{"title":38161,"description":39279},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fjavascript","r5so5r84t6zmTp7AqAWuC0hslb4Ely8zoGJ2qKqVV4U",{"id":39287,"title":39288,"body":39289,"date":71,"description":39603,"extension":73,"meta":39604,"navigation":75,"order":293,"path":31397,"seo":39607,"stem":39608,"__hash__":39609},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogic.md","Use logic",{"type":8,"value":39290,"toc":39595},[39291,39294,39296,39300,39302,39308,39317,39341,39344,39352,39356,39358,39364,39374,39405,39408,39413,39417,39419,39425,39432,39456,39459,39464,39468,39470,39476,39486,39514,39517,39525,39529,39531,39537,39547,39565,39568,39573,39577,39579,39592],[26,39292,39293],{},"Use logic steps to change what an automation does based on data. Every logic step takes a piece of data and checks it against a condition. The data can come from a scrape step, a Google Sheet, a previous user input, or anywhere else data flows through the automation.",[32947,39295],{},[107,39297,39299],{"id":39298},"branch-on-a-condition-with-if-condition","Branch on a condition with If condition",[112,39301],{},[26,39303,39304],{},[1906,39305],{"alt":39306,"src":39307},"The If condition step in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Fif-condition-axiom.ai-step.jpg",[26,39309,2487,39310,39312,39313,39316],{},[192,39311,22067],{}," to run a group of sub-steps only when a condition is met. Compare strings or numbers, run the sub-steps when the condition evaluates true (or when ",[145,39314,39315],{},"Reverse condition"," flips it false), and carry on with the rest of the automation either way.",[1923,39318,39319,39323,39328,39333,39338],{},[189,39320,33896,39321,148],{},[192,39322,22067],{},[189,39324,31836,39325,148],{},[145,39326,39327],{},"Data to check",[189,39329,31836,39330,148],{},[145,39331,39332],{},"Condition to check",[189,39334,31969,39335,39337],{},[145,39336,39315],{}," if you want the sub-steps to run when the condition is false.",[189,39339,39340],{},"Add the sub-steps to run when the condition is met.",[32973,39342],{"url":39343},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fmyp-1LJAg1o?rel=0&start=22&end=827",[26,39345,39346,39348,39349,39351],{},[192,39347,12784],{},": On Instagram profile pages, scrape the message button. If the text ",[145,39350,11867],{}," is found, the sub-steps click the button and send a message. If not, the automation skips those sub-steps and carries on with the rest of the run.",[107,39353,39355],{"id":39354},"branch-either-way-with-if-else","Branch either way with If \u002F Else",[112,39357],{},[26,39359,39360],{},[1906,39361],{"alt":39362,"src":39363},"The If \u002F Else step in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Fif-else-step-axiom-ai.jpg",[26,39365,2487,39366,39369,39370,39373],{},[192,39367,39368],{},"If \u002F Else"," when you need to run one set of sub-steps if a condition is met and a ",[26030,39371,39372],{},"different"," set if it isn't.",[1923,39375,39376,39380,39384,39388,39393,39400],{},[189,39377,33896,39378,148],{},[192,39379,39368],{},[189,39381,31836,39382,148],{},[145,39383,39327],{},[189,39385,31836,39386,148],{},[145,39387,39332],{},[189,39389,31969,39390,39392],{},[145,39391,39315],{}," if needed.",[189,39394,39395,39396,39399],{},"Add sub-steps to the ",[192,39397,39398],{},"If"," branch.",[189,39401,39395,39402,39399],{},[192,39403,39404],{},"Else",[32973,39406],{"url":39407},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fmyp-1LJAg1o?rel=0&start=210&end=827",[26,39409,39410,39412],{},[192,39411,12784],{},": Form filling where the form changes based on an earlier selection. The If branch fills the fields shown for option A; the Else branch fills the different fields shown for option B.",[107,39414,39416],{"id":39415},"stop-the-run-unless-a-condition-is-met","Stop the run unless a condition is met",[112,39418],{},[26,39420,39421],{},[1906,39422],{"alt":39423,"src":39424},"The Continue only if a condition is met step in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Fcontinue-condition-met-step-axiom-ai.jpg",[26,39426,2487,39427,39431],{},[659,39428,39429],{"href":30820},[192,39430,30823],{}," to check a condition and either keep the run going or end it.",[1923,39433,39434,39438,39442,39446,39452],{},[189,39435,33896,39436,148],{},[192,39437,30823],{},[189,39439,31836,39440,148],{},[145,39441,39327],{},[189,39443,31836,39444,148],{},[145,39445,39332],{},[189,39447,31969,39448,39451],{},[145,39449,39450],{},"Fail if condition not met"," to treat a failed condition as an error instead of a clean stop.",[189,39453,31969,39454,39392],{},[145,39455,39315],{},[32973,39457],{"url":39458},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fmyp-1LJAg1o?rel=0&start=303&end=827",[26,39460,39461,39463],{},[192,39462,12784],{},": Check whether a Google Sheet contains data before continuing. If the sheet is empty, stop the run instead of wasting time on later steps that depend on that data.",[107,39465,39467],{"id":39466},"jump-to-another-step-with-conditionally-jump-to-another-step","Jump to another step with Conditionally jump to another step",[112,39469],{},[26,39471,39472],{},[1906,39473],{"alt":39474,"src":39475},"The Conditionally jump to another step in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Fconditionaly-jump-step-axiom-ai.jpg",[26,39477,2487,39478,39482,39483,39485],{},[659,39479,39480],{"href":34811},[192,39481,34814],{}," to skip forward or loop back in the automation based on a condition. Setting ",[145,39484,34839],{}," caps how many times the automation can loop back through the same jump.",[1923,39487,39488,39492,39496,39500,39505,39510],{},[189,39489,33896,39490,148],{},[192,39491,34814],{},[189,39493,31836,39494,148],{},[145,39495,39327],{},[189,39497,31836,39498,148],{},[145,39499,39332],{},[189,39501,31836,39502,39504],{},[145,39503,34831],{}," to the step you want to jump to.",[189,39506,31836,39507,39509],{},[145,39508,34839],{}," to cap how many times the automation can loop back.",[189,39511,31969,39512,39392],{},[145,39513,39315],{},[32973,39515],{"url":39516},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fmyp-1LJAg1o?rel=0&start=574&end=827",[26,39518,39519,39521,39522,39524],{},[192,39520,12784],{},": Click a ",[192,39523,32554],{}," button and jump back to the click step until a target value appears on the page, capped at some maximum so the automation doesn't loop forever.",[107,39526,39528],{"id":39527},"catch-errors-with-try-catch","Catch errors with Try \u002F Catch",[112,39530],{},[26,39532,39533],{},[1906,39534],{"alt":39535,"src":39536},"The Try \u002F Catch step in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Ftry-catch-step-axiom-ai.jpg",[26,39538,2487,39539,39543,39544,39546],{},[659,39540,39541],{"href":32798},[192,39542,22049],{}," to run a set of sub-steps and, if any of them fail, run a different set instead of ending the run. Unlike the other logic steps, ",[192,39545,22049],{}," doesn't take a condition. The Catch branch triggers whenever the Try branch throws an error.",[1923,39548,39549,39553,39559],{},[189,39550,33896,39551,148],{},[192,39552,22049],{},[189,39554,39555,39556,39399],{},"Add the sub-steps that might fail to the ",[192,39557,39558],{},"Try",[189,39560,39561,39562,39399],{},"Add recovery sub-steps to the ",[192,39563,39564],{},"Catch",[32973,39566],{"url":39567},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fmyp-1LJAg1o?rel=0&start=475&end=827",[26,39569,39570,39572],{},[192,39571,12784],{},": A site occasionally triggers a popup that blocks the automation. Put the main sub-steps in the Try branch and, in the Catch branch, add the click needed to dismiss the popup before retrying.",[107,39574,39576],{"id":39575},"build-custom-logic-with-javascript","Build custom logic with JavaScript",[112,39578],{},[26,39580,39581,39582,39586,39587,4468,39589,39591],{},"When the no-code logic steps don't fit, use the ",[659,39583,39584],{"href":39282},[192,39585,19051],{}," step to build your own. Any value your script returns (a 2D array or a string) is available to later steps and can drive an ",[192,39588,22067],{},[192,39590,39368],{},", or any other logic step that reads data.",[32973,39593],{"url":39594},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fmyp-1LJAg1o?rel=0&start=769&end=827",{"title":67,"searchDepth":68,"depth":68,"links":39596},[39597,39598,39599,39600,39601,39602],{"id":39298,"depth":670,"text":39299},{"id":39354,"depth":670,"text":39355},{"id":39415,"depth":670,"text":39416},{"id":39466,"depth":670,"text":39467},{"id":39527,"depth":670,"text":39528},{"id":39575,"depth":670,"text":39576},"Branch an automation based on data, loop until a condition is met, or stop a run early using If, Try \u002F Catch, and jump steps.",{"metaTitle":39605,"video":39606},"Add logic to a browser automation","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fmyp-1LJAg1o?rel=0&amp;start=0&end=827",{"title":39288,"description":39603},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Flogic","MPWTaUt_YQMxcvdijj1GImyBP867QUf1h1qqTf8y0lI",{"id":39611,"title":39612,"body":39613,"date":71,"description":39672,"extension":73,"meta":39673,"navigation":75,"order":293,"path":39675,"seo":39676,"stem":39677,"__hash__":39678},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002F2fa.md","Log in with 2FA",{"type":8,"value":39614,"toc":39668},[39615,39618,39640,39644,39646,39652,39656,39658,39661],[26,39616,39617],{},"When two-factor authentication (2FA) is required, the automation has to be supervised at the start of the run so a human can enter the 2FA code. This is known as attended automation, and it requires running on the desktop app or on the axiom.ai VPS.",[26,39619,39620,39621,4468,39625,4468,39628,4468,39632,10147,39636,148],{},"For other login methods, see ",[659,39622,39624],{"href":39623},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Fsteps","Google Sheet steps",[659,39626,39627],{"href":31378},"sessions",[659,39629,39631],{"href":39630},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Fvps","VPS",[659,39633,39635],{"href":39634},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Fpassword-manager","password managers",[659,39637,39639],{"href":39638},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Fsecure","secure login",[107,39641,39643],{"id":39642},"run-an-automation-with-2fa","Run an automation with 2FA",[112,39645],{},[26,39647,39648,39649,39651],{},"A 2FA login can only be completed by a person, since for security reasons you can't interact with the cloud browser. Run the automation in the desktop app or on the VPS (available on Ultimate plans), then add a ",[192,39650,18065],{}," step before the 2FA prompt to give yourself time to enter the code manually.",[107,39653,39655],{"id":39654},"_2fa-in-the-cloud-or-via-webhook","2FA in the cloud or via webhook",[112,39657],{},[26,39659,39660],{},"You can't currently use 2FA when running automations in the cloud or triggering them via a webhook (for example from Zapier). The only workaround is to disable 2FA on the account.",[2093,39662,39663],{},[26,39664,39665,39667],{},[192,39666,2099],{}," If you disable 2FA, use a dedicated account with restricted permissions, set up specifically for axiom.ai. Don't disable 2FA on your main account.",{"title":67,"searchDepth":68,"depth":68,"links":39669},[39670,39671],{"id":39642,"depth":670,"text":39643},{"id":39654,"depth":670,"text":39655},"Run an automation on a site that requires two-factor authentication using the desktop app or a private VPS.",{"metaTitle":39674},"Run automations on sites that require two-factor authentication","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002F2fa",{"title":39612,"description":39672},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002F2fa","W6Ecrif3U8-BjnKOPuzxHZzhG-qxto_cQ2eXBwb2Ajo",{"id":39680,"title":39681,"body":39682,"date":71,"description":39712,"extension":73,"meta":39713,"navigation":75,"order":2237,"path":31383,"seo":39715,"stem":39716,"__hash__":39717},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Findex.md","Log in to sites",{"type":8,"value":39683,"toc":39709},[39684,39694,39698,39700,39702],[26,39685,39686,39687,39690,39691,39693],{},"There are several ways to keep an automation signed in to the web apps it visits. The simplest is to share your browser ",[659,39688,39689],{"href":31378},"session",". For organisations that need stricter isolation, a ",[659,39692,39639],{"href":39638}," setup keeps everything on a controlled PC. Don't store sensitive passwords directly in step fields, even though all step data is encrypted.",[107,39695,39697],{"id":39696},"methods-for-automating-login","Methods for automating login",[112,39699],{},[2218,39701],{},[26,39703,2222,39704,2226,39706,148],{},[659,39705,2225],{"href":1887},[659,39707,2231],{"href":2229,"rel":39708},[1218],{"title":67,"searchDepth":68,"depth":68,"links":39710},[39711],{"id":39696,"depth":670,"text":39697},"Methods for keeping an automation signed in to the sites it visits, from session sharing to dedicated password managers.",{"metaTitle":39714},"Automate logins for browser automations",{"title":39681,"description":39712},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Findex","RHrUYh5RVyOUeEOS340JiaN-cVyXjiFHbJ48rags24Y",{"id":39719,"title":39720,"body":39721,"date":71,"description":39759,"extension":73,"meta":39760,"navigation":75,"order":68,"path":39634,"seo":39762,"stem":39763,"__hash__":39764},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Fpassword-manager.md","Log in using a password manager",{"type":8,"value":39722,"toc":39756},[39723,39729,39742,39746,39748],[26,39724,39725,39726,39728],{},"For tighter security than a Google Sheet, store passwords in a dedicated password manager or vault that exposes an API. At runtime, retrieve each password using a webhook or the ",[192,39727,19051],{}," step inside the automation, so the password is only ever held in memory for the length of the run.",[26,39730,39620,39731,4468,39733,4468,39735,4468,39737,10147,39740,148],{},[659,39732,39624],{"href":39623},[659,39734,39627],{"href":31378},[659,39736,39631],{"href":39630},[659,39738,39739],{"href":39675},"2FA",[659,39741,39639],{"href":39638},[107,39743,39745],{"id":39744},"recommended-password-managers","Recommended password managers",[112,39747],{},[26,39749,39750,39751,148],{},"Any vault that offers an HTTP API works. One example is ",[659,39752,39755],{"href":39753,"rel":39754},"https:\u002F\u002Fwww.vaultproject.io",[1218],"HashiCorp Vault",{"title":67,"searchDepth":68,"depth":68,"links":39757},[39758],{"id":39744,"depth":670,"text":39745},"Store passwords in a dedicated password manager or vault and retrieve them at runtime using the axiom.ai webhook or JavaScript step.",{"metaTitle":39761},"Use a password manager to store logins for automations",{"title":39720,"description":39759},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Fpassword-manager","3zPiJLQKeCvjKPaLsPRZ4xERmEcqQ-PNn3Xwge2UD2I",{"id":39766,"title":39767,"body":39768,"date":71,"description":39840,"extension":73,"meta":39841,"navigation":75,"order":2237,"path":39638,"seo":39843,"stem":39844,"__hash__":39845},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Fsecure.md","Secure login automation",{"type":8,"value":39769,"toc":39834},[39770,39773,39785,39789,39791,39794,39798,39800,39805,39809,39811,39814,39818,39820],[26,39771,39772],{},"For organisations that need a hyper-secure environment, run login automations on a dedicated PC inside a controlled network. The setup below keeps every byte of automation data on your own hardware.",[26,39774,39620,39775,4468,39777,4468,39779,4468,39781,10147,39783,148],{},[659,39776,39624],{"href":39623},[659,39778,39627],{"href":31378},[659,39780,39631],{"href":39630},[659,39782,39739],{"href":39675},[659,39784,39635],{"href":39634},[107,39786,39788],{"id":39787},"use-a-pc-in-a-secure-environment","Use a PC in a secure environment",[112,39790],{},[26,39792,39793],{},"Run automations from a PC stored in a secure location and connected to a controlled network, for example one in your workplace.",[107,39795,39797],{"id":39796},"use-the-desktop-app","Use the desktop app",[112,39799],{},[26,39801,31158,39802,39804],{},[659,39803,7421],{"href":31161}," on the PC and run all automations from it. None of the data you process leaves the machine. axiom.ai only sends account information and run metadata such as start time and duration. Your data stays behind your network.",[107,39806,39808],{"id":39807},"automate-the-login","Automate the login",[112,39810],{},[26,39812,39813],{},"When you run an automation in the desktop app, it shares the browser cookie automatically and you stay signed in. All cookies are double-encrypted.",[107,39815,39817],{"id":39816},"why-this-method-works","Why this method works",[112,39819],{},[186,39821,39822,39825,39828,39831],{},[189,39823,39824],{},"No private data leaves the network.",[189,39826,39827],{},"The PC is physically secured.",[189,39829,39830],{},"Session data is encrypted at rest and in transit.",[189,39832,39833],{},"The setup meets common data privacy and security requirements.",{"title":67,"searchDepth":68,"depth":68,"links":39835},[39836,39837,39838,39839],{"id":39787,"depth":670,"text":39788},{"id":39796,"depth":670,"text":39797},{"id":39807,"depth":670,"text":39808},{"id":39816,"depth":670,"text":39817},"Run login automations on a secured PC using the desktop app so no data ever leaves your network.",{"metaTitle":39842},"Run login automations on a secure private network",{"title":39767,"description":39840},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Fsecure","JCeFnJurEi78z2yDw8BcK_MQUnwY71gBGzr1dB-6NvA",{"id":39847,"title":39848,"body":39849,"date":71,"description":39955,"extension":73,"meta":39956,"navigation":75,"order":670,"path":31378,"seo":39958,"stem":39959,"__hash__":39960},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Fsessions.md","Log in by sharing your session",{"type":8,"value":39850,"toc":39948},[39851,39854,39866,39870,39872,39878,39882,39884,39887,39913,39917,39923,39927,39930],[26,39852,39853],{},"The simplest way to automate login is to share your browser session. axiom.ai stores your cookie, and when the automation runs, you're already signed in.",[26,39855,39620,39856,4468,39858,4468,39860,4468,39862,10147,39864,148],{},[659,39857,39624],{"href":39623},[659,39859,39631],{"href":39630},[659,39861,39739],{"href":39675},[659,39863,39635],{"href":39634},[659,39865,39639],{"href":39638},[107,39867,39869],{"id":39868},"store-cookies-for-desktop-runs","Store cookies for desktop runs",[112,39871],{},[26,39873,2273,39874,39877],{},[659,39875,39876],{"href":26107},"desktop runner"," shares your browser cookie by default. Run the automation from a window where you're already signed in to the web app, and the session is reused automatically.",[107,39879,39881],{"id":39880},"store-cookies-for-cloud-runs","Store cookies for cloud runs",[112,39883],{},[26,39885,39886],{},"For cloud runs, you have to opt in to cookie sharing on a per-automation basis.",[1923,39888,39889,39894,39899,39907],{},[189,39890,39891,39892,148],{},"In the automation, click the kebab menu in the top right corner and select ",[192,39893,4171],{},[189,39895,1927,39896,39898],{},[192,39897,24726],{}," under run options.",[189,39900,31969,39901,9879,39904,148],{},[145,39902,39903],{},"Local cookies are used",[145,39905,39906],{},"Stored cookies are used",[189,39908,1927,39909,39912],{},[192,39910,39911],{},"Populate from Axiom"," to fetch the cookies.",[21,39914,39916],{"id":39915},"sessions-expire","Sessions expire",[26,39918,39919,39920,39922],{},"Sessions can last up to 100 days but eventually expire. To renew, resync the cookies using the button in the ",[192,39921,24726],{}," settings panel.",[21,39924,39926],{"id":39925},"turn-on-error-notifications","Turn on error notifications",[26,39928,39929],{},"When using cookies for cloud runs, turn on error notifications so you find out as soon as a session expires.",[1923,39931,39932,39936,39940,39945],{},[189,39933,39891,39934,148],{},[192,39935,4171],{},[189,39937,1927,39938,39898],{},[192,39939,24686],{},[189,39941,31969,39942,31972],{},[145,39943,39944],{},"Notify when run fails",[189,39946,39947],{},"Choose to be notified by email or webhook.",{"title":67,"searchDepth":68,"depth":68,"links":39949},[39950,39951],{"id":39868,"depth":670,"text":39869},{"id":39880,"depth":670,"text":39881,"children":39952},[39953,39954],{"id":39915,"depth":68,"text":39916},{"id":39925,"depth":68,"text":39926},"Store browser cookies in axiom.ai so an automation stays signed in to a web app on desktop and cloud runs.",{"metaTitle":39957},"Share a browser session to keep an automation signed in",{"title":39848,"description":39955},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Fsessions","AQpkugyc3RGbPL2DA1DwmV0_8cB8U84ihJ6z1ebMe9o",{"id":39962,"title":39963,"body":39964,"date":71,"description":40207,"extension":73,"meta":40208,"navigation":75,"order":2131,"path":39623,"seo":40210,"stem":40211,"__hash__":40212},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Fsteps.md","Log in using a Google Sheet",{"type":8,"value":39965,"toc":40199},[39966,39973,39985,39989,39991,39994,39998,40000,40006,40010,40012,40015,40040,40043,40079,40083,40085,40090,40093,40130,40132,40179,40183],[26,39967,39968,39969,39972],{},"There are several ways to automate actions behind a login. The simplest is ",[659,39970,39971],{"href":31378},"sharing your session",". This page covers an alternative: storing login details in a Google Sheet and reading them in at runtime. We don't recommend storing passwords directly in step fields. All step data is encrypted at rest and in transit, but a Google Sheet is a more isolated store.",[26,39974,39620,39975,4468,39977,4468,39979,4468,39981,10147,39983,148],{},[659,39976,39627],{"href":31378},[659,39978,39631],{"href":39630},[659,39980,39739],{"href":39675},[659,39982,39635],{"href":39634},[659,39984,39639],{"href":39638},[107,39986,39988],{"id":39987},"why-a-google-sheet","Why a Google Sheet",[112,39990],{},[26,39992,39993],{},"Not everyone is comfortable storing passwords in Google Sheets, but Google operates one of the most heavily monitored security infrastructures on the internet, used by enterprises and governments worldwide. For most teams it is a reasonable trade-off between convenience and isolation.",[107,39995,39997],{"id":39996},"set-up-the-google-sheet","Set up the Google Sheet",[112,39999],{},[26,40001,40002,40003,40005],{},"Create a ",[659,40004,26048],{"href":963}," and add columns for your login details. Don't share the sheet with anyone who doesn't need access.",[107,40007,40009],{"id":40008},"build-the-login-automation","Build the login automation",[112,40011],{},[26,40013,40014],{},"The pattern is five steps:",[1923,40016,40017,40021,40025,40030,40035],{},[189,40018,40019],{},[192,40020,22098],{},[189,40022,40023],{},[192,40024,17849],{},[189,40026,40027,40029],{},[192,40028,16065],{}," (username)",[189,40031,40032,40034],{},[192,40033,16065],{}," (password)",[189,40036,40037,40039],{},[192,40038,15781],{}," (submit)",[26,40041,40042],{},"To build it:",[1923,40044,40045,40050,40055,40063,40072],{},[189,40046,15620,40047,40049],{},[192,40048,22098],{}," step and select the sheet that contains your login details.",[189,40051,15620,40052,40054],{},[192,40053,17849],{}," step and set its URL to the sign-in page.",[189,40056,11513,40057,40059,40060,40062],{},[192,40058,16065],{}," step. Select the username field, click ",[192,40061,31794],{},", choose the Google Sheet variable, and pick the column with the username.",[189,40064,40065,40066,40068,40069,40071],{},"Add another ",[192,40067,16065],{}," step. Select the password field, click ",[192,40070,31794],{},", choose the Google Sheet variable, and pick the column with the password.",[189,40073,15620,40074,40076,40077,148],{},[192,40075,15781],{}," step and select the submit button using ",[192,40078,33310],{},[107,40080,40082],{"id":40081},"loop-through-multiple-logins","Loop through multiple logins",[112,40084],{},[26,40086,40087,40088,15415],{},"To sign in to several accounts in a single run, wrap the login steps in a ",[192,40089,15653],{},[26,40091,40092],{},"The pattern becomes:",[1923,40094,40095,40099],{},[189,40096,40097],{},[192,40098,22098],{},[189,40100,40101,40103],{},[192,40102,15653],{},[1923,40104,40105,40109,40113,40117,40121,40126],{},[189,40106,40107],{},[192,40108,17849],{},[189,40110,40111,40029],{},[192,40112,16065],{},[189,40114,40115,40034],{},[192,40116,16065],{},[189,40118,40119,40039],{},[192,40120,15781],{},[189,40122,40123,40125],{},[192,40124,15653],{}," (the actions to perform once signed in)",[189,40127,40128],{},[192,40129,21971],{},[26,40131,40042],{},[1923,40133,40134,40146,40154,40164,40173],{},[189,40135,40136,40137,40139,40140,40142,40143,40145],{},"Tick the boxes next to the ",[192,40138,17849],{},", both ",[192,40141,16065],{}," steps, and the ",[192,40144,15781],{}," step. The Move toolbar appears at the top.",[189,40147,40148,40149,40151,40152,15415],{},"In the toolbar, click ",[192,40150,32433],{},". The selected steps are wrapped in a ",[192,40153,15653],{},[189,40155,40156,40157,40159,40160,40163],{},"In the new ",[192,40158,15653],{}," step, set ",[145,40161,40162],{},"Data to loop through"," to the Google Sheet variable.",[189,40165,40166,40167,40169,40170,40172],{},"Inside the loop, after the ",[192,40168,15781],{}," step, add a nested ",[192,40171,15653],{}," step. Add the actions to perform once signed in to each account.",[189,40174,40175,40176,40178],{},"At the end of the outer loop, add a ",[192,40177,21971],{}," step. This signs the automation out before the next iteration.",[21,40180,40182],{"id":40181},"control-how-many-accounts-to-sign-in-to","Control how many accounts to sign in to",[26,40184,1934,40185,40159,40187,6205,40189,40191,40192,9879,40195,40198],{},[192,40186,22098],{},[145,40188,36414],{},[145,40190,36424],{}," to limit the rows read. For example, ",[145,40193,40194],{},"A1",[145,40196,40197],{},"B3"," reads three rows from columns A and B, so the automation signs in to three accounts.",{"title":67,"searchDepth":68,"depth":68,"links":40200},[40201,40202,40203,40204],{"id":39987,"depth":670,"text":39988},{"id":39996,"depth":670,"text":39997},{"id":40008,"depth":670,"text":40009},{"id":40081,"depth":670,"text":40082,"children":40205},[40206],{"id":40181,"depth":68,"text":40182},"Store usernames and passwords in a Google Sheet and read them into an automation at runtime to sign in to web apps.",{"metaTitle":40209},"Store login details in a Google Sheet for automated logins",{"title":39963,"description":40207},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Fsteps","CVxnGHLjH4GABvxRi0JZJuVbEGxHSwCm6s8P5o-J-oE",{"id":40214,"title":40215,"body":40216,"date":71,"description":40252,"extension":73,"meta":40253,"navigation":75,"order":1478,"path":39630,"seo":40255,"stem":40256,"__hash__":40257},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Fvps.md","Log in using the VPS",{"type":8,"value":40217,"toc":40249},[40218,40221,40233,40237,40239,40242],[26,40219,40220],{},"The Ultimate subscription tier includes a private VPS, which is an alternative way to store logins for automation runs. The VPS is a private browser with the axiom.ai Chrome extension installed. It behaves like axiom.ai on the desktop and supports every feature, including scheduling.",[26,40222,39620,40223,4468,40225,4468,40227,4468,40229,10147,40231,148],{},[659,40224,39624],{"href":39623},[659,40226,39627],{"href":31378},[659,40228,39739],{"href":39675},[659,40230,39635],{"href":39634},[659,40232,39639],{"href":39638},[107,40234,40236],{"id":40235},"use-the-vps-to-automate-logins","Use the VPS to automate logins",[112,40238],{},[26,40240,40241],{},"In the VPS browser, open the web apps you want to automate and sign in. When you run an automation on the VPS, it shares the session and signs in automatically.",[2093,40243,40244],{},[26,40245,40246,40248],{},[192,40247,2172],{}," For security, create dedicated accounts with only the permissions the automation needs.",{"title":67,"searchDepth":68,"depth":68,"links":40250},[40251],{"id":40235,"depth":670,"text":40236},"Store logins on your private axiom.ai VPS and run automations remotely with full scheduling support.",{"metaTitle":40254},"Automate logins on a private VPS with axiom.ai",{"title":40215,"description":40252},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin\u002Fvps","NjnLGdF_360AcFlBpMQkPpQNTwNypKQJt4DtHfSGjzI",{"id":40259,"title":15653,"body":40260,"date":71,"description":40758,"extension":73,"meta":40759,"navigation":75,"order":1478,"path":31407,"seo":40762,"stem":40763,"__hash__":40764},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Floop.md",{"type":8,"value":40261,"toc":40736},[40262,40265,40267,40287,40291,40293,40298,40302,40308,40311,40314,40326,40329,40332,40347,40350,40354,40357,40363,40387,40390,40397,40401,40407,40414,40417,40421,40427,40430,40433,40437,40443,40449,40452,40456,40459,40462,40466,40468,40482,40486,40488,40491,40495,40525,40529,40561,40565,40597,40600,40620,40624,40626,40633,40637,40640,40646,40662,40665,40675,40679,40681,40694,40700,40704,40733],[26,40263,40264],{},"Looping is one of the most useful patterns in axiom.ai. A loop repeats a group of steps, usually once per row of data. For example, loop through a list of URLs to scrape data from each page, or loop through rows of a Google Sheet to fill in a web form.",[32947,40266],{},[26,40268,40269,40270,40274,40275,6205,40279,40283,40284,40286],{},"There are three steps you can use to build a loop. The primary one is ",[659,40271,40272],{"href":15650},[192,40273,15653],{},". The ",[659,40276,40277],{"href":34805},[192,40278,34808],{},[659,40280,40281],{"href":34811},[192,40282,34814],{}," steps can also create loops, and you can use ",[659,40285,31398],{"href":31397}," inside any of them.",[107,40288,40290],{"id":40289},"loop-using-the-loop-through-data-step","Loop using the Loop through data step",[112,40292],{},[26,40294,2273,40295,40297],{},[192,40296,15653],{}," step repeats its sub-steps once for each row of data passed into it. To use it, add the step and select the data you want to loop through.",[21,40299,40301],{"id":40300},"add-a-loop-through-data-step","Add a Loop through data step",[26,40303,40304],{},[1906,40305],{"alt":40306,"src":40307},"Adding the Loop through data step in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Fadd-loop-step-axiom-ai.jpg",[26,40309,40310],{},"There are two ways to create a loop: use the step finder, or use the Move toolbar to wrap existing steps.",[26,40312,40313],{},"To add a loop with the step finder:",[1923,40315,40316,40323],{},[189,40317,33186,40318,40320,40321,148],{},[192,40319,37904],{},", and add ",[192,40322,15653],{},[189,40324,40325],{},"Add the steps you want to repeat as sub-steps of the loop.",[32973,40327],{"url":40328},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F86ZWhuOa7OU?rel=0&start=23&end=827",[26,40330,40331],{},"To turn existing steps into a loop with the Move toolbar:",[1923,40333,40334,40337,40342],{},[189,40335,40336],{},"Tick the checkboxes next to the steps you want to loop.",[189,40338,40339,40340,148],{},"In the Move toolbar, click ",[192,40341,32433],{},[189,40343,4291,40344,40346],{},[192,40345,15653],{}," to wrap the highlighted steps in a loop.",[32973,40348],{"url":40349},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F86ZWhuOa7OU?rel=0&start=139&end=827",[21,40351,40353],{"id":40352},"select-data-to-loop-through","Select data to loop through",[26,40355,40356],{},"A loop won't iterate until you give it data. There are two ways to set the loop data.",[26,40358,40359],{},[1906,40360],{"alt":40361,"src":40362},"Selecting data to loop through in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Fselect-data-loop-step-axiom-ai.jpg",[1923,40364,40365,40376],{},[189,40366,40367,40370,40371,33904,40373,40375],{},[192,40368,40369],{},"From the loop step."," Set ",[145,40372,40162],{},[192,40374,31794],{}," and choosing the data variable.",[189,40377,40378,40381,40382,40384,40385,148],{},[192,40379,40380],{},"From a sub-step."," Edit a sub-step inside the loop and click ",[192,40383,31794],{},". The variable you pick is automatically set as the loop's ",[145,40386,40162],{},[32973,40388],{"url":40389},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F86ZWhuOa7OU?rel=0&start=168&end=827",[2093,40391,40392],{},[26,40393,40394,40396],{},[192,40395,2359],{}," A loop returns an error if its data source is empty.",[21,40398,40400],{"id":40399},"insert-sub-steps","Insert sub-steps",[26,40402,40403],{},[1906,40404],{"alt":40405,"src":40406},"A Loop through data step with sub-steps in the axiom.ai Builder","\u002Fdocs\u002Floop\u002Finserting-substeps.png",[26,40408,40409,40410,40413],{},"Add the steps you want to repeat inside the loop using ",[192,40411,40412],{},"Add sub-step",". Steps outside the loop are not repeated.",[32973,40415],{"url":40416},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F86ZWhuOa7OU?rel=0&start=240&end=827",[21,40418,40420],{"id":40419},"nest-loops","Nest loops",[26,40422,40423],{},[1906,40424],{"alt":40425,"src":40426},"Nested Loop through data steps in the axiom.ai Builder","\u002Fdocs\u002Floop\u002Fnested-loops.png",[26,40428,40429],{},"You can nest loops up to five levels deep. Three levels is usually enough, even for complex automations.",[32973,40431],{"url":40432},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F86ZWhuOa7OU?rel=0&start=139&end=267",[21,40434,40436],{"id":40435},"output-data-from-a-loop","Output data from a loop",[26,40438,40439],{},[1906,40440],{"alt":40441,"src":40442},"A Loop through data step exporting data via its output token","\u002Fdocs\u002Floop\u002Floop-output.png",[26,40444,40445,40446,40448],{},"Every ",[192,40447,15653],{}," step outputs a token that other steps can read. The token contains the data output by every sub-step in every iteration, assembled into a 2D array (a table).",[32973,40450],{"url":40451},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F86ZWhuOa7OU?rel=0&start=298&end=400",[21,40453,40455],{"id":40454},"group-data-with-a-loop","Group data with a loop",[26,40457,40458],{},"You can use a loop to group the output of several steps into a single token, even if the loop only iterates once. Wrap the steps in a loop to combine their outputs.",[32973,40460],{"url":40461},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F86ZWhuOa7OU?rel=0&start=383&end=500",[107,40463,40465],{"id":40464},"end-a-loop-early","End a loop early",[112,40467],{},[26,40469,31861,40470,40476,40477,40481],{},[659,40471,40473],{"href":40472},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fend-loop",[192,40474,40475],{},"End loop"," step to stop a loop before it finishes its iterations. Combined with a ",[659,40478,40480],{"href":40479},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002F#control-flow","control flow"," step, this lets you exit a loop when a condition is met (or not met).",[107,40483,40485],{"id":40484},"loop-design-patterns","Loop design patterns",[112,40487],{},[26,40489,40490],{},"These are common loop patterns. Each one starts by reading data from a Google Sheet and ends by deleting the processed row, so a re-run picks up where the last run left off.",[21,40492,40494],{"id":40493},"loop-through-links-and-scrape-each-one","Loop through links and scrape each one",[1923,40496,40497,40501],{},[189,40498,40499],{},[192,40500,22098],{},[189,40502,40503,40505],{},[192,40504,15653],{},[1923,40506,40507,40511,40516,40520],{},[189,40508,40509],{},[192,40510,17849],{},[189,40512,40513],{},[192,40514,40515],{},"Get data from current page",[189,40517,40518],{},[192,40519,22113],{},[189,40521,40522],{},[192,40523,40524],{},"Delete row from Google Sheet",[21,40526,40528],{"id":40527},"enter-data-into-a-web-form","Enter data into a web form",[1923,40530,40531,40535],{},[189,40532,40533],{},[192,40534,22098],{},[189,40536,40537,40539],{},[192,40538,15653],{},[1923,40540,40541,40545,40549,40553,40557],{},[189,40542,40543],{},[192,40544,17849],{},[189,40546,40547],{},[192,40548,16065],{},[189,40550,40551],{},[192,40552,17668],{},[189,40554,40555],{},[192,40556,15781],{},[189,40558,40559],{},[192,40560,40524],{},[21,40562,40564],{"id":40563},"ai-web-scraper","AI web scraper",[1923,40566,40567,40571],{},[189,40568,40569],{},[192,40570,22098],{},[189,40572,40573,40575],{},[192,40574,15653],{},[1923,40576,40577,40581,40585,40589,40593],{},[189,40578,40579],{},[192,40580,17849],{},[189,40582,40583],{},[192,40584,40515],{},[189,40586,40587],{},[192,40588,39147],{},[189,40590,40591],{},[192,40592,22113],{},[189,40594,40595],{},[192,40596,40524],{},[26,40598,40599],{},"For full walkthroughs of each pattern, see:",[186,40601,40602,40608,40614],{},[189,40603,40604],{},[659,40605,40607],{"href":40606},"\u002Fguides\u002Floop-through-links-and-scrape-data","Loop through links and scrape data",[189,40609,40610],{},[659,40611,40613],{"href":40612},"\u002Fguides\u002Fentering-text-into-search-field","Enter text into a search field",[189,40615,40616],{},[659,40617,40619],{"href":40618},"\u002Fguides\u002Fscrape-html-extract-data-with-ai","Scrape HTML and extract data with AI",[107,40621,40623],{"id":40622},"loop-using-the-jump-to-another-step","Loop using the Jump to another step",[112,40625],{},[26,40627,2273,40628,40632],{},[659,40629,40630],{"href":34805},[192,40631,34808],{}," step creates a simple loop with two parameters: the step to jump to, and the number of cycles to run.",[21,40634,40636],{"id":40635},"use-jump-to-another-step","Use Jump to another step",[26,40638,40639],{},"The most common pattern is to add the jump step at the end of a series of steps you want to repeat.",[26,40641,40642],{},[1906,40643],{"alt":40644,"src":40645},"Using the Jump to another step in axiom.ai for a simple loop","\u002Fdocs\u002Ftutorials\u002Fjump-step-example.jpg",[1923,40647,40648,40652,40657],{},[189,40649,33896,40650,148],{},[192,40651,34808],{},[189,40653,31836,40654,40656],{},[145,40655,34831],{}," to the step number you want to return to.",[189,40658,31836,40659,40661],{},[145,40660,34839],{}," to the number of times the loop should run.",[32973,40663],{"url":40664},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F86ZWhuOa7OU?rel=0&start=464&end=600",[2093,40666,40667],{},[26,40668,40669,40671,40672,40674],{},[192,40670,2359],{}," If you reorder the steps in your automation, check the ",[145,40673,34831],{}," value still points at the right step.",[107,40676,40678],{"id":40677},"loop-using-the-conditionally-jump-to-another-step","Loop using the Conditionally jump to another step",[112,40680],{},[26,40682,2273,40683,40687,40688,40690,40691,40693],{},[659,40684,40685],{"href":34811},[192,40686,34814],{}," step works like ",[192,40689,34808],{}," but only jumps when a condition is met. Use it to behave differently based on data, for example pairing it with a scrape step to keep clicking ",[192,40692,32554],{}," until a target value appears on the page.",[26,40695,40696],{},[1906,40697],{"alt":40698,"src":40699},"Using the Conditionally jump to another step in axiom.ai","\u002Fdocs\u002Ftutorials\u002Fconditionaly-jump-step.png",[21,40701,40703],{"id":40702},"use-conditionally-jump-to-another-step","Use Conditionally jump to another step",[1923,40705,40706,40711,40716,40719,40723,40728],{},[189,40707,31836,40708,40710],{},[145,40709,39327],{}," to the data you want to evaluate (for example scraped data or a Google Sheet value).",[189,40712,31836,40713,40715],{},[145,40714,39332],{}," to the value to compare against. Strings and numbers are accepted; advanced users can use JavaScript.",[189,40717,40718],{},"Set the matching rules: match any word, all words, or an exact match.",[189,40720,31836,40721,40656],{},[145,40722,34831],{},[189,40724,31836,40725,40727],{},[145,40726,34839],{}," to cap how many times the loop can run.",[189,40729,31969,40730,40732],{},[145,40731,39315],{}," to jump when the condition is false instead of true.",[32973,40734],{"url":40735},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F86ZWhuOa7OU?rel=0&start=572&end=700",{"title":67,"searchDepth":68,"depth":68,"links":40737},[40738,40746,40747,40752,40755],{"id":40289,"depth":670,"text":40290,"children":40739},[40740,40741,40742,40743,40744,40745],{"id":40300,"depth":68,"text":40301},{"id":40352,"depth":68,"text":40353},{"id":40399,"depth":68,"text":40400},{"id":40419,"depth":68,"text":40420},{"id":40435,"depth":68,"text":40436},{"id":40454,"depth":68,"text":40455},{"id":40464,"depth":670,"text":40465},{"id":40484,"depth":670,"text":40485,"children":40748},[40749,40750,40751],{"id":40493,"depth":68,"text":40494},{"id":40527,"depth":68,"text":40528},{"id":40563,"depth":68,"text":40564},{"id":40622,"depth":670,"text":40623,"children":40753},[40754],{"id":40635,"depth":68,"text":40636},{"id":40677,"depth":670,"text":40678,"children":40756},[40757],{"id":40702,"depth":68,"text":40703},"Repeat a set of steps for every row of data using Loop through data, or build conditional loops with Jump and Conditionally jump steps.",{"metaTitle":40760,"video":40761},"Loop through rows of data with the Loop through data step","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F86ZWhuOa7OU?rel=0&amp;start=0&end=827",{"title":15653,"description":40758},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Floop","i9APmvokpz4EeUApaYbN_nfBn9Jox0GaRThjteZbWng",{"id":40766,"title":40767,"body":40768,"date":71,"description":40887,"extension":73,"meta":40888,"navigation":75,"order":293,"path":40889,"seo":40890,"stem":40891,"__hash__":40892},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fadvanced-running-methods.md","Advanced running methods",{"type":8,"value":40769,"toc":40876},[40770,40776,40780,40782,40785,40788,40792,40795,40798,40801,40805,40807,40810,40814,40816,40819,40822,40830,40834,40836,40839,40843,40845,40851,40855,40857,40863,40867,40869],[26,40771,40772,40773],{},"Learn advanced methods for running your automation, such as running across multiple computers or using an API. If you are a beginner getting started and unsure how to run an automation, ",[659,40774,40775],{"href":37768},"click here.",[107,40777,40779],{"id":40778},"run-multiple-bots-at-once-locally","Run multiple bots at once locally",[112,40781],{},[26,40783,40784],{},"To run multiple bots simultaneously, you can set up multiple installs of the desktop application. The standard way to do this is to use multiple computers or virtual machines, install axiom.ai on each of them, and run the desired bots from there.",[26,40786,40787],{},"If you are using local scheduling to run multiple bots, you will additionally need to set up multiple accounts. Only if the bots are being run manually will you be able to run multiple bots at the same time with a single account.",[21,40789,40791],{"id":40790},"how-to-run-multiple-instances-of-the-same-automation","How to run multiple instances of the same automation",[26,40793,40794],{},"Each individual bot can only have one instance of itself running. This means you can run multiple different bots at the same time, but you cannot run multiple instances of the same bot at the same time.",[26,40796,40797],{},"If you need this functionality, then you should duplicate the bot you wish to run concurrently. You can do this using the \"Save as duplicate\" feature, which you can find in the menu at the top of the builder.",[26,40799,40800],{},"Create as many duplicates as you need concurrency. Each duplicate will be a separate item and so will be able to run concurrently along with the other duplicates.",[107,40802,40804],{"id":40803},"run-multiple-bots-at-once-on-cloud-concurrency","Run multiple bots at once on cloud (concurrency)",[112,40806],{},[26,40808,40809],{},"Subscribers at the Pro Max tier and higher are allowed to run multiple bots at once on our cloud infrastructure. This applies to manual runs, Zapier and Make connections, API calls and cloud scheduling runs.",[107,40811,40813],{"id":40812},"use-incognito-mode-or-use-axiomai-on-local-file-urls","Use Incognito mode, or use axiom.ai on local file URLs",[112,40815],{},[26,40817,40818],{},"By default, axiom.ai does not have permission to run in Incognito Mode, or access local HTML files.",[26,40820,40821],{},"To let axiom.ai run Incognito, or on local files:",[32959,40823,40824],{},[2446,40825,40828],{"className":40826,"code":40827,"language":5402},[5400],"1. Type in `chrome:\u002F\u002Fextensions` in your browser. \n2. Click on `Details`.\n    \u003Cimg src=\"\u002Fimg\u002Fchrome-extensions.png\"\u002F>\n3. Toggle to `Allow in Incognito`, or `Allow access to file URLs`:\n    \u003Cimg src=\"\u002Fimg\u002Fchrome-permissions.png\"\u002F>\n",[145,40829,40827],{"__ignoreMap":67},[107,40831,40833],{"id":40832},"run-a-headless-automation","Run a headless automation",[112,40835],{},[26,40837,40838],{},"To run an automation in headless mode, in the builder, click the kebab menu at the top right, then click \"Settings\". Then, under \"Run options\", click \"Run Headless\" and toggle the setting to 'on'. Read more about headless mode here.",[107,40840,40842],{"id":40841},"run-an-automation-from-zapier","Run an automation from Zapier",[112,40844],{},[26,40846,40847,40848],{},"Trigger an automation from Zapier, please see ",[659,40849,40850],{"href":1084},"Working with Zapier and Webhooks",[107,40852,40854],{"id":40853},"run-an-automation-via-api","Run an automation via API",[112,40856],{},[26,40858,40859,40860],{},"To learn how to run an automation via API, please see ",[659,40861,40862],{"href":5562},"Webhook &  API Documentation",[107,40864,40866],{"id":40865},"run-an-automation-using-make","Run an automation using Make",[112,40868],{},[26,40870,40871,40872],{},"To learn how to run an automation via Make, please see ",[659,40873,40875],{"href":40874},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fmake","Working with Make and webhooks",{"title":67,"searchDepth":68,"depth":68,"links":40877},[40878,40881,40882,40883,40884,40885,40886],{"id":40778,"depth":670,"text":40779,"children":40879},[40880],{"id":40790,"depth":68,"text":40791},{"id":40803,"depth":670,"text":40804},{"id":40812,"depth":670,"text":40813},{"id":40832,"depth":670,"text":40833},{"id":40841,"depth":670,"text":40842},{"id":40853,"depth":670,"text":40854},{"id":40865,"depth":670,"text":40866},"Run multiple automations concurrently, trigger from Zapier, or run Axiom across multiple computers.",{},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fadvanced-running-methods",{"title":40767,"description":40887},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fadvanced-running-methods","PhF0KOnoB2rLS71IoAWN8GzA0mUqtHxHsBFQeBQJkdc",{"id":40894,"title":40895,"body":40896,"date":71,"description":40978,"extension":73,"meta":40979,"navigation":75,"order":2237,"path":40980,"seo":40981,"stem":40982,"__hash__":40983},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fautomation.md","Schedule an automation",{"type":8,"value":40897,"toc":40969},[40898,40901,40905,40909,40911,40914,40927,40931,40934,40938,40941,40945,40948,40952,40955,40962,40966],[26,40899,40900],{},"Schedule your automation to run when you want it to. You can schedule an automation to run in the cloud or locally on your desktop. You have the flexibility to set the start date, time, and frequency. However, scheduling is only available on paid subscriptions from the Pro tier upwards. By default scheduled automations run in the cloud.",[1906,40902],{"src":40903,"alt":40904},"\u002Fdocs\u002Fschedule-and-run-an-automation.png","how to schedule your automation",[107,40906,40908],{"id":40907},"how-to-schedule-an-automation","How to schedule an automation",[112,40910],{},[26,40912,40913],{},"To access the scheduler, edit an automation. Once in the builder:",[32959,40915,40916],{},[1923,40917,40918,40921,40924],{},[189,40919,40920],{},"First, click the kebab menu icon (three dots) top right hand corner.",[189,40922,40923],{},"Next, Click on the gear icon ‘Settings’.",[189,40925,40926],{},"Finally in the settings menu click \"Schedule\".",[21,40928,40930],{"id":40929},"turn-the-scheduler-on","Turn the scheduler on",[26,40932,40933],{},"Toggle the scheduler from \"Off\" to \"On\". To disable the scheduler, simply toggle it back to \"Off.\"",[21,40935,40937],{"id":40936},"set-the-start-date","Set the start date",[26,40939,40940],{},"Click the \"Set the date\" button to open a popup window containing a calendar. If necessary, select a month by clicking the right arrow to change months. The default is set to today. Then select a day. Once done, click \"Set date\". Dates in the past cannot be set.",[21,40942,40944],{"id":40943},"set-the-start-time","Set the start time",[26,40946,40947],{},"Next click the \"Set the time\" button to open a popup window containing a clock. If necessary, select AM and PM times to set a start time. The default is set to now. Once done, click \"Set time\". Times in the past cannot be set.",[21,40949,40951],{"id":40950},"set-schedule-frequency","Set schedule frequency",[26,40953,40954],{},"Choose the frequency from the dropdown list, ‘daily’ frequency will be the default option. After configuring the frequency, the scheduler will be active.",[26,40956,40957,40958,40961],{},"Depending on your ",[659,40959,40960],{"href":7414},"subscription"," frequency options will vary.",[21,40963,40965],{"id":40964},"schedule-automations-locally","Schedule automations locally",[26,40967,40968],{},"To run a schedule locally rather than in the cloud, toggle the ‘Run on this computer’ option. Ignore this setting to run in the cloud.",{"title":67,"searchDepth":68,"depth":68,"links":40970},[40971],{"id":40907,"depth":670,"text":40908,"children":40972},[40973,40974,40975,40976,40977],{"id":40929,"depth":68,"text":40930},{"id":40936,"depth":68,"text":40937},{"id":40943,"depth":68,"text":40944},{"id":40950,"depth":68,"text":40951},{"id":40964,"depth":68,"text":40965},"Run automations on a schedule in the cloud or on your local computer.",{},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fautomation",{"title":40895,"description":40978},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fautomation","C01408eCBmzhtCCQt6AxuxGB0YyyNZruqnqjWjOl-Lc",{"id":40985,"title":40986,"body":40987,"date":71,"description":41020,"extension":73,"meta":41021,"navigation":75,"order":2651,"path":41023,"seo":41024,"stem":41025,"__hash__":41026},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Findex.md","Run and schedule bots",{"type":8,"value":40988,"toc":41016},[40989,41004,41007,41010,41013],[26,40990,40991,40992,6205,40995,40999,41000,41003],{},"Learn how to ",[659,40993,40994],{"href":40980},"schedule",[659,40996,40998],{"href":40997},"\u002Fdocs\u002Fhow-it-works\u002Fno-code-tool\u002Fschedule-and-run\u002Fmanage","manage scheduled"," bots, as well as ",[659,41001,37845],{"href":41002},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Flogin"," with scheduled bots on the cloud and on the desktop, through these tutorials.",[107,41005,3137],{"id":41006},"run",[2218,41008],{"by-order":1548,"limit":41009},"1-5",[107,41011,41012],{"id":40994},"Schedule",[2218,41014],{"by-order":1548,"limit":41015},"6-9",{"title":67,"searchDepth":68,"depth":68,"links":41017},[41018,41019],{"id":41006,"depth":670,"text":3137},{"id":40994,"depth":670,"text":41012},"Run a bot manually, on a schedule, or trigger it from Zapier, Make, or a webhook.",{"metaTitle":41022},"Run and schedule browser automations | axiom.ai","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run",{"title":40986,"description":41020},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Findex","OQHH0M0xVZuZm8oGk4bG4iu7phyxdA-CJjcJ5zWy2TA",{"id":41028,"title":41029,"body":41030,"date":71,"description":41223,"extension":73,"meta":41224,"navigation":75,"order":2642,"path":41002,"seo":41225,"stem":41226,"__hash__":41227},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Flogin.md","Login with a scheduled automation",{"type":8,"value":41031,"toc":41218},[41032,41039,41042,41045,41049,41051,41058,41062,41064,41067,41071,41078,41107,41110,41114,41116,41165,41173,41176,41179,41215],[26,41033,41034,41035,41038],{},"When running your bot in the Cloud, automating a task behind a login, you will need to either pass the ",[659,41036,41037],{"href":24725},"cookie"," from your browser or add steps to log into the application you are automating.",[26,41040,41041],{},"If you do not, the automation will most likely fail when scheduled to run in the Cloud because it cannot get past the login.",[26,41043,41044],{},"Don't worry; it's simple enough to do.",[107,41046,41048],{"id":41047},"setting-up-your-scheduler","Setting up your scheduler",[112,41050],{},[26,41052,41053,41054,41057],{},"Set up your ",[659,41055,41056],{"href":40980},"scheduler"," as normal when done choose one of the methods below.",[107,41059,41061],{"id":41060},"how-to-use-cookies-to-login","How to use Cookies to login",[112,41063],{},[26,41065,41066],{},"By storing cookies, you can share a logged-in session with the cloud runner. This means your automation will be logged in when it runs, without adding any login steps to the automation.",[1906,41068],{"src":41069,"alt":41070},"\u002Fdocs\u002Fsettings\u002Fcookies-axiom.ai.jpg","how to store cookies axiom.ai",[26,41072,41073,41074,41077],{},"To share your ",[659,41075,41076],{"href":24725},"cookies",", follow these steps:",[32959,41079,41080],{},[1923,41081,41082,41088,41101,41104],{},[189,41083,41084,41085,148],{},"In the scheduled automation, click the kebab menu in the top right corner or the setting cog in the vertical toolbar on the left and select ",[192,41086,41087],{},"\"Settings\"",[189,41089,41090,41091,41094,41095,9879,41098,148],{},"Next, select ",[659,41092,41093],{"href":24725},"\"Store cookies\""," and toggle ",[192,41096,41097],{},"\"Local cookies are used\"",[192,41099,41100],{},"\"Stored cookies are used\"",[189,41102,41103],{},"Enter the URLs of the sites for which you wish to add cookies for.",[189,41105,41106],{},"If the cookies expire, click \"Resync cookies\".",[26,41108,41109],{},"Now you can run your automations in the cloud while being logged in. Please note, all stored cookies are encrypted. However, cookies do expire and will need renewing periodically.",[107,41111,41113],{"id":41112},"how-to-use-steps-to-login","How to use steps to login",[112,41115],{},[1190,41117,41118],{},[186,41119,41120,41130,41139,41148,41156],{},[189,41121,41122],{},[1332,41123,41126,41129],{"className":41124},[41125],"step",[1332,41127,19338],{"className":41128},[14013]," Read data from a Google Sheet",[189,41131,41132],{},[1332,41133,41135,41138],{"className":41134},[41125],[1332,41136,22781],{"className":41137},[14013]," Go to page",[189,41140,41141],{},[1332,41142,41144,41147],{"className":41143},[41125],[1332,41145,25031],{"className":41146},[14013]," Enter text",[189,41149,41150],{},[1332,41151,41153,41147],{"className":41152},[41125],[1332,41154,25104],{"className":41155},[14013],[189,41157,41158],{},[1332,41159,41161,41164],{"className":41160},[41125],[1332,41162,14021],{"className":41163},[14013]," Click element",[26,41166,41167,41168,41170,41171,148],{},"To ",[659,41169,37845],{"href":31383}," using steps, you will need to store the username and password. We do not recommend doing this directly within the automation, but the data in the fields is encrypted. Whenever possible, we recommend creating accounts with limited permission sets and storing your password in a ",[659,41172,26048],{"href":963},[26,41174,41175],{},"Please note that Google Sheets, and the security Google provides, is among the most secure systems available. The only argument against this method is that Google could potentially read the password. However, in all honesty, how could they read millions of Google Sheets? Anyway, the choice is yours.",[26,41177,41178],{},"To use this method, follow these steps:",[32959,41180,41181],{},[1923,41182,41183,41186,41193,41206,41209],{},[189,41184,41185],{},"Create a Google Sheet to store the username and password, and do not share the sheet with others.",[189,41187,41188,41189,41192],{},"Use a  ",[192,41190,41191],{},"\"Read data from a Google Sheet\""," step to fetch the login information.",[189,41194,41195,41196,41198,41199,41202,41203,15415],{},"Add a  ",[192,41197,23987],{}," step, two ",[192,41200,41201],{},"\"Enter text\""," steps, and one  ",[192,41204,41205],{},"\"Click element\"",[189,41207,41208],{},"Insert the login URL, select the username and password fields, and then the submit button.",[189,41210,41211,41212,41214],{},"Finally, insert the data from the Google Sheet into the ",[192,41213,41201],{}," fields.",[26,41216,41217],{},"Please do test the login steps before scheduling the automation.",{"title":67,"searchDepth":68,"depth":68,"links":41219},[41220,41221,41222],{"id":41047,"depth":670,"text":41048},{"id":41060,"depth":670,"text":41061},{"id":41112,"depth":670,"text":41113},"How to handle login when running a scheduled automation in the cloud.",{},{"title":41029,"description":41223},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Flogin","qL85kXXUrG6NvTbFtXhRszCVM8WWWqejM2_11BAxygU",{"id":41229,"title":41230,"body":41231,"date":71,"description":41466,"extension":73,"meta":41467,"navigation":75,"order":1478,"path":41468,"seo":41469,"stem":41470,"__hash__":41471},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Flong-bot-runs.md","Structure automations for long runs",{"type":8,"value":41232,"toc":41460},[41233,41236,41240,41242,41249,41256,41259,41266,41270,41272,41275,41402,41406,41408,41415,41418,41421,41425,41427,41436,41439,41442],[26,41234,41235],{},"For large bots, processing large data sets, or scraping many pages, we recommend following these guidelines to produce robust automations.",[107,41237,41239],{"id":41238},"use-google-sheets-for-large-runs","Use Google Sheets for large runs",[112,41241],{},[26,41243,41244,41245,41248],{},"We recommend using ",[659,41246,41247],{"href":963},"Google Sheets"," as your primary data source in nearly all cases.",[26,41250,41251,41252,148],{},"This applies even if you have files like CSVs (they can be imported into Sheets), and even if you are sending data from ",[659,41253,41255],{"href":41254},"\u002Fdocs\u002Ftutorials\u002Flong-bot-runs#send-data-from-zapier-make-other-platforms","Zapier or Make",[26,41257,41258],{},"Please avoid reading and writing to a single sheet for your whole automation - this makes your automations harder to structure.",[26,41260,41261,41262,41265],{},"Instead, we recommend using ",[26030,41263,41264],{},"separate"," \"INPUT\" and \"OUTPUT\" sheets, with the following  (example) structure.",[107,41267,41269],{"id":41268},"structure-a-bot-for-large-runs","Structure a bot for large runs",[112,41271],{},[26,41273,41274],{},"The advantage of this design pattern is that both \"Write data to a Google Sheet\" and \"Delete rows from Google Sheet\" operations are performed inside the loop. This means that for every iteration of the loop, new data is saved, and the processed row is deleted. If the bot stops, it can be restarted and will pick up from where it left off.",[1190,41276,41277],{},[186,41278,41279,41297],{},[189,41280,41281,5210,41283,41285],{},[192,41282,36393],{},[145,41284,22098],{},[186,41286,41287,41292],{},[189,41288,41289,41291],{},[145,41290,36402],{},": Search for the Google Sheet you created. Once found, click to select.",[189,41293,41294,41296],{},[145,41295,36408],{},": Choose the sheet tab that contains your input data.",[189,41298,41299,5210,41301,41303],{},[192,41300,36436],{},[145,41302,15653],{},[186,41304,41305,41322,41334,41369],{},[189,41306,41307,5210,41309,41311],{},[192,41308,36455],{},[145,41310,17849],{},[186,41312,41313],{},[189,41314,41315,41318,41319,41321],{},[145,41316,41317],{},"Enter URL",": Click ",[145,41320,32492],{},", select your Google Sheet, and choose the column with the links.",[189,41323,41324,5210,41326,41329],{},[192,41325,36468],{},[145,41327,41328],{},"Insert steps here",[186,41330,41331],{},[189,41332,41333],{},"Insert scraping, downloading, or extraction steps depending on your task.",[189,41335,41336,5210,41339,41341],{},[192,41337,41338],{},"2.3",[145,41340,22113],{},[186,41342,41343,41348,41353,41361],{},[189,41344,41345,41347],{},[145,41346,36402],{},": Search for and select your output Google Sheet.",[189,41349,41350,41352],{},[145,41351,36408],{},": Choose the target tab.",[189,41354,41355,41357,41358,3696],{},[145,41356,36491],{},": Select the variable holding your extracted or generated data (e.g. ",[145,41359,41360],{},"chatgpt-data",[189,41362,41363,36997,41366,148],{},[145,41364,41365],{},"Clear data before writing | Add to existing data",[145,41367,41368],{},"\"Add to existing data\"",[189,41370,41371,5210,41374,41376],{},[192,41372,41373],{},"2.4",[145,41375,40524],{},[186,41377,41378,41383,41388,41395],{},[189,41379,41380,41382],{},[145,41381,36402],{},": Select the same Google Sheet you used for input.",[189,41384,41385,41387],{},[145,41386,36408],{},": Choose the same tab used in Step 1.0.",[189,41389,41390,36997,41393,148],{},[145,41391,41392],{},"First row",[145,41394,19338],{},[189,41396,41397,36997,41400,148],{},[145,41398,41399],{},"Last row",[145,41401,19338],{},[107,41403,41405],{"id":41404},"set-a-maximum-runtime","Set a maximum runtime",[112,41407],{},[26,41409,41410,41411,41414],{},"axiom.ai contains a setting for ",[659,41412,41413],{"href":24661},"maximum runtime",". This is useful if you have a large bot and don't want it to accidentally use up all of the runtime for your plan.",[26,41416,41417],{},"You can alter this setting from the configuration page for your individual axiom.",[26,41419,41420],{},"For the cloud, the maximum runtime cannot exceed the single run limit for your plan.",[107,41422,41424],{"id":41423},"send-data-from-zapier-make-other-platforms","Send data from Zapier, Make & other platforms",[112,41426],{},[26,41428,41429,41430,2344,41432,41435],{},"When sending data from ",[659,41431,1134],{"href":1084},[659,41433,41434],{"href":40874},"Make",", it's possible to either send data directly, or to write data to Google Sheets first.",[26,41437,41438],{},"Sending data directly works fine for small quantities of data.",[26,41440,41441],{},"However, if your data-set contains many columns, or more than 1 row, we recommend using Google Sheets to transfer data:",[32959,41443,41444],{},[1923,41445,41446,41449,41452],{},[189,41447,41448],{},"First, structure your bot to read from a Google Sheet.",[189,41450,41451],{},"Secondly, write data to Google Sheets from Zapier \u002F Make.",[189,41453,41454,41455,41459],{},"Finally, ",[659,41456,41458],{"href":41457},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fzapier#trigger-zapier-from-axiom","trigger bots from Zapier \u002F Make."," Sending data is not required, as your bot will use the Google Sheet instead.",{"title":67,"searchDepth":68,"depth":68,"links":41461},[41462,41463,41464,41465],{"id":41238,"depth":670,"text":41239},{"id":41268,"depth":670,"text":41269},{"id":41404,"depth":670,"text":41405},{"id":41423,"depth":670,"text":41424},"Best practices for building automations that run reliably over long periods.",{},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Flong-bot-runs",{"title":41230,"description":41466},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Flong-bot-runs","XdWV0vEfNQ6Dc5f7b5cliEy49TMdi66h8nV1seHFCDA",{"id":41473,"title":41474,"body":41475,"date":71,"description":41580,"extension":73,"meta":41581,"navigation":75,"order":2623,"path":41582,"seo":41583,"stem":41584,"__hash__":41585},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fmanage.md","Manage scheduled automations",{"type":8,"value":41476,"toc":41571},[41477,41487,41491,41493,41496,41500,41504,41507,41511,41514,41518,41520,41523,41533,41536,41540,41542,41549,41553,41555,41558],[26,41478,41479,41480,2344,41483,41486],{},"Learn how to view, stop and edit scheduled runs and change your scheduler to a local time zone. If you want to learn how to ",[659,41481,41482],{"href":40980},"schedule a run",[659,41484,41485],{"href":41002},"login when scheduling a run"," click the links.",[107,41488,41490],{"id":41489},"view-upcoming-scheduled-runs","View upcoming scheduled runs",[112,41492],{},[26,41494,41495],{},"To view a list of all scheduled automations, navigate back to the dashboard if you are in the builder. Then, using the left-hand side menu, click on \"Scheduled Axioms\". You will see a timeline of their upcoming schedules, as well as the date of their last run.",[1906,41497],{"src":41498,"alt":41499},"\u002Fdocs\u002Fschedule-and-manage-bot-runs.png","how to manage your scheduled automation bot runs",[21,41501,41503],{"id":41502},"edit-scheduled-automations","Edit scheduled automations",[26,41505,41506],{},"Additionally, you can edit the automations by clicking on the ‘Edit’ link which will take you to the axiom.ai No-code tool.",[21,41508,41510],{"id":41509},"disable-local-schedules-on-this-pc","Disable local schedules on this PC",[26,41512,41513],{},"If you have installed axiom.ai on multiple PC's and you want to disable a run, tick the box.",[107,41515,41517],{"id":41516},"watch-a-scheduled-run","Watch a scheduled run",[112,41519],{},[26,41521,41522],{},"You can watch any automation running on a scheduler by doing one of the following:",[32959,41524,41525],{},[1923,41526,41527,41530],{},[189,41528,41529],{},"From the dashboard, on the \"My Axioms\" listing page, search for the automation and click \"Watch\".",[189,41531,41532],{},"Inside the builder, to the left of the save button, click \"Watch\".",[26,41534,41535],{},"This can be helpful when trying to understand why a bot run failed.",[107,41537,41539],{"id":41538},"stop-a-scheduled-run","Stop a scheduled run",[112,41541],{},[26,41543,41544,41545,41548],{},"The best method for stopping a ",[659,41546,41547],{"href":40980},"scheduled run"," is to click \"Scheduled Axioms\" on the dashboard, then click \"Edit\" for the automation you want to stop. Once in the builder, click \"Stop\".",[107,41550,41552],{"id":41551},"changing-timezone","Changing Timezone",[112,41554],{},[26,41556,41557],{},"By default, Axiom Cloud will run scheduled automations using the UTC timezone. You can change your scheduler to run from your local timezone. To edit the timezone:",[32959,41559,41560],{},[1923,41561,41562,41565,41568],{},[189,41563,41564],{},"From the builder, click the kebab menu in the top left corner.",[189,41566,41567],{},"Click the 'Settings' option from the dropdown.",[189,41569,41570],{},"Finally, click \"Configure Timezone\" and toggle to the local timezone.",{"title":67,"searchDepth":68,"depth":68,"links":41572},[41573,41577,41578,41579],{"id":41489,"depth":670,"text":41490,"children":41574},[41575,41576],{"id":41502,"depth":68,"text":41503},{"id":41509,"depth":68,"text":41510},{"id":41516,"depth":670,"text":41517},{"id":41538,"depth":670,"text":41539},{"id":41551,"depth":670,"text":41552},"Edit, pause, stop, or change the timezone of a scheduled automation from your dashboard.",{},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fmanage",{"title":41474,"description":41580},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fmanage","MP35XsNZCXQwFaiS_5TcsgW4ezObGty1ITa82ENRenA",{"id":41587,"title":41588,"body":41589,"date":71,"description":41633,"extension":73,"meta":41634,"navigation":75,"order":2637,"path":41635,"seo":41636,"stem":41637,"__hash__":41638},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fother.md","Schedule on a specific computer",{"type":8,"value":41590,"toc":41628},[41591,41594,41598,41600,41606,41610,41612,41617,41621,41623],[26,41592,41593],{},"You are not limited to scheduling using just axiom.ai's scheduler; you can use external tools such as Zapier or Make to trigger\u002Fschedule runs.",[107,41595,41597],{"id":41596},"how-to-schedule-from-zapier","How to schedule from Zapier",[112,41599],{},[26,41601,41602,41603],{},"Trigger axiom.ai automations via Zapier. Please see our ",[659,41604,41605],{"href":1084},"guide here.",[107,41607,41609],{"id":41608},"how-to-schedule-from-make","How to schedule from Make",[112,41611],{},[26,41613,41614,41615],{},"Trigger axiom.ai automations via Make. Please see our ",[659,41616,41605],{"href":40874},[107,41618,41620],{"id":41619},"how-to-schedule-from-a-webhook","How to schedule from a Webhook",[112,41622],{},[26,41624,41625,41626],{},"Trigger axiom.ai automations via a webhook. Please see our ",[659,41627,41605],{"href":30555},{"title":67,"searchDepth":68,"depth":68,"links":41629},[41630,41631,41632],{"id":41596,"depth":670,"text":41597},{"id":41608,"depth":670,"text":41609},{"id":41619,"depth":670,"text":41620},"Run a scheduled automation on a specific PC when using Axiom across multiple computer.",{},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fother",{"title":41588,"description":41633},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fother","AOuhQOqLVl-Et3_D0jF5e8wdGEjzVTTgb3zkrl-59lM",{"id":41640,"title":41641,"body":41642,"date":71,"description":41801,"extension":73,"meta":41802,"navigation":75,"order":2131,"path":37768,"seo":41803,"stem":41804,"__hash__":41805},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Frun.md","Run your automation",{"type":8,"value":41643,"toc":41793},[41644,41665,41668,41672,41674,41677,41681,41685,41687,41692,41696,41708,41715,41721,41724,41728,41731,41735,41739,41741,41748,41752,41754,41760,41764,41766,41777,41781,41783,41790],[26,41645,41646,41647,41651,41652,41656,41657,41660,41661,2344,41663,148],{},"There are four ways to run an automation: from the ",[659,41648,41650],{"href":41649},"#run-an-automation-from-the-dashboard","dashboard",", the ",[659,41653,41655],{"href":41654},"#run-an-automation-from-the-buidler","builder",", scheduled, and triggered via a ",[659,41658,41659],{"href":36601},"webhook"," from apps such as ",[659,41662,1134],{"href":1084},[659,41664,41434],{"href":40874},[26,41666,41667],{},"When you are ready to run your automation, you will have the choice of using either a desktop or cloud platform.",[107,41669,41671],{"id":41670},"run-an-automation-from-the-dashboard","Run an automation from the dashboard",[112,41673],{},[26,41675,41676],{},"Click the \"Run\" button next to the axiom.ai's row on the dashboard.",[1906,41678],{"src":41679,"alt":41680},"\u002Fdocs\u002Fschedule-and-run-automation-from-dashboard.png","Run automation form the dashboard",[107,41682,41684],{"id":41683},"run-an-automation-from-the-builder","Run an automation from the builder",[112,41686],{},[26,41688,4285,41689,41691],{},[192,41690,37762],{}," button in the builder when creating or editing an automation.",[1906,41693],{"src":41694,"alt":41695},"\u002Fdocs\u002Fschedule-and-run-automation-from-builder.png","Run automation from the builder",[26,41697,41698,41699,41701,41702,2344,41705,148],{},"After clicking the ",[192,41700,37762],{}," button, choose if you would like to ",[192,41703,41704],{},"\"Run in cloud\"",[192,41706,41707],{},"\"Run w\u002F desktop app\"",[26,41709,41710,41711,41714],{},"If an automation is running, the button will turn red and show a ",[192,41712,41713],{},"\"Stop\""," button with an icon. Clicking it stops the bot.",[26,41716,41717],{},[1906,41718],{"alt":41719,"src":41720},"stop.png","\u002Fimg\u002Fstop.png",[26,41722,41723],{},"Once your automation starts running, you will see a window open up and you can watch the bot complete your steps. When running via the cloud, you can see on the left sidebar which step your bot is currently on and how long each of the steps has taken so far to complete.",[1906,41725],{"src":41726,"alt":41727},"\u002Fdocs\u002Ftutorials\u002Fcloud-run.jpg","Running bot in the cloud",[26,41729,41730],{},"If the bot hits an error, it will show you a message to help you debug what's wrong.",[1906,41732],{"src":41733,"alt":41734},"\u002Fdocs\u002Ftutorials\u002Fcloud-run-error.jpg","Running bot in the cloud showing an error",[107,41736,41738],{"id":41737},"concurrency-running-multiple-automations-at-once","Concurrency, running multiple automations at once",[112,41740],{},[26,41742,41743,41744],{},"To learn about running multiple bots at once click ",[659,41745,41747],{"href":41746},"\u002Fdocs\u002Ftutorials\u002Fadvanced-running-methods","concurrency.",[107,41749,41751],{"id":41750},"run-a-bot-via-scheduling","Run a bot via scheduling",[112,41753],{},[26,41755,41756,41757],{},"To schedule bot runs, please see ",[659,41758,41759],{"href":41023},"Scheduling Automations.",[107,41761,41763],{"id":41762},"run-your-bot-from-zapier-make-or-via-a-webhook","Run your bot from Zapier, Make, or via a webhook",[112,41765],{},[26,41767,41768,41769,41771,41772,6205,41774],{},"To trigger runs from ",[659,41770,37853],{"href":36601},", take a look at these links for ",[659,41773,1134],{"href":1084},[659,41775,41776],{"href":40874},"Make.",[107,41778,41780],{"id":41779},"view-currently-running-bots","View currently running bots",[112,41782],{},[26,41784,41785,41786,41789],{},"Currently running bots can be viewed by clicking the ",[192,41787,41788],{},"\"play\""," icon in the sidebar. Any currently running bots will be shown, along with the last 3 completed runs.",[26,41791,41792],{},"You can watch bot runs in progress (if they are running in cloud) or stop a run from this overlay.",{"title":67,"searchDepth":68,"depth":68,"links":41794},[41795,41796,41797,41798,41799,41800],{"id":41670,"depth":670,"text":41671},{"id":41683,"depth":670,"text":41684},{"id":41737,"depth":670,"text":41738},{"id":41750,"depth":670,"text":41751},{"id":41762,"depth":670,"text":41763},{"id":41779,"depth":670,"text":41780},"How to run or trigger automations from the desktop runner or in the cloud.",{},{"title":41641,"description":41801},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Frun","rua-W4ORJ8GIoTI0HziHEV_kHk66ISgy7sqbgLyLoiM",{"id":41807,"title":41808,"body":41809,"date":71,"description":41922,"extension":73,"meta":41923,"navigation":75,"order":68,"path":41924,"seo":41925,"stem":41926,"__hash__":41927},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fspeed-up-run.md","Speed up your automations",{"type":8,"value":41810,"toc":41915},[41811,41814,41818,41820,41823,41827,41834,41849,41853,41855,41859,41862,41865,41875,41879,41881,41884,41888,41890,41893,41900,41904,41906,41909,41912],[26,41812,41813],{},"No two websites load in the same amount of time, and not all web pages load all their content before the site is rendered. Some websites load content on scroll. To manage these complexities, we have developed algorithms that calculate wait times to allow content to load before the bots execute your actions. Through extensive testing, it became obvious there is a correlation between time and accuracy: the longer you wait, the more accurate the bots are. By default, we value accuracy over speed. However, for users wishing to increase the speed of bot runs, there are settings you can experiment with. We strongly recommend that each time you change a setting, you test your bot to ensure accuracy has not been affected.",[107,41815,41817],{"id":41816},"disable-page-change-monitoring","Disable page change monitoring",[112,41819],{},[26,41821,41822],{},"By default Axiom waits for a page to finish making changes. This is to make sure that page contents which load in dynamically have fully loaded. Sometimes, this can slow down an automation. This is most common when there are animated elements, and axiom.ai must take a while to determine whether the animation is related to page loads or not.",[1906,41824],{"src":41825,"alt":41826},"\u002Fdocs\u002Fsettings\u002Fmonitoring-axiom.ai.jpg","monitor page load axiom.ai",[26,41828,41829,41830,41833],{},"In these cases, you can turn off the ",[659,41831,41832],{"href":23832},"page monitoring"," to skip it. Note you may need to add back manual waits in these cases, in case axiom.ai starts jumping ahead.",[32959,41835,41836],{},[1923,41837,41838,41840,41843,41846],{},[189,41839,31822],{},[189,41841,41842],{},"Navigate to the settings in the top right menu.",[189,41844,41845],{},"Click \"Disable change monitoring\".",[189,41847,41848],{},"Toggle the option to on.",[107,41850,41852],{"id":41851},"reduce-the-wait-time-on-get-data-steps","Reduce the wait time on Get data steps",[112,41854],{},[1906,41856],{"src":41857,"alt":41858},"\u002Fdocs\u002Ftutorials\u002Fconfigure-get-data-step-axiom-ai.jpg","configure your get data steps axiom.ai",[26,41860,41861],{},"If your bot seems to be taking a long time over scraping, there are several things you can do to try and speed it up. Please note that the axiom.ai scraper is configured by default to maximise accuracy across a wide range of sites, so by changing these options you might introduce some inaccuracies - the scraper can be configured to go too fast for the website!",[26,41863,41864],{},"To configure these options, open the \"Configure scraper\" optional parameter on the scrape step. There are two options to choose from which can help speed up your bot:",[32959,41866,41867],{},[1923,41868,41869,41872],{},[189,41870,41871],{},"Wait time between scrolls (ms): This controls the default amount of time the scraper wait between each scroll. Lower this to increase speed.",[189,41873,41874],{},"Number of attempts when results not found: When no results are found, the scraper will try again to make doubly sure that the scrape has finished. You can set the number of times this happens; 0 will never re-check.",[107,41876,41878],{"id":41877},"when-scraping-set-a-maximum-number-of-results","When scraping, set a maximum number of results",[112,41880],{},[26,41882,41883],{},"If you know you need to scrape 1 result per page (or 5, or 10 etc.) set \"Max results\" to the number of results you need to scrape. This means axiom.ai will stop once it has scraped 1 result, then move to the next iteration of the loop.",[107,41885,41887],{"id":41886},"use-the-keyboard","Use the Keyboard",[112,41889],{},[26,41891,41892],{},"Using Keyboard shortcuts and \"Tabbing\" between inputs can be faster than selecting \"Enter text\" to enter data.",[26,41894,41895,41896],{},"Please see our tips on using the ",[659,41897,41899],{"href":41898},"\u002Fdocs\u002Fguides\u002Fgeneral\u002Fweb-actions\u002Fkeyboard-short-cuts","keyboard.",[107,41901,41903],{"id":41902},"jump-ahead-with-conditional-logic","Jump ahead with conditional logic",[112,41905],{},[26,41907,41908],{},"This may only apply to some scenarios.",[26,41910,41911],{},"Let's look at the example of entering data into multi-step form with 5 steps.",[26,41913,41914],{},"If at step 2, it is evident steps 3 and 4 are not required, you can jump ahead to step 5 using conditional logic.",{"title":67,"searchDepth":68,"depth":68,"links":41916},[41917,41918,41919,41920,41921],{"id":41816,"depth":670,"text":41817},{"id":41851,"depth":670,"text":41852},{"id":41877,"depth":670,"text":41878},{"id":41886,"depth":670,"text":41887},{"id":41902,"depth":670,"text":41903},"Techniques to make your automations run faster and get results more quickly.",{},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fspeed-up-run",{"title":41808,"description":41922},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fspeed-up-run","RVjZuwlAeuCQcCQPexoK5nzJpB5pKas53-i9Wjl-aAU",{"id":41929,"title":10364,"body":41930,"date":71,"description":41466,"extension":73,"meta":42111,"navigation":75,"order":670,"path":42112,"seo":42113,"stem":42114,"__hash__":42115},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fstop-bot-runs.md",{"type":8,"value":41931,"toc":42107},[41932,41935,41939,41941,41944,41947,41951,41953,41956,42013,42022,42025,42073,42076,42098,42104],[26,41933,41934],{},"When scheduling bots, or running bots via Webhook, Zapier or Integromat, you may find multiple bots start simultaneously and you need to stop these.",[107,41936,41938],{"id":41937},"stop-bots-using-the-extension","Stop bots using the extension",[112,41940],{},[26,41942,41943],{},"We automatically track remote-running bots and allow you to stop them within the extension.",[26,41945,41946],{},"Any running bot will be indicated from the axiom.ai dashboard, and you can click the \"Stop\" button to stop it at any time.",[107,41948,41950],{"id":41949},"stop-bots-via-api","Stop bots via API",[112,41952],{},[26,41954,41955],{},"When you trigger axiom.ai via the API, you'll be sent a URL to visit, which will contain the following pattern:",[2446,41957,41961],{"className":41958,"code":41959,"language":41960,"meta":67,"style":67},"language-php shiki shiki-themes github-light-default github-dark-default","c-00$POD-v4-proxy.axiom.ai&port=443&password=$PASSWORD\n","php",[145,41962,41963],{"__ignoreMap":67},[1332,41964,41965,41968,41970,41973,41976,41978,41981,41983,41985,41987,41989,41991,41993,41996,41999,42001,42004,42006,42008,42010],{"class":2455,"line":2131},[1332,41966,41967],{"class":2511},"c",[1332,41969,9555],{"class":2507},[1332,41971,41972],{"class":2511},"00",[1332,41974,41975],{"class":2521},"$POD",[1332,41977,9555],{"class":2507},[1332,41979,41980],{"class":2511},"v4",[1332,41982,9555],{"class":2507},[1332,41984,31914],{"class":2511},[1332,41986,148],{"class":2507},[1332,41988,16904],{"class":2511},[1332,41990,148],{"class":2507},[1332,41992,1861],{"class":2511},[1332,41994,41995],{"class":2507},"&",[1332,41997,41998],{"class":2511},"port",[1332,42000,5110],{"class":2507},[1332,42002,42003],{"class":2511},"443",[1332,42005,41995],{"class":2507},[1332,42007,8450],{"class":2511},[1332,42009,5110],{"class":2507},[1332,42011,42012],{"class":2521},"$PASSWORD\n",[26,42014,42015,42016,30861,42018,42021],{},"Note down the ",[145,42017,41975],{},[145,42019,42020],{},"$PASSWORD"," in the URL you are sent.",[26,42023,42024],{},"To stop a bot at the URL you've been given, visit the following URL:",[2446,42026,42028],{"className":41958,"code":42027,"language":41960,"meta":67,"style":67},"lar.axiom.ai\u002Fapi\u002Fv3\u002Fstop?pid=$POD&pw=$PASSWORD\n",[145,42029,42030],{"__ignoreMap":67},[1332,42031,42032,42035,42037,42039,42041,42043,42045,42048,42050,42052,42054,42057,42059,42061,42063,42065,42067,42069,42071],{"class":2455,"line":2131},[1332,42033,42034],{"class":2511},"lar",[1332,42036,148],{"class":2507},[1332,42038,16904],{"class":2511},[1332,42040,148],{"class":2507},[1332,42042,1861],{"class":2511},[1332,42044,122],{"class":2507},[1332,42046,42047],{"class":2511},"api",[1332,42049,122],{"class":2507},[1332,42051,11090],{"class":2511},[1332,42053,122],{"class":2507},[1332,42055,42056],{"class":2511},"stop",[1332,42058,6841],{"class":2507},[1332,42060,11007],{"class":2511},[1332,42062,5110],{"class":2507},[1332,42064,41975],{"class":2521},[1332,42066,41995],{"class":2507},[1332,42068,11010],{"class":2511},[1332,42070,5110],{"class":2507},[1332,42072,42012],{"class":2521},[26,42074,42075],{},"You should see:",[2446,42077,42079],{"className":41958,"code":42078,"language":41960,"meta":67,"style":67},"{\"stopped\":\"$POD\"}\n",[145,42080,42081],{"__ignoreMap":67},[1332,42082,42083,42085,42088,42090,42092,42094,42096],{"class":2455,"line":2131},[1332,42084,5124],{"class":2521},[1332,42086,42087],{"class":2462},"\"stopped\"",[1332,42089,3297],{"class":2521},[1332,42091,5912],{"class":2462},[1332,42093,41975],{"class":2521},[1332,42095,5912],{"class":2462},[1332,42097,2802],{"class":2521},[26,42099,42100,42101,42103],{},"If you are unable to use the methods above to stop your bots, please email ",[659,42102,2364],{"href":2363}," and we'll handle it.",[2819,42105,42106],{},"html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}",{"title":67,"searchDepth":68,"depth":68,"links":42108},[42109,42110],{"id":41937,"depth":670,"text":41938},{"id":41949,"depth":670,"text":41950},{},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fstop-bot-runs",{"title":10364,"description":41466},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fstop-bot-runs","nXJPiTcmZCNM9sU68M6AX-JzWTumEpfptUiCg9w2PXI",{"id":42117,"title":42118,"body":42119,"date":71,"description":42228,"extension":73,"meta":42229,"navigation":75,"order":71,"path":42230,"seo":42231,"stem":42232,"__hash__":42233},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fvps.md","VPS Guide",{"type":8,"value":42120,"toc":42221},[42121,42124,42127,42132,42135,42139,42141,42144,42147,42150,42153,42157,42159,42162,42165,42169,42171,42174,42177,42180,42183,42187,42189,42192,42199,42203,42205,42208,42216],[26,42122,42123],{},"Your VPS is accessible through a web browser via a dedicated URL.",[26,42125,42126],{},"The link to access your VPS is accessible via \"My VPS\" in the axiom.ai extension.",[26,42128,42129],{},[192,42130,42131],{},"Please logout and login again to see this link after we setup your VPS for the first time, or you will not see the link.",[1906,42133],{"src":42134},"\u002Fimg\u002Fmy-vps-extension.png",[107,42136,42138],{"id":42137},"your-vps-is-like-running-axiomai-desktop-on-a-dedicated-machine","Your VPS is like running axiom.ai Desktop on a dedicated machine",[112,42140],{},[26,42142,42143],{},"Your VPS is a private browser that can store sessions and run bots on a schedule (see\nbelow).",[26,42145,42146],{},"From this link you have keyboard and mouse control over your VPS, unlike in regular axiom.ai\ncloud.",[26,42148,42149],{},"When doing this axiom.ai on the VPS will behave just like a desktop application with the bot\nrunning locally on the VPS.",[26,42151,42152],{},"The VPS contains its own version of axio.aim that opens on every page. This is necessary for\nChrome to keep axiom.ai active and to run schedules.",[107,42154,42156],{"id":42155},"vps-reboots","VPS reboots",[112,42158],{},[26,42160,42161],{},"Your VPS will reboot once daily (by default this is at 3 am UTC).",[26,42163,42164],{},"This occurs to prevent problems with Chrome after it is left running for too long.",[107,42166,42168],{"id":42167},"vps-connection-issues","VPS connection issues",[112,42170],{},[26,42172,42173],{},"If your VPS link fails to connect this (usually) means another user is logged in, or you’ve left a\ntab open with the VPS connection active.",[26,42175,42176],{},"This can happen when a company has multiple people using the same axiom.ai account. Multiple people cannot use the VPS simultaneously.",[26,42178,42179],{},"To logout of a VPS session simply close the browser tab in which the VPS is open.",[26,42181,42182],{},"For users with many tabs open finding out where the VPS is being used can be a problem. Please email support if you are unable to connect to your VPS and we can close any active sessions for you to restore access.",[107,42184,42186],{"id":42185},"file-downloads","File downloads",[112,42188],{},[26,42190,42191],{},"The VPS is not subject to same file download restrictions as running on the cloud. Files can be saved to and uploaded from the VPS file system during bot runs.",[26,42193,42194,42195,42198],{},"If you'd like to access files on the VPS outside of bot runs, they are located in ",[145,42196,42197],{},"\u002Fhome\u002Fseluser\u002FDownloads",". You'll need to use a service with a web interface, like Google Drive, Dropbox or similar, to transfer files into and out of the VPS.",[107,42200,42202],{"id":42201},"scheduling-on-the-vps","Scheduling on the VPS",[112,42204],{},[26,42206,42207],{},"Please ensure that:",[1923,42209,42210,42213],{},[189,42211,42212],{},"Your schedule is set to ‘Run on this computer (this labelling is currently confusing - it arises\nbecause the run will be ‘local’ to the VPS).",[189,42214,42215],{},"You are logged into any websites on the VPS that require session access. If you have added login steps to your bot already these can be removed.",[26,42217,42218,42219,148],{},"If you have any issues, please contact ",[659,42220,2225],{"href":1887},{"title":67,"searchDepth":68,"depth":68,"links":42222},[42223,42224,42225,42226,42227],{"id":42137,"depth":670,"text":42138},{"id":42155,"depth":670,"text":42156},{"id":42167,"depth":670,"text":42168},{"id":42185,"depth":670,"text":42186},{"id":42201,"depth":670,"text":42202},"Learn how to use your own VPS server to schedule and run bots remotely.",{},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fvps",{"title":42118,"description":42228},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fvps","t8kbI5mbDpN46Hoh_YWvnU712Rgwj5G8GjsWaq4-1yM",{"id":42235,"title":42236,"body":42237,"date":71,"description":42457,"extension":73,"meta":42458,"navigation":75,"order":1478,"path":42460,"seo":42461,"stem":42462,"__hash__":42463},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fwebhooks\u002Fexport.md","Import data with a webhook",{"type":8,"value":42238,"toc":42448},[42239,42249,42253,42255,42268,42272,42274,42281,42298,42301,42303,42306,42322,42326,42328,42337,42341,42343,42346,42350,42352,42362,42432,42436,42438,42446],[26,42240,42241,42242,42245,42246,148],{},"Use a webhook to trigger an axiom.ai automation from another app and pass data into it at the same time. For background on the API and how to find your API key, see the ",[659,42243,42244],{"href":5562},"API reference",". For a worked example using Zapier forms, see the ",[659,42247,42248],{"href":1185},"Zapier forms guide",[107,42250,42252],{"id":42251},"build-and-test-the-automation","Build and test the automation",[112,42254],{},[26,42256,42257,42258,42261,42262,42265,42266,148],{},"Build the automation with dummy data first, then connect the webhook once it works. To start a new automation, click ",[192,42259,42260],{},"New automation"," then ",[192,42263,42264],{},"Add first step"," on the ",[659,42267,2836],{"href":37734},[107,42269,42271],{"id":42270},"add-a-receive-data-from-another-app-step","Add a Receive data from another app step",[112,42273],{},[26,42275,42276,42277,42280],{},"This step receives data from the webhook and returns a token (",[145,42278,42279],{},"[webhook-data-1]",") that later steps can use.",[1923,42282,42283,42289],{},[189,42284,33186,42285,42288],{},[192,42286,42287],{},"receive",", and add the step.",[189,42290,31969,42291,42294,42295,148],{},[145,42292,42293],{},"Test data"," on and add a 2D array of test data, for example ",[145,42296,42297],{},"[[\"Row 1 colA\", \"Row 1 colB\", \"Row 1 colC\"], [\"Row 2 colA\", \"Row 2 colB\", \"Row 2 colC\"]]",[107,42299,42300],{"id":33019},"Add a Go to page step",[112,42302],{},[26,42304,42305],{},"This step loads the web page you want to interact with.",[1923,42307,42308,42312],{},[189,42309,33186,42310,42288],{},[192,42311,29041],{},[189,42313,1927,42314,42316,42317,42319,42320,15415],{},[192,42315,31794],{}," and select ",[145,42318,42279],{}," to pass a URL in from the ",[192,42321,15414],{},[107,42323,42325],{"id":42324},"build-out-the-rest-of-the-automation","Build out the rest of the automation",[112,42327],{},[26,42329,42330,42331,42333,42334,42336],{},"Add any further steps you need. Click ",[192,42332,31794],{}," and select the ",[145,42335,42279],{}," token to pass values from the webhook into later steps.",[107,42338,42340],{"id":42339},"test-with-dummy-data","Test with dummy data",[112,42342],{},[26,42344,42345],{},"Run the automation to confirm it works end to end with the test data. Failed runs do not count against your usage.",[107,42347,42349],{"id":42348},"set-up-the-post-request","Set up the POST request",[112,42351],{},[26,42353,42354,42355,42357,42358,42361],{},"To trigger the automation from outside axiom.ai, send a ",[145,42356,9878],{}," request to ",[145,42359,42360],{},"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger"," with your API key, the automation's name, and the data as a 2D array.",[2446,42363,42365],{"className":6112,"code":42364,"language":5926,"meta":67,"style":67},"{\n    \"key\": \"1jf8SSbf73gfa\",\n    \"name\": \"My Axiom\",\n    \"data\": [[\"A1\", \"B1\", \"C1\"], [\"A2\", \"B2\", \"C2\"]]\n}\n",[145,42366,42367,42371,42383,42394,42428],{"__ignoreMap":67},[1332,42368,42369],{"class":2455,"line":2131},[1332,42370,6120],{"class":2521},[1332,42372,42373,42376,42378,42381],{"class":2455,"line":670},[1332,42374,42375],{"class":6125},"    \"key\"",[1332,42377,5260],{"class":2521},[1332,42379,42380],{"class":2462},"\"1jf8SSbf73gfa\"",[1332,42382,6024],{"class":2521},[1332,42384,42385,42387,42389,42392],{"class":2455,"line":68},[1332,42386,23545],{"class":6125},[1332,42388,5260],{"class":2521},[1332,42390,42391],{"class":2462},"\"My Axiom\"",[1332,42393,6024],{"class":2521},[1332,42395,42396,42399,42402,42404,42406,42408,42410,42412,42415,42417,42419,42421,42423,42425],{"class":2455,"line":1478},[1332,42397,42398],{"class":6125},"    \"data\"",[1332,42400,42401],{"class":2521},": [[",[1332,42403,12211],{"class":2462},[1332,42405,4468],{"class":2521},[1332,42407,12216],{"class":2462},[1332,42409,4468],{"class":2521},[1332,42411,12221],{"class":2462},[1332,42413,42414],{"class":2521},"], [",[1332,42416,12230],{"class":2462},[1332,42418,4468],{"class":2521},[1332,42420,12235],{"class":2462},[1332,42422,4468],{"class":2521},[1332,42424,12240],{"class":2462},[1332,42426,42427],{"class":2521},"]]\n",[1332,42429,42430],{"class":2455,"line":293},[1332,42431,2802],{"class":2521},[107,42433,42435],{"id":42434},"go-live","Go live",[112,42437],{},[26,42439,42440,42441,42443,42444,148],{},"When the automation is working with dummy data, switch the ",[192,42442,15414],{}," step to live data. For details on rate limits and authentication, see the ",[659,42445,42244],{"href":5562},[2819,42447,8243],{},{"title":67,"searchDepth":68,"depth":68,"links":42449},[42450,42451,42452,42453,42454,42455,42456],{"id":42251,"depth":670,"text":42252},{"id":42270,"depth":670,"text":42271},{"id":33019,"depth":670,"text":42300},{"id":42324,"depth":670,"text":42325},{"id":42339,"depth":670,"text":42340},{"id":42348,"depth":670,"text":42349},{"id":42434,"depth":670,"text":42435},"Externally trigger an axiom.ai automation and pass data into it with a webhook from Zapier, Make, or any other app.",{"metaTitle":42459},"Trigger automations and pass in data with a webhook","\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fwebhooks\u002Fexport",{"title":42236,"description":42457},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fwebhooks\u002Fexport","0jVB9o-TZzjiZiYV74Ry0-ZfLuioUC6YlFtegMQpDtw",{"id":42465,"title":42236,"body":42466,"date":71,"description":42457,"extension":73,"meta":42635,"navigation":75,"order":1478,"path":42636,"seo":42637,"stem":42638,"__hash__":42639},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fwebhooks\u002Fimport.md",{"type":8,"value":42467,"toc":42626},[42468,42474,42476,42478,42486,42488,42490,42494,42506,42508,42510,42512,42526,42528,42530,42536,42538,42540,42542,42544,42546,42552,42614,42616,42618,42624],[26,42469,42241,42470,42245,42472,148],{},[659,42471,42244],{"href":5562},[659,42473,42248],{"href":1185},[107,42475,42252],{"id":42251},[112,42477],{},[26,42479,42257,42480,42261,42482,42265,42484,148],{},[192,42481,42260],{},[192,42483,42264],{},[659,42485,2836],{"href":37734},[107,42487,42271],{"id":42270},[112,42489],{},[26,42491,42276,42492,42280],{},[145,42493,42279],{},[1923,42495,42496,42500],{},[189,42497,33186,42498,42288],{},[192,42499,42287],{},[189,42501,31969,42502,42294,42504,148],{},[145,42503,42293],{},[145,42505,42297],{},[107,42507,42300],{"id":33019},[112,42509],{},[26,42511,42305],{},[1923,42513,42514,42518],{},[189,42515,33186,42516,42288],{},[192,42517,29041],{},[189,42519,1927,42520,42316,42522,42319,42524,15415],{},[192,42521,31794],{},[145,42523,42279],{},[192,42525,15414],{},[107,42527,42325],{"id":42324},[112,42529],{},[26,42531,42330,42532,42333,42534,42336],{},[192,42533,31794],{},[145,42535,42279],{},[107,42537,42340],{"id":42339},[112,42539],{},[26,42541,42345],{},[107,42543,42349],{"id":42348},[112,42545],{},[26,42547,42354,42548,42357,42550,42361],{},[145,42549,9878],{},[145,42551,42360],{},[2446,42553,42554],{"className":6112,"code":42364,"language":5926,"meta":67,"style":67},[145,42555,42556,42560,42570,42580,42610],{"__ignoreMap":67},[1332,42557,42558],{"class":2455,"line":2131},[1332,42559,6120],{"class":2521},[1332,42561,42562,42564,42566,42568],{"class":2455,"line":670},[1332,42563,42375],{"class":6125},[1332,42565,5260],{"class":2521},[1332,42567,42380],{"class":2462},[1332,42569,6024],{"class":2521},[1332,42571,42572,42574,42576,42578],{"class":2455,"line":68},[1332,42573,23545],{"class":6125},[1332,42575,5260],{"class":2521},[1332,42577,42391],{"class":2462},[1332,42579,6024],{"class":2521},[1332,42581,42582,42584,42586,42588,42590,42592,42594,42596,42598,42600,42602,42604,42606,42608],{"class":2455,"line":1478},[1332,42583,42398],{"class":6125},[1332,42585,42401],{"class":2521},[1332,42587,12211],{"class":2462},[1332,42589,4468],{"class":2521},[1332,42591,12216],{"class":2462},[1332,42593,4468],{"class":2521},[1332,42595,12221],{"class":2462},[1332,42597,42414],{"class":2521},[1332,42599,12230],{"class":2462},[1332,42601,4468],{"class":2521},[1332,42603,12235],{"class":2462},[1332,42605,4468],{"class":2521},[1332,42607,12240],{"class":2462},[1332,42609,42427],{"class":2521},[1332,42611,42612],{"class":2455,"line":293},[1332,42613,2802],{"class":2521},[107,42615,42435],{"id":42434},[112,42617],{},[26,42619,42440,42620,42443,42622,148],{},[192,42621,15414],{},[659,42623,42244],{"href":5562},[2819,42625,8243],{},{"title":67,"searchDepth":68,"depth":68,"links":42627},[42628,42629,42630,42631,42632,42633,42634],{"id":42251,"depth":670,"text":42252},{"id":42270,"depth":670,"text":42271},{"id":33019,"depth":670,"text":42300},{"id":42324,"depth":670,"text":42325},{"id":42339,"depth":670,"text":42340},{"id":42348,"depth":670,"text":42349},{"id":42434,"depth":670,"text":42435},{"metaTitle":42459},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fwebhooks\u002Fimport",{"title":42236,"description":42457},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fwebhooks\u002Fimport","xyE_7r6GKYPXPiA5eyGAgNtNc7FpySNszbmE2FEzF_I",{"id":42641,"title":42642,"body":42643,"date":71,"description":37944,"extension":73,"meta":42663,"navigation":75,"order":2637,"path":36601,"seo":42665,"stem":42666,"__hash__":42667},"content\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fwebhooks\u002Findex.md","Send and receive webhooks",{"type":8,"value":42644,"toc":42660},[42645,42654,42658],[26,42646,42647,42648,6205,42650,42653],{},"How to ",[659,42649,4661],{"href":42636},[659,42651,42652],{"href":42460},"export data"," with webhooks.",[107,42655,42657],{"id":42656},"working-with-webhooks","Working with Webhooks",[2218,42659],{},{"title":67,"searchDepth":68,"depth":68,"links":42661},[42662],{"id":42656,"depth":670,"text":42657},{"metaTitle":42664},"Webhooks for browser automation | axiom.ai",{"title":42642,"description":37944},"docs\u002Fno-code-tool\u002Fhow-it-works\u002Fwebhooks\u002Findex","PrqFT_1vhyiabp6bnP3TJ-YRiBRrg0iAJ1rzkS32jik",{"id":42669,"title":42670,"body":42671,"date":71,"description":42712,"extension":73,"meta":42713,"navigation":75,"order":2131,"path":32398,"seo":42714,"stem":42715,"__hash__":42716},"content\u002Fdocs\u002Fno-code-tool\u002Findex.md","No-Code Tool",{"type":8,"value":42672,"toc":42710},[42673,42683],[26,42674,42675,42676,42678,42679,42682],{},"The No-Code Tool is a visual ",[659,42677,10785],{"href":1725}," inside the axiom.ai Chrome extension. Drag and drop steps to record clicks, scrape data, fill forms, and connect to Google Sheets — without writing code. Once your automation works, ",[659,42680,42681],{"href":41023},"schedule it to run"," on a recurring basis or trigger it from another app.",[3075,42684,42685,42688,42691,42694,42697,42701,42705],{"cols":68,"gap":3077},[499,42686],{"link":1725,"shape":502,"text":42687,"title":1731},"Tour the visual Builder and learn how to add, edit, and arrange steps.",[499,42689],{"link":37991,"shape":510,"text":42690,"title":1376},"Understand how steps run, handle data, loop, and connect to the web.",[499,42692],{"link":31364,"shape":502,"text":42693,"title":519},"Real-world examples of what you can automate with axiom.ai.",[499,42695],{"link":425,"shape":510,"text":42696,"title":417},"Connect your automations to AI, Google Sheets, Zapier, webhooks, and more.",[499,42698],{"link":42699,"shape":502,"text":42700,"title":5535},"\u002Fdocs\u002Fno-code-tool\u002Freference","Detailed pages for every step available in the Builder.",[499,42702],{"link":42703,"shape":510,"text":42704,"title":34069},"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting","Fix common errors and debug automations that aren't behaving.",[499,42706],{"link":42707,"shape":502,"text":42708,"title":42709},"\u002Fdocs\u002Fno-code-tool\u002Frelease-notes","See what's new and what's changed in recent versions.","Release notes",{"title":67,"searchDepth":68,"depth":68,"links":42711},[],"Build browser automations visually with the axiom.ai Chrome extension — no coding required.",{},{"title":42670,"description":42712},"docs\u002Fno-code-tool\u002Findex","3PD2MTFUa0mDF_z7tkvyPo7hb5P7eVLvr3ihJXPHB1g",{"id":42718,"title":824,"body":42719,"date":71,"description":43204,"extension":73,"meta":43205,"navigation":75,"order":1478,"path":771,"seo":43207,"stem":43208,"__hash__":43209},"content\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002F2captcha.md",{"type":8,"value":42720,"toc":43199},[42721,42733,42737,42739,42747,42754,42758,42760,42766,42772,42775,42791,42795,42797,42813,42824,43190,43196],[26,42722,42723,42724,42727,42728,42732],{},"axiom.ai integrates with ",[659,42725,824],{"href":35698,"rel":42726},[1218],", a captcha-solving service. Use the ",[659,42729,42730],{"href":21022},[192,42731,21025],{}," step in your automation, and 2Captcha handles the challenge in the background.",[107,42734,42736],{"id":42735},"sign-up-for-2captcha","Sign up for 2Captcha",[112,42738],{},[26,42740,42741,42742,42746],{},"Register for a 2Captcha account at ",[659,42743,42745],{"href":35698,"rel":42744},[1218],"2captcha.com",". 2Captcha only charges for successfully solved captchas, and each captcha typically takes 30–60 seconds to solve since the work is done by humans.",[2093,42748,42749],{},[26,42750,42751,42753],{},[192,42752,2359],{}," The service can fail on custom captcha implementations or when 2Captcha returns an incorrect answer. Plan your automation so it can recover from a failed solve.",[107,42755,42757],{"id":42756},"use-the-solve-captcha-step","Use the Solve Captcha step",[112,42759],{},[26,42761,42762,42763,42765],{},"Add the ",[192,42764,21025],{}," step in your automation. It supports these captcha types:",[186,42767,42768,42770],{},[189,42769,783],{},[189,42771,789],{},[26,42773,42774],{},"If a captcha doesn't appear when the step runs, the step takes no action and the automation continues. This makes it safe to use for captchas that only appear sometimes.",[1923,42776,42777,42783],{},[189,42778,33186,42779,33189,42781,15415],{},[192,42780,35705],{},[192,42782,21025],{},[189,42784,42785,42786,148],{},"Enter your 2Captcha API key, available on the ",[659,42787,42790],{"href":42788,"rel":42789},"https:\u002F\u002F2captcha.com\u002Fsetting",[1218],"2Captcha settings page",[107,42792,42794],{"id":42793},"solve-other-captcha-types-with-javascript","Solve other captcha types with JavaScript",[112,42796],{},[26,42798,42799,42800,42802,42803,42808,42809,15415],{},"For captcha types not supported by the ",[192,42801,21025],{}," step (for example, image-to-text captchas), call the ",[659,42804,42807],{"href":42805,"rel":42806},"https:\u002F\u002F2captcha.com\u002Fapi-docs",[1218],"2Captcha API"," directly from a ",[659,42810,42811],{"href":19048},[192,42812,19051],{},[26,42814,42815,42816,42818,42819,42823],{},"The example below uses the ",[659,42817,26484],{"href":26483}," to screenshot the captcha image, sends the screenshot to 2Captcha as base64, then polls until the solution is ready. The script returns the solved text, which you can pass to an ",[659,42820,42821],{"href":17231},[192,42822,16065],{}," step to fill the field.",[2446,42825,42827],{"className":2498,"code":42826,"language":2500,"meta":67,"style":67},"const apiKey = 'XXX'; \u002F\u002F Your 2Captcha API key\nconst ele = await page.$('#captcha_image'); \u002F\u002F Selector for the captcha image\n\nconst base64 = await ele.screenshot({ encoding: 'base64' });\nconst delay = ms => new Promise(res => setTimeout(res, ms));\n\nlet options = {\n  clientKey: apiKey,\n  task: {\n    type: 'ImageToTextTask',\n    body: base64,\n    case: true,\n  },\n  languagePool: 'en',\n};\n\nlet postData = { method: 'POST', body: JSON.stringify(options) };\nlet response = await fetch('https:\u002F\u002Fapi.2captcha.com\u002FcreateTask', postData);\nlet json = await response.json();\nconst taskId = json.taskId;\n\n\u002F\u002F Poll for the result every 20 seconds.\ndo {\n  await delay(20000);\n  postData = { method: 'POST', body: JSON.stringify({ clientKey: apiKey, taskId }) };\n  response = await fetch('https:\u002F\u002Fapi.2captcha.com\u002FgetTaskResult', postData);\n  json = await response.json();\n} while (json.status && json.status === 'processing');\n\nreturn [[json.solution.text]];\n",[145,42828,42829,42847,42873,42877,42901,42927,42931,42942,42947,42952,42962,42967,42976,42981,42991,42995,42999,43025,43045,43062,43074,43078,43083,43090,43103,43125,43143,43158,43179,43183],{"__ignoreMap":67},[1332,42830,42831,42833,42836,42838,42841,42844],{"class":2455,"line":2131},[1332,42832,2508],{"class":2507},[1332,42834,42835],{"class":2511}," apiKey",[1332,42837,2515],{"class":2507},[1332,42839,42840],{"class":2462}," 'XXX'",[1332,42842,42843],{"class":2521},"; ",[1332,42845,42846],{"class":2609},"\u002F\u002F Your 2Captcha API key\n",[1332,42848,42849,42851,42854,42856,42858,42860,42863,42865,42868,42870],{"class":2455,"line":670},[1332,42850,2508],{"class":2507},[1332,42852,42853],{"class":2511}," ele",[1332,42855,2515],{"class":2507},[1332,42857,2518],{"class":2507},[1332,42859,2679],{"class":2521},[1332,42861,42862],{"class":2525},"$",[1332,42864,1213],{"class":2521},[1332,42866,42867],{"class":2462},"'#captcha_image'",[1332,42869,26599],{"class":2521},[1332,42871,42872],{"class":2609},"\u002F\u002F Selector for the captcha image\n",[1332,42874,42875],{"class":2455,"line":68},[1332,42876,2588],{"emptyLinePlaceholder":75},[1332,42878,42879,42881,42884,42886,42888,42891,42893,42896,42899],{"class":2455,"line":1478},[1332,42880,2508],{"class":2507},[1332,42882,42883],{"class":2511}," base64",[1332,42885,2515],{"class":2507},[1332,42887,2518],{"class":2507},[1332,42889,42890],{"class":2521}," ele.",[1332,42892,4770],{"class":2525},[1332,42894,42895],{"class":2521},"({ encoding: ",[1332,42897,42898],{"class":2462},"'base64'",[1332,42900,3040],{"class":2521},[1332,42902,42903,42905,42907,42909,42911,42913,42915,42917,42919,42921,42923,42925],{"class":2455,"line":293},[1332,42904,2508],{"class":2507},[1332,42906,28202],{"class":2525},[1332,42908,2515],{"class":2507},[1332,42910,28207],{"class":2458},[1332,42912,10271],{"class":2507},[1332,42914,2697],{"class":2507},[1332,42916,2700],{"class":2511},[1332,42918,1213],{"class":2521},[1332,42920,28218],{"class":2458},[1332,42922,10271],{"class":2507},[1332,42924,2715],{"class":2525},[1332,42926,28225],{"class":2521},[1332,42928,42929],{"class":2455,"line":2237},[1332,42930,2588],{"emptyLinePlaceholder":75},[1332,42932,42933,42935,42938,42940],{"class":2455,"line":2623},[1332,42934,26696],{"class":2507},[1332,42936,42937],{"class":2521}," options ",[1332,42939,5110],{"class":2507},[1332,42941,2648],{"class":2521},[1332,42943,42944],{"class":2455,"line":2637},[1332,42945,42946],{"class":2521},"  clientKey: apiKey,\n",[1332,42948,42949],{"class":2455,"line":2642},[1332,42950,42951],{"class":2521},"  task: {\n",[1332,42953,42954,42957,42960],{"class":2455,"line":2651},[1332,42955,42956],{"class":2521},"    type: ",[1332,42958,42959],{"class":2462},"'ImageToTextTask'",[1332,42961,6024],{"class":2521},[1332,42963,42964],{"class":2455,"line":2673},[1332,42965,42966],{"class":2521},"    body: base64,\n",[1332,42968,42969,42972,42974],{"class":2455,"line":2692},[1332,42970,42971],{"class":2521},"    case: ",[1332,42973,1548],{"class":2511},[1332,42975,6024],{"class":2521},[1332,42977,42978],{"class":2455,"line":2727},[1332,42979,42980],{"class":2521},"  },\n",[1332,42982,42983,42986,42989],{"class":2455,"line":2739},[1332,42984,42985],{"class":2521},"  languagePool: ",[1332,42987,42988],{"class":2462},"'en'",[1332,42990,6024],{"class":2521},[1332,42992,42993],{"class":2455,"line":2750},[1332,42994,3816],{"class":2521},[1332,42996,42997],{"class":2455,"line":2765},[1332,42998,2588],{"emptyLinePlaceholder":75},[1332,43000,43001,43003,43006,43008,43011,43013,43016,43018,43020,43022],{"class":2455,"line":2777},[1332,43002,26696],{"class":2507},[1332,43004,43005],{"class":2521}," postData ",[1332,43007,5110],{"class":2507},[1332,43009,43010],{"class":2521}," { method: ",[1332,43012,9017],{"class":2462},[1332,43014,43015],{"class":2521},", body: ",[1332,43017,6539],{"class":2511},[1332,43019,148],{"class":2521},[1332,43021,6544],{"class":2525},[1332,43023,43024],{"class":2521},"(options) };\n",[1332,43026,43027,43029,43031,43033,43035,43037,43039,43042],{"class":2455,"line":2788},[1332,43028,26696],{"class":2507},[1332,43030,38813],{"class":2521},[1332,43032,5110],{"class":2507},[1332,43034,2518],{"class":2507},[1332,43036,6487],{"class":2525},[1332,43038,1213],{"class":2521},[1332,43040,43041],{"class":2462},"'https:\u002F\u002Fapi.2captcha.com\u002FcreateTask'",[1332,43043,43044],{"class":2521},", postData);\n",[1332,43046,43047,43049,43052,43054,43056,43058,43060],{"class":2455,"line":2799},[1332,43048,26696],{"class":2507},[1332,43050,43051],{"class":2521}," json ",[1332,43053,5110],{"class":2507},[1332,43055,2518],{"class":2507},[1332,43057,38887],{"class":2521},[1332,43059,5926],{"class":2525},[1332,43061,2670],{"class":2521},[1332,43063,43064,43066,43069,43071],{"class":2455,"line":3751},[1332,43065,2508],{"class":2507},[1332,43067,43068],{"class":2511}," taskId",[1332,43070,2515],{"class":2507},[1332,43072,43073],{"class":2521}," json.taskId;\n",[1332,43075,43076],{"class":2455,"line":3762},[1332,43077,2588],{"emptyLinePlaceholder":75},[1332,43079,43080],{"class":2455,"line":3777},[1332,43081,43082],{"class":2609},"\u002F\u002F Poll for the result every 20 seconds.\n",[1332,43084,43085,43088],{"class":2455,"line":3787},[1332,43086,43087],{"class":2507},"do",[1332,43089,2648],{"class":2521},[1332,43091,43092,43094,43096,43098,43101],{"class":2455,"line":3796},[1332,43093,3389],{"class":2507},[1332,43095,28202],{"class":2525},[1332,43097,1213],{"class":2521},[1332,43099,43100],{"class":2511},"20000",[1332,43102,2583],{"class":2521},[1332,43104,43105,43108,43110,43112,43114,43116,43118,43120,43122],{"class":2455,"line":3807},[1332,43106,43107],{"class":2521},"  postData ",[1332,43109,5110],{"class":2507},[1332,43111,43010],{"class":2521},[1332,43113,9017],{"class":2462},[1332,43115,43015],{"class":2521},[1332,43117,6539],{"class":2511},[1332,43119,148],{"class":2521},[1332,43121,6544],{"class":2525},[1332,43123,43124],{"class":2521},"({ clientKey: apiKey, taskId }) };\n",[1332,43126,43127,43130,43132,43134,43136,43138,43141],{"class":2455,"line":3813},[1332,43128,43129],{"class":2521},"  response ",[1332,43131,5110],{"class":2507},[1332,43133,2518],{"class":2507},[1332,43135,6487],{"class":2525},[1332,43137,1213],{"class":2521},[1332,43139,43140],{"class":2462},"'https:\u002F\u002Fapi.2captcha.com\u002FgetTaskResult'",[1332,43142,43044],{"class":2521},[1332,43144,43145,43148,43150,43152,43154,43156],{"class":2455,"line":3819},[1332,43146,43147],{"class":2521},"  json ",[1332,43149,5110],{"class":2507},[1332,43151,2518],{"class":2507},[1332,43153,38887],{"class":2521},[1332,43155,5926],{"class":2525},[1332,43157,2670],{"class":2521},[1332,43159,43160,43162,43164,43167,43169,43172,43174,43177],{"class":2455,"line":3824},[1332,43161,2768],{"class":2521},[1332,43163,14422],{"class":2507},[1332,43165,43166],{"class":2521}," (json.status ",[1332,43168,14570],{"class":2507},[1332,43170,43171],{"class":2521}," json.status ",[1332,43173,9291],{"class":2507},[1332,43175,43176],{"class":2462}," 'processing'",[1332,43178,2583],{"class":2521},[1332,43180,43181],{"class":2455,"line":6027},[1332,43182,2588],{"emptyLinePlaceholder":75},[1332,43184,43185,43187],{"class":2455,"line":6051},[1332,43186,12963],{"class":2507},[1332,43188,43189],{"class":2521}," [[json.solution.text]];\n",[26,43191,43192,43195],{},[659,43193,42736],{"href":35698,"rel":43194},[1218]," to get started.",[2819,43197,43198],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":67,"searchDepth":68,"depth":68,"links":43200},[43201,43202,43203],{"id":42735,"depth":670,"text":42736},{"id":42756,"depth":670,"text":42757},{"id":42793,"depth":670,"text":42794},"Use the Solve Captcha step to outsource reCAPTCHA challenges to 2Captcha, with optional support for other captcha types via JavaScript.",{"metaTitle":43206},"Solve captchas in an automation with the 2Captcha integration",{"title":824,"description":43204},"docs\u002Fno-code-tool\u002Fintegrations\u002F2captcha","BBIaGl1gwQ3KyfiVt7GP64n5jgNJv1H3xQ7eT1t7DmE",{"id":43211,"title":43212,"body":43213,"date":71,"description":43449,"extension":73,"meta":43450,"navigation":75,"order":68,"path":26084,"seo":43452,"stem":43453,"__hash__":43454},"content\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fchatgpt.md","ChatGPT",{"type":8,"value":43214,"toc":43442},[43215,43224,43230,43234,43236,43275,43277,43279,43294,43298,43300,43303,43345,43356,43360,43362,43365,43399,43403,43405,43410,43439],[26,43216,43217,43218,43223],{},"ChatGPT is one of the LLM providers supported by the ",[659,43219,43221],{"href":43220},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fintegrate-ai",[192,43222,19124],{}," step. Drop the step into any automation, choose OpenAI as the provider, and either generate text or extract structured fields from data flowing through earlier steps. You supply your own OpenAI API key, so billing happens directly on your OpenAI account.",[26,43225,43226,43227,43229],{},"For step usage and how to write extract or generate prompts, see ",[659,43228,19124],{"href":38155},". The rest of this page covers OpenAI-specific setup and gotchas.",[107,43231,43233],{"id":43232},"sign-up-and-get-an-api-key","Sign up and get an API key",[112,43235],{},[1923,43237,43238,43247,43254,43266],{},[189,43239,43240,43241,43246],{},"Create an account at ",[659,43242,43245],{"href":43243,"rel":43244},"https:\u002F\u002Fplatform.openai.com\u002Fsignup",[1218],"platform.openai.com"," if you don't have one.",[189,43248,43249,43250,43253],{},"Add a payment method in ",[192,43251,43252],{},"Billing",". OpenAI's API requires a positive balance separate from a ChatGPT Plus subscription.",[189,43255,4245,43256,43261,43262,43265],{},[659,43257,43260],{"href":43258,"rel":43259},"https:\u002F\u002Fplatform.openai.com\u002Faccount\u002Fapi-keys",[1218],"API keys page"," and click ",[192,43263,43264],{},"Create new secret key",". Copy the key once; OpenAI doesn't show it again.",[189,43267,43268,43269,43271,43272,43274],{},"Paste the key into the ",[145,43270,4175],{}," field of the ",[192,43273,19124],{}," step in your automation.",[107,43276,38035],{"id":38034},[112,43278],{},[26,43280,2273,43281,43283,43284,43287,43288,43293],{},[192,43282,19124],{}," step lets you pick the OpenAI model in the ",[145,43285,43286],{},"Model"," field. Use a smaller, cheaper model for high-volume extraction; use a larger one for nuanced generation. See ",[659,43289,43292],{"href":43290,"rel":43291},"https:\u002F\u002Fopenai.com\u002Fapi\u002Fpricing\u002F",[1218],"OpenAI's pricing page"," for current per-token costs.",[107,43295,43297],{"id":43296},"what-to-use-it-for","What to use it for",[112,43299],{},[26,43301,43302],{},"Common patterns when OpenAI is the provider:",[186,43304,43305,43324,43339],{},[189,43306,43307,43310,43311,2344,43316,43320,43321,43323],{},[192,43308,43309],{},"Extract structured data"," from messy scraped HTML. Pair with ",[659,43312,43314],{"href":43313},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fget-data-from-url",[192,43315,32839],{},[659,43317,43318],{"href":25942},[192,43319,15414],{},", then ask ",[192,43322,19124],{}," for the fields you want as a comma-separated list.",[189,43325,43326,43329,43330,43332,43333,43338],{},[192,43327,43328],{},"Generate replies, emails, or DMs"," using data from earlier steps. Insert tokens into the prompt with ",[192,43331,31794],{},", then pass the output to ",[659,43334,43336],{"href":43335},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsend-an-email",[192,43337,22127],{}," or a posting step.",[189,43340,43341,43344],{},[192,43342,43343],{},"Pull metrics out of reporting sites"," that have no API by scraping the page text and asking ChatGPT to isolate specific values.",[26,43346,43347,43348,30861,43352,148],{},"For a worked example, try the ",[659,43349,43351],{"href":43350},"\u002Fguides\u002Fchatgpt-web-scraper","ChatGPT web scraper template",[659,43353,43355],{"href":43354},"\u002Fblog\u002Fchatgpt-web-scraping","related blog post",[107,43357,43359],{"id":43358},"limit-api-spending","Limit API spending",[112,43361],{},[26,43363,43364],{},"OpenAI doesn't support per-user or per-API-key spending limits. To keep usage isolated and predictable:",[186,43366,43367,43373,43384,43390],{},[189,43368,43369,43372],{},[192,43370,43371],{},"Create a dedicated OpenAI account just for axiom.ai"," so your automation's usage is separated from any other apps using the API.",[189,43374,43375,7176,43378,43383],{},[192,43376,43377],{},"Set a monthly budget",[659,43379,43382],{"href":43380,"rel":43381},"https:\u002F\u002Fplatform.openai.com\u002Faccount\u002Fbilling\u002Flimits",[1218],"OpenAI's billing settings"," so the API stops responding when the cap is hit.",[189,43385,43386,43389],{},[192,43387,43388],{},"Rotate keys periodically"," and revoke anything you're no longer using.",[189,43391,43392,43393,43398],{},"Follow ",[659,43394,43397],{"href":43395,"rel":43396},"https:\u002F\u002Fhelp.openai.com\u002Fen\u002Farticles\u002F8304786-how-can-i-keep-my-openai-accounts-secure",[1218],"OpenAI's security guidance"," for the latest best practices.",[107,43400,43402],{"id":43401},"other-llm-providers","Other LLM providers",[112,43404],{},[26,43406,2273,43407,43409],{},[192,43408,19124],{}," step also supports:",[186,43411,43412,43419,43426,43433],{},[189,43413,43414,43418],{},[659,43415,43417],{"href":43416},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fclaude","Claude"," (Anthropic)",[189,43420,43421,43425],{},[659,43422,43424],{"href":43423},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fgemini","Gemini"," (Google)",[189,43427,43428,43432],{},[659,43429,43431],{"href":43430},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fsonar","Sonar"," (Perplexity)",[189,43434,43435],{},[659,43436,43438],{"href":43437},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fdeepseek","DeepSeek",[26,43440,43441],{},"The step behaves the same way; only the model list and API key change.",{"title":67,"searchDepth":68,"depth":68,"links":43443},[43444,43445,43446,43447,43448],{"id":43232,"depth":670,"text":43233},{"id":38034,"depth":670,"text":38035},{"id":43296,"depth":670,"text":43297},{"id":43358,"depth":670,"text":43359},{"id":43401,"depth":670,"text":43402},"Connect ChatGPT (OpenAI) to your axiom.ai automations through the Integrate AI step. Generate text or extract structured data using your own OpenAI API key.",{"metaTitle":43451},"Use OpenAI's ChatGPT with axiom.ai through the Integrate AI step",{"title":43212,"description":43449},"docs\u002Fno-code-tool\u002Fintegrations\u002Fchatgpt","Aancb2LCo3hn9X_I-gfa5zV2fpP7XU_kCInOmQYCFto",{"id":43456,"title":43417,"body":43457,"date":71,"description":43640,"extension":73,"meta":43641,"navigation":75,"order":2651,"path":43416,"seo":43643,"stem":43644,"__hash__":43645},"content\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fclaude.md",{"type":8,"value":43458,"toc":43633},[43459,43467,43472,43474,43476,43508,43510,43512,43532,43536,43538,43541,43561,43563,43574,43576,43578,43581,43604,43606,43608,43612,43631],[26,43460,43461,43462,43466],{},"Claude is one of the LLM providers supported by the ",[659,43463,43464],{"href":43220},[192,43465,19124],{}," step. Drop the step into any automation, choose Claude as the provider, and either generate text or extract structured fields from data flowing through earlier steps. You supply your own Anthropic API key, so billing happens directly on your Anthropic account.",[26,43468,43226,43469,43471],{},[659,43470,19124],{"href":38155},". The rest of this page covers Claude-specific setup and gotchas.",[107,43473,43233],{"id":43232},[112,43475],{},[1923,43477,43478,43485,43491,43502],{},[189,43479,43240,43480,148],{},[659,43481,43484],{"href":43482,"rel":43483},"https:\u002F\u002Fconsole.anthropic.com",[1218],"console.anthropic.com",[189,43486,43249,43487,43490],{},[192,43488,43489],{},"Plans & billing",". API access is separate from a claude.ai chat subscription.",[189,43492,3528,43493,43261,43498,43501],{},[659,43494,43497],{"href":43495,"rel":43496},"https:\u002F\u002Fconsole.anthropic.com\u002Fsettings\u002Fkeys",[1218],"API Keys",[192,43499,43500],{},"Create Key",". Copy the key once; Anthropic doesn't show it again.",[189,43503,43268,43504,43271,43506,43274],{},[145,43505,4175],{},[192,43507,19124],{},[107,43509,38035],{"id":38034},[112,43511],{},[26,43513,43514,43515,43517,43518,43520,43521,43526,43527,43293],{},"Pick a Claude model in the ",[145,43516,43286],{}," field of ",[192,43519,19124],{},". Anthropic publishes the current model lineup (Opus, Sonnet, Haiku) on ",[659,43522,43525],{"href":43523,"rel":43524},"https:\u002F\u002Fdocs.anthropic.com\u002Fen\u002Fdocs\u002Fabout-claude\u002Fmodels",[1218],"their models page",". Use Haiku for fast, cheap, high-volume extraction; use Sonnet or Opus for complex reasoning or longer generation. See ",[659,43528,43531],{"href":43529,"rel":43530},"https:\u002F\u002Fwww.anthropic.com\u002Fpricing#api",[1218],"Anthropic's pricing",[107,43533,43535],{"id":43534},"what-claude-is-good-at","What Claude is good at",[112,43537],{},[26,43539,43540],{},"Claude tends to outperform other models when the automation needs to:",[186,43542,43543,43549,43555],{},[189,43544,43545,43548],{},[192,43546,43547],{},"Follow long, precise instructions"," without drifting. Strict extraction schemas hold up well.",[189,43550,43551,43554],{},[192,43552,43553],{},"Process long inputs"," like full HTML pages or long PDFs (Claude has a large context window).",[189,43556,43557,43560],{},[192,43558,43559],{},"Refuse to invent data"," the source doesn't contain, which makes it a safer pick for extraction tasks where hallucinated fields would corrupt downstream data.",[26,43562,15626],{},[186,43564,43565,43568,43571],{},[189,43566,43567],{},"Extract structured fields from scraped HTML or PDF text.",[189,43569,43570],{},"Summarise long pages or reports into a fixed format.",[189,43572,43573],{},"Draft contextual replies in customer-service or outreach workflows.",[107,43575,43359],{"id":43358},[112,43577],{},[26,43579,43580],{},"Anthropic exposes spending controls directly in the console:",[186,43582,43583,43593,43599],{},[189,43584,43585,7176,43588,43592],{},[192,43586,43587],{},"Set a monthly limit",[659,43589,43489],{"href":43590,"rel":43591},"https:\u002F\u002Fconsole.anthropic.com\u002Fsettings\u002Fplans",[1218],". The API stops responding when the cap is hit.",[189,43594,43595,43598],{},[192,43596,43597],{},"Create a dedicated workspace"," for axiom.ai usage to keep its spend isolated from other apps.",[189,43600,43601,43603],{},[192,43602,43388],{}," and revoke any you're no longer using.",[107,43605,43402],{"id":43401},[112,43607],{},[26,43609,2273,43610,43409],{},[192,43611,19124],{},[186,43613,43614,43619,43623,43627],{},[189,43615,43616,43618],{},[659,43617,43212],{"href":26084}," (OpenAI)",[189,43620,43621,43425],{},[659,43622,43424],{"href":43423},[189,43624,43625,43432],{},[659,43626,43431],{"href":43430},[189,43628,43629],{},[659,43630,43438],{"href":43437},[26,43632,43441],{},{"title":67,"searchDepth":68,"depth":68,"links":43634},[43635,43636,43637,43638,43639],{"id":43232,"depth":670,"text":43233},{"id":38034,"depth":670,"text":38035},{"id":43534,"depth":670,"text":43535},{"id":43358,"depth":670,"text":43359},{"id":43401,"depth":670,"text":43402},"Connect Claude (Anthropic) to your axiom.ai automations through the Integrate AI step. Generate text or extract structured data using your own Anthropic API key.",{"metaTitle":43642},"Use Anthropic's Claude with axiom.ai through the Integrate AI step",{"title":43417,"description":43640},"docs\u002Fno-code-tool\u002Fintegrations\u002Fclaude","R7rFdia1GCpsCRgPm5RBJd8JXFf6nVOw4qCkMKBMH8g",{"id":43647,"title":43438,"body":43648,"date":71,"description":43852,"extension":73,"meta":43853,"navigation":75,"order":2727,"path":43437,"seo":43855,"stem":43856,"__hash__":43857},"content\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fdeepseek.md",{"type":8,"value":43649,"toc":43844},[43650,43658,43663,43665,43667,43698,43700,43702,43710,43724,43735,43739,43741,43744,43764,43766,43777,43781,43783,43786,43788,43790,43793,43816,43818,43820,43824,43842],[26,43651,43652,43653,43657],{},"DeepSeek is one of the LLM providers supported by the ",[659,43654,43655],{"href":43220},[192,43656,19124],{}," step. Drop the step into any automation, choose DeepSeek as the provider, and either generate text or extract structured fields from data flowing through earlier steps. You supply your own DeepSeek API key, so billing happens directly on your DeepSeek account.",[26,43659,43226,43660,43662],{},[659,43661,19124],{"href":38155},". The rest of this page covers DeepSeek-specific setup and gotchas.",[107,43664,43233],{"id":43232},[112,43666],{},[1923,43668,43669,43676,43681,43692],{},[189,43670,43240,43671,148],{},[659,43672,43675],{"href":43673,"rel":43674},"https:\u002F\u002Fplatform.deepseek.com",[1218],"platform.deepseek.com",[189,43677,3528,43678,43680],{},[192,43679,43252],{}," and top up the account balance. DeepSeek bills against a prepaid balance.",[189,43682,8138,43683,43261,43688,43691],{},[659,43684,43687],{"href":43685,"rel":43686},"https:\u002F\u002Fplatform.deepseek.com\u002Fapi_keys",[1218],"API keys",[192,43689,43690],{},"Create new API key",". Copy the key once; DeepSeek doesn't show it again.",[189,43693,43268,43694,43271,43696,43274],{},[145,43695,4175],{},[192,43697,19124],{},[107,43699,38035],{"id":38034},[112,43701],{},[26,43703,43704,43705,43517,43707,43709],{},"Pick a DeepSeek model in the ",[145,43706,43286],{},[192,43708,19124],{},". The two main families are:",[186,43711,43712,43718],{},[189,43713,43714,43717],{},[192,43715,43716],{},"DeepSeek-V3"," for general chat, generation, and extraction tasks.",[189,43719,43720,43723],{},[192,43721,43722],{},"DeepSeek-R1"," for tasks that benefit from explicit step-by-step reasoning, such as complex extraction schemas or logic-heavy decisions.",[26,43725,6104,43726,43731,43732,43734],{},[659,43727,43730],{"href":43728,"rel":43729},"https:\u002F\u002Fapi-docs.deepseek.com\u002Fquick_start\u002Fpricing",[1218],"DeepSeek's pricing"," for current per-token costs. DeepSeek is typically the cheapest provider supported by ",[192,43733,19124],{},", often by an order of magnitude.",[107,43736,43738],{"id":43737},"what-deepseek-is-good-at","What DeepSeek is good at",[112,43740],{},[26,43742,43743],{},"DeepSeek's strengths inside an axiom.ai automation:",[186,43745,43746,43752,43758],{},[189,43747,43748,43751],{},[192,43749,43750],{},"Very low per-token cost",", useful for high-volume extraction or generation where the same prompt runs hundreds or thousands of times.",[189,43753,43754,43757],{},[192,43755,43756],{},"Reasoning models"," (R1 family) when an automation needs to follow a multi-step decision tree rather than a single instruction.",[189,43759,43760,43763],{},[192,43761,43762],{},"OpenAI-compatible API surface"," so models behave predictably if you've used ChatGPT before.",[26,43765,15626],{},[186,43767,43768,43771,43774],{},[189,43769,43770],{},"High-volume scraped-page extraction where ChatGPT or Claude would be too expensive per run.",[189,43772,43773],{},"Bulk content generation (product descriptions, ad variants, email drafts) at a scale that would push other providers' bills up.",[189,43775,43776],{},"Reasoning over structured data with R1 when a single-shot prompt won't reliably produce the right answer.",[107,43778,43780],{"id":43779},"data-residency-note","Data residency note",[112,43782],{},[26,43784,43785],{},"DeepSeek is operated from China and routes API traffic to servers there. If your automation handles personal data, customer data, or anything subject to a data residency requirement, confirm DeepSeek's terms fit your needs before sending production traffic. Anonymise or scrub sensitive fields where possible.",[107,43787,43359],{"id":43358},[112,43789],{},[26,43791,43792],{},"DeepSeek bills against a prepaid balance, which is itself a built-in spending cap:",[186,43794,43795,43801,43812],{},[189,43796,43797,43800],{},[192,43798,43799],{},"Only top up the balance you're willing to spend."," When the balance hits zero, the API stops responding.",[189,43802,43803,42265,43806,43811],{},[192,43804,43805],{},"Watch usage",[659,43807,43810],{"href":43808,"rel":43809},"https:\u002F\u002Fplatform.deepseek.com\u002Fusage",[1218],"usage page"," and refill in small increments to keep a hard cap.",[189,43813,43814,43603],{},[192,43815,43388],{},[107,43817,43402],{"id":43401},[112,43819],{},[26,43821,2273,43822,43409],{},[192,43823,19124],{},[186,43825,43826,43830,43834,43838],{},[189,43827,43828,43618],{},[659,43829,43212],{"href":26084},[189,43831,43832,43418],{},[659,43833,43417],{"href":43416},[189,43835,43836,43425],{},[659,43837,43424],{"href":43423},[189,43839,43840,43432],{},[659,43841,43431],{"href":43430},[26,43843,43441],{},{"title":67,"searchDepth":68,"depth":68,"links":43845},[43846,43847,43848,43849,43850,43851],{"id":43232,"depth":670,"text":43233},{"id":38034,"depth":670,"text":38035},{"id":43737,"depth":670,"text":43738},{"id":43779,"depth":670,"text":43780},{"id":43358,"depth":670,"text":43359},{"id":43401,"depth":670,"text":43402},"Connect DeepSeek to your axiom.ai automations through the Integrate AI step. Generate text or extract structured data using your own DeepSeek API key.",{"metaTitle":43854},"Use DeepSeek with axiom.ai through the Integrate AI step",{"title":43438,"description":43852},"docs\u002Fno-code-tool\u002Fintegrations\u002Fdeepseek","Ceh8OOA7jd_PU0FbibZVh-P90m9v_4FoLmYQUjAN8-g",{"id":43859,"title":43860,"body":43861,"date":71,"description":43982,"extension":73,"meta":43983,"navigation":75,"order":2637,"path":894,"seo":43985,"stem":43986,"__hash__":43987},"content\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fexcel.md","Microsoft Excel",{"type":8,"value":43862,"toc":43976},[43863,43866,43870,43872,43879,43885,43907,43911,43913,43919,43937,43941,43943,43946,43964,43968,43970,43973],[26,43864,43865],{},"Connect Microsoft Excel to axiom.ai to read data into your automations and write results back. The integration uses Microsoft's Graph API and currently requires a work or school Microsoft account.",[107,43867,43869],{"id":43868},"connect-a-microsoft-account","Connect a Microsoft account",[112,43871],{},[2093,43873,43874],{},[26,43875,43876,43878],{},[192,43877,25889],{}," A work or school Microsoft account is required. Microsoft's API restricts file availability for personal Microsoft accounts.",[26,43880,43881],{},[1906,43882],{"alt":43883,"src":43884},"The Credentials and API key screen in axiom.ai with the Connect Microsoft button highlighted","\u002Fdocs\u002Ftutorials\u002Fcredentials-and-api-key-screen.png",[1923,43886,43887,43890,43895,43904],{},[189,43888,43889],{},"Open axiom.ai.",[189,43891,43892,43893,148],{},"Navigate to ",[192,43894,4253],{},[189,43896,1934,43897,43900,43901,148],{},[192,43898,43899],{},"Microsoft"," section, click ",[192,43902,43903],{},"Connect Microsoft",[189,43905,43906],{},"Follow the on-screen instructions to sign in.",[107,43908,43910],{"id":43909},"disconnect-a-microsoft-account","Disconnect a Microsoft account",[112,43912],{},[26,43914,43915],{},[1906,43916],{"alt":43917,"src":43918},"The Credentials and API key screen with the Disconnect Microsoft button highlighted","\u002Fdocs\u002Ftutorials\u002Fdisconnect-microsoft.png",[1923,43920,43921,43923,43927,43934],{},[189,43922,43889],{},[189,43924,43892,43925,148],{},[192,43926,4253],{},[189,43928,1934,43929,43900,43931,148],{},[192,43930,43899],{},[192,43932,43933],{},"Disconnect Microsoft",[189,43935,43936],{},"Follow the on-screen instructions.",[107,43938,43940],{"id":43939},"excel-steps","Excel steps",[112,43942],{},[26,43944,43945],{},"Two steps are available once Microsoft is connected:",[186,43947,43948,43956],{},[189,43949,43950],{},[659,43951,43953],{"href":43952},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-data-from-excel",[192,43954,43955],{},"Read data from Excel",[189,43957,43958],{},[659,43959,43961],{"href":43960},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-data-to-an-excel-sheet",[192,43962,43963],{},"Write data to an Excel sheet",[107,43965,43967],{"id":43966},"microsoft-token-expiry","Microsoft token expiry",[112,43969],{},[26,43971,43972],{},"When you connect Microsoft to axiom.ai, axiom.ai stores a token from Microsoft instead of your password. Microsoft sometimes expires these tokens with no notice.",[26,43974,43975],{},"This is controlled entirely by Microsoft. The most common pattern we've seen is high-frequency reads and writes triggering the expiry. If your token expires often, consider running the automation less frequently.",{"title":67,"searchDepth":68,"depth":68,"links":43977},[43978,43979,43980,43981],{"id":43868,"depth":670,"text":43869},{"id":43909,"depth":670,"text":43910},{"id":43939,"depth":670,"text":43940},{"id":43966,"depth":670,"text":43967},"Connect a Microsoft work or school account to axiom.ai to read data from and write data to Excel sheets in your automations.",{"metaTitle":43984},"Read and write Microsoft Excel sheets in axiom.ai",{"title":43860,"description":43982},"docs\u002Fno-code-tool\u002Fintegrations\u002Fexcel","ks96RQ31nu85kAroxu9d26-Xrot2sHV-CPCWFTEqaGw",{"id":43989,"title":43424,"body":43990,"date":71,"description":44186,"extension":73,"meta":44187,"navigation":75,"order":2673,"path":43423,"seo":44189,"stem":44190,"__hash__":44191},"content\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fgemini.md",{"type":8,"value":43991,"toc":44179},[43992,44000,44005,44007,44009,44039,44041,44043,44062,44066,44068,44071,44091,44093,44116,44118,44120,44123,44151,44153,44155,44159,44177],[26,43993,43994,43995,43999],{},"Gemini is one of the LLM providers supported by the ",[659,43996,43997],{"href":43220},[192,43998,19124],{}," step. Drop the step into any automation, choose Gemini as the provider, and either generate text or extract structured fields from data flowing through earlier steps. You supply your own Google AI Studio API key, so billing happens directly on your Google account.",[26,44001,43226,44002,44004],{},[659,44003,19124],{"href":38155},". The rest of this page covers Gemini-specific setup and gotchas.",[107,44006,43233],{"id":43232},[112,44008],{},[1923,44010,44011,44019,44027,44030,44033],{},[189,44012,8138,44013,44018],{},[659,44014,44017],{"href":44015,"rel":44016},"https:\u002F\u002Faistudio.google.com\u002F",[1218],"Google AI Studio"," and sign in with a Google account.",[189,44020,4245,44021,43261,44025,148],{},[659,44022,43260],{"href":44023,"rel":44024},"https:\u002F\u002Faistudio.google.com\u002Fapp\u002Fapikey",[1218],[192,44026,4180],{},[189,44028,44029],{},"Choose an existing Google Cloud project or create a new one to attach the key to.",[189,44031,44032],{},"Copy the key. Google AI Studio lets you view existing keys later, but treat them as secrets and don't share or commit them.",[189,44034,43268,44035,43271,44037,43274],{},[145,44036,4175],{},[192,44038,19124],{},[107,44040,38035],{"id":38034},[112,44042],{},[26,44044,44045,44046,43517,44048,44050,44051,44056,44057,43293],{},"Pick a Gemini model in the ",[145,44047,43286],{},[192,44049,19124],{},". Google publishes the current model lineup (Pro, Flash, and variants) on the ",[659,44052,44055],{"href":44053,"rel":44054},"https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fmodels\u002Fgemini",[1218],"Gemini models page",". Use Flash for fast, cheap, high-volume work; use Pro for harder reasoning or longer outputs. See ",[659,44058,44061],{"href":44059,"rel":44060},"https:\u002F\u002Fai.google.dev\u002Fpricing",[1218],"Gemini API pricing",[107,44063,44065],{"id":44064},"what-gemini-is-good-at","What Gemini is good at",[112,44067],{},[26,44069,44070],{},"Gemini's strengths inside an axiom.ai automation:",[186,44072,44073,44079,44085],{},[189,44074,44075,44078],{},[192,44076,44077],{},"Free tier for development."," Google AI Studio includes a generous free tier on most models, useful for prototyping before turning on paid quotas.",[189,44080,44081,44084],{},[192,44082,44083],{},"Long context."," The Pro models support very large inputs, useful for long scraped HTML or PDF text.",[189,44086,44087,44090],{},[192,44088,44089],{},"Multimodal input"," when paired with a screenshot or image from an earlier step.",[26,44092,15626],{},[186,44094,44095,44098,44113],{},[189,44096,44097],{},"High-volume extraction from scraped pages where cost matters and Flash is fast enough.",[189,44099,44100,44101,2344,44107,148],{},"Summarising long documents pulled in by ",[659,44102,44104],{"href":44103},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-local-file",[192,44105,44106],{},"Read local file",[659,44108,44110],{"href":44109},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-file-from-google-drive",[192,44111,44112],{},"Read file from Google Drive",[189,44114,44115],{},"Drafting content where you want a different tone or style than ChatGPT or Claude produce.",[107,44117,43359],{"id":43358},[112,44119],{},[26,44121,44122],{},"Gemini billing runs through Google Cloud, so the standard Google Cloud controls apply:",[186,44124,44125,44136,44142],{},[189,44126,44127,44130,44131,148],{},[192,44128,44129],{},"Set a budget"," on the Google Cloud project the API key is attached to. See ",[659,44132,44135],{"href":44133,"rel":44134},"https:\u002F\u002Fcloud.google.com\u002Fbilling\u002Fdocs\u002Fhow-to\u002Fbudgets",[1218],"Cloud billing budgets",[189,44137,44138,44141],{},[192,44139,44140],{},"Stay on the free tier"," during development by capping usage well below the free-tier limits.",[189,44143,44144,7176,44146,44150],{},[192,44145,43388],{},[659,44147,44149],{"href":44023,"rel":44148},[1218],"AI Studio"," and delete unused ones.",[107,44152,43402],{"id":43401},[112,44154],{},[26,44156,2273,44157,43409],{},[192,44158,19124],{},[186,44160,44161,44165,44169,44173],{},[189,44162,44163,43618],{},[659,44164,43212],{"href":26084},[189,44166,44167,43418],{},[659,44168,43417],{"href":43416},[189,44170,44171,43432],{},[659,44172,43431],{"href":43430},[189,44174,44175],{},[659,44176,43438],{"href":43437},[26,44178,43441],{},{"title":67,"searchDepth":68,"depth":68,"links":44180},[44181,44182,44183,44184,44185],{"id":43232,"depth":670,"text":43233},{"id":38034,"depth":670,"text":38035},{"id":44064,"depth":670,"text":44065},{"id":43358,"depth":670,"text":43359},{"id":43401,"depth":670,"text":43402},"Connect Gemini (Google) to your axiom.ai automations through the Integrate AI step. Generate text or extract structured data using your own Google AI Studio API key.",{"metaTitle":44188},"Use Google's Gemini with axiom.ai through the Integrate AI step",{"title":43424,"description":44186},"docs\u002Fno-code-tool\u002Fintegrations\u002Fgemini","lZLuBThi-lQmOK9Kokr9ISpLdQV2u42wONiA_Tga6N8",{"id":44193,"title":41247,"body":44194,"date":71,"description":44642,"extension":73,"meta":44643,"navigation":75,"order":670,"path":963,"seo":44645,"stem":44646,"__hash__":44647},"content\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fgoogle-sheets.md",{"type":8,"value":44195,"toc":44627},[44196,44199,44203,44205,44211,44227,44231,44237,44251,44255,44257,44265,44268,44270,44277,44280,44283,44317,44319,44331,44334,44336,44344,44347,44349,44396,44398,44402,44408,44429,44433,44435,44443,44445,44491,44494,44497,44499,44506,44509,44511,44533,44535,44539,44541,44549,44551,44577,44581,44583,44586,44609,44615,44619,44621,44624],[26,44197,44198],{},"Connect Google Sheets to axiom.ai to read data into your automations, write results back, find or update specific rows, and create new sheets on the fly.",[107,44200,44202],{"id":44201},"connect-a-google-sheets-account","Connect a Google Sheets account",[112,44204],{},[26,44206,44207],{},[1906,44208],{"alt":44209,"src":44210},"The Google Sheets and API key screen in the axiom.ai dashboard with the Connect button highlighted","\u002Fdocs\u002Ftutorials\u002Fgoogle-sheets-connect-your-sheet.jpg",[1923,44212,44213,44215,44220],{},[189,44214,43889],{},[189,44216,43892,44217,148],{},[192,44218,44219],{},"Google Sheets and API key",[189,44221,1934,44222,43900,44224,148],{},[192,44223,41247],{},[192,44225,44226],{},"Connect Google Sheets",[21,44228,44230],{"id":44229},"disconnect-google-sheets","Disconnect Google Sheets",[26,44232,44233],{},[1906,44234],{"alt":44235,"src":44236},"The Google Sheets and API key screen with the Disconnect button highlighted","\u002Fdocs\u002Ftutorials\u002Fgoogle-sheets-axiom-disconect.jpg",[1923,44238,44239,44241,44245],{},[189,44240,43889],{},[189,44242,43892,44243,148],{},[192,44244,44219],{},[189,44246,1934,44247,43900,44249,148],{},[192,44248,41247],{},[192,44250,44230],{},[107,44252,44254],{"id":44253},"create-a-new-google-sheet","Create a new Google Sheet",[112,44256],{},[26,44258,2273,44259,44264],{},[659,44260,44262],{"href":44261},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcreate-a-new-google-sheet",[192,44263,44254],{}," step creates a sheet in your Google Drive and returns the sheet URL as a variable. Use the variable in later steps to read or write to the new sheet.",[107,44266,22098],{"id":44267},"read-data-from-a-google-sheet",[112,44269],{},[26,44271,2273,44272,44276],{},[659,44273,44274],{"href":24142},[192,44275,22098],{}," step pulls data from a sheet into your automation.",[32947,44278],{"video":44279},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=311&end=366",[26,44281,44282],{},"Configuration options:",[186,44284,44285,44290,44295,44303,44311],{},[189,44286,44287,44289],{},[145,44288,36402],{},": start typing the sheet name to autocomplete, or paste in the URL. Can be set from a variable.",[189,44291,44292,44294],{},[145,44293,36408],{},": pick a specific tab from the dropdown.",[189,44296,44297,44299,44300,44302],{},[145,44298,36414],{},": when enabled, set the first cell to read from. For example, ",[145,44301,36418],{}," skips a header row.",[189,44304,44305,44307,44308,148],{},[145,44306,36424],{},": when enabled, set the last cell to read up to. For example, ",[145,44309,44310],{},"B10",[189,44312,44313,44316],{},[145,44314,44315],{},"Continue when empty",": when enabled, the automation continues if the sheet has no data instead of erroring.",[32973,44318],{"url":44279},[26,44320,44321,44322,44326,44327,44330],{},"The step outputs a variable containing the sheet data. Use it in a ",[659,44323,44324],{"href":31407},[192,44325,15653],{}," step to iterate row by row, or ",[659,44328,44329],{"href":31803},"pass it"," to any other step that accepts data.",[107,44332,22113],{"id":44333},"write-data-to-a-google-sheet",[112,44335],{},[26,44337,2273,44338,44343],{},[659,44339,44341],{"href":44340},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-data-to-a-google-sheet-step",[192,44342,22113],{}," step writes data into a sheet from your automation.",[32947,44345],{"video":44346},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=2315&end=2378",[26,44348,44282],{},[186,44350,44351,44360,44364,44369,44382],{},[189,44352,44353,44355,44356,44359],{},[145,44354,36402],{},": start typing the sheet name to autocomplete, or paste in the URL. Toggle ",[192,44357,44358],{},"Set sheet URL from data"," to drive this from a variable.",[189,44361,44362,44294],{},[145,44363,36408],{},[189,44365,44366,44368],{},[145,44367,581],{},": the variable containing the data to write. Pick it from the dropdown.",[189,44370,44371,44373,44374,44377,44378,44381],{},[145,44372,36499],{},": choose ",[192,44375,44376],{},"Clear data before writing"," to overwrite the sheet, or ",[192,44379,44380],{},"Add to existing data"," to append.",[189,44383,44384,44387,44388,44391,44392,44395],{},[145,44385,44386],{},"Write method",": defaults to ",[192,44389,44390],{},"Raw",", which writes data as-is. ",[192,44393,44394],{},"User entered"," simulates typing into the cell, which is useful for adding formulas.",[32973,44397],{"url":44346},[21,44399,44401],{"id":44400},"edit-a-specific-row","Edit a specific row",[26,44403,44404,44405,44407],{},"You can use the ",[192,44406,22113],{}," step to update a particular row instead of appending or overwriting:",[186,44409,44410,44417],{},[189,44411,31836,44412,9879,44414,44416],{},[145,44413,36499],{},[192,44415,44380],{}," so existing rows aren't cleared.",[189,44418,31836,44419,44421,44422,44424,44425,44428],{},[145,44420,36414],{}," to the cell you want to write from, for example ",[145,44423,36418],{},". Combine with the ",[192,44426,44427],{},"Find row in a Google Sheet"," step to target dynamically.",[107,44430,44432],{"id":44431},"find-a-row-in-a-google-sheet","Find a row in a Google Sheet",[112,44434],{},[26,44436,2273,44437,44442],{},[659,44438,44440],{"href":44439},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Ffind-row-in-a-google-sheet",[192,44441,44427],{}," step looks up rows that match a set of values.",[26,44444,44282],{},[186,44446,44447,44452,44456,44462,44468,44481],{},[189,44448,44449,44451],{},[145,44450,36402],{},": start typing the sheet name to autocomplete, or paste in the URL.",[189,44453,44454,44294],{},[145,44455,36408],{},[189,44457,44458,44461],{},[145,44459,44460],{},"Values",": a comma-separated list of values to search for.",[189,44463,44464,44467],{},[145,44465,44466],{},"Exact match",": tick to match whole values rather than partial matches.",[189,44469,44470,44373,44473,44476,44477,44480],{},[145,44471,44472],{},"Value matching mode",[192,44474,44475],{},"Any"," to match rows containing any value, or ",[192,44478,44479],{},"All"," to require all values.",[189,44482,44483,44486,44487,44490],{},[145,44484,44485],{},"Columns",": a comma-separated list of column numbers to search. For example, ",[145,44488,44489],{},"1,2"," searches columns A and B.",[26,44492,44493],{},"The step outputs a variable that includes the row number when a match is found.",[107,44495,32106],{"id":44496},"delete-rows-from-a-google-sheet",[112,44498],{},[26,44500,2273,44501,44505],{},[659,44502,44503],{"href":32103},[192,44504,32106],{}," step removes a contiguous range of rows.",[32947,44507],{"video":44508},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1940&end=1998",[26,44510,44282],{},[186,44512,44513,44517,44521,44527],{},[189,44514,44515,44451],{},[145,44516,36402],{},[189,44518,44519,44294],{},[145,44520,36408],{},[189,44522,44523,44526],{},[145,44524,44525],{},"First row to delete",": the row number to start from.",[189,44528,44529,44532],{},[145,44530,44531],{},"Last row to delete",": the row number to end at.",[32973,44534],{"url":44508},[107,44536,44538],{"id":44537},"clear-data-from-a-google-sheet","Clear data from a Google Sheet",[112,44540],{},[26,44542,2273,44543,44548],{},[659,44544,44546],{"href":44545},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclear-data-from-a-google-sheet",[192,44547,44538],{}," step empties a range of cells without deleting the rows themselves.",[26,44550,44282],{},[186,44552,44553,44557,44561,44569],{},[189,44554,44555,44451],{},[145,44556,36402],{},[189,44558,44559,44294],{},[145,44560,36408],{},[189,44562,44563,44565,44566,148],{},[145,44564,36414],{},": the start of the range to clear, for example ",[145,44567,44568],{},"A3",[189,44570,44571,44573,44574,148],{},[145,44572,36424],{},": the end of the range to clear, for example ",[145,44575,44576],{},"B33",[107,44578,44580],{"id":44579},"convert-excel-to-google-sheets","Convert Excel to Google Sheets",[112,44582],{},[26,44584,44585],{},"axiom.ai's Google Sheets steps don't read native Microsoft Excel files. To use an Excel file, convert it first:",[1923,44587,44588,44598,44601],{},[189,44589,44590,44591,2344,44594,44597],{},"Upload the ",[145,44592,44593],{},".xls",[145,44595,44596],{},".xlsx"," file to a Google Drive folder.",[189,44599,44600],{},"Open the file in Google Sheets.",[189,44602,1927,44603,4172,44606,148],{},[192,44604,44605],{},"File",[192,44607,44608],{},"Save as Google Sheets",[26,44610,44611,44612,148],{},"For native Excel support, see the ",[659,44613,44614],{"href":894},"Excel integration",[107,44616,44618],{"id":44617},"google-token-expiry","Google token expiry",[112,44620],{},[26,44622,44623],{},"When you connect Google Sheets to axiom.ai, axiom.ai stores a token from Google instead of your password. Google sometimes expires these tokens with no notice.",[26,44625,44626],{},"This is controlled entirely by Google. The most common pattern we've seen is high-frequency reads and writes triggering the expiry. If your token expires often, consider running the automation less frequently.",{"title":67,"searchDepth":68,"depth":68,"links":44628},[44629,44632,44633,44634,44637,44638,44639,44640,44641],{"id":44201,"depth":670,"text":44202,"children":44630},[44631],{"id":44229,"depth":68,"text":44230},{"id":44253,"depth":670,"text":44254},{"id":44267,"depth":670,"text":22098},{"id":44333,"depth":670,"text":22113,"children":44635},[44636],{"id":44400,"depth":68,"text":44401},{"id":44431,"depth":670,"text":44432},{"id":44496,"depth":670,"text":32106},{"id":44537,"depth":670,"text":44538},{"id":44579,"depth":670,"text":44580},{"id":44617,"depth":670,"text":44618},"Connect a Google Sheets account to axiom.ai to read, write, find, and delete rows from your sheets during an automation.",{"metaTitle":44644},"Read, write, and manage Google Sheets in an automation",{"title":41247,"description":44642},"docs\u002Fno-code-tool\u002Fintegrations\u002Fgoogle-sheets","qLRAAZmLRG5U5rL2gilutjsHExT9lQTRETorWarcP6Y",{"id":44649,"title":417,"body":44650,"date":71,"description":44719,"extension":73,"meta":44720,"navigation":75,"order":1478,"path":425,"seo":44722,"stem":44723,"__hash__":44724},"content\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Findex.md",{"type":8,"value":44651,"toc":44716},[44652,44701,44705,44707,44709],[26,44653,44654,44655,4468,44657,4468,44659,2936,44663,44667,44668,6205,44670,44672,44673,4468,44675,4468,44677,4468,44679,2936,44681,44683,44684,44688,44689,6205,44691,44693,44694,44698,44699,148],{},"The axiom.ai Chrome extension integrates with workflow tools like ",[659,44656,1134],{"href":1084},[659,44658,41434],{"href":40874},[659,44660,44662],{"href":44661},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fn8n","n8n",[659,44664,44666],{"href":44665},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Frelay-app","Relay.app","; spreadsheets like ",[659,44669,41247],{"href":963},[659,44671,869],{"href":894},"; LLM providers like ",[659,44674,43212],{"href":26084},[659,44676,43417],{"href":43416},[659,44678,43424],{"href":43423},[659,44680,43431],{"href":43430},[659,44682,43438],{"href":43437}," (all via the ",[659,44685,44686],{"href":43220},[192,44687,19124],{}," step); and developer tools like ",[659,44690,824],{"href":771},[659,44692,25095],{"href":26483},". For anything else, build your own integration with the ",[659,44695,44696],{"href":1123},[192,44697,13063],{}," step. If you'd like an integration that isn't listed, ",[659,44700,26195],{"href":1887},[107,44702,44704],{"id":44703},"available-integrations","Available integrations",[112,44706],{},[2218,44708],{},[26,44710,2222,44711,2226,44713,148],{},[659,44712,2225],{"href":1887},[659,44714,2231],{"href":2229,"rel":44715},[1218],{"title":67,"searchDepth":68,"depth":68,"links":44717},[44718],{"id":44703,"depth":670,"text":44704},"Connect axiom.ai to Zapier, Make, n8n, Google Sheets, Excel, ChatGPT, Claude, Gemini, Sonar, 2Captcha, Puppeteer, and Relay.app to extend your automations.",{"metaTitle":44721},"axiom.ai integrations with Zapier, Make, ChatGPT, Claude, and more",{"title":417,"description":44719},"docs\u002Fno-code-tool\u002Fintegrations\u002Findex","pYJEBKbz-NNa6RuC7JbPmFfgS5ArO3zxilS2yMk1XeE",{"id":44726,"title":41434,"body":44727,"date":71,"description":44990,"extension":73,"meta":44991,"navigation":75,"order":2237,"path":40874,"seo":44993,"stem":44994,"__hash__":44995},"content\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fmake.md",{"type":8,"value":44728,"toc":44984},[44729,44736,44740,44742,44749,44752,44789,44792,44810,44816,44825,44829,44831,44843,44850,44853,44874,44876,44924,44926,44935,44941,44948,44952,44954,44964,44975,44979,44981],[26,44730,44731,44735],{},[659,44732,41434],{"href":44733,"rel":44734},"https:\u002F\u002Fmake.com",[1218]," is a workflow builder you can connect to axiom.ai in either direction. Trigger a Make scenario when an axiom.ai automation runs, or trigger an automation from any Make scenario.",[107,44737,44739],{"id":44738},"trigger-a-make-scenario-from-an-axiomai-automation","Trigger a Make scenario from an axiom.ai automation",[112,44741],{},[26,44743,31861,44744,44748],{},[659,44745,44746],{"href":1123},[192,44747,13063],{}," step to start a Make scenario when your automation runs. You'll need a Make account.",[26,44750,44751],{},"In Make:",[1923,44753,44754,44759,44768,44776,44783,44786],{},[189,44755,1927,44756,148],{},[192,44757,44758],{},"Create new scenario",[189,44760,44761,44762,44764,44765,148],{},"Add a trigger and search for ",[192,44763,229],{},", then choose ",[192,44766,44767],{},"Custom webhook",[189,44769,1927,44770,44773,44774,148],{},[192,44771,44772],{},"Create a webhook",", enter a name, and click ",[192,44775,2388],{},[189,44777,44778,44779,44782],{},"Copy the webhook URL Make gives you. It starts with ",[145,44780,44781],{},"https:\u002F\u002Fhook...",". Save it for the next section.",[189,44784,44785],{},"Optionally, edit the advanced settings to define a data structure.",[189,44787,44788],{},"Build out the rest of your scenario with the modules you need.",[26,44790,44791],{},"In axiom.ai:",[1923,44793,44794,44799,44804],{},[189,44795,44796,44797,15415],{},"Open your automation and add a ",[192,44798,13063],{},[189,44800,31836,44801,44803],{},[145,44802,4585],{}," to the webhook URL you copied from Make.",[189,44805,31836,44806,44809],{},[145,44807,44808],{},"Payload"," to the data you want to send.",[26,44811,44812],{},[1906,44813],{"alt":44814,"src":44815},"The Trigger webhook step configured with a Make endpoint and payload","\u002Fdocs\u002Fintegrations\u002Ftrigger-webhook-make-integration.png",[26,44817,44818,44819,44824],{},"For Make's side of the setup, see Make's ",[659,44820,44823],{"href":44821,"rel":44822},"https:\u002F\u002Fwww.integromat.com\u002Fen\u002Fhelp\u002Freceiving-a-webhook-from-a-web-service",[1218],"receiving a webhook"," docs.",[107,44826,44828],{"id":44827},"trigger-an-axiomai-automation-from-a-make-scenario","Trigger an axiom.ai automation from a Make scenario",[112,44830],{},[2093,44832,44833],{},[26,44834,44835,44837,44838,44840,44841,12780],{},[192,44836,2359],{}," This setup uses the axiom.ai webhook API. A subscription that includes Webhooks is required to use the ",[192,44839,15414],{}," step. See ",[659,44842,465],{"href":7414},[2093,44844,44845],{},[26,44846,44847,44849],{},[192,44848,2359],{}," We're aware of an issue with the official Make integration that can prevent new users from adding connections. Use the HTTP request setup below in the meantime.",[26,44851,44852],{},"You'll need:",[186,44854,44855,44862,44868],{},[189,44856,44857,44859,44860,148],{},[192,44858,4175],{},". Find it on the ",[659,44861,30581],{"href":3097},[189,44863,44864,44867],{},[192,44865,44866],{},"Automation name",". The exact name of the automation you want to trigger.",[189,44869,44870,12265,44872,148],{},[192,44871,4585],{},[145,44873,42360],{},[26,44875,44751],{},[1923,44877,44878,44888,44893,44899,44906,44914],{},[189,44879,44880,44881,44884,44885,148],{},"Add a new module to your scenario. Search for ",[192,44882,44883],{},"HTTP"," and add ",[192,44886,44887],{},"Make a request",[189,44889,31836,44890,44892],{},[145,44891,4603],{}," to the axiom.ai endpoint above.",[189,44894,31836,44895,9879,44897,148],{},[145,44896,10884],{},[192,44898,9878],{},[189,44900,31836,44901,9879,44904,148],{},[145,44902,44903],{},"Body type",[192,44905,44390],{},[189,44907,31836,44908,9879,44911,148],{},[145,44909,44910],{},"Content type",[192,44912,44913],{},"JSON (application\u002Fjson)",[189,44915,44916,44917,7436,44920,44923],{},"Add the JSON body in ",[145,44918,44919],{},"Request content",[659,44921,44922],{"href":30555},"sending data with the API"," for the format.",[26,44925,44791],{},[1923,44927,44928],{},[189,44929,15620,44930,44934],{},[659,44931,44932],{"href":25942},[192,44933,15414],{}," step at the start of your automation.",[26,44936,44937],{},[1906,44938],{"alt":44939,"src":44940},"A Make HTTP request module configured to call the axiom.ai trigger endpoint","\u002Fdocs\u002Fintegrations\u002Fhttp-module-make-integration.png",[26,44942,44943,44944,44923],{},"When the run is successful, axiom.ai returns a JSON response Make can use in later modules. See ",[659,44945,44947],{"href":44946},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi#understanding-the-api-response","understanding the API response",[107,44949,44951],{"id":44950},"test-the-integration","Test the integration",[112,44953],{},[26,44955,44956,44957,44959,44960,44963],{},"To test the axiom.ai → Make direction, click ",[192,44958,3137],{}," in the axiom.ai extension, wait a few seconds, then check ",[192,44961,44962],{},"History"," in Make.",[26,44965,44966,44967,44970,44971,44974],{},"To test the Make → axiom.ai direction, click ",[192,44968,44969],{},"Run once"," in Make, wait a few seconds, then check ",[659,44972,2874],{"href":44973},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fdashboard#run-reports"," in axiom.ai.",[107,44976,44978],{"id":44977},"future-plans","Future plans",[112,44980],{},[26,44982,44983],{},"We have an official Make integration but are aware of issues with new connections, likely related to the Integromat-to-Make migration. We hope to restore full integration support soon, which will make this setup simpler than the HTTP request workaround above.",{"title":67,"searchDepth":68,"depth":68,"links":44985},[44986,44987,44988,44989],{"id":44738,"depth":670,"text":44739},{"id":44827,"depth":670,"text":44828},{"id":44950,"depth":670,"text":44951},{"id":44977,"depth":670,"text":44978},"Trigger Make scenarios from axiom.ai automations and trigger axiom.ai automations from Make using webhooks and HTTP requests.",{"metaTitle":44992},"Trigger axiom.ai automations from Make and vice versa",{"title":41434,"description":44990},"docs\u002Fno-code-tool\u002Fintegrations\u002Fmake","nH3TmWX7MCwB6FUIbORG4z-gkDizdEwMzvTncPw--Ps",{"id":44997,"title":44662,"body":44998,"date":71,"description":45191,"extension":73,"meta":45192,"navigation":75,"order":2623,"path":44661,"seo":45194,"stem":45195,"__hash__":45196},"content\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fn8n.md",{"type":8,"value":44999,"toc":45185},[45000,45007,45011,45013,45020,45023,45049,45051,45066,45071,45074,45078,45080,45091,45093,45111,45113,45143,45145,45153,45158,45163,45165,45167,45173,45178,45180,45182],[26,45001,45002,45006],{},[659,45003,44662],{"href":45004,"rel":45005},"https:\u002F\u002Fn8n.io",[1218]," is a workflow builder you can connect to axiom.ai in either direction. Trigger an n8n workflow when an axiom.ai automation runs, or trigger an automation from any n8n workflow.",[107,45008,45010],{"id":45009},"trigger-an-n8n-workflow-from-an-axiomai-automation","Trigger an n8n workflow from an axiom.ai automation",[112,45012],{},[26,45014,31861,45015,45019],{},[659,45016,45017],{"href":1123},[192,45018,13063],{}," step to start an n8n workflow when your automation runs. You'll need an n8n instance.",[26,45021,45022],{},"In n8n:",[1923,45024,45025,45028,45034,45040,45043,45046],{},[189,45026,45027],{},"Create a new workflow.",[189,45029,45030,45031,148],{},"Add a trigger node and select ",[192,45032,45033],{},"Webhook",[189,45035,45036,45037,45039],{},"Set the webhook to listen for ",[192,45038,9878],{}," requests.",[189,45041,45042],{},"Copy the webhook URL n8n provides. Save it for the next section.",[189,45044,45045],{},"Optionally configure the webhook to accept specific data or parameters.",[189,45047,45048],{},"Build out the rest of your workflow with the nodes you need.",[26,45050,44791],{},[1923,45052,45053,45057,45062],{},[189,45054,44796,45055,15415],{},[192,45056,13063],{},[189,45058,31836,45059,45061],{},[145,45060,4585],{}," to the webhook URL you copied from n8n.",[189,45063,31836,45064,44809],{},[145,45065,44808],{},[26,45067,45068],{},[1906,45069],{"alt":45070,"src":44815},"The Trigger webhook step configured with an n8n endpoint and payload",[26,45072,45073],{},"For n8n's side of the setup, see n8n's webhook documentation.",[107,45075,45077],{"id":45076},"trigger-an-axiomai-automation-from-an-n8n-workflow","Trigger an axiom.ai automation from an n8n workflow",[112,45079],{},[2093,45081,45082],{},[26,45083,45084,45086,45087,44840,45089,12780],{},[192,45085,2359],{}," A subscription that includes Webhooks is required to use the ",[192,45088,15414],{},[659,45090,465],{"href":7414},[26,45092,44852],{},[186,45094,45095,45101,45105],{},[189,45096,45097,44859,45099,148],{},[192,45098,4175],{},[659,45100,30581],{"href":3097},[189,45102,45103,44867],{},[192,45104,44866],{},[189,45106,45107,12265,45109,148],{},[192,45108,4585],{},[145,45110,42360],{},[26,45112,45022],{},[1923,45114,45115,45121,45125,45131,45138],{},[189,45116,11513,45117,45120],{},[192,45118,45119],{},"HTTP Request"," node to your workflow.",[189,45122,31836,45123,44892],{},[145,45124,4603],{},[189,45126,31836,45127,9879,45129,148],{},[145,45128,10884],{},[192,45130,9878],{},[189,45132,31836,45133,9879,45136,148],{},[145,45134,45135],{},"Content Type",[192,45137,6539],{},[189,45139,45140,45141,44923],{},"Add the JSON request body. See ",[659,45142,44922],{"href":30555},[26,45144,44791],{},[1923,45146,45147],{},[189,45148,15620,45149,44934],{},[659,45150,45151],{"href":25942},[192,45152,15414],{},[26,45154,45155],{},[1906,45156],{"alt":45157,"src":44940},"An n8n HTTP Request node configured to call the axiom.ai trigger endpoint",[26,45159,45160,45161,44923],{},"When the run is successful, axiom.ai returns a JSON response n8n can use in later nodes. See ",[659,45162,44947],{"href":44946},[107,45164,44951],{"id":44950},[112,45166],{},[26,45168,45169,45170,45172],{},"To test the axiom.ai → n8n direction, click ",[192,45171,3137],{}," in the axiom.ai extension, wait a few seconds, then check the execution history in n8n.",[26,45174,45175,45176,44974],{},"To test the n8n → axiom.ai direction, manually execute the workflow in n8n, wait a few seconds, then check ",[659,45177,2874],{"href":44973},[107,45179,44978],{"id":44977},[112,45181],{},[26,45183,45184],{},"axiom.ai doesn't yet have a dedicated n8n node, but webhooks and HTTP requests cover both directions reliably. We plan to expand the docs with more examples over time.",{"title":67,"searchDepth":68,"depth":68,"links":45186},[45187,45188,45189,45190],{"id":45009,"depth":670,"text":45010},{"id":45076,"depth":670,"text":45077},{"id":44950,"depth":670,"text":44951},{"id":44977,"depth":670,"text":44978},"Trigger n8n workflows from axiom.ai and trigger axiom.ai automations from n8n using webhooks and HTTP requests.",{"metaTitle":45193},"Trigger axiom.ai automations from n8n and vice versa",{"title":44662,"description":45191},"docs\u002Fno-code-tool\u002Fintegrations\u002Fn8n","nl26j3PJ13_G-llua1ExBXKUbBLi-4_J3Up_qf3ZD-E",{"id":45198,"title":25095,"body":45199,"date":71,"description":45424,"extension":73,"meta":45425,"navigation":75,"order":293,"path":26483,"seo":45427,"stem":45428,"__hash__":45429},"content\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fpuppeteer.md",{"type":8,"value":45200,"toc":45414},[45201,45213,45217,45219,45222,45238,45242,45244,45254,45256,45258,45265,45269,45289,45293,45322,45326,45334,45362,45366,45411],[26,45202,45203,45204,45207,45208,45212],{},"The axiom.ai desktop app is built on top of ",[659,45205,25095],{"href":25093,"rel":45206},[1218],", Google's library for controlling Chrome over the DevTools Protocol. From the ",[659,45209,45210],{"href":19048},[192,45211,19051],{}," step, you can call a subset of Puppeteer's methods to do things the no-code steps can't.",[107,45214,45216],{"id":45215},"enable-puppeteer-in-a-script","Enable Puppeteer in a script",[112,45218],{},[26,45220,45221],{},"Puppeteer methods only work when the script runs in the desktop app, not in the browser:",[1923,45223,45224,45228,45232],{},[189,45225,15620,45226,15415],{},[192,45227,19051],{},[189,45229,31969,45230,31972],{},[145,45231,26470],{},[189,45233,45234,45235,45237],{},"Tick the ",[192,45236,26470],{}," confirmation checkbox.",[107,45239,45241],{"id":45240},"supported-methods","Supported methods",[112,45243],{},[26,45245,45246,45247,45251,45252,15415],{},"axiom.ai supports the ",[659,45248,45250],{"href":29958,"rel":45249},[1218],"Page Interactions"," methods from Puppeteer. Other methods aren't available inside the ",[192,45253,19051],{},[107,45255,19292],{"id":19291},[112,45257],{},[26,45259,45260,45261,45264],{},"To use Puppeteer, you'll need a CSS selector for the element you want to interact with. Open Chrome DevTools (right-click the element and choose ",[192,45262,45263],{},"Inspect",") to find one. Replace the selectors in the snippets below with your own.",[21,45266,45268],{"id":45267},"click-a-button","Click a button",[2446,45270,45272],{"className":2498,"code":45271,"language":2500,"meta":67,"style":67},"await page.click('#button');\n",[145,45273,45274],{"__ignoreMap":67},[1332,45275,45276,45278,45280,45282,45284,45287],{"class":2455,"line":2131},[1332,45277,3020],{"class":2507},[1332,45279,2679],{"class":2521},[1332,45281,5473],{"class":2525},[1332,45283,1213],{"class":2521},[1332,45285,45286],{"class":2462},"'#button'",[1332,45288,2583],{"class":2521},[21,45290,45292],{"id":45291},"fill-a-text-input","Fill a text input",[2446,45294,45296],{"className":2498,"code":45295,"language":2500,"meta":67,"style":67},"await page.locator('input.name').fill('Hello, world!');\n",[145,45297,45298],{"__ignoreMap":67},[1332,45299,45300,45302,45304,45306,45308,45311,45313,45315,45317,45320],{"class":2455,"line":2131},[1332,45301,3020],{"class":2507},[1332,45303,2679],{"class":2521},[1332,45305,3688],{"class":2525},[1332,45307,1213],{"class":2521},[1332,45309,45310],{"class":2462},"'input.name'",[1332,45312,3696],{"class":2521},[1332,45314,3699],{"class":2525},[1332,45316,1213],{"class":2521},[1332,45318,45319],{"class":2462},"'Hello, world!'",[1332,45321,2583],{"class":2521},[21,45323,45325],{"id":45324},"find-an-element-by-its-text","Find an element by its text",[26,45327,45328,45329,148],{},"For more on text selectors, see the ",[659,45330,45333],{"href":45331,"rel":45332},"https:\u002F\u002Fpptr.dev\u002Fguides\u002Fpage-interactions#text-selectors--p-text",[1218],"Puppeteer text selector docs",[2446,45335,45337],{"className":2498,"code":45336,"language":2500,"meta":67,"style":67},"const element = await page.waitForSelector('div ::-p-text(Submit)');\n",[145,45338,45339],{"__ignoreMap":67},[1332,45340,45341,45343,45346,45348,45350,45352,45355,45357,45360],{"class":2455,"line":2131},[1332,45342,2508],{"class":2507},[1332,45344,45345],{"class":2511}," element",[1332,45347,2515],{"class":2507},[1332,45349,2518],{"class":2507},[1332,45351,2679],{"class":2521},[1332,45353,45354],{"class":2525},"waitForSelector",[1332,45356,1213],{"class":2521},[1332,45358,45359],{"class":2462},"'div ::-p-text(Submit)'",[1332,45361,2583],{"class":2521},[21,45363,45365],{"id":45364},"use-a-custom-selector","Use a custom selector",[2446,45367,45369],{"className":2498,"code":45368,"language":2500,"meta":67,"style":67},"const mySelector = 'input';\nconst element = await page.waitForSelector(`form.${mySelector}`);\n",[145,45370,45371,45385],{"__ignoreMap":67},[1332,45372,45373,45375,45378,45380,45383],{"class":2455,"line":2131},[1332,45374,2508],{"class":2507},[1332,45376,45377],{"class":2511}," mySelector",[1332,45379,2515],{"class":2507},[1332,45381,45382],{"class":2462}," 'input'",[1332,45384,4673],{"class":2521},[1332,45386,45387,45389,45391,45393,45395,45397,45399,45401,45404,45407,45409],{"class":2455,"line":670},[1332,45388,2508],{"class":2507},[1332,45390,45345],{"class":2511},[1332,45392,2515],{"class":2507},[1332,45394,2518],{"class":2507},[1332,45396,2679],{"class":2521},[1332,45398,45354],{"class":2525},[1332,45400,1213],{"class":2521},[1332,45402,45403],{"class":2462},"`form.${",[1332,45405,45406],{"class":2521},"mySelector",[1332,45408,6502],{"class":2462},[1332,45410,2583],{"class":2521},[2819,45412,45413],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}",{"title":67,"searchDepth":68,"depth":68,"links":45415},[45416,45417,45418],{"id":45215,"depth":670,"text":45216},{"id":45240,"depth":670,"text":45241},{"id":19291,"depth":670,"text":19292,"children":45419},[45420,45421,45422,45423],{"id":45267,"depth":68,"text":45268},{"id":45291,"depth":68,"text":45292},{"id":45324,"depth":68,"text":45325},{"id":45364,"depth":68,"text":45365},"Call Puppeteer's page interaction methods from a Write javascript step to control the browser in ways the no-code steps can't.",{"metaTitle":45426},"Use the Puppeteer API in axiom.ai automations",{"title":25095,"description":45424},"docs\u002Fno-code-tool\u002Fintegrations\u002Fpuppeteer","4Wtymo1RRk2ZcHxUQMx0OCZcZa5M6W2FqZm9-hStvzQ",{"id":45431,"title":44666,"body":45432,"date":71,"description":45600,"extension":73,"meta":45601,"navigation":75,"order":2642,"path":44665,"seo":45603,"stem":45604,"__hash__":45605},"content\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Frelay-app.md",{"type":8,"value":45433,"toc":45590},[45434,45441,45445,45447,45457,45461,45463,45466,45486,45488,45502,45505,45509,45511,45522,45536,45543,45547,45557,45561,45567,45571,45583,45585,45587],[26,45435,45436,45440],{},[659,45437,44666],{"href":45438,"rel":45439},"https:\u002F\u002Fwww.relay.app",[1218]," is a workflow builder for AI agents that connects services like Zapier and Make. The axiom.ai integration works in either direction.",[107,45442,45444],{"id":45443},"get-started-with-relayapp","Get started with Relay.app",[112,45446],{},[26,45448,45449,45450,45453,45454,148],{},"Sign up at ",[659,45451,44666],{"href":45438,"rel":45452},[1218]," and complete their onboarding to learn the basics. Workflows are created from the Relay.app dashboard by clicking ",[192,45455,45456],{},"+ New workflow",[107,45458,45460],{"id":45459},"trigger-a-relayapp-workflow-from-an-axiomai-automation","Trigger a Relay.app workflow from an axiom.ai automation",[112,45462],{},[26,45464,45465],{},"In Relay.app:",[1923,45467,45468,45477,45483],{},[189,45469,1927,45470,42316,45473,45476],{},[192,45471,45472],{},"+ Add trigger",[192,45474,45475],{},"Webhook is called"," from the list.",[189,45478,45479,45480,45482],{},"Leave the HTTP method as ",[192,45481,9878],{}," (the default).",[189,45484,45485],{},"Copy the webhook URL Relay.app provides.",[26,45487,44791],{},[1923,45489,45490,45497],{},[189,45491,45492,45493,15415],{},"Build out your automation as normal. When you're ready to fire the Relay.app workflow, add a ",[659,45494,45495],{"href":1123},[192,45496,13063],{},[189,45498,31836,45499,45501],{},[145,45500,4585],{}," to the Relay.app webhook URL.",[26,45503,45504],{},"Run the automation to test. The trigger may take a few seconds. Check the Relay.app dashboard to confirm the workflow ran.",[107,45506,45508],{"id":45507},"trigger-an-axiomai-automation-from-relayapp","Trigger an axiom.ai automation from Relay.app",[112,45510],{},[2093,45512,45513],{},[26,45514,45515,45517,45518,148],{},[192,45516,2359],{}," This integration is built and maintained by the Relay.app team. axiom.ai's support is limited to issues on our side. For axiom.ai-specific errors, see ",[659,45519,45521],{"href":45520},"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors","common errors",[26,45523,45524,45525,45528,45529,45532,45533,148],{},"In Relay.app, after adding a trigger, click ",[192,45526,45527],{},"+ Add step",", search for ",[192,45530,45531],{},"axiom.ai",", and select ",[192,45534,45535],{},"Run automation",[26,45537,45538,45539,15415],{},"In axiom.ai, make sure the automation starts with a ",[659,45540,45541],{"href":25942},[192,45542,15414],{},[21,45544,45546],{"id":45545},"connect-your-axiomai-account","Connect your axiom.ai account",[26,45548,45549,45550,45553,45554,148],{},"In Relay.app, click ",[192,45551,45552],{},"Connect"," on the axiom.ai step. Enter your axiom.ai API key when prompted. To find your API key, see the ",[659,45555,45556],{"href":3097},"API key documentation",[21,45558,45560],{"id":45559},"pick-the-automation-to-trigger","Pick the automation to trigger",[26,45562,45563,45564,45566],{},"Enter the automation's name in ",[145,45565,44866],{},". The value is case-sensitive and must match the name shown in the axiom.ai dashboard exactly.",[21,45568,45570],{"id":45569},"pass-data-into-the-run","Pass data into the run",[26,45572,31861,45573,45576,45577,45579,45580,45582],{},[192,45574,45575],{},"Fields to populate"," section of the ",[192,45578,45535],{}," step in Relay.app to map data into the run. Mapped fields become available in the ",[192,45581,15414],{}," step at the start of your axiom.ai automation.",[107,45584,24962],{"id":24961},[112,45586],{},[26,45588,45589],{},"Relay.app's catalog of integrations gives you a quick way to wire axiom.ai automations into a much larger ecosystem of apps and AI agents.",{"title":67,"searchDepth":68,"depth":68,"links":45591},[45592,45593,45594,45599],{"id":45443,"depth":670,"text":45444},{"id":45459,"depth":670,"text":45460},{"id":45507,"depth":670,"text":45508,"children":45595},[45596,45597,45598],{"id":45545,"depth":68,"text":45546},{"id":45559,"depth":68,"text":45560},{"id":45569,"depth":68,"text":45570},{"id":24961,"depth":670,"text":24962},"Trigger Relay.app workflows from axiom.ai automations and trigger axiom.ai automations from Relay.app, with built-in field mapping support.",{"metaTitle":45602},"Connect axiom.ai to Relay.app workflows in either direction",{"title":44666,"description":45600},"docs\u002Fno-code-tool\u002Fintegrations\u002Frelay-app","gfcFqAnoa9GfdfJr12_yFaEDa8n5sUMROSg_GBtneHk",{"id":45607,"title":43431,"body":45608,"date":71,"description":45792,"extension":73,"meta":45793,"navigation":75,"order":2692,"path":43430,"seo":45795,"stem":45796,"__hash__":45797},"content\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fsonar.md",{"type":8,"value":45609,"toc":45785},[45610,45618,45623,45625,45627,45656,45658,45660,45679,45683,45685,45692,45712,45714,45725,45728,45730,45732,45735,45757,45759,45761,45765,45783],[26,45611,45612,45613,45617],{},"Sonar is Perplexity's API-accessible model family, and one of the LLM providers supported by the ",[659,45614,45615],{"href":43220},[192,45616,19124],{}," step. Drop the step into any automation, choose Sonar as the provider, and either generate text or extract structured fields from data flowing through earlier steps. You supply your own Perplexity API key, so billing happens directly on your Perplexity account.",[26,45619,43226,45620,45622],{},[659,45621,19124],{"href":38155},". The rest of this page covers Sonar-specific setup and gotchas.",[107,45624,43233],{"id":43232},[112,45626],{},[1923,45628,45629,45636,45644,45650],{},[189,45630,43240,45631,148],{},[659,45632,45635],{"href":45633,"rel":45634},"https:\u002F\u002Fwww.perplexity.ai\u002F",[1218],"perplexity.ai",[189,45637,3528,45638,45643],{},[659,45639,45642],{"href":45640,"rel":45641},"https:\u002F\u002Fwww.perplexity.ai\u002Faccount\u002Fapi\u002Fkeys",[1218],"API settings"," and add a payment method.",[189,45645,1927,45646,45649],{},[192,45647,45648],{},"Generate API key"," and copy the key. Treat it like a secret.",[189,45651,43268,45652,43271,45654,43274],{},[145,45653,4175],{},[192,45655,19124],{},[107,45657,38035],{"id":38034},[112,45659],{},[26,45661,45662,45663,43517,45665,45667,45668,7436,45673,45678],{},"Pick a Sonar model in the ",[145,45664,43286],{},[192,45666,19124],{},". Perplexity publishes the current model lineup (Sonar, Sonar Pro, and reasoning variants) on the ",[659,45669,45672],{"href":45670,"rel":45671},"https:\u002F\u002Fdocs.perplexity.ai\u002Fgetting-started\u002Fmodels",[1218],"Perplexity API models page",[659,45674,45677],{"href":45675,"rel":45676},"https:\u002F\u002Fdocs.perplexity.ai\u002Fgetting-started\u002Fpricing",[1218],"Perplexity's pricing"," for current per-token and per-request costs.",[107,45680,45682],{"id":45681},"what-sonar-is-good-at","What Sonar is good at",[112,45684],{},[26,45686,45687,45688,45691],{},"Sonar's distinguishing feature is ",[192,45689,45690],{},"live web search built into the model",". Where other LLMs only know what was in their training data, Sonar can pull in current information at inference time. Useful when an automation needs:",[186,45693,45694,45700,45706],{},[189,45695,45696,45699],{},[192,45697,45698],{},"Real-time facts"," like today's prices, scores, or news.",[189,45701,45702,45705],{},[192,45703,45704],{},"Citations"," alongside generated answers, since Sonar can return source URLs.",[189,45707,45708,45711],{},[192,45709,45710],{},"Research-style summaries"," of topics that change frequently.",[26,45713,15626],{},[186,45715,45716,45719,45722],{},[189,45717,45718],{},"Generate a market update with up-to-date competitor pricing pulled in by Sonar itself, no separate scrape step needed.",[189,45720,45721],{},"Enrich scraped leads with recent news about their company.",[189,45723,45724],{},"Produce briefings that need to reference recent events.",[26,45726,45727],{},"Sonar is usually less useful for pure extraction from data you've already scraped; for that, ChatGPT, Claude, or Gemini Flash are typically cheaper and faster.",[107,45729,43359],{"id":43358},[112,45731],{},[26,45733,45734],{},"Perplexity exposes spending controls in the API settings:",[186,45736,45737,45746,45752],{},[189,45738,45739,7176,45742,45745],{},[192,45740,45741],{},"Set usage limits",[659,45743,45642],{"href":45640,"rel":45744},[1218]," so the API stops responding past a monthly cap.",[189,45747,45748,45751],{},[192,45749,45750],{},"Use a dedicated account"," for axiom.ai if you want strict isolation from other apps.",[189,45753,45754,45756],{},[192,45755,43388],{}," and delete any you're no longer using.",[107,45758,43402],{"id":43401},[112,45760],{},[26,45762,2273,45763,43409],{},[192,45764,19124],{},[186,45766,45767,45771,45775,45779],{},[189,45768,45769,43618],{},[659,45770,43212],{"href":26084},[189,45772,45773,43418],{},[659,45774,43417],{"href":43416},[189,45776,45777,43425],{},[659,45778,43424],{"href":43423},[189,45780,45781],{},[659,45782,43438],{"href":43437},[26,45784,43441],{},{"title":67,"searchDepth":68,"depth":68,"links":45786},[45787,45788,45789,45790,45791],{"id":43232,"depth":670,"text":43233},{"id":38034,"depth":670,"text":38035},{"id":45681,"depth":670,"text":45682},{"id":43358,"depth":670,"text":43359},{"id":43401,"depth":670,"text":43402},"Connect Sonar (Perplexity) to your axiom.ai automations through the Integrate AI step. Generate text or extract structured data using your own Perplexity API key.",{"metaTitle":45794},"Use Perplexity's Sonar with axiom.ai through the Integrate AI step",{"title":43431,"description":45792},"docs\u002Fno-code-tool\u002Fintegrations\u002Fsonar","Z6fAgy3HM9_xfVHxwBQwbp8hpXLG_Z7grxubbUTe1kE",{"id":45799,"title":1134,"body":45800,"date":71,"description":45894,"extension":73,"meta":45895,"navigation":75,"order":2131,"path":1084,"seo":45897,"stem":45898,"__hash__":45899},"content\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fzapier.md",{"type":8,"value":45801,"toc":45889},[45802,45805,45809,45811,45823,45837,45844,45848,45850,45853,45866,45870,45872,45881],[26,45803,45804],{},"Connect axiom.ai and Zapier in either direction. Trigger a Zap when an automation runs, or trigger an automation from any Zap. You can also pass data between the two.",[107,45806,45808],{"id":45807},"trigger-a-zap-from-an-axiomai-automation","Trigger a Zap from an axiom.ai automation",[112,45810],{},[26,45812,31861,45813,45817,45818,45822],{},[659,45814,45815],{"href":1123},[192,45816,13063],{}," step or the ",[659,45819,45820],{"href":19048},[192,45821,19051],{}," step to fire a Zap when your automation runs. For step-by-step walkthroughs:",[186,45824,45825,45831],{},[189,45826,45827],{},[659,45828,45830],{"href":45829},"\u002Fguides\u002Fzapier#triggering-a-zap-using-an-axiom-ai-automation","Trigger a Zap from axiom.ai with Trigger webhook",[189,45832,45833],{},[659,45834,45836],{"href":45835},"\u002Fguides\u002Fzapier#triggering-a-zap-using-an-axiom-ai-automation-javascript","Trigger a Zap from axiom.ai with JavaScript",[26,45838,45839,45840,148],{},"To send data with the trigger, see the ",[659,45841,45843],{"href":45842},"\u002Fguides\u002Fzapier#examples","Sending data to Zapier examples",[107,45845,45847],{"id":45846},"trigger-an-axiomai-automation-from-zapier","Trigger an axiom.ai automation from Zapier",[112,45849],{},[26,45851,45852],{},"Use Zapier as a middleman between its library of apps and axiom.ai. When a Zap fires, it triggers your automation and passes data into it.",[186,45854,45855,45860],{},[189,45856,45857],{},[659,45858,45847],{"href":45859},"\u002Fguides\u002Fzapier#triggering-an-axiom-ai-automation-from-zapier",[189,45861,45862],{},[659,45863,45865],{"href":45864},"\u002Fguides\u002Fzapier#sending-data-from-zapier-to-axiom-ai","Send data from Zapier to axiom.ai",[107,45867,45869],{"id":45868},"trigger-local-runs-with-zapier","Trigger local runs with Zapier",[112,45871],{},[26,45873,45874,45875,45877,45878,45880],{},"The axiom.ai ",[659,45876,5345],{"href":5562}," always runs automations in the cloud. To run on the desktop instead, use the ",[659,45879,32114],{"href":32113}," workaround.",[2093,45882,45883],{},[26,45884,45885,45886,148],{},"Got more questions? Ask in our ",[659,45887,2231],{"href":2229,"rel":45888},[1218],{"title":67,"searchDepth":68,"depth":68,"links":45890},[45891,45892,45893],{"id":45807,"depth":670,"text":45808},{"id":45846,"depth":670,"text":45847},{"id":45868,"depth":670,"text":45869},"Trigger Zaps from your axiom.ai automations and trigger axiom.ai automations from Zapier, with optional support for passing data between them.",{"metaTitle":45896},"Trigger axiom.ai automations from Zapier and vice versa",{"title":1134,"description":45894},"docs\u002Fno-code-tool\u002Fintegrations\u002Fzapier","WnUsjxa3hBqEQBl_BLhm93QeYD23GzWJn67pdKJ-UlI",{"id":45901,"title":5535,"body":45902,"date":71,"description":45912,"extension":73,"meta":45913,"navigation":75,"order":293,"path":42699,"seo":45914,"stem":45915,"__hash__":45916},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Findex.md",{"type":8,"value":45903,"toc":45910},[45904,45907],[26,45905,45906],{},"Learn in depth about the range of axiom.ai steps and settings.",[2218,45908],{"path":45909,"scope":37937},"settings,steps",{"title":67,"searchDepth":68,"depth":68,"links":45911},[],"To learn more about axiom.ai's steps, read our reference documention.",{},{"title":5535,"description":45912},"docs\u002Fno-code-tool\u002Freference\u002Findex","OY86vZFGkncDsEfcrV-reZUlVJTvszRlc0B2eCr9UsE",{"id":45918,"title":45919,"body":45920,"date":71,"description":46102,"extension":73,"meta":46103,"navigation":75,"order":2131,"path":31697,"seo":46105,"stem":46106,"__hash__":46107},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fbypass-bot-detection.md","Bypass bot detection",{"type":8,"value":45921,"toc":46092},[45922,45925,45931,45935,45937,45948,45952,45954,45962,45965,45985,45989,45991,45994,46002,46009,46022,46028,46031,46033,46036,46040,46046,46059,46062,46066,46069,46073,46076,46082,46089],[26,45923,45924],{},"Many websites use automated bot detection (most commonly Cloudflare) to block automated traffic. axiom.ai automations can get caught in those blocks even though they're not malicious. The bypass bot detection setting helps in two ways: it can solve common challenges automatically, or attach axiom.ai to an existing Chrome window that has already been validated as a real user.",[26,45926,45927],{},[1906,45928],{"alt":45929,"src":45930},"The bypass bot detection settings panel in the axiom.ai Builder","\u002Fdocs\u002Fsettings\u002Fbypass-axiom.ai.jpg",[107,45932,45934],{"id":45933},"install-the-desktop-app","Install the desktop app",[112,45936],{},[26,45938,45939,45940,45943,45944,148],{},"Bypass bot detection requires the ",[659,45941,45942],{"href":26107},"axiom.ai desktop application",". Download it from the ",[659,45945,45947],{"href":45946},"\u002Fguide-part-two","downloads page",[107,45949,45951],{"id":45950},"choose-a-bypass-method","Choose a bypass method",[112,45953],{},[26,45955,45956,45957,45959,45960,2264],{},"Bot detection bypass is off by default because the checks slow automations down. To turn it on, open the automation, click the ",[192,45958,24349],{}," icon in the toolbar on the left, and select the ",[192,45961,45919],{},[26,45963,45964],{},"There are three options:",[186,45966,45967,45973,45979],{},[189,45968,45969,45972],{},[192,45970,45971],{},"No bot detection bypass."," The default. axiom.ai runs without any bot detection workarounds.",[189,45974,45975,45978],{},[192,45976,45977],{},"Use automatic bot detection bypassing."," axiom.ai detects and solves bot challenges automatically where it can.",[189,45980,45981,45984],{},[192,45982,45983],{},"Attach to existing Chrome."," axiom.ai connects to a Chrome window you've manually validated.",[107,45986,45988],{"id":45987},"use-automatic-bot-detection-bypassing","Use automatic bot detection bypassing",[112,45990],{},[26,45992,45993],{},"With this mode on, axiom.ai detects bot challenges and solves them automatically. It works for many sites but isn't infallible. When automatic bypass can't solve a challenge, you'll need to solve it manually.",[26,45995,45996,45997,46001],{},"For complex challenges, use the ",[659,45998,45999],{"href":771},[192,46000,21025],{}," step from the 2Captcha integration.",[26,46003,46004,46005,29089],{},"For simple checkbox challenges, record the keystrokes to solve them with the ",[659,46006,46007],{"href":19561},[192,46008,19564],{},[1923,46010,46011,46017],{},[189,46012,46013,46014,46016],{},"Record ",[192,46015,19687],{}," the correct number of times to move focus onto the checkbox.",[189,46018,46013,46019,46021],{},[192,46020,33228],{}," to tick the box and complete the challenge.",[26,46023,46024,46025,148],{},"For more on keystroke automation, see ",[659,46026,46027],{"href":34629},"record keystrokes",[107,46029,31701],{"id":46030},"attach-to-existing-chrome",[112,46032],{},[26,46034,46035],{},"This method connects axiom.ai to a Chrome window you've already validated as a real user, so the bot blocker sees legitimate-looking traffic.",[21,46037,46039],{"id":46038},"open-chrome-with-remote-debugging-enabled","Open Chrome with remote debugging enabled",[26,46041,46042,46043,46045],{},"Chrome needs to be started with the remote debugging port flag for axiom.ai to attach to it. The ",[192,46044,45919],{}," settings panel includes a button to open one for you. To start one manually instead, run a command like this in a terminal:",[2446,46047,46049],{"className":2448,"code":46048,"language":2450,"meta":67,"style":67},"\u002Fpath\u002Fto\u002FChrome\u002Fchrome --remote-debugging-port=21222\n",[145,46050,46051],{"__ignoreMap":67},[1332,46052,46053,46056],{"class":2455,"line":2131},[1332,46054,46055],{"class":2458},"\u002Fpath\u002Fto\u002FChrome\u002Fchrome",[1332,46057,46058],{"class":2511}," --remote-debugging-port=21222\n",[26,46060,46061],{},"Adjust the path to your Chrome executable. You can also create a shortcut or symbolic link with the flag built in for easier reuse.",[21,46063,46065],{"id":46064},"solve-the-challenge-in-your-chrome-window","Solve the challenge in your Chrome window",[26,46067,46068],{},"In the new Chrome window, navigate to the site you're trying to automate, then to the page where bot blocking happens. The site validates the session, often automatically, sometimes by asking you to solve a captcha. Once you've passed the validation, the session is ready for axiom.ai to take over.",[21,46070,46072],{"id":46071},"adjust-the-automation-start-point","Adjust the automation start point",[26,46074,46075],{},"The automation needs to start on the page you've validated, not before it. If validation happens after a login, sign in manually first, then change the automation so it only contains the steps that come after sign-in.",[26,46077,46078,46079,46081],{},"When you click ",[192,46080,3137],{},", axiom.ai picks up the validated browser window and runs from the configured start step.",[2093,46083,46084],{},[26,46085,46086,46088],{},[192,46087,2359],{}," In this mode, the Chrome window doesn't close when the automation stops. The automation finishes its current action, then leaves the window open for you to close manually.",[2819,46090,46091],{},"html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":67,"searchDepth":68,"depth":68,"links":46093},[46094,46095,46096,46097],{"id":45933,"depth":670,"text":45934},{"id":45950,"depth":670,"text":45951},{"id":45987,"depth":670,"text":45988},{"id":46030,"depth":670,"text":31701,"children":46098},[46099,46100,46101],{"id":46038,"depth":68,"text":46039},{"id":46064,"depth":68,"text":46065},{"id":46071,"depth":68,"text":46072},"Get past Cloudflare and similar bot blockers by attaching axiom.ai to an existing Chrome window that has already passed the challenge.",{"metaTitle":46104},"Bypass website bot blocking with the desktop app",{"title":45919,"description":46102},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fbypass-bot-detection","GY5TzTLnL3wAuCkm7qU_cQnrFB1Gfia0uIorBlWvOC4",{"id":46109,"title":23853,"body":46110,"date":71,"description":46184,"extension":73,"meta":46185,"navigation":75,"order":670,"path":23852,"seo":46187,"stem":46188,"__hash__":46189},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fexecutable-path.md",{"type":8,"value":46111,"toc":46181},[46112,46115,46121,46125,46127,46154,46157],[26,46113,46114],{},"By default, axiom.ai runs automations in a built-in Chromium window. Set an executable path to use your local Chrome installation instead. This can help with sites that detect or behave differently in Chromium.",[26,46116,46117],{},[1906,46118],{"alt":46119,"src":46120},"The set executable path settings panel in the axiom.ai Builder","\u002Fdocs\u002Fsettings\u002Fpath-axiom.ai.jpg",[107,46122,46124],{"id":46123},"set-the-executable-path","Set the executable path",[112,46126],{},[1923,46128,46129,46132,46137,46143],{},[189,46130,46131],{},"Open a new tab in Chrome.",[189,46133,43892,46134,148],{},[145,46135,46136],{},"chrome:\u002F\u002Fversion",[189,46138,46139,46140,27358],{},"Copy the ",[192,46141,46142],{},"Executable path",[189,46144,46145,46146,46148,46149,46151,46152,148],{},"In the automation, click the ",[192,46147,24349],{}," icon, open the ",[192,46150,23853],{}," section, and paste the path into ",[145,46153,46142],{},[26,46155,46156],{},"The path looks similar to these examples:",[186,46158,46159,46166,46173],{},[189,46160,46161,5260,46163],{},[192,46162,7807],{},[145,46164,46165],{},"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",[189,46167,46168,5260,46170],{},[192,46169,7797],{},[145,46171,46172],{},"\u002FApplications\u002FGoogle Chrome.app\u002FContents\u002FMacOS\u002FGoogle Chrome",[189,46174,46175,5260,46178],{},[192,46176,46177],{},"Linux",[145,46179,46180],{},"\u002Fusr\u002Fbin\u002Fgoogle-chrome",{"title":67,"searchDepth":68,"depth":68,"links":46182},[46183],{"id":46123,"depth":670,"text":46124},"Point axiom.ai at your local Chrome installation so automations run in Chrome instead of the built-in Chromium browser.",{"metaTitle":46186},"Run automations in your local Chrome instead of Chromium",{"title":23853,"description":46184},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fexecutable-path","hujGxoiafdcWAKPrS3gNj1tUH03iS4_VwIPJa4hg3Ok",{"id":46191,"title":24641,"body":46192,"date":71,"description":46257,"extension":73,"meta":46258,"navigation":75,"order":293,"path":24640,"seo":46260,"stem":46261,"__hash__":46262},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fincognito.md",{"type":8,"value":46193,"toc":46253},[46194,46197,46203,46207,46209,46212,46230,46233,46237,46239],[26,46195,46196],{},"Run an automation in incognito mode to start every run in a fresh window with no stored cookies. Useful when sessions need to be clean each time, for example when sign-in cookies from a previous run would interfere.",[26,46198,46199],{},[1906,46200],{"alt":46201,"src":46202},"The run in incognito mode settings panel in the axiom.ai Builder","\u002Fdocs\u002Fsettings\u002Fincognito-axiom.ai.jpg",[107,46204,46206],{"id":46205},"allow-incognito-mode-for-the-extension","Allow incognito mode for the extension",[112,46208],{},[26,46210,46211],{},"The Chrome extension needs explicit permission to run in incognito mode. This is a one-time setup per machine.",[1923,46213,46214,46220,46225],{},[189,46215,46216,46217,148],{},"In Chrome, navigate to ",[145,46218,46219],{},"chrome:\u002F\u002Fextensions",[189,46221,46222,46223,148],{},"Find the axiom.ai extension and click ",[192,46224,3223],{},[189,46226,31969,46227,31972],{},[192,46228,46229],{},"Allow in incognito",[26,46231,46232],{},"Without this permission, axiom.ai can't start in an incognito window.",[107,46234,46236],{"id":46235},"enable-incognito-mode-on-the-automation","Enable incognito mode on the automation",[112,46238],{},[1923,46240,46241,46245,46249],{},[189,46242,25628,46243,25631],{},[192,46244,24349],{},[189,46246,4245,46247,2264],{},[192,46248,24641],{},[189,46250,31969,46251,31972],{},[145,46252,24641],{},{"title":67,"searchDepth":68,"depth":68,"links":46254},[46255,46256],{"id":46205,"depth":670,"text":46206},{"id":46235,"depth":670,"text":46236},"Force axiom.ai to run an automation in a fresh incognito window with no stored cookies, useful when sessions need to start clean.",{"metaTitle":46259},"Run an automation in Chrome incognito mode",{"title":24641,"description":46257},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fincognito","yzBu0e6Z0gexoXL0IZDBXfULeGg2T2HFjawzKCX974c",{"id":46264,"title":46265,"body":46266,"date":71,"description":46305,"extension":73,"meta":46306,"navigation":75,"order":2131,"path":46308,"seo":46309,"stem":46310,"__hash__":46311},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Findex.md","Chrome",{"type":8,"value":46267,"toc":46302},[46268,46287,46291,46293,46295],[26,46269,46270,46271,46273,46274,46276,46277,4468,46280,46283,46284,148],{},"The Chrome settings control how axiom.ai launches the browser for an automation. Use them to ",[659,46272,31698],{"href":31697},", use a ",[659,46275,25066],{"href":24780},", point at a specific ",[659,46278,46279],{"href":23852},"Chrome executable",[659,46281,46282],{"href":23872},"load another extension",", or run in ",[659,46285,46286],{"href":24640},"incognito mode",[107,46288,46290],{"id":46289},"chrome-settings","Chrome settings",[112,46292],{},[2218,46294],{},[26,46296,2222,46297,2226,46299,148],{},[659,46298,2225],{"href":1887},[659,46300,2231],{"href":2229,"rel":46301},[1218],{"title":67,"searchDepth":68,"depth":68,"links":46303},[46304],{"id":46289,"depth":670,"text":46290},"Configure how axiom.ai launches Chrome or Chromium, including bot detection bypass, profiles, executable path, extensions, and incognito mode.",{"metaTitle":46307},"Configure Chrome and Chromium settings for an automation","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome",{"title":46265,"description":46305},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Findex","A4G3MVQDIhWEmm0h3Gp2oC4CVmrjKznJt8xJ7zMI_w0",{"id":46313,"title":23873,"body":46314,"date":71,"description":46632,"extension":73,"meta":46633,"navigation":75,"order":1478,"path":23872,"seo":46635,"stem":46636,"__hash__":46637},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fload-extension.md",{"type":8,"value":46315,"toc":46614},[46316,46319,46326,46333,46343,46347,46349,46358,46402,46407,46414,46418,46420,46431,46454,46456,46458,46462,46465,46469,46474,46478,46485,46487,46493,46499,46507,46510,46512,46517,46549,46553,46559,46562,46564,46570,46590,46593,46595,46598,46600,46603,46607,46610],[26,46317,46318],{},"By default, axiom.ai runs in a clean Chromium window with no extensions installed. Load another extension to bring its functionality (an ad blocker, a tracking blocker, a password manager, and so on) into the automation's browser session.",[2093,46320,46321],{},[26,46322,46323,46325],{},[192,46324,2359],{}," Only one extension can be loaded at a time. Not all extensions work in Chromium. Ad blockers and other resource-blocking extensions can affect axiom.ai itself; if one is loaded, ask the developer to whitelist axiom.ai.",[2093,46327,46328],{},[26,46329,46330,46332],{},[192,46331,2359],{}," You can't interact with the extension's UI during a run. You can interact with elements the extension inserts into the page's HTML, but only if those elements are inserted before axiom.ai's script runs.",[2093,46334,46335],{},[26,46336,46337,46339,46340,46342],{},[192,46338,2172],{}," As an alternative, run the automation in your local Chrome instead with ",[659,46341,32358],{"href":23852},". You won't be able to drive the extension's UI, but extensions tend to behave more reliably in your real Chrome.",[107,46344,46346],{"id":46345},"load-an-extension","Load an extension",[112,46348],{},[26,46350,46351,46352,46357],{},"The extension needs to already be installed in your local Chrome (or another Chromium-based browser) via the ",[659,46353,46356],{"href":46354,"rel":46355},"https:\u002F\u002Fchromewebstore.google.com",[1218],"Chrome Web Store"," or a manual install.",[1923,46359,46360,46369,46377,46384,46387,46390,46393],{},[189,46361,46362,46363,46365,46366,148],{},"Open Chrome and navigate to ",[145,46364,46219],{},". Find the extension and copy its ",[192,46367,46368],{},"ID",[189,46370,43892,46371,46373,46374,148],{},[145,46372,46136],{}," and copy the ",[192,46375,46376],{},"Profile path",[189,46378,46379,46380,46383],{},"In your file system, open the profile path and find the ",[145,46381,46382],{},"Extensions"," folder.",[189,46385,46386],{},"Open the folder named with the extension ID from step 1.",[189,46388,46389],{},"Open the version folder inside it (the most recent version of the extension).",[189,46391,46392],{},"Copy the full file path of that version folder.",[189,46394,46145,46395,46148,46397,46151,46399,148],{},[192,46396,24349],{},[192,46398,23873],{},[145,46400,46401],{},"Extension path",[26,46403,46404],{},[1906,46405],{"alt":46406,"src":46120},"The load another extension settings panel in the axiom.ai Builder",[2093,46408,46409],{},[26,46410,46411,46413],{},[192,46412,2359],{}," Extension paths can change when the extension updates. If the path includes a version number, you may need to update the path after each update.",[107,46415,46417],{"id":46416},"understand-the-file-path","Understand the file path",[112,46419],{},[26,46421,46422,46423,46426,46427,46430],{},"The path looks similar to these examples, where ",[145,46424,46425],{},"\u003CEXTENSION_ID>"," is from step 1 and ",[145,46428,46429],{},"\u003CEXTENSION_VERSION>"," is the latest version folder:",[186,46432,46433,46440,46447],{},[189,46434,46435,5260,46437],{},[192,46436,7807],{},[145,46438,46439],{},"C:\\Users\\\u003CUSER>\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Extensions\\\u003CEXTENSION_ID>\\\u003CEXTENSION_VERSION>",[189,46441,46442,5260,46444],{},[192,46443,7797],{},[145,46445,46446],{},"\u002FUsers\u002F\u003CUSER>\u002FLibrary\u002FApplication Support\u002FGoogle\u002FChrome\u002FDefault\u002FExtensions\u002F\u003CEXTENSION_ID>\u002F\u003CEXTENSION_VERSION>",[189,46448,46449,5260,46451],{},[192,46450,46177],{},[145,46452,46453],{},"\u002Fhome\u002F\u003CUSER>\u002F.config\u002Fgoogle-chrome\u002FExtensions\u002F\u003CEXTENSION_ID>\u002F\u003CEXTENSION_VERSION>",[107,46455,34069],{"id":34068},[112,46457],{},[21,46459,46461],{"id":46460},"the-extension-isnt-loading","The extension isn't loading",[26,46463,46464],{},"Double-check the file path points at the correct extension and the latest version folder. Update the path if the extension has been updated since you set it.",[21,46466,46468],{"id":46467},"the-extension-loads-but-doesnt-work","The extension loads but doesn't work",[26,46470,46471,46472,148],{},"The extension may not work in Chromium, may need configuration that isn't possible in this context, or may require a sign-in (which isn't supported here). Try running the automation in your local Chrome instead. See ",[659,46473,32358],{"href":23852},[21,46475,46477],{"id":46476},"browser-could-not-be-started","Browser could not be started",[107,46479,6104,46481,46484],{"id":46480},"see-browser-could-not-be-started-title-load-another-extensionmetatitle-load-a-chrome-extension-into-an-axiomai-automationdescription-load-a-chrome-extension-into-the-chromium-window-axiomai-uses-with-one-extension-at-a-time-and-known-limitations-on-interactivityorder-4",[659,46482,46477],{"href":46483},"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fgeneral#browser-could-not-be-started",".---\ntitle: Load another extension\nmetaTitle: Load a Chrome extension into an axiom.ai automation\ndescription: Load a Chrome extension into the Chromium window axiom.ai uses, with one extension at a time and known limitations on interactivity.\norder: 4",[26,46486,46318],{},[2093,46488,46489],{},[26,46490,46491,46325],{},[192,46492,2359],{},[2093,46494,46495],{},[26,46496,46497,46332],{},[192,46498,2359],{},[2093,46500,46501],{},[26,46502,46503,46339,46505,46342],{},[192,46504,2172],{},[659,46506,32358],{"href":23852},[107,46508,46346],{"id":46509},"load-an-extension-1",[112,46511],{},[26,46513,46351,46514,46357],{},[659,46515,46356],{"href":46354,"rel":46516},[1218],[1923,46518,46519,46525,46531,46535,46537,46539,46541],{},[189,46520,46362,46521,46365,46523,148],{},[145,46522,46219],{},[192,46524,46368],{},[189,46526,43892,46527,46373,46529,148],{},[145,46528,46136],{},[192,46530,46376],{},[189,46532,46379,46533,46383],{},[145,46534,46382],{},[189,46536,46386],{},[189,46538,46389],{},[189,46540,46392],{},[189,46542,46145,46543,46148,46545,46151,46547,148],{},[192,46544,24349],{},[192,46546,23873],{},[145,46548,46401],{},[26,46550,46551],{},[1906,46552],{"alt":46406,"src":46120},[2093,46554,46555],{},[26,46556,46557,46413],{},[192,46558,2359],{},[107,46560,46417],{"id":46561},"understand-the-file-path-1",[112,46563],{},[26,46565,46422,46566,46426,46568,46430],{},[145,46567,46425],{},[145,46569,46429],{},[186,46571,46572,46578,46584],{},[189,46573,46574,5260,46576],{},[192,46575,7807],{},[145,46577,46439],{},[189,46579,46580,5260,46582],{},[192,46581,7797],{},[145,46583,46446],{},[189,46585,46586,5260,46588],{},[192,46587,46177],{},[145,46589,46453],{},[107,46591,34069],{"id":46592},"troubleshooting-1",[112,46594],{},[21,46596,46461],{"id":46597},"the-extension-isnt-loading-1",[26,46599,46464],{},[21,46601,46468],{"id":46602},"the-extension-loads-but-doesnt-work-1",[26,46604,46471,46605,148],{},[659,46606,32358],{"href":23852},[21,46608,46477],{"id":46609},"browser-could-not-be-started-1",[26,46611,6104,46612,148],{},[659,46613,46477],{"href":46483},{"title":67,"searchDepth":68,"depth":68,"links":46615},[46616,46617,46618,46623,46625,46626,46627],{"id":46345,"depth":670,"text":46346},{"id":46416,"depth":670,"text":46417},{"id":34068,"depth":670,"text":34069,"children":46619},[46620,46621,46622],{"id":46460,"depth":68,"text":46461},{"id":46467,"depth":68,"text":46468},{"id":46476,"depth":68,"text":46477},{"id":46480,"depth":670,"text":46624},"See Browser could not be started.---\ntitle: Load another extension\nmetaTitle: Load a Chrome extension into an axiom.ai automation\ndescription: Load a Chrome extension into the Chromium window axiom.ai uses, with one extension at a time and known limitations on interactivity.\norder: 4",{"id":46509,"depth":670,"text":46346},{"id":46561,"depth":670,"text":46417},{"id":46592,"depth":670,"text":34069,"children":46628},[46629,46630,46631],{"id":46597,"depth":68,"text":46461},{"id":46602,"depth":68,"text":46468},{"id":46609,"depth":68,"text":46477},"Load a Chrome extension into the Chromium window axiom.ai uses, with one extension at a time and known limitations on interactivity.",{"metaTitle":46634},"Load a Chrome extension into an axiom.ai automation",{"title":23873,"description":46632},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fload-extension","Fgf1d2_mQqUYwQpyKqOliuD730rKr1OcLo79VwnOoz8",{"id":46639,"title":24781,"body":46640,"date":71,"description":46812,"extension":73,"meta":46813,"navigation":75,"order":68,"path":24780,"seo":46815,"stem":46816,"__hash__":46817},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fprofile.md",{"type":8,"value":46641,"toc":46802},[46642,46645,46655,46662,46669,46675,46678,46680,46688,46708,46714,46738,46742,46744,46747,46755,46757,46759,46763,46766,46770,46784,46788,46791,46795],[26,46643,46644],{},"By default, axiom.ai uses Chromium's default profile. Set a custom profile to carry over browser settings (download behaviour, default file locations, and so on) into your automation runs.",[2093,46646,46647],{},[26,46648,46649,46651,46652,46654],{},[192,46650,2359],{}," This setting is only available in the ",[659,46653,7421],{"href":26107},". Profiles must be created in Chromium, not Chrome.",[2093,46656,46657],{},[26,46658,46659,46661],{},[192,46660,2099],{}," If you run an automation without a profile, then run it again with a profile set, the custom profile is deleted. This appears to be a Chromium bug. To avoid it, restart the axiom.ai desktop app before running an automation that uses a custom profile.",[2093,46663,46664],{},[26,46665,46666,46668],{},[192,46667,2099],{}," Chromium must be fully closed before the automation runs. Chromium can crash if it tries to load a profile that's already open in another window.",[26,46670,46671],{},[1906,46672],{"alt":46673,"src":46674},"The set custom Chromium profile settings panel in the axiom.ai Builder","\u002Fdocs\u002Fsettings\u002Fprofile-axiom.ai.jpg",[107,46676,24781],{"id":46677},"set-a-custom-chromium-profile",[112,46679],{},[26,46681,46682,46683,46687],{},"You'll need ",[659,46684,24990],{"href":46685,"rel":46686},"https:\u002F\u002Fdownload-chromium.appspot.com",[1218]," installed in addition to Chrome.",[1923,46689,46690,46695,46699],{},[189,46691,46692,46693,148],{},"Open Chromium and navigate to ",[145,46694,46136],{},[189,46696,46139,46697,27358],{},[192,46698,46376],{},[189,46700,46145,46701,46148,46703,46151,46706,148],{},[192,46702,24349],{},[192,46704,46705],{},"Set profile",[145,46707,46376],{},[26,46709,46710,46711,46713],{},"If ",[145,46712,46136],{}," shows an empty Profile path, Chromium may be installed in the same location as profiles. In that case, the profile is in one of these default locations:",[186,46715,46716,46724,46731],{},[189,46717,46718,5260,46721],{},[192,46719,46720],{},"Windows 7, 8.1, 10, 11",[145,46722,46723],{},"C:\\Users\\\u003CUSER>\\AppData\\Local\\Google\\Chrome\\User Data\\Default",[189,46725,46726,5260,46728],{},[192,46727,7797],{},[145,46729,46730],{},"\u002FUsers\u002F\u003CUSER>\u002FLibrary\u002FApplication Support\u002FGoogle\u002FChrome\u002FDefault",[189,46732,46733,5260,46735],{},[192,46734,46177],{},[145,46736,46737],{},"\u002Fhome\u002F\u003CUSER>\u002F.config\u002Fgoogle-chrome\u002Fdefault",[107,46739,46741],{"id":46740},"modify-settings-inside-the-profile","Modify settings inside the profile",[112,46743],{},[26,46745,46746],{},"To change browser settings the automation will use, open Chromium (with the profile loaded), make the changes, then close Chromium before the next run. Common settings worth changing:",[186,46748,46749,46752],{},[189,46750,46751],{},"Whether downloaded PDFs save to disk or open in the browser.",[189,46753,46754],{},"The default download location.",[107,46756,34069],{"id":34068},[112,46758],{},[21,46760,46762],{"id":46761},"chromium-opens-to-aboutblank-and-the-automation-doesnt-start","Chromium opens to about:blank and the automation doesn't start",[26,46764,46765],{},"Close Chromium completely and start the automation again. Chromium can't load a profile already open in another window.",[21,46767,46769],{"id":46768},"chromium-prompts-you-to-select-a-user","Chromium prompts you to select a user",[26,46771,46772,46773,46775,46776,46779,46780,46783],{},"Compare the profile path in your automation against the value in ",[145,46774,46136],{},". The two must match exactly. Trailing slashes count: ",[145,46777,46778],{},"\u002FProfile"," works, but ",[145,46781,46782],{},"\u002FProfile\u002F"," does not.",[21,46785,46787],{"id":46786},"the-profile-was-removed","The profile was removed",[26,46789,46790],{},"Restart the axiom.ai desktop app before running the automation again. This is the most reliable workaround for the Chromium bug described in the warning above.",[21,46792,46794],{"id":46793},"the-profile-reports-as-corrupt","The profile reports as corrupt",[26,46796,46797,46798,46801],{},"Set the ",[659,46799,46800],{"href":23852},"executable path"," to your downloaded version of Chromium and try again.",{"title":67,"searchDepth":68,"depth":68,"links":46803},[46804,46805,46806],{"id":46677,"depth":670,"text":24781},{"id":46740,"depth":670,"text":46741},{"id":34068,"depth":670,"text":34069,"children":46807},[46808,46809,46810,46811],{"id":46761,"depth":68,"text":46762},{"id":46768,"depth":68,"text":46769},{"id":46786,"depth":68,"text":46787},{"id":46793,"depth":68,"text":46794},"Point axiom.ai at a custom Chromium profile so automations carry over browser settings, downloads behaviour, and other preferences.",{"metaTitle":46814},"Use a custom Chromium profile in axiom.ai automations",{"title":24781,"description":46812},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fprofile","F0rTMt8XcqKI2Kwq8eN_RNO4Ex49qUYrRdkTtjZs_MQ",{"id":46819,"title":23813,"body":46820,"date":71,"description":46874,"extension":73,"meta":46875,"navigation":75,"order":2131,"path":23812,"seo":46877,"stem":46878,"__hash__":46879},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling\u002Fcontinue-on-error.md",{"type":8,"value":46821,"toc":46871},[46822,46825,46841,46847,46851,46853],[26,46823,46824],{},"By default, axiom.ai stops an automation as soon as a step throws an error. This protects against unexpected side effects, like writing partial data to a Google Sheet. The continue on error option overrides that behaviour and lets the automation keep running through errors.",[2093,46826,46827],{},[26,46828,46829,46831,46832,46834,46835,46837,46838,46840],{},[192,46830,2359],{}," When ",[145,46833,23813],{}," is enabled, every run reports as ",[192,46836,31982],{}," at the end, regardless of how many errors occurred. Errors appear as warnings in ",[659,46839,2874],{"href":44973},". Don't use this setting on automations where it matters whether a run actually succeeded.",[26,46842,46843],{},[1906,46844],{"alt":46845,"src":46846},"The Continue on error settings panel in the axiom.ai Builder","\u002Fdocs\u002Fsettings\u002Fcontinue-on-error-axiom.ai.jpg",[107,46848,46850],{"id":46849},"enable-continue-on-error","Enable Continue on error",[112,46852],{},[1923,46854,46855,46859,46867],{},[189,46856,25628,46857,25631],{},[192,46858,24349],{},[189,46860,4245,46861,46863,46864,148],{},[192,46862,23813],{}," section under ",[192,46865,46866],{},"Error handling",[189,46868,31969,46869,31972],{},[145,46870,23813],{},{"title":67,"searchDepth":68,"depth":68,"links":46872},[46873],{"id":46849,"depth":670,"text":46850},"Toggle Continue on error to keep an automation running past failures instead of stopping, with errors shown as warnings in run reports.",{"metaTitle":46876},"Keep running an automation past errors with Continue on error",{"title":23813,"description":46874},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling\u002Fcontinue-on-error","ZC9mllDv2n82VuLI6UlgVXEEAbUEf9qRTOm6BlJg4GA",{"id":46881,"title":24621,"body":46882,"date":71,"description":46918,"extension":73,"meta":46919,"navigation":75,"order":670,"path":24620,"seo":46921,"stem":46922,"__hash__":46923},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling\u002Fiframes.md",{"type":8,"value":46883,"toc":46915},[46884,46887,46893,46897,46899],[26,46885,46886],{},"By default, axiom.ai ignores iframes (embedded frames within a page) when scraping or clicking. Iframes are usually unnecessary for the task and can introduce inconsistencies if the automation reaches into them by accident. Enable iframe support when you need to interact with content inside an iframe.",[26,46888,46889],{},[1906,46890],{"alt":46891,"src":46892},"The Interact with iframes settings panel in the axiom.ai Builder","\u002Fdocs\u002Fsettings\u002Fiframes--axiom.ai.jpg",[107,46894,46896],{"id":46895},"enable-iframe-support","Enable iframe support",[112,46898],{},[1923,46900,46901,46905,46911],{},[189,46902,25628,46903,25631],{},[192,46904,24349],{},[189,46906,4245,46907,46863,46909,148],{},[192,46908,24621],{},[192,46910,46866],{},[189,46912,31969,46913,31972],{},[145,46914,24621],{},{"title":67,"searchDepth":68,"depth":68,"links":46916},[46917],{"id":46895,"depth":670,"text":46896},"Enable iframe support so an automation can scrape and click inside embedded iframes, which axiom.ai ignores by default.",{"metaTitle":46920},"Allow an automation to scrape and click inside iframes",{"title":24621,"description":46918},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling\u002Fiframes","aRJ49siSLF4-CYEkaVqYK4L-BDjkpuRv_ziZ8fNB69M",{"id":46925,"title":46866,"body":46926,"date":71,"description":46959,"extension":73,"meta":46960,"navigation":75,"order":2131,"path":46962,"seo":46963,"stem":46964,"__hash__":46965},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling\u002Findex.md",{"type":8,"value":46927,"toc":46956},[46928,46941,46945,46947,46949],[26,46929,46930,46931,46933,46934,46937,46938,46940],{},"Error handling settings change how an automation reacts to errors and edge cases during a run. Use ",[659,46932,31955],{"href":23812}," to keep going past failures, ",[659,46935,46936],{"href":24620},"iframe support"," to interact with embedded frames, and ",[659,46939,41832],{"href":23832}," to control how axiom.ai detects when a page has finished loading.",[107,46942,46944],{"id":46943},"error-handling-settings","Error handling settings",[112,46946],{},[2218,46948],{},[26,46950,2222,46951,2226,46953,148],{},[659,46952,2225],{"href":1887},[659,46954,2231],{"href":2229,"rel":46955},[1218],{"title":67,"searchDepth":68,"depth":68,"links":46957},[46958],{"id":46943,"depth":670,"text":46944},"Configure how an automation reacts to errors, slow-loading pages, and iframes using continue on error, page monitoring, and iframe support.",{"metaTitle":46961},"Configure how an automation handles errors and edge cases","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling",{"title":46866,"description":46959},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling\u002Findex","z2UQnUc9pZYOb-VN61He-78ALGvdWgRUm2_QUmEBXJE",{"id":46967,"title":23833,"body":46968,"date":71,"description":47009,"extension":73,"meta":47010,"navigation":75,"order":68,"path":23832,"seo":47012,"stem":47013,"__hash__":47014},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling\u002Fpage-monitoring.md",{"type":8,"value":46969,"toc":47006},[46970,46973,46980,46985,46988,46990],[26,46971,46972],{},"By default, axiom.ai watches the page for changes and only continues to the next step once the page has finished loading. This makes automations more reliable, but in rare cases it can slow them down significantly. Disable page monitoring when you've confirmed the wait is unnecessary and the automation is being held back by it.",[2093,46974,46975],{},[26,46976,46977,46979],{},[192,46978,2099],{}," Disabling page monitoring can make an automation less reliable. Test thoroughly after changing this setting; if a page is still loading when the next step runs, that step may fail or pick up incomplete data.",[26,46981,46982],{},[1906,46983],{"alt":46984,"src":41825},"The Disable page monitoring settings panel in the axiom.ai Builder",[107,46986,23833],{"id":46987},"disable-page-monitoring",[112,46989],{},[1923,46991,46992,46996,47002],{},[189,46993,25628,46994,25631],{},[192,46995,24349],{},[189,46997,4245,46998,46863,47000,148],{},[192,46999,23833],{},[192,47001,46866],{},[189,47003,31969,47004,31972],{},[145,47005,23833],{},{"title":67,"searchDepth":68,"depth":68,"links":47007},[47008],{"id":46987,"depth":670,"text":23833},"Disable page monitoring so axiom.ai stops waiting for page changes between steps, useful when monitoring slows automations significantly.",{"metaTitle":47011},"Disable page-load monitoring to speed up an automation",{"title":23833,"description":47009},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling\u002Fpage-monitoring","LHZLJ7wlTkBzO4JkryyENKvPGYGIrcT0TyntcFQjYro",{"id":47016,"title":47017,"body":47018,"date":71,"description":47047,"extension":73,"meta":47048,"navigation":75,"order":2131,"path":47050,"seo":47051,"stem":47052,"__hash__":47053},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fimport-export\u002Findex.md","Import and export",{"type":8,"value":47019,"toc":47044},[47020,47030,47033,47035,47037],[26,47021,47022,47023,47026,47027,47029],{},"You can download an automation as a ",[145,47024,47025],{},".json"," file to share with another user or keep as a backup, and you can import a previously downloaded ",[145,47028,47025],{}," file back into axiom.ai.",[107,47031,47017],{"id":47032},"import-and-export",[112,47034],{},[2218,47036],{},[26,47038,2222,47039,2226,47041,148],{},[659,47040,2225],{"href":1887},[659,47042,2231],{"href":2229,"rel":47043},[1218],{"title":67,"searchDepth":68,"depth":68,"links":47045},[47046],{"id":47032,"depth":670,"text":47017},"Download an automation as a JSON file to share or back up, or import a previously downloaded automation into the Builder.",{"metaTitle":47049},"Import and export axiom.ai automations as JSON files","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fimport-export",{"title":47017,"description":47047},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fimport-export\u002Findex","YF_WqKHVO_DNN-sgzwwM_1xCukhRZrQLP2_aiZpvF-s",{"id":47055,"title":47056,"body":47057,"date":71,"description":47145,"extension":73,"meta":47146,"navigation":75,"order":2131,"path":25877,"seo":47149,"stem":47150,"__hash__":47151},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fimport-export\u002Fsharing.md","Import or download an automation",{"type":8,"value":47058,"toc":47141},[47059,47062,47064,47068,47070,47078,47085,47106,47112,47116,47118,47124,47138],[26,47060,47061],{},"axiom.ai stores each automation as a JSON file. Use these settings to download an automation as a file you can share or back up, or to import a previously downloaded file into the Builder.",[32947,47063],{},[107,47065,47067],{"id":47066},"import-an-automation","Import an automation",[112,47069],{},[26,47071,47072,47073,47077],{},"Importing replaces the current automation with the one in the file. Open the automation you want to overwrite first, or ",[659,47074,47076],{"href":47075},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fdashboard#create-a-new-automation","create a new automation"," and import into that instead.",[2093,47079,47080],{},[26,47081,47082,47084],{},[192,47083,2099],{}," Importing overwrites the current automation as soon as you save. There's no undo, so make sure you're in the right automation before importing.",[1923,47086,47087,47091,47096,47103],{},[189,47088,25628,47089,25631],{},[192,47090,24349],{},[189,47092,4245,47093,2264],{},[192,47094,47095],{},"Import or download",[189,47097,1927,47098,33817,47100,47102],{},[192,47099,33903],{},[145,47101,47025],{}," file to import.",[189,47104,47105],{},"Save the automation to apply the change.",[26,47107,47108],{},[1906,47109],{"alt":47110,"src":47111},"The import or download settings panel in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Fshare-automation.png",[107,47113,47115],{"id":47114},"download-an-automation","Download an automation",[112,47117],{},[26,47119,47120,47121,47123],{},"Downloading exports the current automation as a ",[145,47122,47025],{}," file you can share or back up.",[1923,47125,47126,47130,47134],{},[189,47127,25628,47128,25631],{},[192,47129,24349],{},[189,47131,4245,47132,2264],{},[192,47133,47095],{},[189,47135,1927,47136,148],{},[192,47137,2413],{},[26,47139,47140],{},"The file saves to your usual downloads folder. To use it elsewhere, follow the import steps above.",{"title":67,"searchDepth":68,"depth":68,"links":47142},[47143,47144],{"id":47066,"depth":670,"text":47067},{"id":47114,"depth":670,"text":47115},"Import a previously downloaded automation as a JSON file, or download an automation as JSON to share or back up.",{"metaTitle":47147,"video":47148},"Import an automation from JSON or download one to share","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F2fxhVQfjfqU?rel=0",{"title":47056,"description":47145},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fimport-export\u002Fsharing","3XwEXXhOuVrhL9LWPowBtHfq-lAxaXaBp2NykXyl3KU",{"id":47153,"title":24343,"body":47154,"date":71,"description":47231,"extension":73,"meta":47232,"navigation":75,"order":2131,"path":47234,"seo":47235,"stem":47236,"__hash__":47237},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Findex.md",{"type":8,"value":47155,"toc":47225},[47156,47177,47180,47182,47185,47188,47190,47192,47195,47198,47201,47203,47206,47208,47211,47213,47216,47218],[26,47157,47158,47159,4468,47163,47167,47168,47172,47173,148],{},"Every automation has its own settings. Control ",[659,47160,47162],{"href":47161},"#running","how a bot runs",[659,47164,47166],{"href":47165},"#import-and-export","import or export bots as templates",", decide ",[659,47169,47171],{"href":47170},"#error-handling","how errors are handled",", and manage ",[659,47174,47176],{"href":47175},"#chrome","how the bot uses Chrome",[107,47178,10143],{"id":47179},"running",[112,47181],{},[26,47183,47184],{},"Control how a bot runs - start page, run speed, scroll behaviour, and scheduling.",[2218,47186],{"path":47187},"run-options",[107,47189,47017],{"id":47032},[112,47191],{},[26,47193,47194],{},"Share a bot as a template or download it as a JSON file others can import.",[2218,47196],{"path":47197},"import-export",[107,47199,46866],{"id":47200},"error-handling",[112,47202],{},[26,47204,47205],{},"Decide what happens when a step fails - retry, skip, log, or stop the run.",[2218,47207],{"path":47200},[107,47209,46265],{"id":47210},"chrome",[112,47212],{},[26,47214,47215],{},"Manage how the bot uses Chrome - bypass bot detection, run in incognito mode, and load other extensions.",[2218,47217],{"path":47210},[26,47219,2222,47220,2226,47222,148],{},[659,47221,2225],{"href":1887},[659,47223,2231],{"href":2229,"rel":47224},[1218],{"title":67,"searchDepth":68,"depth":68,"links":47226},[47227,47228,47229,47230],{"id":47179,"depth":670,"text":10143},{"id":47032,"depth":670,"text":47017},{"id":47200,"depth":670,"text":46866},{"id":47210,"depth":670,"text":46265},"Configure how each bot runs, handles errors, uses Chrome, and gets shared as a template.",{"metaTitle":47233},"Bot settings for browser automation | axiom.ai","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings",{"title":24343,"description":47231},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Findex","jjqQNCWh75R6YrHHWv9sv5CvRyMgHNGW1TrIf9G-h3c",{"id":47239,"title":30173,"body":47240,"date":71,"description":47460,"extension":73,"meta":47461,"navigation":75,"order":2642,"path":30498,"seo":47463,"stem":47464,"__hash__":47465},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fblock-resources.md",{"type":8,"value":47241,"toc":47452},[47242,47245,47252,47258,47262,47264,47290,47293,47297,47299,47305,47328,47331,47335,47337,47357,47360,47362,47368,47372,47375,47377,47399,47401,47404,47406,47410,47428,47430,47433,47435,47449],[26,47243,47244],{},"Block resources stops an automation from loading images, fonts, scripts, media, and other webpage assets it doesn't need. Skipping these cuts bandwidth, reduces network traffic, and speeds up runs, especially on heavy pages where the automation only needs the HTML.",[2093,47246,47247],{},[26,47248,47249,47251],{},[192,47250,2099],{}," Blocking some resources, like JavaScript, can break the page. Always test the automation after changing these settings.",[26,47253,47254],{},[1906,47255],{"alt":47256,"src":47257},"The block resources settings panel in the axiom.ai Builder","\u002Fdocs\u002Fsettings\u002Fblock-resources-axiom-ai.png",[107,47259,47261],{"id":47260},"block-resources-for-an-automation","Block resources for an automation",[112,47263],{},[1923,47265,47266,47270,47274,47279,47287],{},[189,47267,25628,47268,25631],{},[192,47269,24349],{},[189,47271,4245,47272,2264],{},[192,47273,30173],{},[189,47275,31969,47276,31972],{},[145,47277,47278],{},"Block individual resources",[189,47280,47281,47282,43261,47285,148],{},"Enter a domain or URL pattern in ",[145,47283,47284],{},"Domain or path",[192,47286,2352],{},[189,47288,47289],{},"For each entry, pick which resource types to block (images, fonts, scripts, media, and so on).",[26,47291,47292],{},"Repeat for every domain or path the automation loads during a run.",[107,47294,47296],{"id":47295},"domain-and-url-patterns","Domain and URL patterns",[112,47298],{},[26,47300,2487,47301,47304],{},[145,47302,47303],{},"*"," as a wildcard to match a group of URLs:",[186,47306,47307,47312,47320],{},[189,47308,47309,47311],{},[145,47310,47303],{}," blocks all URLs.",[189,47313,47314,47317,47318,148],{},[145,47315,47316],{},"axiom.ai\u002F*\u002Fscripts"," blocks any path matching that pattern on ",[145,47319,45531],{},[189,47321,47322,47325,47326,148],{},[145,47323,47324],{},"*.axiom.ai\u002F*"," blocks every subdomain of ",[145,47327,45531],{},[26,47329,47330],{},"Specific patterns let you block bandwidth-heavy resources on third-party domains (analytics, ad servers, image CDNs) while leaving the main site you're scraping untouched.",[107,47332,47334],{"id":47333},"when-to-use-it","When to use it",[112,47336],{},[186,47338,47339,47345,47351],{},[189,47340,47341,47344],{},[192,47342,47343],{},"Scraping text-heavy pages."," Block images, fonts, and media to load pages faster.",[189,47346,47347,47350],{},[192,47348,47349],{},"Avoiding tracking and ads."," Block known analytics or advertising domains so they don't slow the run.",[189,47352,47353,47356],{},[192,47354,47355],{},"Working around heavy third-party scripts."," Block embedded widgets, chat boxes, or video players that aren't needed for the task.",[26,47358,47359],{},"Don't block resources the page genuinely depends on, particularly JavaScript, unless you've tested that the automation still works without them.---\ntitle: Block resources\nmetaTitle: Block images, fonts, and scripts to speed up automations\ndescription: Block images, fonts, scripts, and other webpage resources during a run to cut bandwidth and speed up automations.\norder: 9",[26,47361,47244],{},[2093,47363,47364],{},[26,47365,47366,47251],{},[192,47367,2099],{},[26,47369,47370],{},[1906,47371],{"alt":47256,"src":47257},[107,47373,47261],{"id":47374},"block-resources-for-an-automation-1",[112,47376],{},[1923,47378,47379,47383,47387,47391,47397],{},[189,47380,25628,47381,25631],{},[192,47382,24349],{},[189,47384,4245,47385,2264],{},[192,47386,30173],{},[189,47388,31969,47389,31972],{},[145,47390,47278],{},[189,47392,47281,47393,43261,47395,148],{},[145,47394,47284],{},[192,47396,2352],{},[189,47398,47289],{},[26,47400,47292],{},[107,47402,47296],{"id":47403},"domain-and-url-patterns-1",[112,47405],{},[26,47407,2487,47408,47304],{},[145,47409,47303],{},[186,47411,47412,47416,47422],{},[189,47413,47414,47311],{},[145,47415,47303],{},[189,47417,47418,47317,47420,148],{},[145,47419,47316],{},[145,47421,45531],{},[189,47423,47424,47325,47426,148],{},[145,47425,47324],{},[145,47427,45531],{},[26,47429,47330],{},[107,47431,47334],{"id":47432},"when-to-use-it-1",[112,47434],{},[186,47436,47437,47441,47445],{},[189,47438,47439,47344],{},[192,47440,47343],{},[189,47442,47443,47350],{},[192,47444,47349],{},[189,47446,47447,47356],{},[192,47448,47355],{},[26,47450,47451],{},"Don't block resources the page genuinely depends on, particularly JavaScript, unless you've tested that the automation still works without them.",{"title":67,"searchDepth":68,"depth":68,"links":47453},[47454,47455,47456,47457,47458,47459],{"id":47260,"depth":670,"text":47261},{"id":47295,"depth":670,"text":47296},{"id":47333,"depth":670,"text":47334},{"id":47374,"depth":670,"text":47261},{"id":47403,"depth":670,"text":47296},{"id":47432,"depth":670,"text":47334},"Block images, fonts, scripts, and other webpage resources during a run to cut bandwidth and speed up automations.",{"metaTitle":47462},"Block images, fonts, and scripts to speed up automations",{"title":30173,"description":47460},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fblock-resources","3Id2kMhV1OWQLCR7XnraNTBRcjUA6P77Zi_h6GFDfRc",{"id":47467,"title":47468,"body":47469,"date":71,"description":47567,"extension":73,"meta":47568,"navigation":75,"order":2637,"path":31995,"seo":47570,"stem":47571,"__hash__":47572},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fconcurrency.md","Concurrency",{"type":8,"value":47470,"toc":47561},[47471,47474,47480,47484,47486,47492,47495,47506,47509,47513,47515,47521,47524,47528,47530,47549,47553,47555],[26,47472,47473],{},"Concurrency lets multiple instances of the same automation run at the same time. Useful when an automation is triggered repeatedly (by a webhook, a schedule, or a manual rerun) and you don't want each run to wait for the last one to finish. Turn it off when runs depend on each other, for example when both write to the same Google Sheet and would clash if they ran in parallel.",[26,47475,47476],{},[1906,47477],{"alt":47478,"src":47479},"The concurrency settings panel in the axiom.ai Builder","\u002Fdocs\u002Fsettings\u002Fconcurrency.webp",[107,47481,47483],{"id":47482},"cloud-concurrency","Cloud concurrency",[112,47485],{},[26,47487,31969,47488,47491],{},[145,47489,47490],{},"Allow cloud concurrency"," on to let multiple cloud runs of the automation fire at the same time.",[26,47493,47494],{},"Use it when:",[186,47496,47497,47500,47503],{},[189,47498,47499],{},"A webhook triggers the automation more often than a single run takes to finish.",[189,47501,47502],{},"A schedule overlaps with manual runs.",[189,47504,47505],{},"Each run is independent. It doesn't read or write data another run also touches.",[26,47507,47508],{},"Keep it off when runs share state, especially when both runs read from or write to the same Google Sheet, since simultaneous writes can overwrite each other.",[107,47510,47512],{"id":47511},"desktop-concurrency","Desktop concurrency",[112,47514],{},[26,47516,31969,47517,47520],{},[145,47518,47519],{},"Allow desktop concurrency"," on to let multiple desktop runs of the automation fire at the same time.",[26,47522,47523],{},"The same rules as cloud concurrency apply. Off by default. Desktop runs typically need the screen and a single browser session, so running several in parallel is more likely to clash.",[107,47525,47527],{"id":47526},"set-concurrency-for-an-automation","Set concurrency for an automation",[112,47529],{},[1923,47531,47532,47536,47540,47545],{},[189,47533,25628,47534,25631],{},[192,47535,24349],{},[189,47537,4245,47538,2264],{},[192,47539,47468],{},[189,47541,31969,47542,47544],{},[145,47543,47490],{}," on or off.",[189,47546,31969,47547,47544],{},[145,47548,47519],{},[107,47550,47552],{"id":47551},"need-more-concurrency","Need more concurrency",[112,47554],{},[26,47556,47557,47558,47560],{},"Each plan ships with a default concurrency limit. To raise it, email ",[659,47559,2364],{"href":2363}," for a custom package.",{"title":67,"searchDepth":68,"depth":68,"links":47562},[47563,47564,47565,47566],{"id":47482,"depth":670,"text":47483},{"id":47511,"depth":670,"text":47512},{"id":47526,"depth":670,"text":47527},{"id":47551,"depth":670,"text":47552},"Allow more than one instance of an automation to run at the same time on the cloud or desktop, or keep them sequential when order matters.",{"metaTitle":47569},"Run multiple instances of the same automation in parallel",{"title":47468,"description":47567},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fconcurrency","3BtfLWn4sqrSUEkj59s_JJGb-2HmVCIAbyPBK7kE9WY",{"id":47574,"title":24601,"body":47575,"date":71,"description":47616,"extension":73,"meta":47617,"navigation":75,"order":2623,"path":24600,"seo":47619,"stem":47620,"__hash__":47621},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fheadless.md",{"type":8,"value":47576,"toc":47613},[47577,47580,47587,47593,47597,47599],[26,47578,47579],{},"Headless mode runs an automation in the background, without opening a visible browser window. Useful for desktop runs you want out of the way, or when running on a remote machine without a display.",[2093,47581,47582],{},[26,47583,47584,47586],{},[192,47585,2099],{}," Some sites detect headless browsers and block them. If a site behaves differently in headless mode, run it with the visible browser instead.",[26,47588,47589],{},[1906,47590],{"alt":47591,"src":47592},"The headless mode settings panel in the axiom.ai Builder","\u002Fdocs\u002Fsettings\u002Fheadless-axiom.ai.jpg",[107,47594,47596],{"id":47595},"enable-headless-mode","Enable headless mode",[112,47598],{},[1923,47600,47601,47605,47609],{},[189,47602,25628,47603,25631],{},[192,47604,24349],{},[189,47606,4245,47607,2264],{},[192,47608,24601],{},[189,47610,31969,47611,31972],{},[145,47612,24601],{},{"title":67,"searchDepth":68,"depth":68,"links":47614},[47615],{"id":47595,"depth":670,"text":47596},"Run an automation in headless mode so it executes in the background without opening a visible browser window.",{"metaTitle":47618},"Run automations in headless mode in the background",{"title":24601,"description":47616},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fheadless","SlDggIuk7FzBW7BsmDgbihp0t-bJ_G6aZd2vE6fYh9U",{"id":47623,"title":31660,"body":47624,"date":71,"description":47661,"extension":73,"meta":47662,"navigation":75,"order":2131,"path":47664,"seo":47665,"stem":47666,"__hash__":47667},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Findex.md",{"type":8,"value":47625,"toc":47658},[47626,47643,47647,47649,47651],[26,47627,47628,47629,6205,47632,9879,47635,6205,47637,47639,47640,47642],{},"Run options let you fine-tune how an automation runs. From ",[659,47630,47631],{"href":31771},"scheduling",[659,47633,47634],{"href":24705},"proxies",[659,47636,25143],{"href":24600},[659,47638,26064],{"href":24725},", this section covers every option in the ",[192,47641,31660],{}," panel of the Builder settings.",[107,47644,47646],{"id":47645},"available-run-options","Available run options",[112,47648],{},[2218,47650],{},[26,47652,2222,47653,2226,47655,148],{},[659,47654,2225],{"href":1887},[659,47656,2231],{"href":2229,"rel":47657},[1218],{"title":67,"searchDepth":68,"depth":68,"links":47659},[47660],{"id":47645,"depth":670,"text":47646},"Configure how an automation runs, including scheduling, proxies, timezone, max runtime, headless mode, notifications, and stored cookies.",{"metaTitle":47663},"Configure how an axiom.ai automation runs","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options",{"title":31660,"description":47661},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Findex","nzOBBeurVcpuoYf_7BGXn6bWikMOOU8QxkAurtOGQGw",{"id":47669,"title":24662,"body":47670,"date":71,"description":47716,"extension":73,"meta":47717,"navigation":75,"order":2237,"path":24661,"seo":47719,"stem":47720,"__hash__":47721},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fmax-runtime.md",{"type":8,"value":47671,"toc":47713},[47672,47675,47678,47685,47691,47695,47697],[26,47673,47674],{},"The maximum runtime option stops an automation if it has been running longer than the limit you set. This protects against runaway runs (loops that never exit, slow-loading pages, and so on) burning through your runtime allowance.",[26,47676,47677],{},"The default is set by your subscription plan.",[2093,47679,47680],{},[26,47681,47682,47684],{},[192,47683,2359],{}," This setting only affects cloud runs.",[26,47686,47687],{},[1906,47688],{"alt":47689,"src":47690},"The maximum runtime settings panel in the axiom.ai Builder","\u002Fdocs\u002Fsettings\u002Fruntime-axiom.ai.jpg",[107,47692,47694],{"id":47693},"set-the-maximum-runtime","Set the maximum runtime",[112,47696],{},[1923,47698,47699,47703,47707],{},[189,47700,25628,47701,25631],{},[192,47702,24349],{},[189,47704,4245,47705,2264],{},[192,47706,24662],{},[189,47708,31836,47709,47712],{},[145,47710,47711],{},"Maximum runtime"," to the duration you want as the cap.",{"title":67,"searchDepth":68,"depth":68,"links":47714},[47715],{"id":47693,"depth":670,"text":47694},"Set a maximum runtime so an automation stops automatically if it runs longer than expected.",{"metaTitle":47718},"Cap how long an automation can run in the cloud",{"title":24662,"description":47716},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fmax-runtime","skIT2KhUmOBKRyN5enuO9adp-6bsjsfAT5ly6fgMDPI",{"id":47723,"title":24686,"body":47724,"date":71,"description":47868,"extension":73,"meta":47869,"navigation":75,"order":1478,"path":24685,"seo":47871,"stem":47872,"__hash__":47873},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fnotifications.md",{"type":8,"value":47725,"toc":47861},[47726,47729,47732,47743,47749,47752,47754,47785,47788,47797,47800,47808,47842,47846,47848,47859],[26,47727,47728],{},"Notifications let you know when an automation has finished, so you don't have to keep checking the dashboard. Choose the conditions that should trigger a notification, and pick whether to receive it by email or webhook.",[26,47730,47731],{},"You can be notified when a run:",[186,47733,47734,47737,47740],{},[189,47735,47736],{},"Fails",[189,47738,47739],{},"Finishes with warnings",[189,47741,47742],{},"Succeeds",[26,47744,47745],{},[1906,47746],{"alt":47747,"src":47748},"The notification settings panel in the axiom.ai Builder","\u002Fdocs\u002Fsettings\u002Fnotifications-axiom.ai.jpg",[107,47750,24686],{"id":47751},"set-up-notifications",[112,47753],{},[1923,47755,47756,47760,47766,47777],{},[189,47757,25628,47758,25631],{},[192,47759,24349],{},[189,47761,4245,47762,46863,47764,148],{},[192,47763,24686],{},[192,47765,31660],{},[189,47767,47768,47769,4468,47771,4468,47774,148],{},"Toggle the conditions you want notifications for: ",[145,47770,39944],{},[145,47772,47773],{},"Notify when run has warnings",[145,47775,47776],{},"Notify when run succeeds",[189,47778,2340,47779,2344,47782,148],{},[145,47780,47781],{},"Notify by email",[145,47783,47784],{},"Notify by webhook",[21,47786,47781],{"id":47787},"notify-by-email",[26,47789,47790,47791,47796],{},"Enter one or more email addresses, one per line. The email body includes any errors and metadata. To include extra metadata, add an ",[659,47792,47794],{"href":47793},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fadd-error-metadata",[192,47795,11519],{}," step to your automation.",[21,47798,47784],{"id":47799},"notify-by-webhook",[26,47801,47802,47803,47805,47806,3297],{},"Enter the URL to send a ",[145,47804,9878],{}," request to. axiom.ai sends a JSON payload with this structure. Errors and metadata are included in ",[145,47807,2575],{},[2446,47809,47811],{"className":6112,"code":47810,"language":5926,"meta":67,"style":67},"{\n    \"status\": \"Run Status\",\n    \"log\": \"Axiom Run completed successfully\"\n}\n",[145,47812,47813,47817,47828,47838],{"__ignoreMap":67},[1332,47814,47815],{"class":2455,"line":2131},[1332,47816,6120],{"class":2521},[1332,47818,47819,47821,47823,47826],{"class":2455,"line":670},[1332,47820,23568],{"class":6125},[1332,47822,5260],{"class":2521},[1332,47824,47825],{"class":2462},"\"Run Status\"",[1332,47827,6024],{"class":2521},[1332,47829,47830,47833,47835],{"class":2455,"line":68},[1332,47831,47832],{"class":6125},"    \"log\"",[1332,47834,5260],{"class":2521},[1332,47836,47837],{"class":2462},"\"Axiom Run completed successfully\"\n",[1332,47839,47840],{"class":2455,"line":1478},[1332,47841,2802],{"class":2521},[107,47843,47845],{"id":47844},"send-notifications-to-slack","Send notifications to Slack",[112,47847],{},[26,47849,47850,47851,47853,47854,47858],{},"To get run notifications in Slack, enable ",[145,47852,47784],{}," and point it at a Slack Workflow that accepts the JSON payload above. For setup details, see \"Triggering a Slack workflow with an axiom.ai automation\" in the ",[659,47855,47857],{"href":47856},"\u002Fguides\u002Fslack","Slack guide",". The Slack Workflow needs to be modified to parse the payload format shown above.",[2819,47860,8243],{},{"title":67,"searchDepth":68,"depth":68,"links":47862},[47863,47867],{"id":47751,"depth":670,"text":24686,"children":47864},[47865,47866],{"id":47787,"depth":68,"text":47781},{"id":47799,"depth":68,"text":47784},{"id":47844,"depth":670,"text":47845},"Receive email or webhook notifications when an automation fails, finishes with warnings, or completes successfully.",{"metaTitle":47870},"Get notified when an automation fails, warns, or succeeds",{"title":24686,"description":47868},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fnotifications","csWztHM4l_yJ9vdeIefw-qBPJx9kwr4FI9wb7vhYReA",{"id":47875,"title":24706,"body":47876,"date":71,"description":48176,"extension":73,"meta":48177,"navigation":75,"order":670,"path":24705,"seo":48179,"stem":48180,"__hash__":48181},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fproxy.md",{"type":8,"value":47877,"toc":48166},[47878,47881,47887,47894,47898,47900,47903,47906,47912,47915,47921,47924,47978,47990,47997,48000,48002,48047,48054,48056,48058,48062,48065,48128,48133,48137,48140,48144,48156,48160,48163],[26,47879,47880],{},"The proxy option routes an automation's traffic through a proxy server. Useful for working around sites that block automated traffic, or for reaching content that's restricted to a specific region.",[26,47882,47883],{},[1906,47884],{"alt":47885,"src":47886},"The proxy settings panel in the axiom.ai Builder","\u002Fdocs\u002Fsettings\u002Fproxy-axiom.ai.jpg",[2093,47888,47889],{},[26,47890,47891,47893],{},[192,47892,2359],{}," axiom.ai doesn't offer proxy services. Use a third-party proxy provider, or a self-hosted proxy server.",[107,47895,47897],{"id":47896},"parse-your-proxy-url","Parse your proxy URL",[112,47899],{},[26,47901,47902],{},"Most proxy providers give you a single URL containing every detail you need. The form in axiom.ai splits that URL across separate fields, so before configuring a proxy you'll need to break the URL into its parts.",[26,47904,47905],{},"A proxy URL has this shape:",[2446,47907,47910],{"className":47908,"code":47909,"language":5402},[5400],"\u003Cprotocol>:\u002F\u002F\u003Cusername>:\u003Cpassword>@\u003Chost>:\u003Cport>\n",[145,47911,47909],{"__ignoreMap":67},[26,47913,47914],{},"For example, a proxy from a typical provider might look like this:",[2446,47916,47919],{"className":47917,"code":47918,"language":5402},[5400],"http:\u002F\u002F4bd1c98f3a72de01:xQRtwNZUBsa19YFm@res.proxy-seller.com:10000\n",[145,47920,47918],{"__ignoreMap":67},[26,47922,47923],{},"Mapped onto axiom.ai's fields:",[186,47925,47926,47936,47947,47958,47970],{},[189,47927,47928,11490,47930,47932,47933,3696],{},[145,47929,4600],{},[192,47931,44883],{}," (the part before ",[145,47934,47935],{},":\u002F\u002F",[189,47937,47938,11490,47941,47944,47945,3696],{},[145,47939,47940],{},"Username",[145,47942,47943],{},"4bd1c98f3a72de01"," (the part before the colon, before the ",[145,47946,27928],{},[189,47948,47949,11490,47952,47955,47956,3696],{},[145,47950,47951],{},"Password",[145,47953,47954],{},"xQRtwNZUBsa19YFm"," (the part after the colon, before the ",[145,47957,27928],{},[189,47959,47960,11490,47963,47966,47967,47969],{},[145,47961,47962],{},"IP address",[145,47964,47965],{},"res.proxy-seller.com"," (the part after the ",[145,47968,27928],{},", before the colon). This is a hostname rather than a numeric IP, but the field accepts both.",[189,47971,47972,11490,47975,47977],{},[145,47973,47974],{},"Port",[145,47976,14449],{}," (the part after the final colon).",[2093,47979,47980],{},[26,47981,47982,47984,47985,47989],{},[192,47983,2359],{}," The example above is an HTTP proxy with credentials. Username and password authentication typically only works with HTTP proxies; SOCKS proxies usually authenticate by IP allowlisting at the provider instead. See ",[659,47986,47988],{"href":47987},"#configure-a-proxy","Configure a proxy"," below for details.",[2093,47991,47992],{},[26,47993,47994,47996],{},[192,47995,2359],{}," The example credentials above are not real. Use the credentials your provider gave you.",[107,47998,47988],{"id":47999},"configure-a-proxy",[112,48001],{},[1923,48003,48004,48008,48013,48029,48034,48039],{},[189,48005,25628,48006,25631],{},[192,48007,24349],{},[189,48009,4245,48010,2264],{},[192,48011,48012],{},"Proxy",[189,48014,31836,48015,48017,48018,4468,48020,4468,48023,10147,48026,3696],{},[145,48016,4600],{}," to your proxy's protocol (typically ",[192,48019,44883],{},[192,48021,48022],{},"HTTPS",[192,48024,48025],{},"SOCKS4",[192,48027,48028],{},"SOCKS5",[189,48030,31836,48031,48033],{},[145,48032,47962],{}," to your proxy's hostname or IP.",[189,48035,31836,48036,48038],{},[145,48037,47974],{}," to your proxy's port.",[189,48040,48041,48042,6205,48044,48046],{},"If your proxy needs authentication, set ",[145,48043,47940],{},[145,48045,47951],{}," to the credentials your provider gave you.",[2093,48048,48049],{},[26,48050,48051,48053],{},[192,48052,2359],{}," Username and password authentication typically only works with HTTP proxies. SOCKS proxies usually authenticate by IP allowlisting on the provider's dashboard rather than by credentials in the connection. If you've set the protocol to SOCKS4 or SOCKS5 and the proxy still rejects the connection, check your provider's dashboard for an IP allowlist instead.",[107,48055,34069],{"id":34068},[112,48057],{},[21,48059,48061],{"id":48060},"the-proxy-connection-times-out","The proxy connection times out",[26,48063,48064],{},"Confirm the proxy URL works outside axiom.ai before debugging the automation. A quick test from the terminal:",[2446,48066,48068],{"className":2448,"code":48067,"language":2450,"meta":67,"style":67},"curl -x http:\u002F\u002F\u003Cusername>:\u003Cpassword>@\u003Chost>:\u003Cport> https:\u002F\u002Fwww.google.com\n",[145,48069,48070],{"__ignoreMap":67},[1332,48071,48072,48074,48077,48080,48082,48085,48087,48090,48092,48094,48097,48100,48102,48104,48106,48109,48112,48114,48116,48118,48121,48123,48125],{"class":2455,"line":2131},[1332,48073,4370],{"class":2458},[1332,48075,48076],{"class":2511}," -x",[1332,48078,48079],{"class":2462}," http:\u002F\u002F",[1332,48081,23299],{"class":2507},[1332,48083,48084],{"class":2462},"usernam",[1332,48086,28794],{"class":2521},[1332,48088,48089],{"class":2507},">",[1332,48091,3297],{"class":2462},[1332,48093,23299],{"class":2507},[1332,48095,48096],{"class":2462},"passwor",[1332,48098,48099],{"class":2521},"d",[1332,48101,48089],{"class":2507},[1332,48103,27928],{"class":2462},[1332,48105,23299],{"class":2507},[1332,48107,48108],{"class":2462},"hos",[1332,48110,48111],{"class":2521},"t",[1332,48113,48089],{"class":2507},[1332,48115,3297],{"class":2462},[1332,48117,23299],{"class":2507},[1332,48119,48120],{"class":2462},"por",[1332,48122,48111],{"class":2521},[1332,48124,48089],{"class":2507},[1332,48126,48127],{"class":2462}," https:\u002F\u002Fwww.google.com\n",[26,48129,46710,48130,48132],{},[145,48131,4370],{}," can't reach the proxy either, the issue is with the proxy itself, not with axiom.ai. Contact your proxy provider.",[21,48134,48136],{"id":48135},"pages-load-but-the-wrong-region-appears","Pages load but the wrong region appears",[26,48138,48139],{},"Some proxy providers route traffic through different regions automatically. Check whether your provider offers a region-specific endpoint or sticky session, and use that hostname instead of the rotating one.",[21,48141,48143],{"id":48142},"authentication-errors","Authentication errors",[26,48145,48146,48147,48150,48151,6205,48153,48155],{},"If you see a ",[145,48148,48149],{},"407 Proxy Authentication Required"," error in run logs, double-check that ",[145,48152,47940],{},[145,48154,47951],{}," exactly match the credentials your provider issued. Pay particular attention to leading and trailing whitespace, which can sneak in when copying from a provider's dashboard.",[21,48157,48159],{"id":48158},"socks-proxy-with-credentials-isnt-working","SOCKS proxy with credentials isn't working",[26,48161,48162],{},"Username and password authentication typically only works with HTTP proxies. If your provider gave you a URL with embedded credentials but the protocol is SOCKS4 or SOCKS5, the credentials usually aren't used by the proxy connection itself. Instead, sign in to your provider's dashboard and add the IP address of the machine running the automation to their allowlist. After the IP is allowlisted, the proxy will accept connections from that machine without any credentials in axiom.ai.",[2819,48164,48165],{},"html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":67,"searchDepth":68,"depth":68,"links":48167},[48168,48169,48170],{"id":47896,"depth":670,"text":47897},{"id":47999,"depth":670,"text":47988},{"id":34068,"depth":670,"text":34069,"children":48171},[48172,48173,48174,48175],{"id":48060,"depth":68,"text":48061},{"id":48135,"depth":68,"text":48136},{"id":48142,"depth":68,"text":48143},{"id":48158,"depth":68,"text":48159},"Route automation traffic through a proxy to bypass bot blocks or geo-restricted content, with guidance on parsing a proxy URL into the right fields.",{"metaTitle":48178},"Route automation traffic through a proxy server",{"title":24706,"description":48176},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fproxy","fDWWPlrPVkY35w9062yJzyvJhopgLN7BiR04-P2FUto",{"id":48183,"title":40895,"body":48184,"date":71,"description":48482,"extension":73,"meta":48483,"navigation":75,"order":2131,"path":31771,"seo":48485,"stem":48486,"__hash__":48487},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fschedule.md",{"type":8,"value":48185,"toc":48469},[48186,48189,48195,48199,48201,48210,48214,48220,48224,48231,48235,48238,48249,48252,48258,48262,48264,48267,48270,48292,48296,48331,48335,48365,48369,48466],[26,48187,48188],{},"The schedule option runs an automation automatically on a date, time, and frequency you set. Use it for recurring tasks like daily scrapes, weekly reports, or end-of-month rollups.",[26,48190,48191],{},[1906,48192],{"alt":48193,"src":48194},"The schedule settings panel in the axiom.ai Builder","\u002Fdocs\u002Fsettings\u002Fschedule-axiom.ai.jpg",[107,48196,48198],{"id":48197},"configure-the-schedule","Configure the schedule",[112,48200],{},[26,48202,48203,48204,48206,48207,48209],{},"Open the automation, click the ",[192,48205,24349],{}," icon, and open the ",[192,48208,41012],{}," section. Then configure each field.",[21,48211,48213],{"id":48212},"set-the-date","Set the date",[26,48215,48216,48217,48219],{},"Set the date the automation should first run. Click ",[192,48218,48213],{}," and pick a date. The start date must be in the future.",[21,48221,48223],{"id":48222},"set-the-time","Set the time",[26,48225,48226,48227,48230],{},"Set the time of day the automation should run. Click ",[192,48228,48229],{},"Change time"," and pick a time. This is the time of the first run.",[21,48232,48234],{"id":48233},"set-the-frequency","Set the frequency",[26,48236,48237],{},"Set how often the automation repeats. The available frequencies depend on your subscription plan.",[26,48239,48240,48241,48244,48245,48248],{},"For example, with the time set to ",[145,48242,48243],{},"16:00:00"," and frequency set to ",[192,48246,48247],{},"Daily",", the automation runs at 16:00:00 every day.",[21,48250,31180],{"id":48251},"run-on-this-computer",[26,48253,48254,48255,48257],{},"By default, scheduled runs happen in the cloud. Toggle ",[145,48256,31180],{}," on to run them on your local machine instead. The computer needs to be on and the browser open at the scheduled time.",[107,48259,48261],{"id":48260},"advanced-schedules-with-javascript","Advanced schedules with JavaScript",[112,48263],{},[26,48265,48266],{},"The standard scheduler covers most cases, but you can extend it with a JavaScript condition for patterns it doesn't support directly (weekdays only, end of month, and so on).",[26,48268,48269],{},"To set up a JavaScript schedule:",[1923,48271,48272,48275,48282,48289],{},[189,48273,48274],{},"Set the standard schedule to run at least once on each candidate day. For \"weekdays only\", schedule it daily.",[189,48276,15620,48277,48281],{},[659,48278,48279],{"href":30820},[192,48280,30823],{}," step at the start of the automation.",[189,48283,31836,48284,9879,48286,148],{},[145,48285,39332],{},[192,48287,48288],{},"JS == true",[189,48290,48291],{},"Paste one of the snippets below into the JavaScript field.",[21,48293,48295],{"id":48294},"run-only-on-weekdays","Run only on weekdays",[2446,48297,48299],{"className":2498,"code":48298,"language":2500,"meta":67,"style":67},"return date => date.getDay() % 6 !== 0;\n",[145,48300,48301],{"__ignoreMap":67},[1332,48302,48303,48305,48308,48310,48313,48316,48318,48321,48324,48327,48329],{"class":2455,"line":2131},[1332,48304,12963],{"class":2507},[1332,48306,48307],{"class":2458}," date",[1332,48309,10271],{"class":2507},[1332,48311,48312],{"class":2521}," date.",[1332,48314,48315],{"class":2525},"getDay",[1332,48317,26591],{"class":2521},[1332,48319,48320],{"class":2507},"%",[1332,48322,48323],{"class":2511}," 6",[1332,48325,48326],{"class":2507}," !==",[1332,48328,26768],{"class":2511},[1332,48330,4673],{"class":2521},[21,48332,48334],{"id":48333},"run-only-on-weekends","Run only on weekends",[2446,48336,48338],{"className":2498,"code":48337,"language":2500,"meta":67,"style":67},"return date => date.getDay() % 6 === 0;\n",[145,48339,48340],{"__ignoreMap":67},[1332,48341,48342,48344,48346,48348,48350,48352,48354,48356,48358,48361,48363],{"class":2455,"line":2131},[1332,48343,12963],{"class":2507},[1332,48345,48307],{"class":2458},[1332,48347,10271],{"class":2507},[1332,48349,48312],{"class":2521},[1332,48351,48315],{"class":2525},[1332,48353,26591],{"class":2521},[1332,48355,48320],{"class":2507},[1332,48357,48323],{"class":2511},[1332,48359,48360],{"class":2507}," ===",[1332,48362,26768],{"class":2511},[1332,48364,4673],{"class":2521},[21,48366,48368],{"id":48367},"run-only-on-the-last-day-of-the-month","Run only on the last day of the month",[2446,48370,48372],{"className":2498,"code":48371,"language":2500,"meta":67,"style":67},"const today = new Date();\nconst nextMonth = new Date(today.getFullYear(), today.getMonth() + 1, 1);\nnextMonth.setDate(nextMonth.getDate() - 1);\nreturn today.getDate() === nextMonth.getDate();\n",[145,48373,48374,48389,48426,48446],{"__ignoreMap":67},[1332,48375,48376,48378,48381,48383,48385,48387],{"class":2455,"line":2131},[1332,48377,2508],{"class":2507},[1332,48379,48380],{"class":2511}," today",[1332,48382,2515],{"class":2507},[1332,48384,2697],{"class":2507},[1332,48386,17558],{"class":2525},[1332,48388,2670],{"class":2521},[1332,48390,48391,48393,48396,48398,48400,48402,48405,48408,48411,48414,48416,48418,48420,48422,48424],{"class":2455,"line":670},[1332,48392,2508],{"class":2507},[1332,48394,48395],{"class":2511}," nextMonth",[1332,48397,2515],{"class":2507},[1332,48399,2697],{"class":2507},[1332,48401,17558],{"class":2525},[1332,48403,48404],{"class":2521},"(today.",[1332,48406,48407],{"class":2525},"getFullYear",[1332,48409,48410],{"class":2521},"(), today.",[1332,48412,48413],{"class":2525},"getMonth",[1332,48415,26591],{"class":2521},[1332,48417,26660],{"class":2507},[1332,48419,26596],{"class":2511},[1332,48421,4468],{"class":2521},[1332,48423,19338],{"class":2511},[1332,48425,2583],{"class":2521},[1332,48427,48428,48431,48433,48436,48438,48440,48442,48444],{"class":2455,"line":68},[1332,48429,48430],{"class":2521},"nextMonth.",[1332,48432,26582],{"class":2525},[1332,48434,48435],{"class":2521},"(nextMonth.",[1332,48437,26588],{"class":2525},[1332,48439,26591],{"class":2521},[1332,48441,9555],{"class":2507},[1332,48443,26596],{"class":2511},[1332,48445,2583],{"class":2521},[1332,48447,48448,48450,48453,48455,48457,48459,48462,48464],{"class":2455,"line":1478},[1332,48449,12963],{"class":2507},[1332,48451,48452],{"class":2521}," today.",[1332,48454,26588],{"class":2525},[1332,48456,26591],{"class":2521},[1332,48458,9291],{"class":2507},[1332,48460,48461],{"class":2521}," nextMonth.",[1332,48463,26588],{"class":2525},[1332,48465,2670],{"class":2521},[2819,48467,48468],{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":67,"searchDepth":68,"depth":68,"links":48470},[48471,48477],{"id":48197,"depth":670,"text":48198,"children":48472},[48473,48474,48475,48476],{"id":48212,"depth":68,"text":48213},{"id":48222,"depth":68,"text":48223},{"id":48233,"depth":68,"text":48234},{"id":48251,"depth":68,"text":31180},{"id":48260,"depth":670,"text":48261,"children":48478},[48479,48480,48481],{"id":48294,"depth":68,"text":48295},{"id":48333,"depth":68,"text":48334},{"id":48367,"depth":68,"text":48368},"Run an automation on a recurring schedule by setting a start date, time, and frequency, with optional JavaScript conditions for advanced patterns.",{"metaTitle":48484},"Schedule axiom.ai automations to run automatically",{"title":40895,"description":48482},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fschedule","nmwmXY8_3ABJJniVHXEQQOeXbD3vJbwh4lJcpepNpRY",{"id":48489,"title":24726,"body":48490,"date":71,"description":48617,"extension":73,"meta":48618,"navigation":75,"order":293,"path":24725,"seo":48620,"stem":48621,"__hash__":48622},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fstore-cookies.md",{"type":8,"value":48491,"toc":48609},[48492,48495,48501,48511,48516,48520,48522,48525,48529,48539,48550,48561,48563,48568,48571,48576,48580,48583],[26,48493,48494],{},"The store cookies option shares browser cookies and local storage with cloud runs, so an automation that depends on a logged-in session can reuse that session in the cloud. All stored cookies and local storage are encrypted and have an expiry, so you'll need to resync periodically.",[26,48496,48497,48498,48500],{},"By default, cloud runs use the cookies stored locally with the extension. Set this option to ",[192,48499,39906],{}," to copy cookies into axiom.ai for cloud runs.",[2093,48502,48503],{},[26,48504,48505,48507,48508,48510],{},[192,48506,2172],{}," When stored cookies are enabled, also turn on ",[659,48509,25745],{"href":24685}," so you get notified if a run fails because a stored cookie or local storage session has expired.",[26,48512,48513],{},[1906,48514],{"alt":48515,"src":41069},"The store cookies settings panel in the axiom.ai Builder",[107,48517,48519],{"id":48518},"configure-stored-cookies","Configure stored cookies",[112,48521],{},[26,48523,48524],{},"This setting is configured per automation.",[21,48526,48528],{"id":48527},"add-a-url","Add a URL",[26,48530,48531,48532,43261,48535,48538],{},"Enter a URL in ",[145,48533,48534],{},"Cookies",[192,48536,48537],{},"+ Add"," to register it.",[26,48540,48541,48542,48544,48545,48549],{},"To auto-detect URLs from steps in the automation, click ",[192,48543,39911],{},". Every URL referenced in a ",[659,48546,48547],{"href":17846},[192,48548,17849],{}," step is added to the list. URLs that aren't picked up automatically can be added manually.",[2093,48551,48552],{},[26,48553,48554,48556,48557,48560],{},[192,48555,2359],{}," Some sites use a separate subdomain for sign-in (for example ",[145,48558,48559],{},"login.example.com","). If the sign-in subdomain isn't auto-detected, add it manually.",[21,48562,25561],{"id":25601},[26,48564,1927,48565,48567],{},[192,48566,25561],{}," to copy cookies from your local browser into the stored set for this automation.",[21,48569,25643],{"id":48570},"globally-resync-cookies",[26,48572,1927,48573,48575],{},[192,48574,25643],{}," to copy cookies from your local browser into the stored set for this automation, plus every other automation that uses the same URLs.",[21,48577,48579],{"id":48578},"url-settings","URL settings",[26,48581,48582],{},"For each stored URL:",[186,48584,48585,48591,48597,48603],{},[189,48586,48587,48590],{},[192,48588,48589],{},"URL."," The URL the cookies are stored against. Confirm this matches the URL the automation actually loads.",[189,48592,48593,48596],{},[192,48594,48595],{},"Cookies shared."," On by default. Lets cloud runs reuse the stored cookies for this URL.",[189,48598,48599,48602],{},[192,48600,48601],{},"Local storage shared."," Off by default. Lets cloud runs reuse stored local storage for this URL. Only enable when cookies alone aren't enough; enabling it can slow page loads.",[189,48604,48605,48608],{},[192,48606,48607],{},"Delete."," Remove the stored cookies and local storage for this URL.",{"title":67,"searchDepth":68,"depth":68,"links":48610},[48611],{"id":48518,"depth":670,"text":48519,"children":48612},[48613,48614,48615,48616],{"id":48527,"depth":68,"text":48528},{"id":25601,"depth":68,"text":25561},{"id":48570,"depth":68,"text":25643},{"id":48578,"depth":68,"text":48579},"Share browser cookies and local storage with cloud runs so logged-in sessions are reused, with optional auto-detection of URLs from your automation.",{"metaTitle":48619},"Share browser cookies and local storage with cloud automations",{"title":24726,"description":48617},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fstore-cookies","r79-H85vQzv3D41jvRd_zwN8pBVz6cfbTjPr24zqlK4",{"id":48624,"title":24761,"body":48625,"date":71,"description":48664,"extension":73,"meta":48665,"navigation":75,"order":68,"path":24760,"seo":48667,"stem":48668,"__hash__":48669},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Ftimezone.md",{"type":8,"value":48626,"toc":48661},[48627,48630,48636,48640,48642,48654],[26,48628,48629],{},"By default, scheduled automations run in the cloud on UTC. Use the timezone option to run them on your local timezone instead.",[26,48631,48632],{},[1906,48633],{"alt":48634,"src":48635},"The timezone settings panel in the axiom.ai Builder","\u002Fdocs\u002Fsettings\u002Ftime-zone-axiom.ai.jpg",[107,48637,48639],{"id":48638},"configure-the-timezone","Configure the timezone",[112,48641],{},[1923,48643,48644,48648,48652],{},[189,48645,25628,48646,25631],{},[192,48647,24349],{},[189,48649,4245,48650,2264],{},[192,48651,24761],{},[189,48653,31669],{},[2093,48655,48656],{},[26,48657,48658,48660],{},[192,48659,2359],{}," This setting only affects cloud runs. Desktop runs always use the local timezone of the computer they're running on.",{"title":67,"searchDepth":68,"depth":68,"links":48662},[48663],{"id":48638,"depth":670,"text":48639},"Set the timezone used by scheduled cloud automations, instead of the default UTC.",{"metaTitle":48666},"Set the timezone for scheduled cloud automations",{"title":24761,"description":48664},"docs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Ftimezone","WGWEmvih1eyG20IMtA0KTvey5x4qlRnFpUcIsRTl11k",{"id":48671,"title":48672,"body":48673,"date":71,"description":48737,"extension":73,"meta":48738,"navigation":75,"order":71,"path":47793,"seo":48741,"stem":48742,"__hash__":48743},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fadd-error-metadata.md","Add error metadata step",{"type":8,"value":48674,"toc":48730},[48675,48678,48682,48684,48687,48690,48701,48705,48707,48710,48712,48714,48717,48721,48723],[32947,48676],{"video":48677},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=2380&end=2419?rel=0",[107,48679,48681],{"id":48680},"what-to-use-the-add-error-metadata-step-for","What to use the Add error metadata step for",[112,48683],{},[26,48685,48686],{},"This step's output is included in error messages from subsequent steps, aiding in debugging and testing data output.",[26,48688,48689],{},"You can use this step to:",[186,48691,48692,48695,48698],{},[189,48693,48694],{},"Test data output in steps",[189,48696,48697],{},"Working out causes of errors in steps",[189,48699,48700],{},"Enhance error messages",[107,48702,48704],{"id":48703},"how-to-configure-the-add-error-metadata-step","How to configure the Add error metadata step",[112,48706],{},[26,48708,48709],{},"Add this step to the start of your Axiom.",[21,48711,33318],{"id":11867},[112,48713],{},[26,48715,48716],{},"Build your custom error message here. Use 'Insert Data' to select tokens to display data you wish to check from steps in your Axiom.",[107,48718,48720],{"id":48719},"additional-information","Additional information",[112,48722],{},[26,48724,48725,48726,48729],{},"You may want to try our ",[659,48727,48728],{"href":32798},"'Try catch'"," step to aid debugging.",{"title":67,"searchDepth":68,"depth":68,"links":48731},[48732,48733,48736],{"id":48680,"depth":670,"text":48681},{"id":48703,"depth":670,"text":48704,"children":48734},[48735],{"id":11867,"depth":68,"text":33318},{"id":48719,"depth":670,"text":48720},"Insert debug or error messages. Use to test data output and check step results during automation runs.",{"category":48739,"icon":48740},"Debug","WidgetErrorMetadata.svg",{"title":48672,"description":48737},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fadd-error-metadata","RXrBAUTurbUAjT707MN35qiPnV82-6d8XTLRHymYXPA",{"id":48745,"title":48746,"body":48747,"date":71,"description":48805,"extension":73,"meta":48806,"navigation":75,"order":71,"path":48809,"seo":48810,"stem":48811,"__hash__":48812},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fadd-row-numbers.md","Add row numbers",{"type":8,"value":48748,"toc":48798},[48749,48753,48755,48758,48761,48780,48784,48786,48788,48791,48795],[107,48750,48752],{"id":48751},"what-to-use-the-add-row-numbers-step-for","What to use the Add row numbers step for",[112,48754],{},[26,48756,48757],{},"Insert row numbers into your data set. This step adds a column to the start of your data so you can track each row. It is useful when you want to write data back to specific rows in your data source.",[26,48759,48760],{},"You can use this step to add row numbers to:",[186,48762,48763,48774],{},[189,48764,48765,48766,4468,48768,10147,48770],{},"Data imported from ",[659,48767,41247],{"href":24142},[659,48769,869],{"href":43952},[659,48771,48773],{"href":48772},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-data-from-airtable","Airtable",[189,48775,48776,48777],{},"Data imported via a ",[659,48778,48779],{"href":25942},"webhook.",[107,48781,48783],{"id":48782},"how-to-configure-the-add-row-numbers-step","How to configure the Add row numbers step",[112,48785],{},[21,48787,36491],{"id":580},[26,48789,48790],{},"Select the data to append the row numbers to.",[21,48792,48794],{"id":48793},"offset","Offset",[26,48796,48797],{},"Set an number to start the row numbering at.",{"title":67,"searchDepth":68,"depth":68,"links":48799},[48800,48801],{"id":48751,"depth":670,"text":48752},{"id":48782,"depth":670,"text":48783,"children":48802},[48803,48804],{"id":580,"depth":68,"text":36491},{"id":48793,"depth":68,"text":48794},"Add row numbers to your data so you can track, organise, and manipulate each row during your automation.",{"category":48807,"icon":48808},"Read and write data","WidgetRowNumbers.svg","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fadd-row-numbers",{"title":48746,"description":48805},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fadd-row-numbers","LwFlPrrAWZSJz0T1XjIMknjWr_QDDOITQk5nx_XahNU",{"id":48814,"title":48815,"body":48816,"date":71,"description":48909,"extension":73,"meta":48910,"navigation":75,"order":71,"path":36795,"seo":48912,"stem":48913,"__hash__":48914},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fappend-or-merge-data.md","Append or Merge data step",{"type":8,"value":48817,"toc":48900},[48818,48820,48824,48826,48834,48845,48851,48855,48857,48860,48863,48865,48871,48874,48876,48882,48886,48888,48891,48895,48897],[32947,48819],{"video":36828},[107,48821,48823],{"id":48822},"what-to-use-the-append-or-merge-data-step-for","What to use the Append or Merge data step for",[112,48825],{},[26,48827,48828,48829,48833],{},"This step merges data by appending one set to another, either horizontally to merge rows or vertically to add columns from the second set to the end of the first. It's commonly used to append a webpage's URL to ",[659,48830,48832],{"href":48831},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fget-data-from-website","'scraped data.'","\nYou can use this step to:",[186,48835,48836,48839,48842],{},[189,48837,48838],{},"Combine Google Sheet data with scraped data",[189,48840,48841],{},"Merge scraped data to a CSV",[189,48843,48844],{},"Join two sets of scraped data",[26,48846,48847,48848],{},"If you are looking to join different data sources based on matching columns try this ",[659,48849,48850],{"href":36855},"step.",[107,48852,48854],{"id":48853},"how-to-configure-the-append-or-merge-data-step","How to configure the Append or Merge data step",[112,48856],{},[26,48858,48859],{},"If you need to combine more than two sets of data, use multiple Append data steps.",[21,48861,36818],{"id":48862},"data-a",[112,48864],{},[26,48866,48867,48868,48870],{},"Select the Data to be appended to (For example, data from a ",[659,48869,33092],{"href":24142}," When selecting data, click on the token to see a preview. Click 'Save and close' to select all or click 'Clear All' to choose columns individually.",[21,48872,36824],{"id":48873},"data-b",[112,48875],{},[26,48877,48878,48879,48870],{},"Select the Data to be appended (For example, data from the ",[659,48880,48881],{"href":48831},"Get data step.",[21,48883,48885],{"id":48884},"append-mode","Append mode",[112,48887],{},[26,48889,48890],{},"Choose to append the data horizontally or vertically. axiom.ai's data is formatted in a 2D array, so we commonly use the horizontal method which adds a column to the end of the array.",[21,48892,48894],{"id":48893},"output","Output",[112,48896],{},[26,48898,48899],{},"A preview of the appended data, so you can decide how you want to add it.",{"title":67,"searchDepth":68,"depth":68,"links":48901},[48902,48903],{"id":48822,"depth":670,"text":48823},{"id":48853,"depth":670,"text":48854,"children":48904},[48905,48906,48907,48908],{"id":48862,"depth":68,"text":36818},{"id":48873,"depth":68,"text":36824},{"id":48884,"depth":68,"text":48885},{"id":48893,"depth":68,"text":48894},"Join data from separate steps. Use to combine scraped data with data from a Google Sheet. Join single columns or entire datasets.",{"category":38518,"icon":48911},"WidgetFilterAppend.svg",{"title":48815,"description":48909},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fappend-or-merge-data","sFc7P6O4atmjqFGlQZ4ZDfj34_CWDB5nt4waLzQ1M5c",{"id":48916,"title":48917,"body":48918,"date":71,"description":48950,"extension":73,"meta":48951,"navigation":75,"order":71,"path":29007,"seo":48954,"stem":48955,"__hash__":48956},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fback.md","Back step",{"type":8,"value":48919,"toc":48946},[48920,48923,48929,48931,48936,48938,48943],[32947,48921],{"video":48922},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FQ7O7QzaDS3I?si=cxqftugzWbysa_9T&start=751&rel=0",[107,48924,48926,48927,36811],{"id":48925},"purpose-of-the-back-step","Purpose of the ",[192,48928,29010],{},[112,48930],{},[26,48932,2273,48933,48935],{},[192,48934,29010],{}," step is a simple action that navigates back to the previous page, similar to clicking the 'Back' button in a browser.",[26,48937,48689],{},[186,48939,48940],{},[189,48941,48942],{},"Navigate to the previous page in your browser workflow",[26,48944,48945],{},"This step requires no configuration.",{"title":67,"searchDepth":68,"depth":68,"links":48947},[48948],{"id":48925,"depth":670,"text":48949},"Purpose of the Back step","Go back to the previous tab. Return to an earlier page during an automation run.",{"category":48952,"icon":48953},"Navigate","WidgetDriverBack.svg",{"title":48917,"description":48950},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fback","5SKdRX1dQ4xnsI9D_eDIHuriffME3kjeSJqcJzSzVjg",{"id":48958,"title":48959,"body":48960,"date":71,"description":49000,"extension":73,"meta":49001,"navigation":75,"order":71,"path":21968,"seo":49004,"stem":49005,"__hash__":49006},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclear-cookies.md","Clear cookies step",{"type":8,"value":48961,"toc":48996},[48962,48965,48969,48971,48974,48976,48987,48991,48993],[32947,48963],{"video":48964},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1690&end=1709?rel=0",[107,48966,48968],{"id":48967},"what-to-use-the-clear-cookies-step-for","What to use the Clear cookies step for",[112,48970],{},[26,48972,48973],{},"This step, 'Clear cookies,' is useful for switching between accounts in the same web application and requires no configuration.",[26,48975,48689],{},[186,48977,48978,48981,48984],{},[189,48979,48980],{},"Remove session data",[189,48982,48983],{},"When logging in with multiple accounts",[189,48985,48986],{},"For additional security",[107,48988,48990],{"id":48989},"how-to-configure-the-clear-cookies-step","How to configure the Clear cookies step",[112,48992],{},[26,48994,48995],{},"No configuration is required. Add the step when needed.",{"title":67,"searchDepth":68,"depth":68,"links":48997},[48998,48999],{"id":48967,"depth":670,"text":48968},{"id":48989,"depth":670,"text":48990},"Clear cookies during a run. Use to log out or fix login issues caused by corrupted cookies.",{"category":49002,"icon":49003},"Other","WidgetDriverClearCookies.svg",{"title":48959,"description":49000},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclear-cookies","AOX3ZtDUw6vJCOGZtBImdXMEyn-AoOuoecFjxSmE514",{"id":49008,"title":49009,"body":49010,"date":71,"description":49072,"extension":73,"meta":49073,"navigation":75,"order":71,"path":44545,"seo":49075,"stem":49076,"__hash__":49077},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclear-data-from-a-google-sheet.md","Clear data from a Google Sheet step",{"type":8,"value":49011,"toc":49063},[49012,49015,49019,49021,49027,49032,49036,49038,49041,49044,49047,49050,49053,49056,49060],[32947,49013],{"video":49014},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1709&end=1749?rel=0",[107,49016,49018],{"id":49017},"what-to-use-the-clear-data-from-a-google-sheet-step-for","What to use the Clear data from a Google Sheet step for",[112,49020],{},[26,49022,49023,49024,48833],{},"This step clears the contents of the selected cell range while preserving formatting in a Google sheet. Use this step to clear data stored in a Google Sheet rather than ",[659,49025,49026],{"href":32103},"deleting rows.",[186,49028,49029],{},[189,49030,49031],{},"Clear values from a Google Sheet",[107,49033,49035],{"id":49034},"how-to-configure-the-clear-data-from-a-google-sheet-step","How to configure the Clear data from a Google Sheet step",[112,49037],{},[21,49039,36402],{"id":49040},"spreadsheet",[26,49042,49043],{},"Select a Google Sheet to clear, or paste its URL here . You can also use 'Insert Data' to pass spreadsheet URLs into this step.",[21,49045,36408],{"id":49046},"sheet-name",[26,49048,49049],{},"Leave blank to use the first sheet or select a sheet name.",[21,49051,36414],{"id":49052},"first-cell",[26,49054,49055],{},"Enter a column and row number if you wish to start your clear operation from a particular cell in your Google Sheet. For example, 'B10' will\nmean your bot will start clear data from the second column on the 10th row.",[21,49057,49059],{"id":49058},"last-cell","Last Cell",[26,49061,49062],{},"Enter a column and row number combination if you wish to end the clear operation at a particular cell in your Google Sheet. For example, 'B100' will mean your bot will end clearing data at the 100th row in the second column.",{"title":67,"searchDepth":68,"depth":68,"links":49064},[49065,49066],{"id":49017,"depth":670,"text":49018},{"id":49034,"depth":670,"text":49035,"children":49067},[49068,49069,49070,49071],{"id":49040,"depth":68,"text":36402},{"id":49046,"depth":68,"text":36408},{"id":49052,"depth":68,"text":36414},{"id":49058,"depth":68,"text":49059},"Clear data from your Google Sheet. Use to remove rows, columns, or entire ranges before writing new data.",{"category":48807,"icon":49074},"WidgetClearGoogleSheet.svg",{"title":49009,"description":49072},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclear-data-from-a-google-sheet","lcZMooT5UpnDWq556CfwlmM5oMW2B-EzBXCfzFekkow",{"id":49079,"title":49080,"body":49081,"date":71,"description":49187,"extension":73,"meta":49188,"navigation":75,"order":71,"path":15778,"seo":49191,"stem":49192,"__hash__":49193},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclick-element.md","Click element step",{"type":8,"value":49082,"toc":49179},[49083,49086,49090,49092,49095,49097,49135,49138,49140,49142,49145,49148,49159,49165,49169,49172,49176],[32947,49084],{"video":49085},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1749&end=1838?rel=0",[107,49087,49089],{"id":49088},"what-to-use-the-click-element-step-for","What to use the click element step for",[112,49091],{},[26,49093,49094],{},"The \"Click element\" step automates clicks in web automation, essential for actions like liking content or submitting forms. Learn about optional clicks and using element text for button selection.",[26,49096,48689],{},[186,49098,49099,49105,49108,49120,49130],{},[189,49100,49101,49102],{},"Click submit on a ",[659,49103,23880],{"href":49104},"\u002Fblog\u002Fhow-to-automate-data-entry",[189,49106,49107],{},"Close a pop-up window by clicking 'X'",[189,49109,49110,49111,49115,49116,49119],{},"Like an ",[659,49112,49114],{"href":49113},"\u002Fblog\u002Fautomate-instagram-post","Instagram post"," - Click on a ",[659,49117,49118],{"href":20850},"select list"," - Tick a box",[189,49121,49122,49125,49126],{},[659,49123,22127],{"href":49124},"\u002Fblog\u002Fhow-to-send-email-blast"," - Click to generate ",[659,49127,49129],{"href":49128},"\u002Fblog\u002Fhow-to-automate-reporting","reports",[189,49131,49132,49133,15415],{},"Click to discover even more uses for the ",[659,49134,15781],{"href":31632},[107,49136,314],{"id":49137},"configuration",[112,49139],{},[21,49141,33198],{"id":15831},[26,49143,49144],{},"Click 'Select' to choose the button click you wish to automate. The display will transform into the single selector tool, then point and click.",[26,49146,49147],{},"The single selector tool comes with several valuable features accessed by clicking custom:",[186,49149,49150,49153,49156],{},[189,49151,49152],{},"Ability to use custom CSS selectors",[189,49154,49155],{},"'Use element text' allows you to click buttons based on the button text i.e. 'Submit'",[189,49157,49158],{},"Pass CSS selectors in from data sources like a Google Sheet",[26,49160,49161],{},[659,49162,49164],{"href":49163},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool","Watch these guides to learn more about the selector tool.",[21,49166,49168],{"id":49167},"left-click-right-click","Left click | Right click",[26,49170,49171],{},"Toggle off to perform a left click; toggle on to perform a right click.",[21,49173,49175],{"id":49174},"optional-click-can-be-very-handy","Optional click (Can be very handy)",[26,49177,49178],{},"By default, if the selected element is missing, Axiom will throw an error and stop the run. However, in some cases, you may want to click on an element that is not always present. If you check this box, the error will be ignored and the run will complete.",{"title":67,"searchDepth":68,"depth":68,"links":49180},[49181,49182],{"id":49088,"depth":670,"text":49089},{"id":49137,"depth":670,"text":314,"children":49183},[49184,49185,49186],{"id":15831,"depth":68,"text":33198},{"id":49167,"depth":68,"text":49168},{"id":49174,"depth":68,"text":49175},"Replicate page clicks on links or buttons with the Click element step. Point and click to select the action you want to automate.",{"category":49189,"icon":49190},"Interact","WidgetDriverClick.svg",{"title":49080,"description":49187},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclick-element","Dqft2xEmSrvXpNUPqpdHxo968EaVTJn5AGKk--_6hY4",{"id":49195,"title":49196,"body":49197,"date":71,"description":49257,"extension":73,"meta":49258,"navigation":75,"order":71,"path":16493,"seo":49260,"stem":49261,"__hash__":49262},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclick-multiple-elements.md","Click multiple elements step",{"type":8,"value":49198,"toc":49249},[49199,49202,49205,49209,49211,49214,49216,49224,49228,49230,49232,49235,49239,49241,49243,49246],[32947,49200],{"video":49201},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=3192&end=3220?rel=0",[26,49203,49204],{},"Use our 'Click multiple elements' step to automate many button clicks on any webpage without code.",[107,49206,49208],{"id":49207},"what-to-use-the-click-multiple-elements-step-for","What to use the Click multiple elements step for",[112,49210],{},[26,49212,49213],{},"Instruct the bot to click multiple buttons, links, or other elements with a common structure, ideal for listing and feed pages.",[26,49215,48689],{},[186,49217,49218,49221],{},[189,49219,49220],{},"Click buttons on listing pages",[189,49222,49223],{},"Interact with buttons in feeds",[107,49225,49227],{"id":49226},"how-to-configure-the-click-multiple-elements-step","How to configure the Click multiple elements step",[112,49229],{},[21,49231,33198],{"id":15831},[26,49233,49234],{},"Click 'Select' to choose the button click you wish to automate. The display will transform into the Single selector tool, then point and click.",[26,49236,49237],{},[659,49238,49164],{"href":49163},[21,49240,49168],{"id":49167},[26,49242,49171],{},[21,49244,34728],{"id":49245},"maximum-clicks",[26,49247,49248],{},"The maximum number of clicks to perform.",{"title":67,"searchDepth":68,"depth":68,"links":49250},[49251,49252],{"id":49207,"depth":670,"text":49208},{"id":49226,"depth":670,"text":49227,"children":49253},[49254,49255,49256],{"id":15831,"depth":68,"text":33198},{"id":49167,"depth":68,"text":49168},{"id":49245,"depth":68,"text":34728},"Replicate multiple clicks on links or buttons with the Click element step. Point and click to select each action to automate.",{"category":49189,"icon":49259},"WidgetDriverClickMultiple.svg",{"title":49196,"description":49257},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclick-multiple-elements","JLiq6lKSanl94mv-bShfgQ6Xcl9XquENuEW9XtawsS0",{"id":49264,"title":49265,"body":49266,"date":71,"description":49343,"extension":73,"meta":49344,"navigation":75,"order":71,"path":16434,"seo":49346,"stem":49347,"__hash__":49348},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclick-social-media-buttons.md","Click social media buttons step",{"type":8,"value":49267,"toc":49336},[49268,49271,49275,49277,49287,49305,49309,49311,49313,49315,49317,49325,49329,49333],[32947,49269],{"video":49270},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=3247&end=3312?rel=0",[107,49272,49274],{"id":49273},"what-to-use-the-click-social-media-buttons-step-for","What to use the Click social media buttons step for",[112,49276],{},[26,49278,49279,49280,49283,49284,48833],{},"Click on a social button such as like, follow, etc. but only if it has not already been clicked. Create web automations for any social media platform with this handy step and ",[659,49281,49282],{"href":178},"others."," Why not try this ",[659,49285,49286],{"href":1029},"Instagram template.",[186,49288,49289],{},[189,49290,49291,49292,49295,49296,49300,49301],{},"Click like on ",[659,49293,49294],{"href":1029},"Instagram","- Heart tweets on ",[659,49297,49299],{"href":49298},"\u002Fguides\u002Fgoogle-sheets-tweeter","Twitter","- Thumbs up on ",[659,49302,49304],{"href":49303},"\u002Fguides\u002Fautomate-facebook-posts","Facebook",[107,49306,49308],{"id":49307},"how-to-configure-the-click-social-media-buttons-step","How to configure the Click social media buttons step",[112,49310],{},[21,49312,33198],{"id":15831},[26,49314,49234],{},[26,49316,49147],{},[186,49318,49319,49321,49323],{},[189,49320,49152],{},[189,49322,49155],{},[189,49324,49158],{},[26,49326,49327],{},[659,49328,49164],{"href":49163},[21,49330,49332],{"id":49331},"set-value-to-check","Set value to check",[26,49334,49335],{},"The bot will check these values. If one is present on the link or in the button code, it will not perform the click. We have set some default values to check for in the HTML. You may need to use the Chrome Inspector tool to work out new values to check for.",{"title":67,"searchDepth":68,"depth":68,"links":49337},[49338,49339],{"id":49273,"depth":670,"text":49274},{"id":49307,"depth":670,"text":49308,"children":49340},[49341,49342],{"id":15831,"depth":68,"text":33198},{"id":49331,"depth":68,"text":49332},"Automate actions on social media such as like and follow. Set a value to ensure clicks do not unfollow or unlike.",{"category":49189,"icon":49345},"WidgetClickEngagementButton.svg",{"title":49265,"description":49343},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclick-social-media-buttons","AOF4AloDmoLKGUgxiuqL4wSm-LdXB_epd4DvH4FuFdg",{"id":49350,"title":49351,"body":49352,"date":71,"description":49387,"extension":73,"meta":49388,"navigation":75,"order":71,"path":21865,"seo":49390,"stem":49391,"__hash__":49392},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclipboard.md","Get clipboard contents step",{"type":8,"value":49353,"toc":49383},[49354,49358,49360,49363,49374,49378,49380],[107,49355,49357],{"id":49356},"what-to-use-the-get-clipboard-contents-step-for","What to use the Get clipboard contents step for",[112,49359],{},[26,49361,49362],{},"Use this step to read whatever is currently on the browser's clipboard and make it available to the steps that follow. It's useful for pages that respond to a \"copy\" button by putting the result on the clipboard rather than rendering it into the page, so there's nothing to scrape from the DOM.",[26,49364,49365,49366,49369,49370,49373],{},"Capture the clipboard value, then pass it into a later step — for example, write it to a ",[659,49367,49368],{"href":44340},"'Google Sheet'",", or use it to ",[659,49371,49372],{"href":17231},"'enter text'"," elsewhere on the page.",[107,49375,49377],{"id":49376},"how-to-configure-the-get-clipboard-contents-step","How to configure the Get clipboard contents step",[112,49379],{},[26,49381,49382],{},"This step takes no configuration. When it runs it reads the current clipboard contents and returns them as data you can reference in subsequent steps.",{"title":67,"searchDepth":68,"depth":68,"links":49384},[49385,49386],{"id":49356,"depth":670,"text":49357},{"id":49376,"depth":670,"text":49377},"Read the browser's clipboard during a bot run and use it in later steps — useful when a page copies its output to the clipboard instead of the page.",{"category":17816,"icon":49389},"WidgetDriverClipboardContents.svg",{"title":49351,"description":49387},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclipboard","sotT_VH4EmpMgVu_ABTcrETnComkAnJoITMbaZwKhPc",{"id":49394,"title":49395,"body":49396,"date":71,"description":49443,"extension":73,"meta":49444,"navigation":75,"order":71,"path":21784,"seo":49446,"stem":49447,"__hash__":49448},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclose-tab.md","Close browser tab step",{"type":8,"value":49397,"toc":49437},[49398,49401,49405,49407,49414,49416,49424,49428,49430,49434],[32947,49399],{"video":49400},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1839&end=1864?rel=0",[107,49402,49404],{"id":49403},"what-to-use-the-close-browser-tab-step-for","What to use the Close browser tab step for",[112,49406],{},[26,49408,49409,49410,49413],{},"This step closes a tab, necessary when new pages open during bot runs to return to the previous tab. The bot operates in only one tab at a time and cannot switch tabs automatically. Errors like 'click not found' occur if the bot is active in the wrong tab. Combine this step with the ",[659,49411,49412],{"href":35778},"'Switch tab'"," step for multi-tab automation.",[26,49415,48689],{},[186,49417,49418,49421],{},[189,49419,49420],{},"Close new tabs that open in pop up windows",[189,49422,49423],{},"Return to previous tab",[107,49425,49427],{"id":49426},"how-to-configure-the-close-browser-tab-step","How to configure the Close browser tab step",[112,49429],{},[21,49431,49433],{"id":49432},"select-tab","Select Tab",[26,49435,49436],{},"Set the position of the tab to switch to. 1 chooses the tab on the farthest left, 2 the second left etc.",{"title":67,"searchDepth":68,"depth":68,"links":49438},[49439,49440],{"id":49403,"depth":670,"text":49404},{"id":49426,"depth":670,"text":49427,"children":49441},[49442],{"id":49432,"depth":68,"text":49433},"Close tabs during runtime. Use to manage open pages and keep the automation focused on active tasks.",{"category":48952,"icon":49445},"WidgetDriverCloseTab.svg",{"title":49395,"description":49443},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclose-tab","K5rlOF6EPHuBEWtqK-uiC9EaW2L3Qv9XWe2PhEzkrFo",{"id":49450,"title":34814,"body":49451,"date":71,"description":49563,"extension":73,"meta":49564,"navigation":75,"order":71,"path":34811,"seo":49567,"stem":49568,"__hash__":49569},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fconditionall-jump-step.md",{"type":8,"value":49452,"toc":49552},[49453,49456,49460,49462,49465,49467,49487,49497,49501,49503,49506,49509,49512,49515,49518,49521,49524,49527,49530,49533,49536,49539,49542,49546],[32947,49454],{"video":49455},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=579&end=661?rel=0",[107,49457,49459],{"id":49458},"what-to-use-the-conditionally-jump-step-for","What to use the Conditionally Jump step for",[112,49461],{},[26,49463,49464],{},"This logic step enables a bot to either jump to a new step or continue with its run based on the evaluation of a specific condition. For instance, it can be effectively paired with a Scraper step. In this scenario, once the Scraper extracts certain data, the logic step then assesses this data for a particular value. If the value is found, the bot is programmed to jump to a new step. If the value is not found the bot will continue.",[26,49466,48689],{},[186,49468,49469,49472,49479,49482],{},[189,49470,49471],{},"Check for a value in Google sheet to bypass steps",[189,49473,49474,49475,49478],{},"Check against a value on a webpage by ",[659,49476,49477],{"href":48831},"scraping"," it first",[189,49480,49481],{},"Confirm a form or post has been submitted",[189,49483,49484,49485],{},"Control the bot flow depending on a value found in a ",[659,49486,26048],{"href":24142},[26,49488,49489,49490,49493,49494,49496],{},"When combining the ",[659,49491,34814],{"href":49492},"#"," step and the ",[659,49495,15653],{"href":15650}," step, we recommend only using this step to jump to a later step in the loop, or to jump out of the loop to a later step in your automation. We do not recommend using this step to jump to an earlier step in the loop and this can not be used to jump to a previous iteration within the loop - doing so may cause issues with the data within the loop step.",[107,49498,49500],{"id":49499},"how-to-configure-the-conditionally-jump","How to configure the Conditionally jump",[112,49502],{},[21,49504,39327],{"id":49505},"data-to-check",[26,49507,49508],{},"Enter the data to check for values.",[21,49510,39332],{"id":49511},"condition-to-check",[26,49513,49514],{},"Check data for either a list of words, a number or if a javascript expression is true.",[26,49516,49517],{},"Enter either a list of any number of words to check for, separated by commas, or data containing a list of words, one in each row or a number.",[26,49519,49520],{},"Select if the condition should pass when either any of the supplied words are present in the data, or all of them are. Or select the condition to apply when Numbers is selected.",[26,49522,49523],{},"Check this to match only when the complete word appears in the data. Only the characters a-z A-Z 0-9 and _ are considered to be part of a word, all other characters are considered as being part of a word boundary.",[21,49525,34831],{"id":49526},"jump-to-step",[26,49528,49529],{},"Enter the number of the step to jump to if the value is found.",[21,49531,34839],{"id":49532},"maximum-cycles",[26,49534,49535],{},"The number of times the step should jump.",[21,49537,39315],{"id":49538},"reverse-condition",[26,49540,49541],{},"Jump if the specified words or number NOT found.",[21,49543,49545],{"id":49544},"addional-information","Addional information",[26,49547,31861,49548,49551],{},[659,49549,49550],{"href":15650},"loop step"," to loop your steps.",{"title":67,"searchDepth":68,"depth":68,"links":49553},[49554,49555],{"id":49458,"depth":670,"text":49459},{"id":49499,"depth":670,"text":49500,"children":49556},[49557,49558,49559,49560,49561,49562],{"id":49505,"depth":68,"text":39327},{"id":49511,"depth":68,"text":39332},{"id":49526,"depth":68,"text":34831},{"id":49532,"depth":68,"text":34839},{"id":49538,"depth":68,"text":39315},{"id":49544,"depth":68,"text":49545},"Jump to a different step based on logic set. Use strings, numbers, or JavaScript to define your argument.",{"category":49565,"icon":49566},"Control flow","WidgetJump.svg",{"title":34814,"description":49563},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fconditionall-jump-step","m5Q_QqCr0Di7plu0a0qkFR6D8_AtBmN2g0zV0dNsXig",{"id":49571,"title":49572,"body":49573,"date":71,"description":49650,"extension":73,"meta":49651,"navigation":75,"order":71,"path":30820,"seo":49653,"stem":49654,"__hash__":49655},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcontinue-if-condition-met.md","Continue only if a condition is met step",{"type":8,"value":49574,"toc":49641},[49575,49578,49582,49584,49591,49593,49610,49614,49616,49618,49621,49623,49625,49628,49630,49633,49636,49638],[32947,49576],{"video":49577},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=3085&end=3192?rel=0",[107,49579,49581],{"id":49580},"what-to-use-the-continue-only-if-a-condition-is-met-step-for","What to use the Continue only if a condition is met step for",[112,49583],{},[26,49585,49586,49587,49590],{},"This logic step checks a value and continues the bot run if true. For instance, it can verify if content is updated by searching for 'New.' Pair it with the ",[659,49588,49589],{"href":48831},"'scrape data'"," step to fetch the value.",[26,49592,48689],{},[186,49594,49595,49598,49603,49605],{},[189,49596,49597],{},"Query if there's any data left in a Google Sheet, then stop bot run if empty",[189,49599,49474,49600,49478],{},[659,49601,49602],{"href":48831},"'scraping'",[189,49604,49481],{},[189,49606,49607,49608],{},"Control if a bot runs depending on a value found in a ",[659,49609,26048],{"href":24142},[107,49611,49613],{"id":49612},"how-to-configure-the-continue-only-if-a-condition-is-met-step","How to configure the Continue only if a condition is met step",[112,49615],{},[21,49617,39327],{"id":49505},[26,49619,49620],{},"Select the variable containing the data you wish to check against. That variable could be from any step, for example, a webhook or scraper",[21,49622,39332],{"id":49511},[26,49624,49514],{},[26,49626,49627],{},"Enter either a list of any number of words to check for, separated by commas, or data containing a list of words, one in each row. Leave blank to match anything. Or select the condition to apply when Numbers is selected.",[26,49629,49523],{},[21,49631,39450],{"id":49632},"fail-if-condition-not-met",[26,49634,49635],{},"Tick this box to end the run with the 'Failed' status if the condition is not met. If this is left unchecked, the run will end in 'Success' instead.",[21,49637,39315],{"id":49538},[26,49639,49640],{},"Continue if the condition is NOT met.",{"title":67,"searchDepth":68,"depth":68,"links":49642},[49643,49644],{"id":49580,"depth":670,"text":49581},{"id":49612,"depth":670,"text":49613,"children":49645},[49646,49647,49648,49649],{"id":49505,"depth":68,"text":39327},{"id":49511,"depth":68,"text":39332},{"id":49632,"depth":68,"text":39450},{"id":49538,"depth":68,"text":39315},"Control bot runs with logic. Decide to continue or end based on argument constructed. Use data passed by other steps. Build argument with strings, numbers, or JavaScript.",{"category":49565,"icon":49652},"WidgetContinue.svg",{"title":49572,"description":49650},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcontinue-if-condition-met","9_5grnOxtwttthw3pXCn6rMGI6R3VkmHhud4VQCP2k8",{"id":49657,"title":49658,"body":49659,"date":71,"description":49706,"extension":73,"meta":49707,"navigation":75,"order":71,"path":49709,"seo":49710,"stem":49711,"__hash__":49712},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcount-rows.md","Count rows step",{"type":8,"value":49660,"toc":49700},[49661,49664,49668,49670,49676,49678,49689,49693,49695,49697],[32947,49662],{"video":49663},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=3053&end=3085?rel=0",[107,49665,49667],{"id":49666},"what-to-use-the-count-rows-step-for","What to use the Count rows step for",[112,49669],{},[26,49671,49672,49673,15415],{},"Use this step to count the number of rows in the selected data. Useful if you want to get the number of rows to control the number of loops you do with a Jump step. Use with the ",[659,49674,49675],{"href":24142},"'Read data from a Google Sheet'",[26,49677,48689],{},[186,49679,49680,49683],{},[189,49681,49682],{},"Control the number of times a Jump step jumps. Use this steps token in the 'Maximum cycles' field.",[189,49684,49685,49686],{},"Create a token for a row count to use in the ",[659,49687,49688],{"href":19048},"'Javascript step'",[107,49690,49692],{"id":49691},"how-to-configure-the-count-rows-step","How to configure the Count rows step",[112,49694],{},[21,49696,581],{"id":580},[26,49698,49699],{},"Select the data to count.",{"title":67,"searchDepth":68,"depth":68,"links":49701},[49702,49703],{"id":49666,"depth":670,"text":49667},{"id":49691,"depth":670,"text":49692,"children":49704},[49705],{"id":580,"depth":68,"text":581},"Count number of rows in a Google Sheet. Returns a variable for use in steps like Read data from Google Sheet to control how many rows to loop through or how many steps to jump.",{"category":38518,"icon":49708},"WidgetCountRows.svg","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcount-rows",{"title":49658,"description":49706},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcount-rows","0tMkKw-9pbcxGxeX2FCPQ2aSeqaO8r3V3BvGGl1oDYU",{"id":49714,"title":49715,"body":49716,"date":71,"description":49757,"extension":73,"meta":49758,"navigation":75,"order":71,"path":44261,"seo":49760,"stem":49761,"__hash__":49762},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcreate-a-new-google-sheet.md","Create a new Google Sheet step",{"type":8,"value":49717,"toc":49751},[49718,49721,49725,49727,49732,49735,49740,49744,49746,49748],[32947,49719],{"video":49720},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=166&end=190?rel=0",[107,49722,49724],{"id":49723},"what-to-use-the-create-a-new-google-sheet-step-for","What to use the Create a new Google Sheet step for",[112,49726],{},[26,49728,49729,49730,148],{},"Use this step to create new Google Sheets for your Axioms when automating the browser. If you need to write data to a Google Sheet use this ",[659,49731,41125],{"href":44340},[26,49733,49734],{},"Use this step to:",[186,49736,49737],{},[189,49738,49739],{},"Creating new Google Sheets for you web automations",[107,49741,49743],{"id":49742},"how-to-configure-the-create-a-new-google-sheet-step","How to configure the Create a new Google Sheet step",[112,49745],{},[21,49747,36408],{"id":49046},[26,49749,49750],{},"Enter a name for the new Google Sheet.",{"title":67,"searchDepth":68,"depth":68,"links":49752},[49753,49754],{"id":49723,"depth":670,"text":49724},{"id":49742,"depth":670,"text":49743,"children":49755},[49756],{"id":49046,"depth":68,"text":36408},"Create new Google Sheet on the fly during a bot run. Step returns the sheet value for use in other steps.",{"category":48807,"icon":49759},"WidgetCreateGoogleSheet.svg",{"title":49715,"description":49757},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcreate-a-new-google-sheet","7s59o3I2VJ-IBRgT0KJbYxI76ydnavnWwmyHuqjqmn0",{"id":49764,"title":49765,"body":49766,"date":71,"description":49814,"extension":73,"meta":49815,"navigation":75,"order":71,"path":21993,"seo":49817,"stem":49818,"__hash__":49819},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcurrent-url.md","Get current bot URL step",{"type":8,"value":49767,"toc":49808},[49768,49771,49775,49777,49787,49795,49799,49801,49805],[32947,49769],{"video":49770},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1864&end=1885?rel=0",[107,49772,49774],{"id":49773},"what-to-use-the-get-current-bot-url-step-for","What to use the Get current bot URL step for",[112,49776],{},[26,49778,49779,49780,49783,49784,48833],{},"Use this step to Grab the URL that bot is currently on and store it as data for later use. This step is helpful because not all links can be scraped from the source. Using this step in combination with others like ",[659,49781,49782],{"href":15778},"'Click element'",", you can make a bot to click links and open pages, so you can grab the URL and write it to a ",[659,49785,49786],{"href":44340},"'Google Sheet.'",[186,49788,49789,49792],{},[189,49790,49791],{},"Get the URL from current page",[189,49793,49794],{},"When a link cannot be scraped use a 'Click element' step then 'Get current bot URL' step",[107,49796,49798],{"id":49797},"how-to-configure-the-get-current-bot-url-step","How to configure the Get current bot URL step",[112,49800],{},[21,49802,49804],{"id":49803},"get-current-bot-url","Get current bot URL",[26,49806,49807],{},"No configuration is required. This Step will return a token containing the URL of the current page.",{"title":67,"searchDepth":68,"depth":68,"links":49809},[49810,49811],{"id":49773,"depth":670,"text":49774},{"id":49797,"depth":670,"text":49798,"children":49812},[49813],{"id":49803,"depth":68,"text":49804},"Fetch URL from the active tab during a bot run. Return it for use in your automation.",{"category":49189,"icon":49816},"WidgetDriverCurrentUrl.svg",{"title":49765,"description":49814},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcurrent-url","OlBzXRadg1QKUSDLfbiVHsd9y2Ueweldy8JeqNln9Oc",{"id":49821,"title":49822,"body":49823,"date":71,"description":49880,"extension":73,"meta":49881,"navigation":75,"order":71,"path":49883,"seo":49884,"stem":49885,"__hash__":49886},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcustom-data.md","Enter custom data step",{"type":8,"value":49824,"toc":49873},[49825,49828,49832,49834,49837,49842,49844,49855,49859,49861,49865,49868,49870],[32947,49826],{"video":49827},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1885&end=1911?rel=0",[107,49829,49831],{"id":49830},"what-to-use-the-enter-custom-data-step-for","What to use the Enter custom data step for",[112,49833],{},[26,49835,49836],{},"The Enter custom data step is a simple field for storing small amounts of data that can be made accessible to other steps via axiom.ai's 'Insert Data' tokens feature found inside step fields.",[26,49838,49839,49840,15415],{},"For example we use this step to store a list of CSS classes that we want to loop through in a ",[659,49841,15781],{"href":15778},[26,49843,48689],{},[186,49845,49846,49849,49852],{},[189,49847,49848],{},"Create a token with a number value",[189,49850,49851],{},"Make a token with a text value",[189,49853,49854],{},"Store data such as CSS classes",[107,49856,49858],{"id":49857},"how-to-configure-the-enter-custom-data-step","How to configure the Enter custom data step",[112,49860],{},[21,49862,49864],{"id":49863},"enter-custom-data","Enter custom data",[26,49866,49867],{},"Enter a list of items to store as data; each line will be stored as a new row.",[21,49869,48894],{"id":48893},[26,49871,49872],{},"Preview of data",{"title":67,"searchDepth":68,"depth":68,"links":49874},[49875,49876],{"id":49830,"depth":670,"text":49831},{"id":49857,"depth":670,"text":49858,"children":49877},[49878,49879],{"id":49863,"depth":68,"text":49864},{"id":48893,"depth":68,"text":48894},"Insert custom data returned for use in your automation. Used to store small amounts of data for use in your automations.",{"category":48739,"icon":49882},"WidgetFilterDataList.svg","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcustom-data",{"title":49822,"description":49880},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcustom-data","SY6jZV8nJCWdM1fw1H2dyivR2wi_5sn5f1u-43tczco",{"id":49888,"title":49889,"body":49890,"date":71,"description":49992,"extension":73,"meta":49993,"navigation":75,"order":71,"path":16968,"seo":49995,"stem":49996,"__hash__":49997},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdate-picker.md","Date picker step",{"type":8,"value":49891,"toc":49980},[49892,49895,49900,49902,49907,49912,49923,49929,49931,49935,49938,49942,49945,49949,49956,49960,49963,49967],[32947,49893],{"video":49894},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FQ7O7QzaDS3I?si=yZCBxs_lPS-99tOB&start=539&rel=0",[107,49896,48926,49898,36811],{"id":49897},"purpose-of-the-date-picker-step",[192,49899,16957],{},[112,49901],{},[26,49903,2273,49904,49906],{},[192,49905,16957],{}," step is used to automate interactions with specific types of date pickers, such as the Trainline date picker shown above. This step works on date pickers that feature the current month and date, along with left and right buttons to change the month, and a calendar to select the day.",[26,49908,44404,49909,49911],{},[192,49910,16957],{}," step to:",[186,49913,49914,49917,49920],{},[189,49915,49916],{},"Automate entering a date when purchasing tickets",[189,49918,49919],{},"Input a date when generating a report",[189,49921,49922],{},"Submit a date when filling out web forms",[107,49924,49926,49927,36811],{"id":49925},"how-to-configure-the-date-picker-step","How to Configure the ",[192,49928,16957],{},[112,49930],{},[21,49932,49934],{"id":49933},"select-month","Select month",[26,49936,49937],{},"Select the text of the month displayed on the date picker.",[21,49939,49941],{"id":49940},"select-month-change-button","Select month change button",[26,49943,49944],{},"Choose the \"Previous\" or \"Next\" button, depending on whether you want to navigate to a future or past month.",[21,49946,49948],{"id":49947},"change-month-to","Change month to",[26,49950,49951,49952,49955],{},"Enter the exact text of the month you want to change to. ",[192,49953,49954],{},"Note",": The text must match exactly as it appears on the date picker for this to work.",[21,49957,49959],{"id":49958},"change-day-of-the-month-to","Change day of the month to",[26,49961,49962],{},"Enter the day of the month you'd like to select.",[21,49964,49966],{"id":49965},"keen-to-learn-more","Keen to learn more?",[186,49968,49969,49974],{},[189,49970,40991,49971],{},[659,49972,49973],{"href":33857},"automate the date picker",[189,49975,49976,49977],{},"Explore ",[659,49978,49979],{"href":33745},"how to automate date pickers without code",{"title":67,"searchDepth":68,"depth":68,"links":49981},[49982,49984],{"id":49897,"depth":670,"text":49983},"Purpose of the Date picker step",{"id":49925,"depth":670,"text":49985,"children":49986},"How to Configure the Date picker step",[49987,49988,49989,49990,49991],{"id":49933,"depth":68,"text":49934},{"id":49940,"depth":68,"text":49941},{"id":49947,"depth":68,"text":49948},{"id":49958,"depth":68,"text":49959},{"id":49965,"depth":68,"text":49966},"A step designed to automate date pickers, commonly found in web forms. Select day, month, and year.",{"category":49189,"icon":49994},"WidgetDatePicker.svg",{"title":49889,"description":49992},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdate-picker","7OPhTA3kkAM2nOxGdZekD2sXOhnB_tgfFAyj_IgC-3E",{"id":49999,"title":50000,"body":50001,"date":71,"description":50088,"extension":73,"meta":50089,"navigation":75,"order":71,"path":50091,"seo":50092,"stem":50093,"__hash__":50094},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdate-time.md","Date and time step",{"type":8,"value":50002,"toc":50081},[50003,50007,50009,50016,50019,50044,50048,50050,50054,50057,50060,50074,50078],[107,50004,50006],{"id":50005},"what-to-use-this-step-for","What to use this step for",[112,50008],{},[26,50010,50011,50012,50015],{},"Use this step to return a date and time value as a token in your web automation. There are various formats to select from to produce the correct values for your location. Users often insert the token provided by the Date and time step into the ",[659,50013,50014],{"href":17231},"'Enter text'"," in their web automation. So they can automate web actions like setting a date.",[26,50017,50018],{},"You can use the date and time step to:",[186,50020,50021,50024,50027,50030,50033],{},[189,50022,50023],{},"Pass dates into file names",[189,50025,50026],{},"Populate From and To dates in web forms",[189,50028,50029],{},"Automate report downloads when a date range is needed",[189,50031,50032],{},"Filtering dates on listing pages",[189,50034,50035,50036,50039,50040,50043],{},"Tagging scraped content by date, use the ",[659,50037,50038],{"href":36795},"'Append step.'","\nIf we are missing a value or format, ",[659,50041,50042],{"href":1887},"let us know"," we can add it.",[107,50045,50047],{"id":50046},"how-to-configure-the-date-and-time-step","How to configure the Date and time step",[112,50049],{},[21,50051,50053],{"id":50052},"select-date","Select date",[26,50055,50056],{},"Current - get the current date in your location.",[26,50058,50059],{},"Custom - select from preset dates:",[186,50061,50062,50065,50068,50071],{},[189,50063,50064],{},"Last day of previous months",[189,50066,50067],{},"First day of this month",[189,50069,50070],{},"N* days in the past",[189,50072,50073],{},"N* days in the future",[21,50075,50077],{"id":50076},"select-format","Select format",[26,50079,50080],{},"Select a date or time, even both. Then choose a format to suit your Zone. If using the date in a file path, use hyphens.",{"title":67,"searchDepth":68,"depth":68,"links":50082},[50083,50084],{"id":50005,"depth":670,"text":50006},{"id":50046,"depth":670,"text":50047,"children":50085},[50086,50087],{"id":50052,"depth":68,"text":50053},{"id":50076,"depth":68,"text":50077},"Use this step to return a date and time value as a token in your web automation.",{"category":49002,"icon":50090},"WidgetCurrentDateTime.svg","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdate-time",{"title":50000,"description":50088},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdate-time","t0obIh0FMW1phM3rRXs2nJBS3IvSSnw9jEcDXaXSf6I",{"id":50096,"title":50097,"body":50098,"date":71,"description":50141,"extension":73,"meta":50142,"navigation":75,"order":71,"path":50144,"seo":50145,"stem":50146,"__hash__":50147},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdelete-files-from-google-drive.md","Delete from Google Drive step",{"type":8,"value":50099,"toc":50135},[50100,50104,50106,50109,50122,50126,50128,50132],[107,50101,50103],{"id":50102},"what-to-use-the-delete-from-google-drive-step-for","What to use the Delete from Google Drive step for",[112,50105],{},[26,50107,50108],{},"Use this step to delete a file or folder from your Google Drive. It works in Axiom Cloud, so you can manage Drive files as part of an automation without the desktop application — for example, removing a file once it has been processed, or clearing out a working folder between runs.",[26,50110,50111,50112,4468,50115,6205,50118,50121],{},"We have separate steps to ",[659,50113,50114],{"href":35908},"upload",[659,50116,50117],{"href":33871},"download",[659,50119,50120],{"href":44109},"read"," files on Google Drive.",[107,50123,50125],{"id":50124},"how-to-configure-the-delete-from-google-drive-step","How to configure the Delete from Google Drive step",[112,50127],{},[21,50129,50131],{"id":50130},"google-drive-file-or-folder-url","Google Drive file or folder URL",[26,50133,50134],{},"Enter the URL of the file or folder in Google Drive to delete. Click 'Insert data' if you wish to pass URLs from a data source like a Google Sheet into this step.",{"title":67,"searchDepth":68,"depth":68,"links":50136},[50137,50138],{"id":50102,"depth":670,"text":50103},{"id":50124,"depth":670,"text":50125,"children":50139},[50140],{"id":50130,"depth":68,"text":50131},"Delete a file or folder from your Google Drive. Use this step to clean up files while running bots in the cloud.",{"category":223,"icon":50143},"WidgetGoogleDriveFolder.svg","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdelete-files-from-google-drive",{"title":50097,"description":50141},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdelete-files-from-google-drive","9RU3ekFd2O0vjU46lYHGeUWMBhc7e--0qeKPIz2ScC8",{"id":50149,"title":50150,"body":50151,"date":71,"description":50227,"extension":73,"meta":50228,"navigation":75,"order":71,"path":32103,"seo":50230,"stem":50231,"__hash__":50232},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdelete-rows-from-a-google-sheet.md","Delete rows from a Google Sheet step",{"type":8,"value":50152,"toc":50218},[50153,50156,50160,50162,50165,50168,50179,50183,50185,50189,50192,50195,50198,50201,50204,50206,50209],[32947,50154],{"video":50155},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1940&end=2001?rel=0",[107,50157,50159],{"id":50158},"what-to-use-the-delete-rows-from-a-google-sheet-step-for","What to use the Delete rows from a Google Sheet step for",[112,50161],{},[26,50163,50164],{},"This step does what it says on the step: it deletes rows from a Google Sheet. But why would you want to do this?",[26,50166,50167],{},"We use it as part of a technique called batching. This involves looping through steps using a jump step. For example, we start by reading a single row from a Google Sheet; we execute automation using that row's data. Then, we delete the row before moving on to read a new row.",[26,50169,50170,50171,50174,50175],{},"To learn more about batching ",[659,50172,40775],{"href":50173},"\u002Fdocs\u002Fbatching-bot-runs","\nWe also have templates ",[659,50176,50178],{"href":50177},"\u002Fguides\u002Fweb-scraping-in-batches","you can try.",[107,50180,50182],{"id":50181},"how-to-configure-the-delete-rows-from-a-google-sheet-step","How to configure the Delete rows from a Google Sheet step",[112,50184],{},[21,50186,50188],{"id":50187},"spreadsheet-url","Spreadsheet Url",[26,50190,50191],{},"Search in the box for a Google Sheet or just cut and paste a URL into the field.",[21,50193,44525],{"id":50194},"first-row-to-delete",[26,50196,50197],{},"Enter the number of the first row to delete.",[21,50199,44531],{"id":50200},"last-row-to-delete",[26,50202,50203],{},"Enter the number of the last row to delete. Everything between the first and last rows will also be deleted.",[21,50205,36408],{"id":49046},[26,50207,50208],{},"Axiom fetches sheet names for you to select or type in a valid sheet name into the input field.",[26,50210,50211,50212,6205,50214,50217],{},"If you liked this step you may also wish to checkout our ",[659,50213,50120],{"href":24142},[659,50215,50216],{"href":44340},"write"," Google Sheet steps.",{"title":67,"searchDepth":68,"depth":68,"links":50219},[50220,50221],{"id":50158,"depth":670,"text":50159},{"id":50181,"depth":670,"text":50182,"children":50222},[50223,50224,50225,50226],{"id":50187,"depth":68,"text":50188},{"id":50194,"depth":68,"text":44525},{"id":50200,"depth":68,"text":44531},{"id":49046,"depth":68,"text":36408},"Delete rows from a Google Sheet. Use with Find rows in Google Sheet to locate and remove specific cells or rows.",{"category":48807,"icon":50229},"WidgetDeleteRowsFromGoogleSheet.svg",{"title":50150,"description":50227},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdelete-rows-from-a-google-sheet","gEcIuVzvJ9GyvW5KyPcjDlm4XEW1AnNEXYqg58JxSf8",{"id":50234,"title":50235,"body":50236,"date":71,"description":50282,"extension":73,"meta":50283,"navigation":75,"order":71,"path":50285,"seo":50286,"stem":50287,"__hash__":50288},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdisplay-a-message.md","Display a message step",{"type":8,"value":50237,"toc":50276},[50238,50241,50245,50247,50254,50256,50267,50269,50271,50273],[32947,50239],{"video":50240},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1608&end=1634?rel=0",[107,50242,50244],{"id":50243},"what-to-use-the-display-a-message-step-for","What to use the Display a message step for",[112,50246],{},[26,50248,50249,50250,50253],{},"The Display a message step is mainly utilised for debugging Axioms. It is similar to a 'Console Log' in programming, but is shown on the screen during runtime. This step is helpful in outputting data from previous steps to better comprehend the current situation. Additionally, it can be utilised to verify if any conditional logic is functioning as anticipated. For instance, when using the ",[659,50251,50252],{"href":34811},"Conditional Jump Step",", you can trigger a message when the conditions are either true or false.",[26,50255,48689],{},[186,50257,50258,50261,50264],{},[189,50259,50260],{},"Display data output by steps",[189,50262,50263],{},"Check conditional logic is working as expected",[189,50265,50266],{},"Flag the step your automation is on",[107,50268,314],{"id":49137},[112,50270],{},[21,50272,33318],{"id":11867},[26,50274,50275],{},"Type in the message you would like to display. You can also display data from other steps by clicking 'Insert Data.' You can add multiple tokens.",{"title":67,"searchDepth":68,"depth":68,"links":50277},[50278,50279],{"id":50243,"depth":670,"text":50244},{"id":49137,"depth":670,"text":314,"children":50280},[50281],{"id":11867,"depth":68,"text":33318},"Use Display message to open a dialog window in the browser. Pass data from other steps by inserting their tokens. Useful for debugging.",{"category":48739,"icon":50284},"WidgetDisplayMessage.svg","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdisplay-a-message",{"title":50235,"description":50282},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdisplay-a-message","QALqXL178zeZEfKFAn9SBa2fRjJfNp899tM9U-G4KaU",{"id":50290,"title":50291,"body":50292,"date":71,"description":50367,"extension":73,"meta":50368,"navigation":75,"order":71,"path":21933,"seo":50370,"stem":50371,"__hash__":50372},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-file-from-url.md","Download file from URL step",{"type":8,"value":50293,"toc":50359},[50294,50297,50301,50303,50313,50316,50327,50334,50338,50340,50343,50346,50350,50353,50356],[32947,50295],{"video":50296},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=2913&end=2983?rel=0",[107,50298,50300],{"id":50299},"what-to-use-the-download-file-from-url-step-for","What to use the Download file from URL step for",[112,50302],{},[26,50304,50305,50306,50308,50309,50312],{},"Use this step to automatically download a file from a specified URL to your computer. You can use this in conjunction with other steps to create a web automation that retrieves URLs from various sources such as ",[659,50307,26048],{"href":24142},", and downloads the corresponding files. You can also ",[659,50310,50311],{"href":34127},"download files"," locally from a webpage to make your web automation.",[26,50314,50315],{},"You can use this step to download files from URLs:",[186,50317,50318,50321,50324],{},[189,50319,50320],{},"Kept in a Spreadsheet",[189,50322,50323],{},"Scraped from a website",[189,50325,50326],{},"Stored in a CSV file",[26,50328,50329,50330],{},"If you would like to know how to download files from a website, please follow this ",[659,50331,50333],{"href":50332},"\u002Fblog\u002Fhow-to-automate-downloadin-a-file-from-a-website","link for instructions.",[107,50335,50337],{"id":50336},"how-to-configure-the-download-file-from-url-step","How to configure the Download file from URL step",[112,50339],{},[21,50341,41317],{"id":50342},"enter-url",[26,50344,50345],{},"Enter the URL of a file to download. You can also plugin data from other steps. Click 'Insert data' to choose the source of you URLs.",[21,50347,50349],{"id":50348},"folder","Folder",[26,50351,50352],{},"Set a folder to download into, copy and paste a path to the folder or use the 'select' button to find the folder. Click 'Insert data' if you wish to pass folder paths from a data source into this step.",[21,50354,50355],{"id":27473},"Filename",[26,50357,50358],{},"Renaming files is simple. You can type a value or pass a token into the field. A Token could be data from a Google Sheet by clicking 'Insert data'.",{"title":67,"searchDepth":68,"depth":68,"links":50360},[50361,50362],{"id":50299,"depth":670,"text":50300},{"id":50336,"depth":670,"text":50337,"children":50363},[50364,50365,50366],{"id":50342,"depth":68,"text":41317},{"id":50348,"depth":68,"text":50349},{"id":27473,"depth":68,"text":50355},"Use this step to automatically download a file from a specified URL to your computer.",{"category":223,"icon":50369},"WidgetDriverDownloadFromUrl.svg",{"title":50291,"description":50367},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-file-from-url","wRspoueeJmy0eZ3fGSliXevRSGhxvt7abpVQUJr_3bg",{"id":50374,"title":50375,"body":50376,"date":71,"description":50470,"extension":73,"meta":50471,"navigation":75,"order":71,"path":34121,"seo":50473,"stem":50474,"__hash__":50475},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-file-step.md","Download file step",{"type":8,"value":50377,"toc":50462},[50378,50381,50385,50387,50392,50404,50407,50424,50428,50430,50432,50435,50437,50448,50452,50454,50457,50459],[32947,50379],{"video":50380},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FNRWmETc9YOM?rel=0?rel=0",[107,50382,50384],{"id":50383},"what-to-use-the-download-file-step-for","What to use the Download file step for",[112,50386],{},[26,50388,50389,50390],{},"Use the Download File step to download images from Instagram and even grab files from legacy systems with no API. This step is a ubiquitous step designed to work with file download links. If you would like to know how to download files from a website, please follow this ",[659,50391,50333],{"href":50332},[26,50393,50394,50395,50398,50399,6205,50401,50403],{},"Currently, the Upload and Download steps only work with the axiom.ai Desktop Application. However, you can install the app by ",[659,50396,50397],{"href":45946},"clicking here.","\nWe now have Google drive steps that allow you to ",[659,50400,50114],{"href":35908},[659,50402,50117],{"href":33871}," files in the cloud.",[26,50405,50406],{},"You can use this step to download files from:",[186,50408,50409,50412,50415,50418,50421],{},[189,50410,50411],{},"Amazon Seller Central.",[189,50413,50414],{},"Social media platforms like Instagram or Youtube.",[189,50416,50417],{},"Digital Asset management sites.",[189,50419,50420],{},"Government websites.",[189,50422,50423],{},"E-commerce stores.",[107,50425,50427],{"id":50426},"how-to-configure-the-download-file-step","How to configure the download file step",[112,50429],{},[21,50431,33198],{"id":15831},[26,50433,50434],{},"Select the file link. You do this with the selector tool, click 'Select'. The display will transform to the selector tool. Next, click on the link you wish to download your file from and confirm your choice.",[26,50436,49147],{},[186,50438,50439,50442,50445],{},[189,50440,50441],{},"Ability to use custom CSS selectors.",[189,50443,50444],{},"'Use element text' allows you to click buttons based on the button text i.e. 'Submit'.",[189,50446,50447],{},"Pass CSS selectors in from data sources like a Google Sheet.",[26,50449,50450],{},[659,50451,49164],{"href":49163},[21,50453,50349],{"id":50348},[26,50455,50456],{},"Set a folder to download into, copy and paste a path to the folder or use the 'Click to select' button to find the folder. Click 'Insert data' if you wish to pass file path from a data source into this step.",[21,50458,50355],{"id":27473},[26,50460,50461],{},"Renaming files is simple. You can type a value or pass a token into the field. A Token could be data from a Google Sheet.",{"title":67,"searchDepth":68,"depth":68,"links":50463},[50464,50465],{"id":50383,"depth":670,"text":50384},{"id":50426,"depth":670,"text":50427,"children":50466},[50467,50468,50469],{"id":15831,"depth":68,"text":33198},{"id":50348,"depth":68,"text":50349},{"id":27473,"depth":68,"text":50355},"Download a file via the desktop app to the local drive where the app is installed.",{"category":223,"icon":50472},"WidgetDriverDownload.svg",{"title":50375,"description":50470},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-file-step","k1q-6319GJjAIsXTl-kXO0hOsrPpglJ-NNFqENmjDw8",{"id":50477,"title":50478,"body":50479,"date":71,"description":50575,"extension":73,"meta":50576,"navigation":75,"order":71,"path":34127,"seo":50578,"stem":50579,"__hash__":50580},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-files.md","Download files step",{"type":8,"value":50480,"toc":50567},[50481,50484,50488,50490,50493,50503,50505,50528,50532,50536,50538,50540,50543,50546,50554,50558,50560,50563,50565],[32947,50482],{"video":50483},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=2983&end=3053?rel=0",[107,50485,50487],{"id":50486},"what-to-use-the-download-files-step-for","What to use the Download files step for",[112,50489],{},[26,50491,50492],{},"Use this step to automate the download of multiple files from a webpage. This step is most useful when downloading files from listing pages, like the ones found on Government websites.",[26,50494,50495,50496,50498,50499,6205,50501,50403],{},"Currently, the Upload and Download steps only works with the Axiom Desktop Application. However, you can install the app by ",[659,50497,50397],{"href":45946},"\nWe now have Google Drive steps that allow you to ",[659,50500,50114],{"href":35908},[659,50502,50117],{"href":33871},[26,50504,50406],{},[186,50506,50507,50510,50513,50516,50519,50522,50525],{},[189,50508,50509],{},"Amazon Seller Central",[189,50511,50512],{},"Social media platforms like Instagram or Youtube",[189,50514,50515],{},"Digital Asset management sites",[189,50517,50518],{},"Government websites",[189,50520,50521],{},"E-commerce stores",[189,50523,50524],{},"Legal documents",[189,50526,50527],{},"Property records",[26,50529,50329,50530],{},[659,50531,50333],{"href":50332},[107,50533,50535],{"id":50534},"how-to-configure-the-download-files-step","How to configure the Download files step",[112,50537],{},[21,50539,33198],{"id":15831},[26,50541,50542],{},"Select the files. You do this with the selector tool, click 'Select'. The display will transform to the selector tool. Next, click on the links you wish to download your files.",[26,50544,50545],{},"The Single selector tool comes with several valuable features accessed by clicking custom:",[186,50547,50548,50550,50552],{},[189,50549,49152],{},[189,50551,49155],{},[189,50553,49158],{},[26,50555,50556],{},[659,50557,49164],{"href":49163},[21,50559,50349],{"id":50348},[26,50561,50562],{},"Set a folder to download into, copy and paste a path to the folder or use the 'Click to select' button to find the folder. Click 'Insert data' if you wish to pass file paths from a data source into this step.",[21,50564,50355],{"id":27473},[26,50566,50358],{},{"title":67,"searchDepth":68,"depth":68,"links":50568},[50569,50570],{"id":50486,"depth":670,"text":50487},{"id":50534,"depth":670,"text":50535,"children":50571},[50572,50573,50574],{"id":15831,"depth":68,"text":33198},{"id":50348,"depth":68,"text":50349},{"id":27473,"depth":68,"text":50355},"Download files via the desktop app to the local drive where the app is installed.",{"category":223,"icon":50577},"WidgetDriverDownloadFiles.svg",{"title":50478,"description":50575},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-files","3r00KkWNvofN9pbBCxDXdI7fEIo-1TpDrOWh6Zqhsk4",{"id":50582,"title":50583,"body":50584,"date":71,"description":50669,"extension":73,"meta":50670,"navigation":75,"order":71,"path":33871,"seo":50672,"stem":50673,"__hash__":50674},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-files-to-google-drive.md","Download a file to Google Drive step",{"type":8,"value":50585,"toc":50661},[50586,50589,50593,50595,50601,50613,50620,50623,50627,50629,50631,50634,50636,50644,50648,50652,50655,50658],[32947,50587],{"video":50588},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=2833&end=2913?rel=0",[107,50590,50592],{"id":50591},"what-to-use-the-download-a-file-to-google-drive-step-for","What to use the Download a file to Google Drive step for",[112,50594],{},[26,50596,50597,50598,50600],{},"Use this step to directly download files to your Google Drive from any web app. This step works in Axiom Cloud. Previously, files had to be downloaded to the desktop application. If you would like to know how to download files from a website, please follow this ",[659,50599,50333],{"href":50332},"\nYou can use this step to download files from:",[186,50602,50603,50605,50607,50609,50611],{},[189,50604,50509],{},[189,50606,50512],{},[189,50608,50515],{},[189,50610,50518],{},[189,50612,50521],{},[26,50614,50111,50615,6205,50617,50619],{},[659,50616,50114],{"href":36075},[659,50618,50117],{"href":34121}," files on the desktop.",[26,50621,50622],{},"Note: the \"Download files to Google Drive\" step supports files up to 250MB.",[107,50624,50626],{"id":50625},"how-to-configure-the-download-a-file-to-google-drive-step","How to configure the Download a file to Google Drive step",[112,50628],{},[21,50630,33198],{"id":15831},[26,50632,50633],{},"Click 'Select' to choose the file to download.",[26,50635,50545],{},[186,50637,50638,50640,50642],{},[189,50639,49152],{},[189,50641,49155],{},[189,50643,49158],{},[26,50645,50646],{},[659,50647,49164],{"href":49163},[21,50649,50651],{"id":50650},"google-drive-folder-url","Google Drive folder URL",[26,50653,50654],{},"Enter the URL of the folder in Google Drive to download to. Click 'Insert data' if you wish to pass file paths from a data source into this step.",[21,50656,33918],{"id":50657},"file-name",[26,50659,50660],{},"Enter a name for the file on Google Drive. Leave blank to keep the existing filename. File names can be passed from data sources like a Google Sheet using 'Insert Data'.",{"title":67,"searchDepth":68,"depth":68,"links":50662},[50663,50664],{"id":50591,"depth":670,"text":50592},{"id":50625,"depth":670,"text":50626,"children":50665},[50666,50667,50668],{"id":15831,"depth":68,"text":33198},{"id":50650,"depth":68,"text":50651},{"id":50657,"depth":68,"text":33918},"Download files from a web page directly to your Google Drive. Use this step to download files when running bots in the cloud.",{"category":223,"icon":50671},"WidgetDriverDownloadToGoogleDrive.svg",{"title":50583,"description":50669},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-files-to-google-drive","knPRz7poAAa0btmeqUPeYkiM1bYl_JlbD-r6JZ20wos",{"id":50676,"title":50677,"body":50678,"date":71,"description":50793,"extension":73,"meta":50794,"navigation":75,"order":71,"path":50796,"seo":50797,"stem":50798,"__hash__":50799},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fedit-row.md","Edit Row step",{"type":8,"value":50679,"toc":50778},[50680,50683,50687,50689,50699,50702,50713,50717,50719,50721,50724,50727,50730,50734,50737,50740,50742,50745,50749,50751,50754,50756,50759,50762,50764,50767,50771],[32947,50681],{"video":50682},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FQ7O7QzaDS3I?rel=0&start=257&end=338?rel=0",[107,50684,50686],{"id":50685},"purpose-of-the-edit-row-step","Purpose of the Edit Row step",[112,50688],{},[26,50690,50691,50692,6205,50695,50698],{},"The Edit Row step is a combination of two steps: ",[192,50693,50694],{},"\"Find Row\"",[192,50696,50697],{},"\"Write to Google Sheet\"",". This combination allows you to locate a row based on a specific value and then overwrite its data. Both steps need to be configured correctly to function.",[26,50700,50701],{},"You can use the Edit Row step to update spreadsheet data, such as:",[186,50703,50704,50707,50710],{},[189,50705,50706],{},"Adjusting stock levels in a spreadsheet",[189,50708,50709],{},"Updating cryptocurrency values",[189,50711,50712],{},"Modifying report data",[107,50714,50716],{"id":50715},"how-to-configure-the-find-row-step","How to Configure the 'Find Row' Step",[112,50718],{},[21,50720,36402],{"id":49040},[26,50722,50723],{},"Select a Google Sheet to search, or paste its URL.",[21,50725,50726],{"id":49046},"Sheet Name",[26,50728,50729],{},"Optionally, specify the name of the sheet to search.",[21,50731,50733],{"id":50732},"values-comma-separated","Values (comma-separated)",[26,50735,50736],{},"Enter a list of values, separated by commas, or provide data containing values in separate rows. These values will be used to locate the specific row in the sheet.",[26,50738,50739],{},"The remaining settings are optional and can be used as needed.",[21,50741,33198],{"id":15831},[26,50743,50744],{},"Click 'Select' to choose the item you want to interact with.",[107,50746,50748],{"id":50747},"how-to-configure-the-write-to-google-sheet-step","How to Configure the 'Write to Google Sheet' Step",[112,50750],{},[21,50752,36402],{"id":50753},"spreadsheet-1",[26,50755,50723],{},[21,50757,50726],{"id":50758},"sheet-name-1",[26,50760,50761],{},"Optionally, specify the name of the sheet to write to.",[21,50763,581],{"id":580},[26,50765,50766],{},"Select the data that you want to write to the sheet.",[21,50768,50770],{"id":50769},"write-options","Write Options",[26,50772,50773,50774,50777],{},"If no value is set, the data will be written to column 'A' of the row found by the ",[192,50775,50776],{},"Find Row"," step. If you need to modify column, adjust the 'A' value as needed.",{"title":67,"searchDepth":68,"depth":68,"links":50779},[50780,50781,50787],{"id":50685,"depth":670,"text":50686},{"id":50715,"depth":670,"text":50716,"children":50782},[50783,50784,50785,50786],{"id":49040,"depth":68,"text":36402},{"id":49046,"depth":68,"text":50726},{"id":50732,"depth":68,"text":50733},{"id":15831,"depth":68,"text":33198},{"id":50747,"depth":670,"text":50748,"children":50788},[50789,50790,50791,50792],{"id":50753,"depth":68,"text":36402},{"id":50758,"depth":68,"text":50726},{"id":580,"depth":68,"text":581},{"id":50769,"depth":68,"text":50770},"This step combines Find row and Write to Google Sheet. Use to locate a row and overwrite its data.",{"category":48807,"icon":50795},"TemplateEditRowGoogleSheet.svg","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fedit-row",{"title":50677,"description":50793},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fedit-row","6_ocUra0B35ZCFjJRRlqzWdao4heV-KUG9LrH-7OLX0",{"id":50801,"title":40475,"body":50802,"date":71,"description":50846,"extension":73,"meta":50847,"navigation":75,"order":71,"path":40472,"seo":50849,"stem":50850,"__hash__":50851},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fend-loop.md",{"type":8,"value":50803,"toc":50843},[50804,50808,50810,50813,50819,50830,50833],[107,50805,50807],{"id":50806},"what-to-use-the-end-loop-step-for","What to use the End loop step for",[112,50809],{},[26,50811,50812],{},"The \"End loop\" step allows you to prematurely end a loop that has been initiated with the \"Loop through data\" step. This allows you to end the loop and continue onto the next step within your automation.",[26,50814,50815,50816,50818],{},"When combined with a ",[659,50817,40480],{"href":40479}," step, you can use logic to determine when to finish your loop, this can be useful for:",[186,50820,50821,50824],{},[189,50822,50823],{},"Ending the loop when a condition is met",[189,50825,50826,50827,15415],{},"Ending a loop when an issue occurs, using the ",[659,50828,50829],{"href":32798},"Try\u002FCatch",[26,50831,50832],{},"Things to note:",[186,50834,50835,50837,50840],{},[189,50836,48945],{},[189,50838,50839],{},"This step can only be used inside of a \"Loop through data\" step - placing it outside of this step will cause the step to be ignored.",[189,50841,50842],{},"Using this step and then jumping back into the \"Loop through data\" step will cause the loop to restart from the first iteration, not where the \"End step\" was called.",{"title":67,"searchDepth":68,"depth":68,"links":50844},[50845],{"id":50806,"depth":670,"text":50807},"Learn how to use the End loop step in your Axiom",{"category":49565,"icon":50848},"TemplateLoopThroughData.svg",{"title":40475,"description":50846},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fend-loop","RvxvSWQTLeyCuSCnB7co9X3TfWbuSFuLvWrHTrjQZfA",{"id":50853,"title":50854,"body":50855,"date":71,"description":50901,"extension":73,"meta":50902,"navigation":75,"order":71,"path":50904,"seo":50905,"stem":50906,"__hash__":50907},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fend-run.md","End run",{"type":8,"value":50856,"toc":50898},[50857,50860,50864,50866,50874,50876,50888,50891],[32947,50858],{"video":50859},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FQ7O7QzaDS3I?si=9TdeqHuBgCabTXSM&start=108&rel=0",[107,50861,50863],{"id":50862},"what-to-use-the-end-run-step-for","What to use the End run step for",[112,50865],{},[26,50867,50868,50869,50873],{},"This step allows you to end your Axiom run without an error. You can use this in conjunction with conditional steps such as the ",[659,50870,50872],{"href":50871},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fif-condtion","If step"," to end your automation when a certain condition is met.",[26,50875,48689],{},[186,50877,50878,50883],{},[189,50879,50880,50881],{},"End run as part of a ",[659,50882,22067],{"href":50871},[189,50884,50885,50886],{},"Stop a run with ",[659,50887,33111],{"href":32798},[26,50889,50890],{},"The step requires no configuration.",[26,50892,50893,50894,148],{},"If you want to learn more, here are some ",[659,50895,50897],{"href":50896},"\u002Fblog\u002Fautomate-chrome-browser","web automation tips",{"title":67,"searchDepth":68,"depth":68,"links":50899},[50900],{"id":50862,"depth":670,"text":50863},"Use this step to end a run. Stops all remaining steps in the automation.",{"category":49565,"icon":50903},"WidgetEndRun.svg","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fend-run",{"title":50854,"description":50901},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fend-run","4w8JQpKEBpN_WZ8KJjUUOeiSE___AnCVsTRc1hYRS4c",{"id":50909,"title":50910,"body":50911,"date":71,"description":51042,"extension":73,"meta":51043,"navigation":75,"order":71,"path":17231,"seo":51045,"stem":51046,"__hash__":51047},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fenter-text.md","Enter text step",{"type":8,"value":50912,"toc":51031},[50913,50916,50920,50922,50929,50931,50951,50961,50965,50967,50971,50974,50976,50984,50988,50995,50997,51000,51003,51006,51010,51013,51016,51019,51023,51026],[32947,50914],{"video":50915},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?start=2001&end=2113&rel=0",[107,50917,50919],{"id":50918},"what-to-use-the-enter-text-step-for","What to use the Enter text step for",[112,50921],{},[26,50923,50924,50925,50928],{},"The 'Enter text' step enables the user to select an input element and ",[659,50926,50927],{"href":49104},"pass data"," from another step, without writing any code. This step is useful for web automation tasks such as data entry and UI testing.",[26,50930,48689],{},[186,50932,50933,50936,50939,50942,50945,50948],{},[189,50934,50935],{},"Enter data into any CRM",[189,50937,50938],{},"Input date ranges to download reports",[189,50940,50941],{},"Login to applications",[189,50943,50944],{},"Send a DM on Instagram or any social media app",[189,50946,50947],{},"Create a mass mailer in Gmail or Outlook",[189,50949,50950],{},"Uploading posts to web apps",[26,50952,50953,50954,50957,50958],{},"To learn about data and looping, ",[659,50955,50956],{"href":31803},"read this page",". You may also want to look at this ",[659,50959,50960],{"href":1014},"data entry template.",[107,50962,50964],{"id":50963},"configure-the-enter-text-step","Configure the Enter text step",[112,50966],{},[21,50968,50970],{"id":50969},"select-text-field","Select text field",[26,50972,50973],{},"Click 'Select' to choose the text field that the Axiom should enter text into. The display will transform into the single selector tool, then point and click.",[26,50975,49147],{},[186,50977,50978,50980,50982],{},[189,50979,49152],{},[189,50981,49155],{},[189,50983,49158],{},[26,50985,50986],{},[659,50987,49164],{"href":49163},[26,50989,50990,50991],{},"If you do not select a field, the bot will type into whatever is selected by default, this works well in tandem with the ",[659,50992,50994],{"href":50993},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fpress-key","Press key(s) step.",[21,50996,33781],{"id":5402},[26,50998,50999],{},"Input the text to enter. Use 'Insert Data' to pass data from sources such as a Google Sheet or WebHook.",[21,51001,51002],{"id":17309},"Delay",[26,51004,51005],{},"Adds a delay between each key press in milliseconds.",[21,51007,51009],{"id":51008},"append-to-existing","Append to existing",[26,51011,51012],{},"Toggle on to skip clearing the text before entering. The value will be appended to whatever is already in the box.",[21,51014,31505],{"id":51015},"custom-line-break",[26,51017,51018],{},"Record a sequence of characters to use instead of enter for line breaks. For example, record shift and enter for Instagram DMs.",[21,51020,51022],{"id":51021},"optional-text","Optional text",[26,51024,51025],{},"If checked & the selected field is not present on the page the automation will continue without an error.",[26,51027,51028,51029],{},"Learn more about automating data entry by ",[659,51030,50397],{"href":49104},{"title":67,"searchDepth":68,"depth":68,"links":51032},[51033,51034],{"id":50918,"depth":670,"text":50919},{"id":50963,"depth":670,"text":50964,"children":51035},[51036,51037,51038,51039,51040,51041],{"id":50969,"depth":68,"text":50970},{"id":5402,"depth":68,"text":33781},{"id":17309,"depth":68,"text":51002},{"id":51008,"depth":68,"text":51009},{"id":51015,"depth":68,"text":31505},{"id":51021,"depth":68,"text":51022},"Use this step to enter text into text fields found in web forms. Pass data from other steps into the Enter text step to automate data entry.",{"category":49189,"icon":51044},"WidgetDriverEnterText.svg",{"title":50910,"description":51042},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fenter-text","j0OYpLilXK4-s0r53GOPGDCcqTNq1cvqWPJEURovRPQ",{"id":51049,"title":51050,"body":51051,"date":71,"description":51121,"extension":73,"meta":51122,"navigation":75,"order":71,"path":51124,"seo":51125,"stem":51126,"__hash__":51127},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fexport-csv-file.md","Export to CSV step",{"type":8,"value":51052,"toc":51112},[51053,51056,51060,51062,51065,51067,51086,51090,51092,51094,51097,51099,51102,51104,51107,51109],[32947,51054],{"video":51055},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=2113&end=2143",[107,51057,51059],{"id":51058},"what-to-use-the-export-to-csv-step-for","What to use the Export to CSV step for",[112,51061],{},[26,51063,51064],{},"This step exports data from any step in your Axiom into a CSV file on your local machine. A helpful step when scraping leads to upload into your CRM or when you need to merge a series of CSVs into a single file. Please note that the CSV will not download if triggered if you are running your automation in the Cloud.",[26,51066,48689],{},[186,51068,51069,51072,51080],{},[189,51070,51071],{},"Export scraped data into a CSV",[189,51073,51074,51075,51079],{},"Use with ",[659,51076,51078],{"href":51077},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fimport-csv-file","'Import CSV'"," step to merge CSVs into a single file",[189,51081,51082,51083,51085],{},"Turn a ",[659,51084,26048],{"href":24142}," into a CSV",[107,51087,51089],{"id":51088},"how-to-configure-the-export-to-csv-step","How to configure the Export to CSV step",[112,51091],{},[21,51093,36491],{"id":580},[26,51095,51096],{},"Select the data to convert into a CSV file by clicking 'Insert data' inside the step.",[21,51098,50349],{"id":50348},[26,51100,51101],{},"Set a folder to export the file to, copy and paste a path to the folder or use the 'Click to select' button to find the folder. Click 'Insert data' if you wish to pass file path from a data source into this step.",[21,51103,33918],{"id":50657},[26,51105,51106],{},"Enter a name to save the file as. If the file already exists it will be renamed by the export process unless the overwrite option is used. You can also 'Insert data' and pass file name from a Google Sheet.",[21,51108,34360],{"id":34359},[26,51110,51111],{},"Toggle on to overwrite existing file rather than renaming the new file.",{"title":67,"searchDepth":68,"depth":68,"links":51113},[51114,51115],{"id":51058,"depth":670,"text":51059},{"id":51088,"depth":670,"text":51089,"children":51116},[51117,51118,51119,51120],{"id":580,"depth":68,"text":36491},{"id":50348,"depth":68,"text":50349},{"id":50657,"depth":68,"text":33918},{"id":34359,"depth":68,"text":34360},"Export any data from Axiom in the form of a CSV. Use to download structured results for use outside the automation.",{"category":48807,"icon":51123},"WidgetExportCSV.svg","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fexport-csv-file",{"title":51050,"description":51121},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fexport-csv-file","24YYXG9GZEbJFyGmh2OmanKUSGKtaV69AyXKDsUpb4E",{"id":51129,"title":51130,"body":51131,"date":71,"description":71,"extension":73,"meta":51191,"navigation":75,"order":71,"path":51194,"seo":51195,"stem":51196,"__hash__":51197},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Ffind-row.md","Find Row step",{"type":8,"value":51132,"toc":51182},[51133,51136,51141,51143,51146,51149,51160,51163,51165,51167,51169,51171,51174,51176,51179],[32947,51134],{"video":51135},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FQ7O7QzaDS3I?rel=0&start=150&end=255?rel=0&start=1503&end=1560?rel=0",[107,51137,48926,51139,36811],{"id":51138},"purpose-of-the-find-row-step",[192,51140,50776],{},[112,51142],{},[26,51144,51145],{},"The Find Row step allows you to locate a specific row in a Google Sheet by searching for a value. Once the row is found, the row number is returned as a token, which can be used as data in your automation.",[26,51147,51148],{},"You can use the Find Row step to locate rows for tasks such as:",[186,51150,51151,51154,51157],{},[189,51152,51153],{},"Updating stock levels",[189,51155,51156],{},"Editing scraped data",[189,51158,51159],{},"Generating reports",[107,51161,51162],{"id":50715},"How to Configure the Find Row step",[112,51164],{},[21,51166,36402],{"id":49040},[26,51168,50723],{},[21,51170,50726],{"id":49046},[26,51172,51173],{},"Optionally, specify the sheet name where you want to perform the search.",[21,51175,50733],{"id":50732},[26,51177,51178],{},"Enter a list of values, separated by commas, or provide data with one value per row. These values will be used to find the specific row in the sheet.",[26,51180,51181],{},"The remaining settings are optional and should be used when necessary.",{"title":67,"searchDepth":68,"depth":68,"links":51183},[51184,51186],{"id":51138,"depth":670,"text":51185},"Purpose of the Find Row step",{"id":50715,"depth":670,"text":51162,"children":51187},[51188,51189,51190],{"id":49040,"depth":68,"text":36402},{"id":49046,"depth":68,"text":50726},{"id":50732,"depth":68,"text":50733},{"category":48807,"summary":51192,"icon":51193},"Search for a specific row in a Google Sheet. Use with Write data to Google Sheet to update specific cells without overwriting the entire sheet.","WidgetFindRowGoogleSheet.svg","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Ffind-row",{"title":51130,"description":71},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Ffind-row","zCzx_ysx-hvmFrkuPDl2Z-6UjWEt9XHb1lybfPxdx1o",{"id":51199,"title":51200,"body":51201,"date":71,"description":51255,"extension":73,"meta":51256,"navigation":75,"order":71,"path":51258,"seo":51259,"stem":51260,"__hash__":51261},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fgenerate-random-password.md","Generate random password step",{"type":8,"value":51202,"toc":51248},[51203,51206,51210,51212,51218,51220,51228,51232,51234,51238,51241,51245],[32947,51204],{"video":51205},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=266&end=293?rel=0",[107,51207,51209],{"id":51208},"what-to-use-the-generate-random-password-step-for","What to use the Generate random password step for",[112,51211],{},[26,51213,51214,51215,51217],{},"Auto-generate a password. You can configure the types of characters that are included and the length of the password. This step can be used with the ",[659,51216,50014],{"href":17231}," step to input the passwords into a web form.",[26,51219,48689],{},[186,51221,51222,51225],{},[189,51223,51224],{},"Test account login pages",[189,51226,51227],{},"Create new user accounts",[107,51229,51231],{"id":51230},"how-to-configure-the-generate-random-password-step","How to configure the Generate random password Step",[112,51233],{},[21,51235,51237],{"id":51236},"password-length","Password length",[26,51239,51240],{},"Add a numeric value to set the length of password.",[21,51242,51244],{"id":51243},"include-non-alphanumeric-characters","Include non-alphanumeric characters",[26,51246,51247],{},"Tick the box to include non-alphanumeric (punctuation etc.) characters.",{"title":67,"searchDepth":68,"depth":68,"links":51249},[51250,51251],{"id":51208,"depth":670,"text":51209},{"id":51230,"depth":670,"text":51231,"children":51252},[51253,51254],{"id":51236,"depth":68,"text":51237},{"id":51243,"depth":68,"text":51244},"Generate random password. Use in automations that require secure input like account creation or form filling.",{"category":49002,"icon":51257},"WidgetRadomPassword.svg","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fgenerate-random-password",{"title":51200,"description":51255},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fgenerate-random-password","4ia25n-dD-BTdcAqfGlhlmt38hNUu4AO6KiUB_W4-x4",{"id":51263,"title":51264,"body":51265,"date":71,"description":51424,"extension":73,"meta":51425,"navigation":75,"order":71,"path":21845,"seo":51427,"stem":51428,"__hash__":51429},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fget-a-list-of-links-to-pages.md","Get a list of links from a page step",{"type":8,"value":51266,"toc":51409},[51267,51270,51274,51276,51299,51302,51330,51334,51336,51338,51341,51344,51353,51357,51361,51364,51367,51370,51372,51375,51379,51382,51384,51387,51389,51392,51396,51399,51401,51404,51406],[32947,51268],{"video":51269},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?start=3671&rel=0",[107,51271,51273],{"id":51272},"what-to-use-the-get-a-list-of-links-to-pages-step-for","What to use the Get a list of links to pages step for",[112,51275],{},[26,51277,51278,51279,51282,51283,51286,51287,51291,51292,51295,51296],{},"Use this step to scrape links from the page the bot is currently on. Then pass the links into a ",[659,51280,51281],{"href":48831},"'Get data from a webpage'"," step to scrape data. Alternatively, write the links to a  ",[659,51284,51285],{"href":24142},"'Google sheet'"," and create a batch scraper for large-scale scraping. We call this design pattern 'Batch scraping' Learn more about ",[659,51288,51290],{"href":51289},"\u002Fdocs\u002Ftutorials\u002Flong-bot-runs","'batching here'"," or try this ",[659,51293,183],{"href":51294},"\u002Fguides\u002Fbatching",". You can also find a ",[659,51297,51298],{"href":1019},"'Link scraper template here.'",[26,51300,51301],{},"You can use this step to scrape:",[186,51303,51304,51315,51318],{},[189,51305,51306,51310,51311],{},[659,51307,51309],{"href":51308},"\u002Fguides\u002Fscrape-amazon","Amazon"," product page links, like ",[659,51312,51314],{"href":51313},"\u002Fblog\u002Fhow-to-scrape-product-details-from-amazon-books","Amazon Book pages",[189,51316,51317],{},"Social media links",[189,51319,51320,51321,51325,51326,51329],{},"LinkedIn profile links from ",[659,51322,51324],{"href":51323},"\u002Fguides\u002Fsales-navigator-connect","Sales Navigator","- ",[659,51327,51328],{"href":1019},"Links"," from any website",[107,51331,51333],{"id":51332},"how-to-configure-the-get-a-list-of-links-to-pages-step","How to configure the Get a list of links to pages step",[112,51335],{},[21,51337,33198],{"id":15831},[26,51339,51340],{},"Click 'Select' to choose the links you wish to scrape. The display will transform into the selector tool, and it will guide you by showing you how to select links from the webpage.",[26,51342,51343],{},"The Multi-selector tool comes with several valuable features accessed by clicking custom:",[186,51345,51346,51348,51350],{},[189,51347,49152],{},[189,51349,49155],{},[189,51351,51352],{},"Pass CSS selectors in from data sources",[26,51354,51355],{},[659,51356,49164],{"href":49163},[21,51358,51360],{"id":51359},"find-pager-optional","Find pager (optional)",[26,51362,51363],{},"Select the 'Next' button for the pager, if there is one. If the button features text such as 'Next,' why not try the 'Use element text' method? Click 'Custom' on the selector toolbar, then click 'Use element text'.",[21,51365,37529],{"id":51366},"max-results",[26,51368,51369],{},"We set the max results to 20 to speed up the testing of your bots as you make them. It's best to do short runs while testing your bot.",[21,51371,37567],{"id":37566},[26,51373,51374],{},"Adjust the wait time between scrolls to increase or decrease the loading time of content. This feature is particularly useful when scrolling down listing pages with slow-loading content. However, insufficient waiting time could mean that content is not loaded. Therefore, experiment with caution.",[21,51376,51378],{"id":51377},"no-of-retry-attempts-when-results-not-found","No. of retry attempts when results not found",[26,51380,51381],{},"To speed up your runs, reduce the retry runs. But keep in mind content could be missed. Make sure to do some test runs.",[21,51383,31816],{"id":37586},[26,51385,51386],{},"To speed up your runs, reduce your wait time. However, keep in mind that some content may not have finished loading yet, which is why we wait.",[21,51388,37593],{"id":37592},[26,51390,51391],{},"For paginated pages, you can specify a starting page. However, not all pages support this.",[21,51393,51395],{"id":51394},"specify-exact-number-of-pixels-to-scroll","Specify exact number of pixels to scroll",[26,51397,51398],{},"Instead of auto-scrolling set a pixel height to scroll.",[21,51400,37607],{"id":37606},[26,51402,51403],{},"Use if you are only getting the first page of results.",[21,51405,48894],{"id":48893},[26,51407,51408],{},"A preview of the scraped data.",{"title":67,"searchDepth":68,"depth":68,"links":51410},[51411,51412],{"id":51272,"depth":670,"text":51273},{"id":51332,"depth":670,"text":51333,"children":51413},[51414,51415,51416,51417,51418,51419,51420,51421,51422,51423],{"id":15831,"depth":68,"text":33198},{"id":51359,"depth":68,"text":51360},{"id":51366,"depth":68,"text":37529},{"id":37566,"depth":68,"text":37567},{"id":51377,"depth":68,"text":51378},{"id":37586,"depth":68,"text":31816},{"id":37592,"depth":68,"text":37593},{"id":51394,"depth":68,"text":51395},{"id":37606,"depth":68,"text":37607},{"id":48893,"depth":68,"text":48894},"Scrape links from a webpage. Return results via a token for use in your automation.",{"category":17816,"icon":51426},"WidgetDriverScrapeLinks.svg",{"title":51264,"description":51424},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fget-a-list-of-links-to-pages","69S6Ylrh1p1_nnVqLptoCRtB4Xcv-32CoLoofoDuM7g",{"id":51431,"title":51432,"body":51433,"date":71,"description":51550,"extension":73,"meta":51551,"navigation":75,"order":71,"path":51552,"seo":51553,"stem":51554,"__hash__":51555},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fget-a-list-of-links-url.md","Get a list of links from a URL step",{"type":8,"value":51434,"toc":51534},[51435,51437,51439,51441,51455,51471,51473,51475,51477,51480,51482,51484,51486,51494,51498,51500,51502,51504,51506,51508,51510,51512,51514,51516,51518,51520,51522,51524,51526,51528,51530,51532],[32947,51436],{"video":51269},[107,51438,51273],{"id":51272},[112,51440],{},[26,51442,51443,51444,51282,51446,51286,51448,51291,51450,51295,51452,51454],{},"Use this step to scrape links from listing-style pages. Then pass the links into a ",[659,51445,51281],{"href":48831},[659,51447,51285],{"href":24142},[659,51449,51290],{"href":50173},[659,51451,183],{"href":51294},[659,51453,51298],{"href":1019},"\nYou can use this step to scrape:",[186,51456,51457,51463,51465],{},[189,51458,51459,51310,51461],{},[659,51460,51309],{"href":51308},[659,51462,51314],{"href":51313},[189,51464,51317],{},[189,51466,51320,51467,51325,51469,51329],{},[659,51468,51324],{"href":51323},[659,51470,51328],{"href":1019},[107,51472,51333],{"id":51332},[112,51474],{},[21,51476,4603],{"id":13749},[26,51478,51479],{},"Enter a URL or multiple URLs, each on their own line. You can also plugin data from other steps to provide URLs",[21,51481,33198],{"id":15831},[26,51483,51340],{},[26,51485,51343],{},[186,51487,51488,51490,51492],{},[189,51489,49152],{},[189,51491,49155],{},[189,51493,51352],{},[26,51495,51496],{},[659,51497,49164],{"href":49163},[21,51499,51360],{"id":51359},[26,51501,51363],{},[21,51503,37529],{"id":51366},[26,51505,51369],{},[21,51507,37567],{"id":37566},[26,51509,51374],{},[21,51511,51378],{"id":51377},[26,51513,51381],{},[21,51515,31816],{"id":37586},[26,51517,51386],{},[21,51519,37593],{"id":37592},[26,51521,51391],{},[21,51523,51395],{"id":51394},[26,51525,51398],{},[21,51527,37607],{"id":37606},[26,51529,51403],{},[21,51531,48894],{"id":48893},[26,51533,51408],{},{"title":67,"searchDepth":68,"depth":68,"links":51535},[51536,51537],{"id":51272,"depth":670,"text":51273},{"id":51332,"depth":670,"text":51333,"children":51538},[51539,51540,51541,51542,51543,51544,51545,51546,51547,51548,51549],{"id":13749,"depth":68,"text":4603},{"id":15831,"depth":68,"text":33198},{"id":51359,"depth":68,"text":51360},{"id":51366,"depth":68,"text":37529},{"id":37566,"depth":68,"text":37567},{"id":51377,"depth":68,"text":51378},{"id":37586,"depth":68,"text":31816},{"id":37592,"depth":68,"text":37593},{"id":51394,"depth":68,"text":51395},{"id":37606,"depth":68,"text":37607},{"id":48893,"depth":68,"text":48894},"Scrape links from a URL. Return results via a token for use in your automation.",{"category":17816,"icon":51426},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fget-a-list-of-links-url",{"title":51432,"description":51550},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fget-a-list-of-links-url","KPMJIVTrqfVe8CgNYn8aZB-WNJY203yH1yfSzsDwS-0",{"id":51557,"title":32839,"body":51558,"date":71,"description":51682,"extension":73,"meta":51683,"navigation":75,"order":71,"path":43313,"seo":51685,"stem":51686,"__hash__":51687},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fget-data-from-url.md",{"type":8,"value":51559,"toc":51666},[51560,51563,51567,51569,51572,51585,51601,51605,51607,51609,51611,51613,51616,51618,51626,51630,51632,51634,51636,51638,51640,51642,51644,51646,51648,51650,51652,51654,51656,51658,51660,51662,51664],[32947,51561],{"video":51562},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1283&end=1503&rel=0",[107,51564,51566],{"id":51565},"what-to-use-the-get-data-from-a-url-step-for","What to use the Get data from a URL step for",[112,51568],{},[26,51570,51571],{},"The 'Get data from a URL' step in axiom.ai is a versatile web scraping tool that can extract data from tables, pages, and listing pages on almost any website or web application. It supports pagination and infinite scroll. The tool includes a point-and-click selector for easy content selection without coding. It's suitable for scraping data for simple reports or extensive databases.",[26,51573,51574,51575,51578,51579,51581,51582,51454],{},"If you are looking to create a large scale scraper we recommend a design pattern called ",[659,51576,51577],{"href":50173},"'batch scraping'."," You will also find a batch scraping ",[659,51580,183],{"href":51294}," here. If you just want to scrape links use this ",[659,51583,51584],{"href":21845},"'scraper'.",[186,51586,51587,51593,51595],{},[189,51588,51589,51310,51591],{},[659,51590,51309],{"href":51308},[659,51592,51314],{"href":51313},[189,51594,51317],{},[189,51596,51320,51597,51325,51599,51329],{},[659,51598,51324],{"href":51323},[659,51600,51328],{"href":1019},[107,51602,51604],{"id":51603},"how-to-configure-the-get-data-from-a-url-step","How to configure the Get data from a URL step",[112,51606],{},[21,51608,4603],{"id":13749},[26,51610,51479],{},[21,51612,33198],{"id":15831},[26,51614,51615],{},"Click 'Select' to choose the data you wish to scrape. The display will transform into the selector tool, and it will guide you by showing you how to select data from the webpage.",[26,51617,51343],{},[186,51619,51620,51622,51624],{},[189,51621,49152],{},[189,51623,49155],{},[189,51625,51352],{},[26,51627,51628],{},[659,51629,49164],{"href":49163},[21,51631,51360],{"id":51359},[26,51633,51363],{},[21,51635,37529],{"id":51366},[26,51637,51369],{},[21,51639,37567],{"id":37566},[26,51641,51374],{},[21,51643,51378],{"id":51377},[26,51645,51381],{},[21,51647,31816],{"id":37586},[26,51649,51386],{},[21,51651,37593],{"id":37592},[26,51653,51391],{},[21,51655,51395],{"id":51394},[26,51657,51398],{},[21,51659,37607],{"id":37606},[26,51661,51403],{},[21,51663,48894],{"id":48893},[26,51665,51408],{},{"title":67,"searchDepth":68,"depth":68,"links":51667},[51668,51669],{"id":51565,"depth":670,"text":51566},{"id":51603,"depth":670,"text":51604,"children":51670},[51671,51672,51673,51674,51675,51676,51677,51678,51679,51680,51681],{"id":13749,"depth":68,"text":4603},{"id":15831,"depth":68,"text":33198},{"id":51359,"depth":68,"text":51360},{"id":51366,"depth":68,"text":37529},{"id":37566,"depth":68,"text":37567},{"id":51377,"depth":68,"text":51378},{"id":37586,"depth":68,"text":31816},{"id":37592,"depth":68,"text":37593},{"id":51394,"depth":68,"text":51395},{"id":37606,"depth":68,"text":37607},{"id":48893,"depth":68,"text":48894},"Scrape data from a URL including images, HTML, and text. Point and click to select the data you wish to extract.",{"category":17816,"icon":51684},"WidgetDriverSmartScraper.svg",{"title":32839,"description":51682},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fget-data-from-url","R6m1x4-iJKN9M65HLObQgKNwKaCzvby_71FOgxMR7YA",{"id":51689,"title":51690,"body":51691,"date":71,"description":51807,"extension":73,"meta":51808,"navigation":75,"order":71,"path":48831,"seo":51809,"stem":51810,"__hash__":51811},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fget-data-from-website.md","Get data from a webpage",{"type":8,"value":51692,"toc":51792},[51693,51696,51700,51702,51705,51714,51731,51735,51737,51739,51741,51743,51751,51755,51757,51759,51761,51764,51766,51768,51770,51772,51774,51776,51778,51780,51782,51784,51786,51788,51790],[32947,51694],{"video":51695},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=2603&end=2833&rel=0",[107,51697,51699],{"id":51698},"what-to-use-the-get-data-from-a-bots-current-page-step-for","What to use the Get data from a bot's current page step for",[112,51701],{},[26,51703,51704],{},"The 'Get data from a bot's current page' step in axiom.ai is a versatile web scraping tool that can extract data from tables, pages, and listing pages the bot is currently on. It supports pagination and infinite scroll. The tool includes a point-and-click selector for easy content selection without coding. It's suitable for scraping data for simple reports or extensive databases.",[26,51706,51574,51707,51709,51710,51581,51712,51454],{},[659,51708,51577],{"href":50173},"  You will also find a batch scraping ",[659,51711,183],{"href":51294},[659,51713,51584],{"href":21845},[186,51715,51716,51722,51724],{},[189,51717,51718,51310,51720],{},[659,51719,51309],{"href":51308},[659,51721,51314],{"href":51313},[189,51723,51317],{},[189,51725,51726,51727,51325,51729,51329],{},"LinkedIn profiles links from ",[659,51728,51324],{"href":51323},[659,51730,51328],{"href":1019},[107,51732,51734],{"id":51733},"how-to-configure-the-get-data-from-a-bots-current-page-step","How to configure the Get data from a bot's current page step",[112,51736],{},[21,51738,33198],{"id":15831},[26,51740,51615],{},[26,51742,51343],{},[186,51744,51745,51747,51749],{},[189,51746,49152],{},[189,51748,49155],{},[189,51750,51352],{},[26,51752,51753],{},[659,51754,49164],{"href":49163},[21,51756,51360],{"id":51359},[26,51758,51363],{},[21,51760,37529],{"id":51366},[26,51762,51763],{},"We set the max results to 1 to speed up the testing of your bots as you make them. It's best to do short runs while testing your bot.",[21,51765,37567],{"id":37566},[26,51767,51374],{},[21,51769,51378],{"id":51377},[26,51771,51381],{},[21,51773,31816],{"id":37586},[26,51775,51386],{},[21,51777,37593],{"id":37592},[26,51779,51391],{},[21,51781,51395],{"id":51394},[26,51783,51398],{},[21,51785,37607],{"id":37606},[26,51787,51403],{},[21,51789,48894],{"id":48893},[26,51791,51408],{},{"title":67,"searchDepth":68,"depth":68,"links":51793},[51794,51795],{"id":51698,"depth":670,"text":51699},{"id":51733,"depth":670,"text":51734,"children":51796},[51797,51798,51799,51800,51801,51802,51803,51804,51805,51806],{"id":15831,"depth":68,"text":33198},{"id":51359,"depth":68,"text":51360},{"id":51366,"depth":68,"text":37529},{"id":37566,"depth":68,"text":37567},{"id":51377,"depth":68,"text":51378},{"id":37586,"depth":68,"text":31816},{"id":37592,"depth":68,"text":37593},{"id":51394,"depth":68,"text":51395},{"id":37606,"depth":68,"text":37607},{"id":48893,"depth":68,"text":48894},"Scrape data from a webpage including images, HTML, and text. Point and click to select the data you wish to extract.",{"category":17816,"icon":51684},{"title":51690,"description":51807},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fget-data-from-website","0Dz94jJ2EaHwuKZI8VVS9Ky529giMvyYhSFumMtxd9E",{"id":51813,"title":17849,"body":51814,"date":71,"description":51861,"extension":73,"meta":51862,"navigation":75,"order":71,"path":17846,"seo":51864,"stem":51865,"__hash__":51866},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fgo-to-page.md",{"type":8,"value":51815,"toc":51854},[51816,51819,51823,51825,51828,51831,51833,51843,51847,51849,51851],[32947,51817],{"video":51818},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1238&end=1283&rel=0",[107,51820,51822],{"id":51821},"what-to-use-the-go-to-page-step","What to use the Go to page step",[112,51824],{},[26,51826,51827],{},"The 'Go to page' step loads a web page for automating web actions or scraping data.",[107,51829,48689],{"id":51830},"you-can-use-this-step-to",[112,51832],{},[186,51834,51835,51840],{},[189,51836,51837,51838,36811],{},"Load a page inside a nested ",[659,51839,32433],{"href":15650},[189,51841,51842],{},"Open a web page to scrape data",[107,51844,51846],{"id":51845},"how-to-configure-go-to-page","How to configure Go to page",[112,51848],{},[21,51850,41317],{"id":50342},[26,51852,51853],{},"Enter a URL or click 'Insert data' to pass URLs from a data source.",{"title":67,"searchDepth":68,"depth":68,"links":51855},[51856,51857,51858],{"id":51821,"depth":670,"text":51822},{"id":51830,"depth":670,"text":48689},{"id":51845,"depth":670,"text":51846,"children":51859},[51860],{"id":50342,"depth":68,"text":41317},"Load a web page. Pass tokens into this step to retrieve URLs from data sources like spreadsheets.",{"category":48952,"icon":51863},"WidgetDriverGoto.svg",{"title":17849,"description":51861},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fgo-to-page","_nnnlzfiQysVy3IiGKOJ5RCiB_SKriz05-9SuhBHV1Y",{"id":51868,"title":51869,"body":51870,"date":71,"description":51958,"extension":73,"meta":51959,"navigation":75,"order":71,"path":50871,"seo":51961,"stem":51962,"__hash__":51963},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fif-condtion.md","If a condition is true, run steps",{"type":8,"value":51871,"toc":51948},[51872,51875,51879,51881,51884,51886,51904,51908,51910,51912,51915,51917,51919,51921,51924,51927,51929,51932,51936,51939,51941],[32947,51873],{"video":51874},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=736&end=811&rel=0",[107,51876,51878],{"id":51877},"what-to-use-the-if-condition-step-for","What to use the If condition step for",[112,51880],{},[26,51882,51883],{},"This logic step can execute a set of sub-steps depending on whether the condition returns true or false. For instance, you could use this step with the scraper step. If the scraper extracts some data, this step can check that data for a particular value. If the value is not found, the bot will skip the sub-steps contained within the condition.",[26,51885,48689],{},[186,51887,51888,51893,51899],{},[189,51889,51890,51891,49478],{},"Execute steps based on a value found on a webpage by ",[659,51892,49477],{"href":48831},[189,51894,51895,51896,51898],{},"Entering data into a ",[659,51897,23880],{"href":49104}," depending on a condition",[189,51900,51901,51902],{},"Triggering another Axiom run, depending on a value found in a ",[659,51903,26048],{"href":24142},[107,51905,51907],{"id":51906},"how-to-configure-if-condition-step","How to configure If condition step",[112,51909],{},[21,51911,39327],{"id":49505},[26,51913,51914],{},"Select the data to check for values.",[21,51916,39332],{"id":49511},[26,51918,49514],{},[26,51920,49627],{},[26,51922,51923],{},"Apply rule when match, Any word or All words or any condition when Numbers selected.",[26,51925,51926],{},"Check - Match only the complete word if it appears in the data. Only the characters a-z A-Z 0-9 and _ are considered to be part of a word, all other characters are considered as being part of a word boundary.",[21,51928,39315],{"id":49538},[26,51930,51931],{},"Tick the box, to invert the condition to execute and execute the sub-steps if the condition fails.",[21,51933,51935],{"id":51934},"add-step","Add step",[26,51937,51938],{},"Add the sub-steps you wish to excute as part of the condition.",[21,51940,49545],{"id":49544},[26,51942,51943,51944,51947],{},"You can nest this step in ",[659,51945,51946],{"href":15650},"loops"," or other IF conditions.",{"title":67,"searchDepth":68,"depth":68,"links":51949},[51950,51951],{"id":51877,"depth":670,"text":51878},{"id":51906,"depth":670,"text":51907,"children":51952},[51953,51954,51955,51956,51957],{"id":49505,"depth":68,"text":39327},{"id":49511,"depth":68,"text":39332},{"id":49538,"depth":68,"text":39315},{"id":51934,"depth":68,"text":51935},{"id":49544,"depth":68,"text":49545},"Execute a set of steps depending on an If condition. Pass data into this step to use when constructing your argument. IF Conditions can use text, numbers, or custom JavaScript.",{"category":49565,"icon":51960},"TemplateIfElse.svg",{"title":51869,"description":51958},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fif-condtion","GiHmeeMjZBByktp2C0eOngs7eMDh9nePLLos47gkusY",{"id":51965,"title":51966,"body":51967,"date":71,"description":52064,"extension":73,"meta":52065,"navigation":75,"order":71,"path":52066,"seo":52067,"stem":52068,"__hash__":52069},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fif-else-condition.md","If Else condition step",{"type":8,"value":51968,"toc":52052},[51969,51971,51977,51979,51985,51988,51999,52005,52007,52010,52013,52016,52019,52022,52025,52032,52035,52038,52042,52045,52049],[32947,51970],{"video":51874},[107,51972,48926,51974,36811],{"id":51973},"purpose-of-the-if-else-condition-step",[192,51975,51976],{},"If Else condition",[112,51978],{},[26,51980,2273,51981,51984],{},[192,51982,51983],{},"If Else Condition"," step allows you to execute different sets of actions based on whether a specified condition evaluates to true or false. In the condition, you can 'Insert Data' to check values from Google Sheets or other steps like 'Get Data from Current Page'. You can compare strings, numeric values, or even create custom conditions using JavaScript.",[26,51986,51987],{},"You can use this step to compare values and execute different actions, such as:",[186,51989,51990,51993,51996],{},[189,51991,51992],{},"Checking if scraped data matches a specific value",[189,51994,51995],{},"Verifying if the page URL contains 'login' and executing login steps",[189,51997,51998],{},"Detecting if a button is present and clicking it",[107,52000,49926,52002,52004],{"id":52001},"how-to-configure-the-if-else-condition-step",[192,52003,51976],{}," Step",[112,52006],{},[21,52008,52009],{"id":49505},"Data to Check",[26,52011,52012],{},"Select the data you want to evaluate.",[21,52014,52015],{"id":49511},"Condition to Check",[26,52017,52018],{},"You can check the data for words, a number or test if a JavaScript expression evaluates to true.",[26,52020,52021],{},"Enter a list of words or numbers separated by commas, or provide data containing a list of values, one per row. Leave the field blank to match any value.",[26,52023,52024],{},"You can apply the rule to match Any Word or All Words. Or any condition when Numbers selected.",[26,52026,52027,52028,52031],{},"Enable the option to ",[192,52029,52030],{},"Match complete word only",". This ensures only alphanumeric characters (a-z, A-Z, 0-9, and _) are considered part of a word, while other characters are treated as word boundaries.",[21,52033,52034],{"id":49538},"Reverse Condition",[26,52036,52037],{},"Check this box to invert the condition and execute sub-steps if the condition is false.",[21,52039,52041],{"id":52040},"add-sub-steps","Add Sub-Steps",[26,52043,52044],{},"Insert the steps you want to execute when the condition is met.",[21,52046,52048],{"id":52047},"else-add-sub-steps","Else - Add Sub-Steps",[26,52050,52051],{},"Insert the steps you want to execute when the condition is not met.",{"title":67,"searchDepth":68,"depth":68,"links":52053},[52054,52056],{"id":51973,"depth":670,"text":52055},"Purpose of the If Else condition step",{"id":52001,"depth":670,"text":52057,"children":52058},"How to Configure the If Else condition Step",[52059,52060,52061,52062,52063],{"id":49505,"depth":68,"text":52009},{"id":49511,"depth":68,"text":52015},{"id":49538,"depth":68,"text":52034},{"id":52040,"depth":68,"text":52041},{"id":52047,"depth":68,"text":52048},"Execute a set of steps depending on an If Else condition. Pass data into this step to use when constructing your argument. IF Conditions can use text, numbers, or custom JavaScript.",{"category":49565,"icon":51960},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fif-else-condition",{"title":51966,"description":52064},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fif-else-condition","ChfzNdBK2Y2WTqK5wDMjaYg-vKrvNlz-uP5luv8Jr0U",{"id":52071,"title":52072,"body":52073,"date":71,"description":52146,"extension":73,"meta":52147,"navigation":75,"order":71,"path":51077,"seo":52149,"stem":52150,"__hash__":52151},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fimport-csv-file.md","Import CSV File step",{"type":8,"value":52074,"toc":52137},[52075,52078,52082,52084,52090,52092,52107,52111,52113,52117,52120,52124,52127,52129,52132,52134],[32947,52076],{"video":52077},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=2143&end=2195&rel=0",[107,52079,52081],{"id":52080},"what-to-use-the-import-csv-file-step-for","What to use the Import CSV File step for",[112,52083],{},[26,52085,52086,52087,52089],{},"This step imports data from a CSV into your Axiom. You can then use the data in other automation steps, such as web actions like ",[659,52088,50014],{"href":17231}," step. For example, import data from a CSV to upload via a web form.",[26,52091,48689],{},[186,52093,52094,52097,52104],{},[189,52095,52096],{},"Import data for data entry",[189,52098,52099,52100,52103],{},"Upload multiple CSVs to merge into single CSV for ",[659,52101,52102],{"href":51124},"export","- Import CSV data to upload into a CRM",[189,52105,52106],{},"Import data to filter and clean",[107,52108,52110],{"id":52109},"how-to-configure-the-import-csv-file-step","How to configure the Import CSV File Step",[112,52112],{},[21,52114,52116],{"id":52115},"import-csv","Import CSV",[26,52118,52119],{},"Select the CSV file to upload. Manually enter the file path or use 'Click to select.' You can also use 'Insert data' to pass a file name or path from another step as a variable. Combine a string and variable to create a file path if required. If you see corrupted characters, please ensure the file is encoded in UTF-8 format.",[21,52121,52123],{"id":52122},"fist-cell","Fist cell",[26,52125,52126],{},"Use the first and last cell settings to specify the data range you wish to import. Will use A1 if no value provided.",[21,52128,36424],{"id":49058},[26,52130,52131],{},"Will use ZZ if no value provided",[21,52133,48894],{"id":48893},[26,52135,52136],{},"You will see a preview of the imported CSV data.",{"title":67,"searchDepth":68,"depth":68,"links":52138},[52139,52140],{"id":52080,"depth":670,"text":52081},{"id":52109,"depth":670,"text":52110,"children":52141},[52142,52143,52144,52145],{"id":52115,"depth":68,"text":52116},{"id":52122,"depth":68,"text":52123},{"id":49058,"depth":68,"text":36424},{"id":48893,"depth":68,"text":48894},"Import data from a CSV. Pass to other steps via a token for use in your automation.",{"category":48807,"icon":52148},"WidgetImportCSV.svg",{"title":52072,"description":52146},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fimport-csv-file","lwrZdiH6ZPqcnPOcWYn5RgrAhOdZ-YGrL2lvHmxkNaU",{"id":52153,"title":52154,"body":52155,"date":71,"description":52330,"extension":73,"meta":52331,"navigation":75,"order":670,"path":178,"seo":52333,"stem":52334,"__hash__":52335},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Findex.md","Step index",{"type":8,"value":52156,"toc":52315},[52157,52210,52212,52215,52217,52219,52222,52224,52226,52229,52231,52234,52237,52239,52241,52244,52246,52248,52251,52253,52256,52259,52261,52263,52266,52268,52272,52275,52278,52280,52283,52285,52287,52290,52292,52294,52297,52299,52301,52304,52306],[26,52158,52159,52160,52163,52164,4468,52167,4468,52171,4468,52175,4468,52179,4468,52183,4468,52186,4468,52189,4468,52193,4468,52197,4468,52199,4468,52203,10147,52206,148],{},"Every step you can use in the ",[659,52161,10785],{"href":52162},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder#using-the-step-finder",", grouped by what it does. Jump to ",[659,52165,5479],{"href":52166},"#scrape",[659,52168,52170],{"href":52169},"#navigate","navigate",[659,52172,52174],{"href":52173},"#interact","interact",[659,52176,52178],{"href":52177},"#read-and-write-data","read and write data",[659,52180,52182],{"href":52181},"#files","files",[659,52184,37904],{"href":52185},"#loop",[659,52187,40480],{"href":52188},"#control-flow",[659,52190,52192],{"href":52191},"#debug","debug",[659,52194,52196],{"href":52195},"#webhook-and-api","webhook and API",[659,52198,200],{"href":1841},[659,52200,52202],{"href":52201},"#manipulate-data","manipulate data",[659,52204,8430],{"href":52205},"#email",[659,52207,52209],{"href":52208},"#other","other",[107,52211,17816],{"id":5479},[26,52213,52214],{},"Pull data out of a webpage - tables, lists, product grids, links, or metadata.",[2218,52216],{"category":17816},[107,52218,48952],{"id":52170},[26,52220,52221],{},"Move a bot between pages and tabs - go to a URL, open a new tab, switch tabs, or restart the browser.",[2218,52223],{"category":48952},[107,52225,49189],{"id":52174},[26,52227,52228],{},"Drive the page like a user would - click, type, press keys, hover, drag, upload files, and select from dropdowns.",[2218,52230],{"category":49189},[107,52232,48807],{"id":52233},"read-and-write-data",[26,52235,52236],{},"Move data in and out of Google Sheets, CSV files, local files, and Google Drive.",[2218,52238],{"category":48807},[107,52240,223],{"id":52182},[26,52242,52243],{},"Download files from a page or URL, save screenshots, or save a page's HTML.",[2218,52245],{"category":223},[107,52247,32433],{"id":37904},[26,52249,52250],{},"Repeat a set of steps for every row of data, or break out of a loop when a condition is met.",[2218,52252],{"category":32433},[107,52254,49565],{"id":52255},"control-flow",[26,52257,52258],{},"Branch a bot based on data, jump to another step, try and catch errors, or end a run early.",[2218,52260],{"category":49565},[107,52262,48739],{"id":52192},[26,52264,52265],{},"Inspect what's happening mid-run - display messages, capture the current URL, or add context to errors.",[2218,52267],{"category":48739},[107,52269,52271],{"id":52270},"webhook-and-api","Webhook and API",[26,52273,52274],{},"Trigger a bot from another app, send data out to any webhook URL, or hit an API directly from a run.",[2218,52276],{"category":52277},"webhook-api",[107,52279,200],{"id":1861},[26,52281,52282],{},"Extract structured fields from unstructured text or generate new content with Claude, ChatGPT, or another LLM.",[2218,52284],{"category":200},[107,52286,38518],{"id":38517},[26,52288,52289],{},"Transform data between steps - split, merge, replace text, strip HTML, remove duplicates, or filter rows.",[2218,52291],{"category":38518},[107,52293,1975],{"id":8430},[26,52295,52296],{},"Send an email to one or more recipients when a run finishes or hits a key step.",[2218,52298],{"category":1975},[107,52300,49002],{"id":52209},[26,52302,52303],{},"Utility steps that don't fit elsewhere - wait, solve CAPTCHAs, generate passwords, get the current date, or run another bot.",[2218,52305],{"category":49002},[26,52307,52308,52309,52314],{},"Can't find the step you're looking for? ",[659,52310,52313],{"href":52311,"rel":52312},"https:\u002F\u002Fwww.reddit.com\u002Fr\u002Faxiom_ai\u002Fcomments\u002F1fptsst\u002Ffeedback_megathread",[1218],"Drop us a comment"," - we'd love to hear from you.",{"title":67,"searchDepth":68,"depth":68,"links":52316},[52317,52318,52319,52320,52321,52322,52323,52324,52325,52326,52327,52328,52329],{"id":5479,"depth":670,"text":17816},{"id":52170,"depth":670,"text":48952},{"id":52174,"depth":670,"text":49189},{"id":52233,"depth":670,"text":48807},{"id":52182,"depth":670,"text":223},{"id":37904,"depth":670,"text":32433},{"id":52255,"depth":670,"text":49565},{"id":52192,"depth":670,"text":48739},{"id":52270,"depth":670,"text":52271},{"id":1861,"depth":670,"text":200},{"id":38517,"depth":670,"text":38518},{"id":8430,"depth":670,"text":1975},{"id":52209,"depth":670,"text":49002},"Every step available in axiom.ai's no-code browser automation builder, grouped by what it does.",{"metaTitle":52332},"All browser automation steps | axiom.ai",{"title":52154,"description":52330},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Findex","zxx7ny-Pr1DII5FZVaIOu_1uJGcRojfXEEVDg7q3AxY",{"id":52337,"title":19124,"body":52338,"date":71,"description":52417,"extension":73,"meta":52418,"navigation":75,"order":71,"path":43220,"seo":52420,"stem":52421,"__hash__":52422},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fintegrate-ai.md",{"type":8,"value":52339,"toc":52408},[52340,52343,52347,52349,52352,52354,52373,52379,52383,52385,52387,52390,52393,52396,52399,52402,52405],[32947,52341],{"video":52342},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1503&end=1560?rel=0",[107,52344,52346],{"id":52345},"what-to-use-the-integrate-ai-step-for","What to use the Integrate AI step for",[112,52348],{},[26,52350,52351],{},"Add AI into your automation using this step to extract data, generate text, and make decisions as part of your workflow. You can connect to providers like ChatGPT, Claude, Gemini and Sonar using your own API keys, allowing you to handle unstructured data and add flexible, intelligent logic without writing code.",[26,52353,48689],{},[186,52355,52356,52359,52362,52365,52368],{},[189,52357,52358],{},"Scrape unstructured data from html with AI",[189,52360,52361],{},"Extract details from LinkedIn profile data",[189,52363,52364],{},"Customise DM messages",[189,52366,52367],{},"Use as part of a larger Axiom that scrapes and responds to comments",[189,52369,52370,52371],{},"Extract data from an ",[659,52372,5345],{"href":25942},[26,52374,52375,52376],{},"If you have an idea for a different AI feature? let us know we can ",[659,52377,52378],{"href":1887},"add it.",[107,52380,52382],{"id":52381},"how-to-configure-the-integrate-ai-step","How to configure the  Integrate AI step",[112,52384],{},[21,52386,38024],{"id":27275},[26,52388,52389],{},"Select extract data or generate data to set the step AI function.",[21,52391,38043],{"id":52392},"llm",[26,52394,52395],{},"Select the model of LLM you wish to use.",[21,52397,4175],{"id":52398},"api-key",[26,52400,52401],{},"Enter your API key here.",[21,52403,1431],{"id":52404},"prompt",[26,52406,52407],{},"Enter your prompt this can be combined with data from other steps by clicking \"insert data\".",{"title":67,"searchDepth":68,"depth":68,"links":52409},[52410,52411],{"id":52345,"depth":670,"text":52346},{"id":52381,"depth":670,"text":52382,"children":52412},[52413,52414,52415,52416],{"id":27275,"depth":68,"text":38024},{"id":52392,"depth":68,"text":38043},{"id":52398,"depth":68,"text":4175},{"id":52404,"depth":68,"text":1431},"Interact with LLMs to extract data, generate text or make decisions. Supports either ChatGPT, Claude and others, requires an API key.",{"category":200,"icon":52419},"WidgetAI.svg",{"title":19124,"description":52417},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fintegrate-ai","pUVjX_SM8pzHJryqr8WOTNWoBBWBOhDRuObJFMgz9y4",{"id":52424,"title":52425,"body":52426,"date":71,"description":52503,"extension":73,"meta":52504,"navigation":75,"order":71,"path":52505,"seo":52506,"stem":52507,"__hash__":52508},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Finteract-with-a-pages-interface.md","Interact step",{"type":8,"value":52427,"toc":52495},[52428,52432,52434,52441,52444,52470,52474,52476,52478,52481,52485,52488,52492],[107,52429,52431],{"id":52430},"what-to-use-the-interact-step","What to use the Interact step",[112,52433],{},[26,52435,52436,52437,52440],{},"This step is now defunct. Replaced by the Loop step. The 'Interact with a page's interface' step has sub-steps that automate web actions like clicking on elements or ",[659,52438,52439],{"href":17231},"'Entering text'",". However, from Axiom 4.0, this step is no longer used, it is replaced by new methods for looping and new nesting features. Although this step will still function, all Axioms created with it will continue to work.",[26,52442,52443],{},"You can use this step to combine steps:",[186,52445,52446,52452,52458,52464,52467],{},[189,52447,52448,52449],{},"To automate ",[659,52450,52451],{"href":1014},"'data entry'",[189,52453,52454,52455],{},"To scrape multiple ",[659,52456,52457],{"href":1024},"'pages'",[189,52459,52460,52461],{},"Social media automation like this ",[659,52462,52463],{"href":1029},"'template'",[189,52465,52466],{},"To automate any website actions such as clicks in Chrome",[189,52468,52469],{},"To automate file downloads.",[107,52471,52473],{"id":52472},"how-to-configure-the-interact-step","How to configure the Interact step",[112,52475],{},[21,52477,15653],{"id":37896},[26,52479,52480],{},"Repeat for each item in another step's data. Click 'Insert Data' and select the data you wish to loop through.",[21,52482,52484],{"id":52483},"loop-through-all","Loop through all",[26,52486,52487],{},"Toggle ON this to loop through all rows of data, this function can be disabled to use first row only.",[21,52489,52491],{"id":52490},"add-a-sub-step","Add a sub step",[26,52493,52494],{},"Add sub steps required to build your web automation.",{"title":67,"searchDepth":68,"depth":68,"links":52496},[52497,52498],{"id":52430,"depth":670,"text":52431},{"id":52472,"depth":670,"text":52473,"children":52499},[52500,52501,52502],{"id":37896,"depth":68,"text":15653},{"id":52483,"depth":68,"text":52484},{"id":52490,"depth":68,"text":52491},"This step is now defunct. Replaced by the Loop step.",{"category":32433,"icon":50848},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Finteract-with-a-pages-interface",{"title":52425,"description":52503},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Finteract-with-a-pages-interface","DmkXfP8SjtKwRhAYBgpynBoMCeS94SwZoOtLPgDFoSk",{"id":52510,"title":52511,"body":52512,"date":71,"description":52595,"extension":73,"meta":52596,"navigation":75,"order":71,"path":36855,"seo":52598,"stem":52599,"__hash__":52600},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fjoin-different-data-sources.md","Join different data sources based on matching columns step",{"type":8,"value":52513,"toc":52584},[52514,52516,52520,52522,52525,52527,52543,52547,52549,52552,52555,52558,52561,52564,52567,52570,52573,52577,52579,52581],[32947,52515],{"video":36897},[107,52517,52519],{"id":52518},"what-to-use-the-join-different-data-sources-based-on-matching-columns-step-for","What to use the Join different data sources based on matching columns step for",[112,52521],{},[26,52523,52524],{},"Use this to join data gathered from different sources together. A shared column is used to combine the two. For example, use this to join product info from different e-commerce sites or to merge a Google Sheet with a CSV.",[26,52526,48689],{},[186,52528,52529,52537],{},[189,52530,52531,52532,8621,52534,52536],{},"Merge a ",[659,52533,32682],{"href":51077},[659,52535,49040],{"href":24142},"- Join data from separate ecommerce store",[189,52538,52539,52540],{},"Merge ",[659,52541,52542],{"href":48831},"scraped data sets",[107,52544,52546],{"id":52545},"how-to-configure-the-join-different-data-sources-based-on-matching-columns-step","How to configure the Join different data sources based on matching columns step",[112,52548],{},[21,52550,36875],{"id":52551},"base-data",[26,52553,52554],{},"Enter the base data to join with another.",[21,52556,36881],{"id":52557},"base-data-column",[26,52559,52560],{},"Column of data to use as the basis of the join. For example, if you want to join based on company name, enter the column number or letter which contains the company name here.",[21,52562,36887],{"id":52563},"join-data",[26,52565,52566],{},"Enter the data you want to join with the base data.",[21,52568,36893],{"id":52569},"column",[26,52571,52572],{},"Specify a particular column of the base data to always match against. Leave this blank to match with any column.",[21,52574,52576],{"id":52575},"fuzzyness-of-the-match","Fuzzyness of the match",[26,52578,52572],{},[21,52580,48894],{"id":48893},[26,52582,52583],{},"A preview results returned by this step.",{"title":67,"searchDepth":68,"depth":68,"links":52585},[52586,52587],{"id":52518,"depth":670,"text":52519},{"id":52545,"depth":670,"text":52546,"children":52588},[52589,52590,52591,52592,52593,52594],{"id":52551,"depth":68,"text":36875},{"id":52557,"depth":68,"text":36881},{"id":52563,"depth":68,"text":36887},{"id":52569,"depth":68,"text":36893},{"id":52575,"depth":68,"text":52576},{"id":48893,"depth":68,"text":48894},"Merge data from multiple sources into a single dataset by matching columns. Used to combine data from large, database-style sets.",{"category":38518,"icon":52597},"WidgetFilterMerge.svg",{"title":52511,"description":52595},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fjoin-different-data-sources","0A0pSC-s7pxGyhWl_Ra9kXJW-Ky3Wap1C7u-Ng2ID9o",{"id":52602,"title":34808,"body":52603,"date":71,"description":52649,"extension":73,"meta":52650,"navigation":75,"order":71,"path":34805,"seo":52652,"stem":52653,"__hash__":52654},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fjump-step.md",{"type":8,"value":52604,"toc":52642},[52605,52608,52612,52614,52621,52627,52631,52633,52635,52638,52640],[32947,52606],{"video":52607},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=225&end=266&rel=0",[107,52609,52611],{"id":52610},"what-to-use-the-jump-to-another-step-step-for","What to use the Jump to another step step for",[112,52613],{},[26,52615,52616,52617,52620],{},"The jump step is used to create simple loops or to skip steps that you do not want to execute. It works well in conjunction with the ",[659,52618,52619],{"href":34811},"Conditional jump step.","\nWe use the jump step as part of a technique called batching. This involves looping through steps using a jump step. For example, we start by reading a single row from a Google Sheet; we execute automation using that row's data. Then, we delete the row before moving on to read a new row.",[26,52622,49489,52623,49493,52625,49496],{},[659,52624,34808],{"href":49492},[659,52626,15653],{"href":15650},[107,52628,52630],{"id":52629},"how-to-configure-the-jump-to-another-step","How to configure the Jump to another step",[112,52632],{},[21,52634,34831],{"id":49526},[26,52636,52637],{},"Enter the number of the step to jump to if the value is found. You can jump up or jump down.",[21,52639,34839],{"id":49532},[26,52641,49535],{},{"title":67,"searchDepth":68,"depth":68,"links":52643},[52644,52645],{"id":52610,"depth":670,"text":52611},{"id":52629,"depth":670,"text":52630,"children":52646},[52647,52648],{"id":49526,"depth":68,"text":34831},{"id":49532,"depth":68,"text":34839},"Automations run steps in sequence. Use this step to break that sequence and jump to a step outside the order.",{"category":49565,"icon":52651},"WidgetAlwaysJump.svg",{"title":34808,"description":52649},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fjump-step","-UHjdgGm39r1wPqxMGNHN1zM6pqZUskve-ny3oZV838",{"id":52656,"title":52657,"body":52658,"date":71,"description":52730,"extension":73,"meta":52731,"navigation":75,"order":71,"path":15650,"seo":52732,"stem":52733,"__hash__":52734},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Floop.md","Loop step",{"type":8,"value":52659,"toc":52721},[52660,52663,52667,52669,52675,52677,52697,52701,52703,52705,52707,52709,52711,52713,52716,52718],[32947,52661],{"video":52662},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=40&end=101&rel=0",[107,52664,52666],{"id":52665},"what-to-use-the-loop-step-for","What to use the Loop step for",[112,52668],{},[26,52670,52671,52672],{},"The Loop step iterates through any sub-steps contained within it. Loop step can also be nested. Use it to loop through data, such as rows from a Google Sheet. Click to follow a ",[659,52673,52674],{"href":31407},"tutorial on looping.",[26,52676,48689],{},[186,52678,52679],{},[189,52680,52681,52682,52684,52685,52689,52690,52693,52694],{},"Loop through data in a ",[659,52683,26048],{"href":24142}," to create ",[659,52686,52688],{"href":52687},"\u002Fblog\u002Fhow-to-automate-social-media-posts","Social Posts","- Enter data into ",[659,52691,52692],{"href":49104},"Web forms","- Create ",[659,52695,52696],{"href":43354},"ChatGPT Web scrapers",[107,52698,52700],{"id":52699},"how-to-use-the-loop-step","How to use the Loop step",[112,52702],{},[21,52704,15653],{"id":37896},[26,52706,52480],{},[21,52708,52484],{"id":52483},[26,52710,52487],{},[21,52712,51935],{"id":51934},[26,52714,52715],{},"Add the sub-steps you wish to execute in the loop.",[21,52717,49545],{"id":49544},[26,52719,52720],{},"You can nest loops up to four levels.",{"title":67,"searchDepth":68,"depth":68,"links":52722},[52723,52724],{"id":52665,"depth":670,"text":52666},{"id":52699,"depth":670,"text":52700,"children":52725},[52726,52727,52728,52729],{"id":37896,"depth":68,"text":15653},{"id":52483,"depth":68,"text":52484},{"id":51934,"depth":68,"text":51935},{"id":49544,"depth":68,"text":49545},"Loop through sub-steps inside a loop. Set data to loop through, such as URLs in a Google Sheet. Pass data into sub-steps using tokens.",{"category":32433,"icon":50848},{"title":52657,"description":52730},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Floop","0Pv7PkhdVhQKze3rC-4-SZ-2ku4anNfB34hvUEb5dlc",{"id":52736,"title":52737,"body":52738,"date":71,"description":52804,"extension":73,"meta":52805,"navigation":75,"order":71,"path":34643,"seo":52807,"stem":52808,"__hash__":52809},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fmouse-click-and-drag.md","Mouse click and drag",{"type":8,"value":52739,"toc":52794},[52740,52743,52747,52749,52752,52754,52759,52763,52765,52769,52772,52776,52779,52781,52784,52786,52789,52791],[32947,52741],{"video":52742},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=190&end=225&rel=0",[107,52744,52746],{"id":52745},"what-to-use-the-mouse-click-and-drag-step-for","What to use the Mouse click and drag step for",[112,52748],{},[26,52750,52751],{},"Instruct the bot to move the mouse to the start coordinates then click and drag to the end coordinates. Use the step for web automation in particular dragging sliders into position.",[26,52753,48689],{},[186,52755,52756],{},[189,52757,52758],{},"Drag Sliders",[107,52760,52762],{"id":52761},"how-to-configure-the-mouse-click-and-drag-step","How to configure the Mouse click and drag step",[112,52764],{},[21,52766,52768],{"id":52767},"keywords","Keywords",[26,52770,52771],{},"Enter a list of keywords to search on, each separated by a comma.",[21,52773,52775],{"id":52774},"email-address","Email address",[26,52777,52778],{},"Enter the email address of the Gmail account to be searched, leave blank to use the default Gmail address. You must be logged into a Gmail account in order to search it, if you are not logged into the specified account then the default Gmail account will be searched instead.",[21,52780,50349],{"id":50348},[26,52782,52783],{},"Set a folder to download into (please note currently only one new folder can be created at a time)",[21,52785,37529],{"id":51366},[26,52787,52788],{},"Set a maximum number of emails to retrieve.",[21,52790,48894],{"id":48893},[26,52792,52793],{},"A preview of the Gmail data gathered.",{"title":67,"searchDepth":68,"depth":68,"links":52795},[52796,52797],{"id":52745,"depth":670,"text":52746},{"id":52761,"depth":670,"text":52762,"children":52798},[52799,52800,52801,52802,52803],{"id":52767,"depth":68,"text":52768},{"id":52774,"depth":68,"text":52775},{"id":50348,"depth":68,"text":50349},{"id":51366,"depth":68,"text":37529},{"id":48893,"depth":68,"text":48894},"Replicate dragging objects with a mouse by recording coordinates. Use to automate drag-and-drop actions on a page.",{"category":49189,"icon":52806},"WidgetDriverMouseClickDrag.svg",{"title":52737,"description":52804},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fmouse-click-and-drag","AFJc9pGgxfs3ChPNXmCThjHuXL3eUaKUb4guM7a7-7Q",{"id":52811,"title":52812,"body":52813,"date":71,"description":52857,"extension":73,"meta":52858,"navigation":75,"order":71,"path":52859,"seo":52860,"stem":52861,"__hash__":52862},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fmove-a-google-sheet.md","Move a Google Sheet to a new folder in Google Drive",{"type":8,"value":52814,"toc":52850},[52815,52817,52819,52825,52827,52829,52832,52836,52838,52841,52845,52847],[107,52816,24999],{"id":24998},[112,52818],{},[26,52820,52821,52822,52824],{},"The \"Move a Google Sheet to a new folder in Google Drive\" step can be used to move a Google Sheet within your Google Drive account. This can be used in combination with the ",[659,52823,44254],{"href":44261}," step to create sheets and then move them based on actions within your automation.",[107,52826,314],{"id":49137},[112,52828],{},[26,52830,52831],{},"This step has two configuration options that are required.",[21,52833,52835],{"id":52834},"sheet-to-move","Sheet to move",[112,52837],{},[26,52839,52840],{},"Select the spreadsheet or paste in a URL of the sheet that you wish the step to move.",[107,52842,52844],{"id":52843},"folder-url","Folder URL",[112,52846],{},[26,52848,52849],{},"Enter the URL of the destination folder for the spreadsheet. This must be created before the step is run and the folder must continue to exist for the duration of the automation runs.",{"title":67,"searchDepth":68,"depth":68,"links":52851},[52852,52853,52856],{"id":24998,"depth":670,"text":24999},{"id":49137,"depth":670,"text":314,"children":52854},[52855],{"id":52834,"depth":68,"text":52835},{"id":52843,"depth":670,"text":52844},"Used to move a Google Sheet within your Google Drive account.",{"category":223,"icon":50143},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fmove-a-google-sheet",{"title":52812,"description":52857},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fmove-a-google-sheet","eMtooh0iG1Xbv6tDjp1DkwPSFFLG3-oG5ifokAyZcgQ",{"id":52864,"title":52865,"body":52866,"date":71,"description":52904,"extension":73,"meta":52905,"navigation":75,"order":71,"path":21758,"seo":52906,"stem":52907,"__hash__":52908},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fopen-tab.md","Open a new tab step",{"type":8,"value":52867,"toc":52898},[52868,52872,52874,52877,52887,52891,52893,52895],[107,52869,52871],{"id":52870},"what-to-use-the-open-a-new-tab-step-for","What to use the Open a new tab step for",[112,52873],{},[26,52875,52876],{},"Use this step to open a new tab in your browser and navigate it to a URL while an automation is running. It's useful when you need to start work on a different page without leaving the current one — for example, opening a record, a search result, or an external tool in a separate tab.",[26,52878,52879,52880,52882,52883,52886],{},"The bot operates in one tab at a time, so pair this with the ",[659,52881,49412],{"href":35778}," step to move the bot to the new tab, and the ",[659,52884,52885],{"href":21784},"'Close browser tab'"," step to tidy up when you're done.",[107,52888,52890],{"id":52889},"how-to-configure-the-open-a-new-tab-step","How to configure the Open a new tab step",[112,52892],{},[21,52894,4603],{"id":13749},[26,52896,52897],{},"Enter the URL to open in the new tab. Click 'Insert data' if you want to pass URLs from a data source like a Google Sheet into this step.",{"title":67,"searchDepth":68,"depth":68,"links":52899},[52900,52901],{"id":52870,"depth":670,"text":52871},{"id":52889,"depth":670,"text":52890,"children":52902},[52903],{"id":13749,"depth":68,"text":4603},"Open a new browser tab and navigate it to a URL during a bot run.",{"category":48952,"icon":51863},{"title":52865,"description":52904},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fopen-tab","caR-yMdrfpFhqRpbiQA-kFAymlaHzYQU1Uk1_m6pBsw",{"id":52910,"title":52911,"body":52912,"date":71,"description":52996,"extension":73,"meta":52997,"navigation":75,"order":71,"path":50993,"seo":52999,"stem":53000,"__hash__":53001},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fpress-key.md","Press keys(s) step",{"type":8,"value":52913,"toc":52987},[52914,52917,52921,52923,52929,52946,52956,52960,52962,52964,52967,52969,52972,52975,52978,52980,52983],[32947,52915],{"video":52916},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=101&end=166?rel=0",[107,52918,52920],{"id":52919},"what-to-use-the-press-keys-step-for","What to use the Press key(s) step for",[112,52922],{},[26,52924,52925,52926,48833],{},"Press key(s) is one of the most useful steps in axiom.ai's stepbox. This feature lets you record keystrokes and replay them later, which is especially useful for web automation. To learn more about how useful the Press key(s) step is read our ",[659,52927,52928],{"href":34629},"docs.",[186,52930,52931,52934,52937,52940,52943],{},[189,52932,52933],{},"Record Tabs to move between form elements",[189,52935,52936],{},"Click a button with a Return",[189,52938,52939],{},"Enter a date into a form input",[189,52941,52942],{},"Up and down arrows can scroll pages",[189,52944,52945],{},"Interact with pop-ups",[26,52947,52948,52949,52951,52952,52955],{},"This step works well in tandem with the ",[659,52950,16065],{"href":17231}," step when automating data entry. Learn to observe where the cursor is loaded on a web page by default. If you're sending ",[659,52953,52954],{"href":1029},"DMs on Instagram"," the cursor is loaded into the message box so you can enter text and record a \"Return\" keypress to send the message.",[107,52957,52959],{"id":52958},"how-to-configure-the-press-keys-step","How to configure the Press key(s) step",[112,52961],{},[21,52963,23459],{"id":4359},[26,52965,52966],{},"Click record, then press the keys you want the bot to press. You can record a sequence of keys. Please note key combinations or special clicks can vary for Mac, Windows and Linux (The cloud runs on Linux).",[21,52968,581],{"id":580},[26,52970,52971],{},"Input keystrokes directly from data sources such as WebHooks and Google Sheets. However, each keystroke must be separated by a delimiter, or Axiom will interpret them as a single keystroke.",[21,52973,52974],{"id":19638},"Delimiter",[26,52976,52977],{},"Customise your delimiter, use this character to separate individual key presses. Make sure this is present between each desired key press in the given data, or this step will not work properly.",[21,52979,51002],{"id":17309},[26,52981,52982],{},"Set a delay between each key press (in milliseconds).",[26,52984,50893,52985,148],{},[659,52986,50897],{"href":50896},{"title":67,"searchDepth":68,"depth":68,"links":52988},[52989,52990],{"id":52919,"depth":670,"text":52920},{"id":52958,"depth":670,"text":52959,"children":52991},[52992,52993,52994,52995],{"id":4359,"depth":68,"text":23459},{"id":580,"depth":68,"text":581},{"id":19638,"depth":68,"text":52974},{"id":17309,"depth":68,"text":51002},"Record keyboard input. Include actions like pressing Return to submit a form or Tab to move between fields. Used to replay typed input as part of an automation.",{"category":49189,"icon":52998},"WidgetDriverKeyDown.svg",{"title":52911,"description":52996},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fpress-key","lQA-aIKqF818sVijNI-C3Q13vSyrUxi5_f873KJ5lGM",{"id":53003,"title":53004,"body":53005,"date":71,"description":53095,"extension":73,"meta":53096,"navigation":75,"order":71,"path":24142,"seo":53098,"stem":53099,"__hash__":53100},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-data-from-a-google-sheet-step.md","Read data from a Google Sheet step",{"type":8,"value":53006,"toc":53085},[53007,53010,53014,53016,53019,53030,53032,53051,53054,53058,53060,53062,53064,53066,53069,53071,53074,53076,53079,53082],[32947,53008],{"video":53009},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=310&end=366?rel=0",[107,53011,53013],{"id":53012},"what-to-use-the-read-data-from-a-google-sheet-step-for","What to use the Read data from a Google Sheet step for",[112,53015],{},[26,53017,53018],{},"The read from a Google sheet step is most commonly used to loop through a list of URLs for scraping content and passing data to web forms. It's a common starting point for most bots made with Axiom. When used in combination with the 'Loop' step, data can be passed without code from the sheet to any website or web application.",[26,53020,53021,53022,53024,53025,53027,53028],{},"If you are looking to create a process with thousands of rows, we recommend a design pattern called ",[659,53023,51577],{"href":50173}," 😊 You will also find a batch ",[659,53026,183],{"href":51294}," here. If you just want to scrape links, use this ",[659,53029,51584],{"href":21845},[26,53031,48689],{},[186,53033,53034,53041,53044],{},[189,53035,53036,53037,53040],{},"Combine with the ",[659,53038,53039],{"href":48831},"'Get data from a URL'"," step to loop through links and scrape pages",[189,53042,53043],{},"Import data to output as a CSV",[189,53045,53046,53047,53050],{},"Read data to input in a form via the ",[659,53048,53049],{"href":52505},"'Interact'"," and ['Enter text'](\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fenter-text\u002F steps.",[26,53052,53053],{},"If you have an Excel sheet, don't worry. They can be imported into Google Sheets and converted with a couple of clicks.",[107,53055,53057],{"id":53056},"how-to-configure-the-read-data-from-a-google-sheet-step","How to configure the Read data from a Google Sheet step",[112,53059],{},[21,53061,36402],{"id":49040},[26,53063,50191],{},[21,53065,36408],{"id":49046},[26,53067,53068],{},"Optionally specify a sheet name to read from. Sheets are different tabs visible at the bottom of your Google doc; enter the name that appears on the tab to specify the sheet. Leaving this blank will use the first sheet in the document.",[21,53070,36414],{"id":49052},[26,53072,53073],{},"Enter a column and row number if you wish to start your read operation from a particular cell in your Google Sheet. For example, 'B10' will\nmean your bot will start reading data from the second column on the 10th row.",[21,53075,49059],{"id":49058},[26,53077,53078],{},"Enter a column and row number combination if you wish to stop the read operation at a particular cell in your Google Sheet. For example, 'B100' will\nmean your bot will stop reading data at the 100th row in the second column.",[21,53080,44315],{"id":53081},"continue-when-empty",[26,53083,53084],{},"If this is turned on, the automation will proceed even if the input sheet is empty otherwise will throw an error.",{"title":67,"searchDepth":68,"depth":68,"links":53086},[53087,53088],{"id":53012,"depth":670,"text":53013},{"id":53056,"depth":670,"text":53057,"children":53089},[53090,53091,53092,53093,53094],{"id":49040,"depth":68,"text":36402},{"id":49046,"depth":68,"text":36408},{"id":49052,"depth":68,"text":36414},{"id":49058,"depth":68,"text":49059},{"id":53081,"depth":68,"text":44315},"Fetch data from a Google Sheet to use in your automation. Pass it into steps using tokens.",{"category":48807,"icon":53097},"WidgetReadGoogleSheet.svg",{"title":53004,"description":53095},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-data-from-a-google-sheet-step","s5KL2Gw5vfRAvBhxvl9i65ENiPSYqQltq-ET3jf09OQ",{"id":53102,"title":53103,"body":53104,"date":71,"description":53179,"extension":73,"meta":53180,"navigation":75,"order":71,"path":48772,"seo":53182,"stem":53183,"__hash__":53184},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-data-from-airtable.md","Read data from Airtable",{"type":8,"value":53105,"toc":53172},[53106,53110,53112,53115,53118,53129,53131,53146,53152,53156,53158,53162,53165,53169],[107,53107,53109],{"id":53108},"what-to-use-the-read-data-from-airtable-step-for","What to use the Read data from Airtable step for",[112,53111],{},[26,53113,53114],{},"The read data from airtable step is used to loop through rows of data, such as lists of URLs, so you can scrape content or send data to web forms.",[26,53116,53117],{},"It is often the starting point for many bots built with Axiom. When combined with the loop step, it allows you to pass data from a table to a website or web app without writing code.",[26,53119,53120,53121,53124,53125,53128],{},"If you need to process thousands of rows, use a pattern called ",[659,53122,53123],{"href":51294},"batch scraping",". This helps you run tasks in smaller chunks. You can also use a batch template for this. If your goal is only to scrape links, use the ",[659,53126,53127],{"href":21845},"scraper"," template instead.",[26,53130,48689],{},[186,53132,53133,53137,53139],{},[189,53134,53036,53135,53040],{},[659,53136,53039],{"href":48831},[189,53138,53043],{},[189,53140,53046,53141,6205,53143,53145],{},[659,53142,53049],{"href":52505},[659,53144,50014],{"href":17231}," steps.",[26,53147,53148,53149,53151],{},"If you have an ",[659,53150,26051],{"href":43952},", use the excel step.",[107,53153,53155],{"id":53154},"how-to-configure-the-read-data-from-airtable-step","How to configure the Read data from Airtable step",[112,53157],{},[21,53159,53161],{"id":53160},"base-id","Base ID",[26,53163,53164],{},"Input your airtable base ID.",[21,53166,53168],{"id":53167},"table-id-or-name","Table ID or name",[26,53170,53171],{},"Input the table ID or name.",{"title":67,"searchDepth":68,"depth":68,"links":53173},[53174,53175],{"id":53108,"depth":670,"text":53109},{"id":53154,"depth":670,"text":53155,"children":53176},[53177,53178],{"id":53160,"depth":68,"text":53161},{"id":53167,"depth":68,"text":53168},"Import data from Airtable into your automations.",{"category":48807,"icon":53181},"WidgetReadAirtable.svg",{"title":53103,"description":53179},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-data-from-airtable","TWnMm-Rmblgfjo4YZ-NKYzpmQEqeQq5aQxwxtojTRbE",{"id":53186,"title":53187,"body":53188,"date":71,"description":67,"extension":73,"meta":53254,"navigation":75,"order":71,"path":43952,"seo":53256,"stem":53257,"__hash__":53258},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-data-from-excel.md","Read data from Excel sheet step",{"type":8,"value":53189,"toc":53244},[53190,53194,53196,53199,53202,53213,53217,53219,53221,53224,53226,53229,53231,53234,53236,53239,53241],[107,53191,53193],{"id":53192},"what-to-use-the-read-data-from-an-excel-sheet-step-for","What to use the Read data from an Excel sheet step for",[112,53195],{},[26,53197,53198],{},"Use this step to read data from an Excel spreadsheet, useful for loading data into your automations.",[26,53200,53201],{},"You can use this step for:",[186,53203,53204,53207,53210],{},[189,53205,53206],{},"Importing data to loop through.",[189,53208,53209],{},"Reading in authentication credentials to log into websites.",[189,53211,53212],{},"Reading in data to input into forms.",[107,53214,53216],{"id":53215},"how-to-configure-the-read-data-from-an-excel-sheet-step","How to configure the Read data from an Excel sheet step",[112,53218],{},[21,53220,36402],{"id":49040},[26,53222,53223],{},"Enter a URL for the sheet that you wish to read from, or enter the name in the search box.",[21,53225,36408],{"id":49046},[26,53227,53228],{},"The name of the sheet within the workspace to read data from.",[21,53230,36414],{"id":49052},[26,53232,53233],{},"The first column and row that you wish to start your read operation. This should be formatted as \"column:row\", for example, \"B10\". The column must be capitalised.",[21,53235,36424],{"id":49058},[26,53237,53238],{},"The last column and row that you wish to finish your read operation on. This should be formatted as \"column:row\", for example, \"B10\". The column must be capitalised.",[21,53240,44315],{"id":53081},[26,53242,53243],{},"If enabled, the automation will proceed even if the sheet is empty, otherwise, this will cause an error.",{"title":67,"searchDepth":68,"depth":68,"links":53245},[53246,53247],{"id":53192,"depth":670,"text":53193},{"id":53215,"depth":670,"text":53216,"children":53248},[53249,53250,53251,53252,53253],{"id":49040,"depth":68,"text":36402},{"id":49046,"depth":68,"text":36408},{"id":49052,"depth":68,"text":36414},{"id":49058,"depth":68,"text":36424},{"id":53081,"depth":68,"text":44315},{"category":48807,"videoguide":71,"imagestep":53255,"icon":53097},"\u002Fstep-images\u002Fread-sheet.png",{"title":53187,"description":67},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-data-from-excel","8OemP-m3g8w9EuUIJtueWG9iNvVynnA_OpxG5c6IAAA",{"id":53260,"title":53261,"body":53262,"date":71,"description":67,"extension":73,"meta":53318,"navigation":75,"order":71,"path":44109,"seo":53322,"stem":53323,"__hash__":53324},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-file-from-google-drive.md","Read file from Google Drive step",{"type":8,"value":53263,"toc":53311},[53264,53267,53269,53272,53275,53286,53289,53291,53293,53296,53299,53302,53305,53308],[107,53265,44112],{"id":53266},"read-file-from-google-drive",[112,53268],{},[26,53270,53271],{},"The \"Read file from Google Drive\" step can be used to read files from your local computer.",[26,53273,53274],{},"This step allows for reading in of text files, such as:",[186,53276,53277,53280,53283],{},[189,53278,53279],{},".txt, .html, .json, .csv",[189,53281,53282],{},"PDF",[189,53284,53285],{},"Microsoft Word (.docx)",[26,53287,53288],{},"This step will output the content of your file as a single piece of unformatted data.",[107,53290,314],{"id":49137},[112,53292],{},[26,53294,53295],{},"Learn how to configure the \"Read file from Google Drive\" step.",[21,53297,35948],{"id":53298},"google-drive-file-url",[26,53300,53301],{},"The URL for the file from your Google Drive. This URL should include the ID of your file and often ends with \"\u002Fview\" followed by some parameters.",[21,53303,34337],{"id":53304},"local-folder",[26,53306,53307],{},"If you are using axiom.ai locally using the desktop application, this option should be enabled to use a local folder as an intermediary step for the file download.",[1906,53309],{"src":53310},"\u002Fdocs\u002Freference\u002Fsteps\u002Fstep-read-file-from-google-drive.png",{"title":67,"searchDepth":68,"depth":68,"links":53312},[53313,53314],{"id":53266,"depth":670,"text":44112},{"id":49137,"depth":670,"text":314,"children":53315},[53316,53317],{"id":53298,"depth":68,"text":35948},{"id":53304,"depth":68,"text":34337},{"category":223,"videoguide":71,"imagestep":53319,"summary":53320,"icon":53321},"\u002Fstep-images\u002Fread-file-from-google-drive.png","Learn how to use the Read file from Google Drive step","WidgetDriverUploadFromGoogleDrive.svg",{"title":53261,"description":67},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-file-from-google-drive","ypdVKOaoPl-mnnRn_fSfLLvbsC6B8mNJbXvoqzXf-Dw",{"id":53326,"title":53327,"body":53328,"date":71,"description":67,"extension":73,"meta":53370,"navigation":75,"order":71,"path":44103,"seo":53373,"stem":53374,"__hash__":53375},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-local-file.md","Read local file step",{"type":8,"value":53329,"toc":53364},[53330,53333,53335,53338,53340,53348,53350,53352,53355,53358,53361],[107,53331,44106],{"id":53332},"read-local-file",[112,53334],{},[26,53336,53337],{},"The \"Read local file\" step can be used to read files from your local computer.",[26,53339,53274],{},[186,53341,53342,53344,53346],{},[189,53343,53279],{},[189,53345,53282],{},[189,53347,53285],{},[107,53349,314],{"id":49137},[112,53351],{},[26,53353,53354],{},"Learn how to configure the \"Read local file\" step.",[21,53356,36112],{"id":53357},"file-path",[26,53359,53360],{},"The path to the local file on your computer, this should be the full file path to the file.",[1906,53362],{"src":53363},"\u002Fdocs\u002Freference\u002Fsteps\u002Fstep-read-local-file.png",{"title":67,"searchDepth":68,"depth":68,"links":53365},[53366,53367],{"id":53332,"depth":670,"text":44106},{"id":49137,"depth":670,"text":314,"children":53368},[53369],{"id":53357,"depth":68,"text":36112},{"category":223,"videoguide":71,"imagestep":53371,"summary":53372,"icon":49389},"\u002Fstep-images\u002Fread-local-file.png","Learn how to use the Read local file step",{"title":53327,"description":67},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-local-file","MAeU9tBA-dM6sgMXVn9KUGLtuFFf3M8iJPUpom1Dtzo",{"id":53377,"title":15414,"body":53378,"date":71,"description":53529,"extension":73,"meta":53530,"navigation":75,"order":71,"path":25942,"seo":53533,"stem":53534,"__hash__":53535},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Freceive-data-from-another-app.md",{"type":8,"value":53379,"toc":53520},[53380,53383,53388,53390,53392,53415,53417,53428,53434,53436,53438,53441,53445,53447,53450,53454,53456,53462,53468,53471,53473,53480,53486,53491,53495,53497],[32947,53381],{"video":53382},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FQ7O7QzaDS3I?rel=0&start=340&end=1050?rel=0",[26,53384,53385],{},[26030,53386,53387],{},"Please note: there may be design changes between the video and current design.",[107,53389,24999],{"id":24998},[112,53391],{},[26,53393,2273,53394,53397,53398,53400,53401,53404,53405,4468,53407,4468,53411,53414],{},[192,53395,53396],{},"receive data from another app"," step allows you to receive data sent through our ",[659,53399,5345],{"href":5562},", an ",[659,53402,53403],{"href":425},"integration",", or a third-party service such as ",[659,53406,30755],{"href":5562},[659,53408,53410],{"href":53409},"\u002Fguides\u002Fpower-automate","Power Automate",[659,53412,53413],{"href":31528},"Google Apps Script"," and much more. This can trigger automations and allows data from your request to be used within your automation.",[26,53416,48689],{},[186,53418,53419,53425],{},[189,53420,53421,53424],{},[659,53422,53423],{"href":30555},"Trigger"," an automation via an API.",[189,53426,53427],{},"Pass data to automations via a POST request.",[26,53429,53430,53431,53433],{},"This feature is limited to certain subscription levels, see ",[659,53432,465],{"href":7414}," for more details.",[107,53435,314],{"id":49137},[112,53437],{},[26,53439,53440],{},"The options below allow you to configure this step to your workflows specific needs.",[21,53442,53444],{"id":53443},"api-credentials","API credentials",[112,53446],{},[26,53448,53449],{},"Click on an item to copy it to your clipboard. This provides essential information for your API requests.",[21,53451,53453],{"id":53452},"json-payload-example","JSON payload example",[112,53455],{},[26,53457,53458,53459,2264],{},"An example payload that the automation is expecting when triggered from an external service. To perform a POST request, you'll need information from the ",[659,53460,53444],{"href":53461},"#api-credentials",[26,53463,53464,53465,53467],{},"See our ",[659,53466,5345],{"href":5562}," documentation for more details on triggering your automation via webhook\u002FAPI.",[21,53469,42293],{"id":53470},"test-data",[112,53472],{},[26,53474,53475,53476,53479],{},"To test your automation manually, or before your external trigger has been set up, use the ",[192,53477,53478],{},"test data"," option. Once enabled, this can be used to add mock data to your automation.",[2446,53481,53484],{"className":53482,"code":53483,"language":5402},[5400],"[[\"A1\", \"B1\", \"C1\"], [\"A2\", \"B2\", \"C2\"]]\n",[145,53485,53483],{"__ignoreMap":67},[26,53487,46078,53488,53490],{},[192,53489,41006],{}," on your automation, this data will be used in place of data received via the API.",[21,53492,53494],{"id":53493},"further-reading","Further reading",[112,53496],{},[186,53498,53499,53504],{},[189,53500,53501,53502,148],{},"Documentation: ",[659,53503,5345],{"href":5562},[189,53505,53506,53507,4468,53509,4468,53511,4468,53513,53515,53516],{},"Guides: ",[659,53508,30755],{"href":5562},[659,53510,53413],{"href":31528},[659,53512,1134],{"href":1191},[659,53514,53410],{"href":53409}," - ",[659,53517,53519],{"href":53518},"\u002Fguides?category=APIs+%26+Webhooks","all guides",{"title":67,"searchDepth":68,"depth":68,"links":53521},[53522,53523],{"id":24998,"depth":670,"text":24999},{"id":49137,"depth":670,"text":314,"children":53524},[53525,53526,53527,53528],{"id":53443,"depth":68,"text":53444},{"id":53452,"depth":68,"text":53453},{"id":53470,"depth":68,"text":42293},{"id":53493,"depth":68,"text":53494},"Use the 'receive data from another app' step to trigger your automation via our API and webhooks, an integration or a third-party service such as Postman, Power Automate, Google Apps Scripts and much more.",{"category":53531,"icon":53532},"Webhook & API","WidgetWebhookReceive.svg",{"title":15414,"description":53529},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Freceive-data-from-another-app","ZIUvfAHN-sXtmp9mUMPZSvgT-TPGr-giqfXxtNgH8FU",{"id":53537,"title":53538,"body":53539,"date":71,"description":53609,"extension":73,"meta":53610,"navigation":75,"order":71,"path":36921,"seo":53612,"stem":53613,"__hash__":53614},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fremove-duplicates.md","Remove duplicates step",{"type":8,"value":53540,"toc":53601},[53541,53543,53547,53549,53552,53554,53575,53579,53581,53583,53586,53590,53593,53596,53598],[32947,53542],{"video":36944},[107,53544,53546],{"id":53545},"what-to-use-the-remove-duplicates-step-for","What to use the Remove duplicates step for",[112,53548],{},[26,53550,53551],{},"Use this step to remove duplicates from the specified data. This can be limited to particular columns. This step can be used when importing data from Google Sheets or CSV files as well as scraping data.",[26,53553,48689],{},[186,53555,53556,53563,53570],{},[189,53557,53558,53559,53562],{},"Filter ",[659,53560,53561],{"href":1024},"scraped data"," for duplicates",[189,53564,53565,53566,53569],{},"Clean up data stored in ",[659,53567,32682],{"href":53568},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fimport-csv-file.html"," files",[189,53571,53572,53573],{},"Remove duplicates from ",[659,53574,26048],{"href":24142},[107,53576,53578],{"id":53577},"how-to-configure-the-remove-duplicates-step","How to configure the Remove Duplicates step",[112,53580],{},[21,53582,581],{"id":580},[26,53584,53585],{},"Select the data to deduplicate.",[21,53587,53589],{"id":53588},"columns-to-check","Columns to check",[26,53591,53592],{},"Specify a list of column numbers, each separated with a comma. Only these columns will be checked for duplicates.",[26,53594,53595],{},"For example, entering 'A,B' here will check for duplicates in columns A and B only.",[21,53597,48894],{"id":48893},[26,53599,53600],{},"The step outputs a preview of the deduplicated data.",{"title":67,"searchDepth":68,"depth":68,"links":53602},[53603,53604],{"id":53545,"depth":670,"text":53546},{"id":53577,"depth":670,"text":53578,"children":53605},[53606,53607,53608],{"id":580,"depth":68,"text":581},{"id":53588,"depth":68,"text":53589},{"id":48893,"depth":68,"text":48894},"Check and remove duplicate data from sources such as Google Sheets or CSV files. Use to clean and prepare data before use.",{"category":38518,"icon":53611},"WidgetFilterRemoveDuplicates.svg",{"title":53538,"description":53609},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fremove-duplicates","Qmkmw5J1rhB6DQYkfMtVlsWZkMfNls0mrwamOv-pbuU",{"id":53616,"title":53617,"body":53618,"date":71,"description":53662,"extension":73,"meta":53663,"navigation":75,"order":71,"path":37305,"seo":53665,"stem":53666,"__hash__":53667},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fremove-html-code.md","Remove HTML code step",{"type":8,"value":53619,"toc":53656},[53620,53622,53626,53628,53635,53637,53645,53649,53651,53653],[32947,53621],{"video":37328},[107,53623,53625],{"id":53624},"what-to-use-the-remove-html-code-step-for","What to use the Remove HTML code step for",[112,53627],{},[26,53629,53630,53631,53634],{},"Use this step to strip all the HTML from a set of data. Useful when ",[659,53632,53633],{"href":48831},"'Scraping HTML'"," and wish to extract data from the HTML.",[26,53636,48689],{},[186,53638,53639,53642],{},[189,53640,53641],{},"Remove HTML from scraped content",[189,53643,53644],{},"Strip HTML from Google Sheet data",[107,53646,53648],{"id":53647},"how-to-configure-the-sremove-html-code-step","How to configure the SRemove HTML code step",[112,53650],{},[21,53652,581],{"id":580},[26,53654,53655],{},"Click 'Insert Data' to select the data you wish to remove HTML from.",{"title":67,"searchDepth":68,"depth":68,"links":53657},[53658,53659],{"id":53624,"depth":670,"text":53625},{"id":53647,"depth":670,"text":53648,"children":53660},[53661],{"id":580,"depth":68,"text":581},"Strip HTML from a data source, including data returned by Get data steps. Use to clean text before using it in your automation.",{"category":38518,"icon":53664},"WidgetFilterStripHtml.svg",{"title":53617,"description":53662},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fremove-html-code","DtthjrUECeEjUs1ayTJqiAB0Sb9VF0i-9ejhEdlMCDw",{"id":53669,"title":53670,"body":53671,"date":71,"description":53756,"extension":73,"meta":53757,"navigation":75,"order":71,"path":36965,"seo":53759,"stem":53760,"__hash__":53761},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fremove-results-that-contain-certain-words.md","Remove results that contain certain words step",{"type":8,"value":53672,"toc":53745},[53673,53675,53679,53681,53687,53689,53700,53704,53706,53708,53711,53714,53717,53720,53723,53726,53729,53731,53735,53738,53741,53743],[32947,53674],{"video":37012},[107,53676,53678],{"id":53677},"what-to-use-the-remove-results-that-contain-certain-words-step-for","What to use the Remove results that contain certain words step for",[112,53680],{},[26,53682,53683,53684],{},"Use this step to filter out rows from your data that contain particular words. Helpful if you wish to filter scraped data or import data from a ",[659,53685,53686],{"href":24142},"Google sheet.",[26,53688,48689],{},[186,53690,53691,53694],{},[189,53692,53693],{},"Remove rows from a Google Sheet",[189,53695,53696,53697,53699],{},"Clean data from a ",[659,53698,32682],{"href":51077},"- Filter scraped data",[107,53701,53703],{"id":53702},"how-to-configure-the-remove-results-that-contain-certain-words-step","How to configure the Remove results that contain certain words step",[112,53705],{},[21,53707,581],{"id":580},[26,53709,53710],{},"Select the data you wish to remove rows from.",[21,53712,36990],{"id":53713},"words-comma-separated",[26,53715,53716],{},"Enter either a list of any number of words to check for, separated by commas, or data containing a list of words, one in each row.",[26,53718,53719],{},"Any row that does not contain the given word will be removed.",[21,53721,36996],{"id":53722},"word-matching-mode",[26,53724,53725],{},"Select Any or All words.",[21,53727,37008],{"id":53728},"match-on-word-boundary",[26,53730,49523],{},[21,53732,53734],{"id":53733},"columns-optional","Columns (optional)",[26,53736,53737],{},"Specify a list of column numbers, each separated with a comma. Only rows that have matches within these columns will be removed.",[26,53739,53740],{},"For example, entering '1,2' here will check in columns 1 and 2 only.",[21,53742,48894],{"id":48893},[26,53744,52583],{},{"title":67,"searchDepth":68,"depth":68,"links":53746},[53747,53748],{"id":53677,"depth":670,"text":53678},{"id":53702,"depth":670,"text":53703,"children":53749},[53750,53751,53752,53753,53754,53755],{"id":580,"depth":68,"text":581},{"id":53713,"depth":68,"text":36990},{"id":53722,"depth":68,"text":36996},{"id":53728,"depth":68,"text":37008},{"id":53733,"depth":68,"text":53734},{"id":48893,"depth":68,"text":48894},"Filter data by words they contain. Works with multiple sources including Google Sheets and Get data steps.",{"category":38518,"icon":53758},"WidgetFilterRemoveWord.svg",{"title":53670,"description":53756},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fremove-results-that-contain-certain-words","rp6-adS_ca1ORlDe1VThQ50LE_5qSFtbnsn2pu-Qrxo",{"id":53763,"title":53764,"body":53765,"date":71,"description":53837,"extension":73,"meta":53838,"navigation":75,"order":71,"path":37033,"seo":53840,"stem":53841,"__hash__":53842},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fremove-results-which-do-not-contain-certain-words.md","Remove results which do not contain certain words step",{"type":8,"value":53766,"toc":53826},[53767,53769,53773,53775,53780,53782,53792,53796,53798,53800,53802,53804,53806,53808,53810,53812,53814,53816,53818,53820,53822,53824],[32947,53768],{"video":37071},[107,53770,53772],{"id":53771},"what-to-use-the-remove-results-which-do-not-contain-certain-words-step-for","What to use the Remove results which do not contain certain words step for",[112,53774],{},[26,53776,53777,53778],{},"Use this step to filter out rows from your data that do not contain particular words. Helpful if you wish to filter scraped data or import data from a ",[659,53779,53686],{"href":24142},[26,53781,48689],{},[186,53783,53784,53786,53789],{},[189,53785,53693],{},[189,53787,53788],{},"Clean data from a CSV",[189,53790,53791],{},"Filter scraped data",[107,53793,53795],{"id":53794},"how-to-configure-the-remove-results-which-do-not-contain-certain-words-step","How to configure the Remove results which do not contain certain words step",[112,53797],{},[21,53799,581],{"id":580},[26,53801,53710],{},[21,53803,36990],{"id":53713},[26,53805,53716],{},[26,53807,53719],{},[21,53809,36996],{"id":53722},[26,53811,53725],{},[21,53813,37008],{"id":53728},[26,53815,49523],{},[21,53817,53734],{"id":53733},[26,53819,53737],{},[26,53821,53740],{},[21,53823,48894],{"id":48893},[26,53825,52583],{},{"title":67,"searchDepth":68,"depth":68,"links":53827},[53828,53829],{"id":53771,"depth":670,"text":53772},{"id":53794,"depth":670,"text":53795,"children":53830},[53831,53832,53833,53834,53835,53836],{"id":580,"depth":68,"text":581},{"id":53713,"depth":68,"text":36990},{"id":53722,"depth":68,"text":36996},{"id":53728,"depth":68,"text":37008},{"id":53733,"depth":68,"text":53734},{"id":48893,"depth":68,"text":48894},"Filter data by words they do not contain. Works with multiple sources including Google Sheets and Get data steps.",{"category":38518,"icon":53839},"WidgetFilterWord.svg",{"title":53764,"description":53837},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fremove-results-which-do-not-contain-certain-words","RLCs_KTRIQ6C3rv29rJ69OYh71F4iO6bXjCmfabv4rs",{"id":53844,"title":53845,"body":53846,"date":71,"description":53915,"extension":73,"meta":53916,"navigation":75,"order":71,"path":37193,"seo":53918,"stem":53919,"__hash__":53920},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Freplace-text-step.md","Replace text step",{"type":8,"value":53847,"toc":53906},[53848,53850,53854,53856,53859,53862,53864,53877,53881,53883,53886,53889,53892,53895,53898,53901,53903],[32947,53849],{"video":37229},[107,53851,53853],{"id":53852},"what-to-use-the-replace-text-step-for","What to use the Replace text step for",[112,53855],{},[26,53857,53858],{},"Use this step to replace a text in your data. For example, when generating reports, let's say you have scraped data that reads 'Red Shoes' and the value 40. You could change the text to 'Stock level of Red Shoes is.'",[26,53860,53861],{},"Here's a helpful tip, if you just want to remove text, simply leave the 'Replace field' blank.",[26,53863,48689],{},[186,53865,53866,53872],{},[189,53867,53868,53869,53871],{},"Overwrite ",[659,53870,53561],{"href":48831},"- Manipulate data from a Google Sheet",[189,53873,53874,53875],{},"Change data in a ",[659,53876,32682],{"href":51077},[107,53878,53880],{"id":53879},"how-to-configure-the-replace-text-step","How to configure the Replace text step",[112,53882],{},[21,53884,37213],{"id":53885},"data-to-replace-words",[26,53887,53888],{},"Select the data you want to replace the text. It can be from any step in Axiom. For example, you can pass the output from 'Read from a Google Sheet' or 'Webhook' as a variable into this step.",[21,53890,37219],{"id":53891},"text-to-replace",[26,53893,53894],{},"Enter the text you wish to change. It has to be found in the variable passed via 'Data to replace words'.",[21,53896,37225],{"id":53897},"replace-with",[26,53899,53900],{},"Enter what you want to replace the text with",[21,53902,48894],{"id":48893},[26,53904,53905],{},"No action required it is a preivew of the data output by this step. So you will see your change here.",{"title":67,"searchDepth":68,"depth":68,"links":53907},[53908,53909],{"id":53852,"depth":670,"text":53853},{"id":53879,"depth":670,"text":53880,"children":53910},[53911,53912,53913,53914],{"id":53885,"depth":68,"text":37213},{"id":53891,"depth":68,"text":37219},{"id":53897,"depth":68,"text":37225},{"id":48893,"depth":68,"text":48894},"Replace text from any of your data sources by inserting their token in this step. Leave blank to delete, or add text to replace with.",{"category":38518,"icon":53917},"WidgetFilterReplace.svg",{"title":53845,"description":53915},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Freplace-text-step","zU9i5WhSk8ibcs7hSN9wqW0DxA5N8NlMbqub6HyxLXE",{"id":53922,"title":19887,"body":53923,"date":71,"description":53953,"extension":73,"meta":53954,"navigation":75,"order":71,"path":53956,"seo":53957,"stem":53958,"__hash__":53959},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Frestart-browser.md",{"type":8,"value":53924,"toc":53949},[53925,53929,53931,53934,53937,53940,53944,53946],[107,53926,53928],{"id":53927},"what-to-use-the-restart-browser-step-for","What to use the Restart browser step for",[112,53930],{},[26,53932,53933],{},"Use this step to restart your browser on long or resource heavy automations to prevent the browser from running into memory issues. This behaves similar to pressing F5 to refresh the page during your run.",[26,53935,53936],{},"We recommend only using this if you are encountering memory issues within the browser as improper use can lead to your automation taking longer, or causing additional errors in your run.",[26,53938,53939],{},"There may be instances where page state, such as the page you are currently viewing in a list, may be stored in JavaScript - in these instances, this state will not be maintained. Page start stored as a URL component will be maintained, for example: \"example.com\u002Flist?page=2\".",[107,53941,53943],{"id":53942},"how-to-configure-this-step","How to configure this step",[112,53945],{},[26,53947,53948],{},"This step does not have any configuration options.",{"title":67,"searchDepth":68,"depth":68,"links":53950},[53951,53952],{"id":53927,"depth":670,"text":53928},{"id":53942,"depth":670,"text":53943},"Learn how to use the Restart browser step in your Axiom",{"category":49189,"icon":53955},"WidgetRestartBrowser.svg","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Frestart-browser",{"title":19887,"description":53953},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Frestart-browser","GX83mlnB5FFXbNVSl8WEJa1GIZA0pz1ZqH2UuShrTgY",{"id":53961,"title":53962,"body":53963,"date":71,"description":54011,"extension":73,"meta":54012,"navigation":75,"order":71,"path":34989,"seo":54014,"stem":54015,"__hash__":54016},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Frollover-element.md","Rollover element step",{"type":8,"value":53964,"toc":54005},[53965,53968,53972,53974,53981,53983,53994,53998,54000,54002],[32947,53966],{"video":53967},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FQ7O7QzaDS3I?start=1011&rel=0",[107,53969,53971],{"id":53970},"what-to-use-the-rollover-element-step-for","What to use the Rollover element step for",[112,53973],{},[26,53975,53976,53977,53980],{},"Use this step to instruct your bot to hover or rollover an HTML element, for example, on a drop-down menu. This step is helpful for web automation when trying to automate data entry or reveal hidden content to scrape into a Google Sheet. The ",[659,53978,53979],{"href":20850},"'Select list'"," step can also be useful for automating drop-downs.",[26,53982,48689],{},[186,53984,53985,53988,53991],{},[189,53986,53987],{},"To reveal hidden content when scraping data",[189,53989,53990],{},"When you need to automate a dropdown menu",[189,53992,53993],{},"Trigger a hover event",[107,53995,53997],{"id":53996},"how-to-configure-the-rollover-element-step","How to configure the Rollover Element step",[112,53999],{},[21,54001,33198],{"id":15831},[26,54003,54004],{},"Click 'Select' to choose the item you want to hover over.",{"title":67,"searchDepth":68,"depth":68,"links":54006},[54007,54008],{"id":53970,"depth":670,"text":53971},{"id":53996,"depth":670,"text":53997,"children":54009},[54010],{"id":15831,"depth":68,"text":33198},"Replicate hovering over HTML elements. Use when you need to reveal hidden data before scraping.",{"category":49189,"icon":54013},"WidgetHoverEvent.svg",{"title":53962,"description":54011},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Frollover-element","Hgva7w2upOtZiRcLqLY3oUNzhL1XU9zdw7cQFZtCZV0",{"id":54018,"title":54019,"body":54020,"date":71,"description":54062,"extension":73,"meta":54063,"navigation":75,"order":71,"path":54065,"seo":54066,"stem":54067,"__hash__":54068},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Frun-another-axiom.md","Run another Axiom step",{"type":8,"value":54021,"toc":54056},[54022,54025,54029,54031,54037,54045,54047,54049,54053],[32947,54023],{"video":54024},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=504&end=524?rel=0",[107,54026,54028],{"id":54027},"what-to-use-the-run-another-axiom-step-for","What to use the Run another Axiom step for",[112,54030],{},[26,54032,54033,54034,48833],{},"This step loads one Axiom into another. You can use this step to create a 'Controller' Axiom that can run multiple sub Axioms. This is a great design pattern if you find yourself creating Axioms with more than 20 steps. However, it's important to note that embedded Axioms cannot share data directly only indirectly through a step like a ",[659,54035,54036],{"href":24142},"Read data from a Google Sheet.",[186,54038,54039,54042],{},[189,54040,54041],{},"Combine Axioms inside a 'Controller' Axiom",[189,54043,54044],{},"Breakdown long Axioms into smaller Axioms",[107,54046,314],{"id":49137},[112,54048],{},[21,54050,54052],{"id":54051},"selected-axiom","Selected Axiom",[26,54054,54055],{},"Select the Axiom to run from the drop-down list.",{"title":67,"searchDepth":68,"depth":68,"links":54057},[54058,54059],{"id":54027,"depth":670,"text":54028},{"id":49137,"depth":670,"text":314,"children":54060},[54061],{"id":54051,"depth":68,"text":54052},"Run other Axioms from inside a single Axiom with this step. Use to chain automations or reuse existing bots.",{"category":49565,"icon":54064},"WidgetRunAxiom.svg","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Frun-another-axiom",{"title":54019,"description":54062},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Frun-another-axiom","AEYqgCP_1XTTpLkgkd8j336mdrgYKOi-DPYeZG6Pg1o",{"id":54070,"title":54071,"body":54072,"date":71,"description":54127,"extension":73,"meta":54128,"navigation":75,"order":71,"path":54130,"seo":54131,"stem":54132,"__hash__":54133},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsave-page-as-html.md","Save page HTML step",{"type":8,"value":54073,"toc":54119},[54074,54077,54081,54083,54086,54088,54096,54100,54102,54104,54107,54109,54114,54116],[32947,54075],{"video":54076},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=524&end=524?rel=0",[107,54078,54080],{"id":54079},"what-to-use-the-save-page-html-step-for","What to use the Save page HTML step for",[112,54082],{},[26,54084,54085],{},"Use this step to Download the HTML of the current page the bot has open. This can be useful for automated testing of user interfaces.",[26,54087,48689],{},[186,54089,54090,54093],{},[189,54091,54092],{},"Testing web pages",[189,54094,54095],{},"Save HTML of web page to desktop",[107,54097,54099],{"id":54098},"how-to-configure-the-save-page-html-step","How to configure the Save page HTML step",[112,54101],{},[21,54103,50349],{"id":50348},[26,54105,54106],{},"Set a folder to save to (please note currently only one new folder can be created at a time)",[21,54108,33918],{"id":50657},[26,54110,54111,54112,148],{},"Enter a name to save the HTML page as. If a file with this name already exists it will be appended with a number e.g. 'page' would become 'page1.html', 'page2.html' and so on unless the overwrite existing file option is used. Only use 'Insert data' if you wish to pass a file name from another step like ",[659,54113,49675],{"href":24142},[21,54115,34360],{"id":34359},[26,54117,54118],{},"Toggle to overwrite existing file.",{"title":67,"searchDepth":68,"depth":68,"links":54120},[54121,54122],{"id":54079,"depth":670,"text":54080},{"id":54098,"depth":670,"text":54099,"children":54123},[54124,54125,54126],{"id":50348,"depth":68,"text":50349},{"id":50657,"depth":68,"text":33918},{"id":34359,"depth":68,"text":34360},"Save snapshots of a page’s HTML to your Google Drive. Use to archive content or review page structure later.",{"category":223,"icon":54129},"WidgetDriverSaveHTML.svg","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsave-page-as-html",{"title":54071,"description":54127},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsave-page-as-html","PvTFxBiK0-OPoj_tsfR7kLhSJHQn8b59-sLMBxkxPos",{"id":54135,"title":54136,"body":54137,"date":71,"description":54199,"extension":73,"meta":54200,"navigation":75,"order":71,"path":25125,"seo":54202,"stem":54203,"__hash__":54204},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsave-screenshot-locally.md","Save screenshot locally step",{"type":8,"value":54138,"toc":54191},[54139,54142,54146,54148,54155,54169,54173,54175,54177,54179,54181,54184,54188],[32947,54140],{"video":54141},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=978&end=1042?rel=0",[107,54143,54145],{"id":54144},"what-to-use-the-save-screenshot-locally-step-for","What to use the Save screenshot locally step for",[112,54147],{},[26,54149,54150,54151,48833],{},"Use this step to save a webpage screenshot to your local machine. This is a handy step when making Axiom bots to test websites or do data entry, and you want visual confirmation of the result. If you're going to run your bot in the cloud, taking screenshots try this ",[659,54152,54154],{"href":54153},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsave-screenshot-to-google-drive","'step.'",[186,54156,54157,54160,54163,54166],{},[189,54158,54159],{},"Capture the results of UI tests",[189,54161,54162],{},"Confirm a web form has been submitted",[189,54164,54165],{},"Grab a screenshot of data",[189,54167,54168],{},"Help monitor status of a web page",[107,54170,54172],{"id":54171},"how-to-configure-the-save-screenshot-locally-step","How to configure the Save screenshot locally step",[112,54174],{},[21,54176,50349],{"id":50348},[26,54178,54106],{},[21,54180,33918],{"id":50657},[26,54182,54183],{},"Enter a name to save the screenshot as. If a file with this name already exists it will be appended with a number e.g. 'screenshot' would become 'screenshot1.jpeg', 'screenshot2.jpeg' and so on unless the overwrite existing file option is used.",[21,54185,54187],{"id":54186},"file-type","File type",[26,54189,54190],{},"File type to save the screenshot as a JPEG or PNG.",{"title":67,"searchDepth":68,"depth":68,"links":54192},[54193,54194],{"id":54144,"depth":670,"text":54145},{"id":54171,"depth":670,"text":54172,"children":54195},[54196,54197,54198],{"id":50348,"depth":68,"text":50349},{"id":50657,"depth":68,"text":33918},{"id":54186,"depth":68,"text":54187},"Save screenshots to your local Drive. Use to archive content or review page structure later.",{"category":223,"icon":54201},"WidgetDriverSaveScreenshot.svg",{"title":54136,"description":54199},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsave-screenshot-locally","WE5OAXF69aNG4nAtHAjvys_d26Nv_fGtpKgEZ4cjjto",{"id":54206,"title":54207,"body":54208,"date":71,"description":54267,"extension":73,"meta":54268,"navigation":75,"order":71,"path":54153,"seo":54270,"stem":54271,"__hash__":54272},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsave-screenshot-to-google-drive.md","Save screenshot to Google Drive step",{"type":8,"value":54209,"toc":54259},[54210,54213,54217,54219,54224,54237,54241,54243,54245,54248,54250,54255,54257],[32947,54211],{"video":54212},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1042&end=1096?rel=0",[107,54214,54216],{"id":54215},"what-to-use-the-save-screenshot-to-google-drive-step-for","What to use the Save screenshot to Google Drive step for",[112,54218],{},[26,54220,54221,54222,48833],{},"Use this step to save a screenshot of a webpage to a Google Drive folder. This is a handy step when making Axiom bots to test websites or for data entry, and you want visual confirmation of the result. If you're going to run your bot on the desktop, try this ",[659,54223,48850],{"href":25125},[186,54225,54226,54228,54230,54232,54234],{},[189,54227,54159],{},[189,54229,54162],{},[189,54231,54165],{},[189,54233,54168],{},[189,54235,54236],{},"Test checkout pages",[107,54238,54240],{"id":54239},"how-to-configure-the-save-screenshot-to-google-drive-step","How to configure the Save screenshot to Google Drive step",[112,54242],{},[21,54244,50651],{"id":50650},[26,54246,54247],{},"Enter the URL of the folder in Google Drive to save the screenshot to.",[21,54249,33918],{"id":50657},[26,54251,54252,54253,148],{},"Enter a name to save the screenshot as. Leave blank to use the default Google Drive filename. Only use 'Insert data' if you wish to pass a file name from another step like ",[659,54254,49675],{"href":24142},[21,54256,54187],{"id":54186},[26,54258,54190],{},{"title":67,"searchDepth":68,"depth":68,"links":54260},[54261,54262],{"id":54215,"depth":670,"text":54216},{"id":54239,"depth":670,"text":54240,"children":54263},[54264,54265,54266],{"id":50650,"depth":68,"text":50651},{"id":50657,"depth":68,"text":33918},{"id":54186,"depth":68,"text":54187},"Save screenshots to your gogole Drive. Use to archive content or review page structure later.",{"category":223,"icon":54269},"WidgetDriverSaveScreenshotToGoogleDrive.svg",{"title":54207,"description":54267},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsave-screenshot-to-google-drive","lCm2dvSrpxdT1DglUwfPolose5GxsLDc-ekaWdHHY1g",{"id":54274,"title":54275,"body":54276,"date":71,"description":67,"extension":73,"meta":54313,"navigation":75,"order":71,"path":21826,"seo":54317,"stem":54318,"__hash__":54319},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fscrape-metadata.md","Scrape metadata step",{"type":8,"value":54277,"toc":54307},[54278,54281,54283,54286,54289,54293,54295,54298,54301,54304],[107,54279,19529],{"id":54280},"scrape-metadata",[112,54282],{},[26,54284,54285],{},"The \"Scrape metadata\" step can be used to extract metadata from a website. This metadata contains information about the page and is set by the author of the page. This includes social media tags, and general tags such as the page title, description or keywords. You can then use the data, or export this to an external service such as Google Sheets or Microsoft Excel.",[1906,54287],{"src":54288},"\u002Fdocs\u002Freference\u002Fsteps\u002Fstep-scrape-metadata.png",[107,54290,54292],{"id":54291},"step-configuration","Step configuration",[112,54294],{},[26,54296,54297],{},"Learn how to configure the step.",[21,54299,54300],{"id":20487},"Metadata",[26,54302,54303],{},"Select the options that you want to extract from the dropdown. Selected options will be highlighted. Use the \"Select all\" or \"Deselect all\" to select or deselect whole categories.",[1906,54305],{"src":54306},"\u002Fdocs\u002Freference\u002Fsteps\u002Fstep-scrape-metadata-open.png",{"title":67,"searchDepth":68,"depth":68,"links":54308},[54309,54310],{"id":54280,"depth":670,"text":19529},{"id":54291,"depth":670,"text":54292,"children":54311},[54312],{"id":20487,"depth":68,"text":54300},{"category":17816,"videoguide":71,"imagestep":54314,"summary":54315,"icon":54316},"\u002Fstep-images\u002Fscrape-metadata.png","Learn how to use the Scrape metadata step","WidgetSmartScraper.svg",{"title":54275,"description":67},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fscrape-metadata","cf26wP43YR0a7CUmu_yOkJTt9skTEhtq0UMkHNc0HQM",{"id":54321,"title":54322,"body":54323,"date":71,"description":54384,"extension":73,"meta":54385,"navigation":75,"order":71,"path":20850,"seo":54387,"stem":54388,"__hash__":54389},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fselect-list.md","Select list step",{"type":8,"value":54324,"toc":54377},[54325,54328,54332,54334,54342,54344,54361,54365,54367,54369,54372,54374],[32947,54326],{"video":54327},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=922&end=1096?rel=0",[107,54329,54331],{"id":54330},"what-to-use-the-select-list-step-for","What to use the Select list step for",[112,54333],{},[26,54335,54336,54337,6205,54339,54341],{},"This step automates the select list (or dropdown) web action. Select the dropdown you wish to automate and the value you wish to select. Use this step with other web action steps like ",[659,54338,50014],{"href":17231},[659,54340,49782],{"href":15778}," to automate tasks like data entry.",[26,54343,48689],{},[186,54345,54346,54349,54352,54355,54358],{},[189,54347,54348],{},"Automate Select lists when entering data into webforms",[189,54350,54351],{},"Interacting with web page to change search filters",[189,54353,54354],{},"Configuring web based software",[189,54356,54357],{},"Data entry into a CRM",[189,54359,54360],{},"When uploading files",[107,54362,54364],{"id":54363},"how-to-configure-the-select-list-step","How to configure the Select list Step",[112,54366],{},[21,54368,33198],{"id":15831},[26,54370,54371],{},"Click 'Select' to choose the select list, then use our 'Selector tool' to highlight the select list you wish to automate.",[21,54373,33781],{"id":5402},[26,54375,54376],{},"Input the option the bot should select or click 'Insert data' to pass a value from another step, such as 'Read data from a Google Sheet.'",{"title":67,"searchDepth":68,"depth":68,"links":54378},[54379,54380],{"id":54330,"depth":670,"text":54331},{"id":54363,"depth":670,"text":54364,"children":54381},[54382,54383],{"id":15831,"depth":68,"text":33198},{"id":5402,"depth":68,"text":33781},"Automate interactions with select lists and dropdowns. Pass data into the step to dynamically select options.",{"category":49189,"icon":54386},"WidgetDriverSelectList.svg",{"title":54322,"description":54384},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fselect-list","eICiHyxLAw956s1xj-ZVXcGiL8Xet-iw0_D7TrQVF_0",{"id":54391,"title":54392,"body":54393,"date":71,"description":54448,"extension":73,"meta":54449,"navigation":75,"order":71,"path":37092,"seo":54451,"stem":54452,"__hash__":54453},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fselect-random-rows.md","Select random rows step",{"type":8,"value":54394,"toc":54440},[54395,54397,54401,54403,54406,54408,54419,54423,54425,54427,54430,54432,54435,54437],[32947,54396],{"video":37121},[107,54398,54400],{"id":54399},"what-to-use-the-select-random-rows-step-for","What to use the Select random rows step for",[112,54402],{},[26,54404,54405],{},"Select random rows from a given data set, and create a new data set containing them. This could be used to vary content used in a direct message or to enter a random number.",[26,54407,48689],{},[186,54409,54410,54413],{},[189,54411,54412],{},"Enter random numbers stored in a Google Sheet randomly",[189,54414,54415,54416,54418],{},"Enter text stored in a ",[659,54417,51285],{"href":24142}," randomly",[107,54420,54422],{"id":54421},"how-to-configure-the-select-random-rows-step","How to configure the Select random rows step",[112,54424],{},[21,54426,37112],{"id":19383},[26,54428,54429],{},"Enter the number of rows to select from.",[21,54431,581],{"id":580},[26,54433,54434],{},"Click 'Insert Data' to select the data to get rows from.",[21,54436,48894],{"id":48893},[26,54438,54439],{},"A preview of random results returned by this step.",{"title":67,"searchDepth":68,"depth":68,"links":54441},[54442,54443],{"id":54399,"depth":670,"text":54400},{"id":54421,"depth":670,"text":54422,"children":54444},[54445,54446,54447],{"id":19383,"depth":68,"text":37112},{"id":580,"depth":68,"text":581},{"id":48893,"depth":68,"text":48894},"Randomly select a row from a Google Sheet. Use this step to pick a single entry for actions like testing, sampling, or random output.",{"category":38518,"icon":54450},"WidgetSelectRandomRows.svg",{"title":54392,"description":54448},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fselect-random-rows","dqnRUQAGr_kikJ37svVKPLCv4E4SSlimObTuWUCHmxc",{"id":54455,"title":54456,"body":54457,"date":71,"description":54522,"extension":73,"meta":54523,"navigation":75,"order":71,"path":43335,"seo":54525,"stem":54526,"__hash__":54527},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsend-an-email.md","Send an email step",{"type":8,"value":54458,"toc":54514},[54459,54462,54466,54468,54471,54473,54484,54488,54490,54494,54497,54500,54504,54507,54511],[32947,54460],{"video":54461},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=870&end=922?rel=0",[107,54463,54465],{"id":54464},"what-to-use-the-send-an-email-step-for","What to use the Send an email step for",[112,54467],{},[26,54469,54470],{},"Use this step to send an email to one or more email addresses. Very useful for confirming an Axiom has run or sharing data scraped from a reporting page with colleagues. Please respect this step and not use it to spam others.",[26,54472,48689],{},[186,54474,54475,54478,54481],{},[189,54476,54477],{},"Send confirmations an Axiom has completed",[189,54479,54480],{},"Email colleagues data you have scraped",[189,54482,54483],{},"Distribute files you have downloaded",[107,54485,54487],{"id":54486},"how-to-configure-the-send-an-email-step","How to configure the Send an email step",[112,54489],{},[21,54491,54493],{"id":54492},"email-addresses","Email addresses",[26,54495,54496],{},"Enter a list of email addresses to send to, one email address per line.",[26,54498,54499],{},"All emails are sent from a no-reply axiom.ai email address and you will not receive a reply to any message sent. Messages are rate limited to one per 30 seconds. Please do not use this step to send unsolicited email to third parties!",[21,54501,54503],{"id":54502},"email-subject","Email subject",[26,54505,54506],{},"Add your email subject line in this field.",[21,54508,54510],{"id":54509},"email-body","Email body",[26,54512,54513],{},"Add your email body in this field. Use 'Insert Data' to pass data from any step into your email body.",{"title":67,"searchDepth":68,"depth":68,"links":54515},[54516,54517],{"id":54464,"depth":670,"text":54465},{"id":54486,"depth":670,"text":54487,"children":54518},[54519,54520,54521],{"id":54492,"depth":68,"text":54493},{"id":54502,"depth":68,"text":54503},{"id":54509,"depth":68,"text":54510},"Send an email. Use to share scraped data, distribute downloaded files, or confirm that an Axiom has completed.",{"category":1975,"icon":54524},"WidgetSendEmail.svg",{"title":54456,"description":54522},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsend-an-email","3P5hDD6n6fyu3bWdDzpvafKa8od9d5jfEXqYFwQ5jQs",{"id":54529,"title":54530,"body":54531,"date":71,"description":54593,"extension":73,"meta":54594,"navigation":75,"order":71,"path":21022,"seo":54596,"stem":54597,"__hash__":54598},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsolve-captcha.md","Solve Captcha step",{"type":8,"value":54532,"toc":54586},[54533,54536,54540,54542,54555,54566,54570,54572,54576,54579,54583],[32947,54534],{"video":54535},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=842&end=870?rel=0",[107,54537,54539],{"id":54538},"what-to-use-the-solve-captcha-step-for","What to use the Solve Captcha step for",[112,54541],{},[26,54543,31861,54544,54546,54547,54551,54552,48833],{},[659,54545,824],{"href":771}," external service to solve a captcha when your web automation encounters it. You will need to sign up and get your own ",[659,54548,4175],{"href":54549,"rel":54550},"https:\u002F\u002F2captcha.com",[1218],", you can also learn more about solving ",[659,54553,54554],{"href":31347},"Captcha in our docs.",[186,54556,54557,54560,54563],{},[189,54558,54559],{},"Solve reCAPTCHA V2",[189,54561,54562],{},"Solve reCAPTCHA V3",[189,54564,54565],{},"Solve invisible reCAPTCHA",[107,54567,54569],{"id":54568},"how-to-configure-the-solve-captcha-step","How to configure the Solve Captcha step",[112,54571],{},[21,54573,54575],{"id":54574},"_2captcha-api-key","2Captcha API key",[26,54577,54578],{},"Enter your 2Captcha API key here to use this key as the default on all steps that require a 2Captcha API key. Your API key can be found on your 2Captcha account page.",[21,54580,54582],{"id":54581},"override-default-api-key","Override default API key",[26,54584,54585],{},"Enter a 2Captcha API key here to be used only on this widget.",{"title":67,"searchDepth":68,"depth":68,"links":54587},[54588,54589],{"id":54538,"depth":670,"text":54539},{"id":54568,"depth":670,"text":54569,"children":54590},[54591,54592],{"id":54574,"depth":68,"text":54575},{"id":54581,"depth":68,"text":54582},"Use a third party to solve captchas encountered during your bot run.",{"category":49189,"icon":54595},"WidgetDriverSolveCaptcha.svg",{"title":54530,"description":54593},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsolve-captcha","DPevRD_UUkIPTyjP3Cp1yhOYE4OLloiOH4bLMaopUhc",{"id":54600,"title":54601,"body":54602,"date":71,"description":54676,"extension":73,"meta":54677,"navigation":75,"order":71,"path":37250,"seo":54679,"stem":54680,"__hash__":54681},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsplit-a-name-into-columns.md","Split a name into columns step",{"type":8,"value":54603,"toc":54667},[54604,54606,54610,54612,54618,54637,54641,54643,54645,54648,54650,54653,54656,54659,54662,54664],[32947,54605],{"video":37282},[107,54607,54609],{"id":54608},"what-to-use-the-split-a-name-into-columns-step-for","What to use the Split a name into columns step for",[112,54611],{},[26,54613,54614,54615,48833],{},"This step takes any full name and splits it into its parts - title, first name, last name, and additional name. Useful when scraping LinkedIn Sales Navigator, and you want to send personalised messages. ",[659,54616,54617],{"href":51323},"See this LinkedIn template.",[186,54619,54620,54623,54626,54629],{},[189,54621,54622],{},"To extract first names to create personalised messages",[189,54624,54625],{},"Extract names for CRM data",[189,54627,54628],{},"Extract first and last name from LinkedIn",[189,54630,54631,54632,2344,54634,54636],{},"Extract first names from data in a ",[659,54633,26048],{"href":24142},[659,54635,32682],{"href":51077},"- Extract names to personalise email campaigns",[107,54638,54640],{"id":54639},"how-to-configure-the-split-a-name-into-columns-step","How to configure the Split a name into columns step",[112,54642],{},[21,54644,581],{"id":580},[26,54646,54647],{},"Select the data containing the names.",[21,54649,36893],{"id":52569},[26,54651,54652],{},"Enter the column in the data where the names can be found. You can enter either a number (starting from 1) or a capital letter (starting from A).",[26,54654,54655],{},"Please ensure you only enter one value as only the first column provided will be used.",[21,54657,37278],{"id":54658},"fields",[26,54660,54661],{},"Select the fields to split the name into.",[21,54663,48894],{"id":48893},[26,54665,54666],{},"The step outputs a preview of the split names.",{"title":67,"searchDepth":68,"depth":68,"links":54668},[54669,54670],{"id":54608,"depth":670,"text":54609},{"id":54639,"depth":670,"text":54640,"children":54671},[54672,54673,54674,54675],{"id":580,"depth":68,"text":581},{"id":52569,"depth":68,"text":36893},{"id":54658,"depth":68,"text":37278},{"id":48893,"depth":68,"text":48894},"Extract first names, middle names, and surnames from scraped data. Pass in a token from your selected data source to use.",{"category":38518,"icon":54678},"WidgetFilterSplitName.svg",{"title":54601,"description":54676},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsplit-a-name-into-columns","ImrrkBUCsQ_btimekpZMhq9g5eo3NhA6jMw5N9p6ZHo",{"id":54683,"title":54684,"body":54685,"date":71,"description":54748,"extension":73,"meta":54749,"navigation":75,"order":71,"path":37142,"seo":54751,"stem":54752,"__hash__":54753},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsplit-by-character.md","Split by character step",{"type":8,"value":54686,"toc":54740},[54687,54689,54693,54695,54701,54703,54714,54718,54720,54723,54726,54728,54731,54735,54737],[32947,54688],{"video":37169},[107,54690,54692],{"id":54691},"what-to-use-the-split-by-character-step-for","What to use the Split by character step for",[112,54694],{},[26,54696,54697,54698,54700],{},"Use this step to extract specific data from a larger data block like HTML. For example, you may be trying to scrape an image URL, but it's not a standard link. Using the  ",[659,54699,53039],{"href":48831},", scrape the HTML, then use this step to extract the URL. You can also extract text with this step. Finally, you may need to use multiple Split steps, one to strip the data before and one step to strip the data after.",[26,54702,48689],{},[186,54704,54705,54708,54711],{},[189,54706,54707],{},"Extract links from scraped HTML",[189,54709,54710],{},"Get Image URLs from scraped HTML",[189,54712,54713],{},"Get specific text from scraped data",[107,54715,54717],{"id":54716},"how-to-configure-the-split-by-character-text-step","How to configure the Split by character text step",[112,54719],{},[21,54721,37160],{"id":54722},"character",[26,54724,54725],{},"Enter a character or word to split the data on.",[21,54727,581],{"id":580},[26,54729,54730],{},"Select the variable containing the data you wish to split.",[107,54732,54734],{"id":54733},"using-multiple-split-steps","Using multiple split steps",[112,54736],{},[26,54738,54739],{},"If you wish to extract data that has data in front and after, you will need to use multiple Split steps. You can easily share data between these steps by clicking 'Insert Data' and selecting the correct token.",{"title":67,"searchDepth":68,"depth":68,"links":54741},[54742,54743,54747],{"id":54691,"depth":670,"text":54692},{"id":54716,"depth":670,"text":54717,"children":54744},[54745,54746],{"id":54722,"depth":68,"text":37160},{"id":580,"depth":68,"text":581},{"id":54733,"depth":670,"text":54734},"Extract data from large volumes of scraped text using the Split by character step. Use multiple steps if needed to remove text before the start and after the end.",{"category":38518,"icon":54750},"WidgetSplitByCharacter.svg",{"title":54684,"description":54748},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsplit-by-character","fxp4gWPPUJcd13NR0iegAggi63aUty9EpribVPncm1A",{"id":54755,"title":54756,"body":54757,"date":71,"description":67,"extension":73,"meta":54804,"navigation":75,"order":71,"path":54807,"seo":54808,"stem":54809,"__hash__":54810},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fswap-rows-and-columns.md","Swap rows and columns step",{"type":8,"value":54758,"toc":54798},[54759,54762,54766,54768,54771,54773,54785,54789,54791,54795],[32947,54760],{"video":54761},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1131&end=1146?rel=0",[107,54763,54765],{"id":54764},"what-to-use-the-swap-rows-and-columns-step-for","What to use the Swap rows and columns step for",[112,54767],{},[26,54769,54770],{},"Swap (transpose) the rows and columns in your data. Rows become columns and columns become rows. This can be useful when looking to manipulate data from a Google Sheet.",[26,54772,48689],{},[186,54774,54775,54780],{},[189,54776,54777,54778,53871],{},"Transpose ",[659,54779,53561],{"href":48831},[189,54781,54782,54783],{},"Flip data from a ",[659,54784,32682],{"href":51077},[107,54786,54788],{"id":54787},"how-to-configure-the-swap-rows-and-columns-step","How to configure the Swap rows and columns step",[112,54790],{},[21,54792,54794],{"id":54793},"transposable-data","Transposable data",[26,54796,54797],{},"Select the step you whish to transpose data from.",{"title":67,"searchDepth":68,"depth":68,"links":54799},[54800,54801],{"id":54764,"depth":670,"text":54765},{"id":54787,"depth":670,"text":54788,"children":54802},[54803],{"id":54793,"depth":68,"text":54794},{"desciption":54805,"category":38518,"icon":54806},"Transpose rows and columns of data from any source. Pass the data source token into this step to switch row and column positions.","WidgetFilterTranspose.svg","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fswap-rows-and-columns",{"title":54756,"description":67},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fswap-rows-and-columns","OCJ41mhKAnWRxMUVWGLRzyJTWANU2XTEklALRwuZIdY",{"id":54812,"title":54813,"body":54814,"date":71,"description":54864,"extension":73,"meta":54865,"navigation":75,"order":71,"path":35778,"seo":54867,"stem":54868,"__hash__":54869},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fswitch-browser-tab.md","Switch browser tab step",{"type":8,"value":54815,"toc":54857},[54816,54819,54823,54825,54832,54834,54842,54846,54848,54850,54852,54854],[32947,54817],{"video":54818},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1211&end=1238?rel=0",[107,54820,54822],{"id":54821},"what-to-use-the-switch-browser-tab-step-for","What to use the Switch browser tab step for",[112,54824],{},[26,54826,54827,54828,54831],{},"This step is essential when Axiom opens a new browser tab or window during operation. Since the bot operates in only one tab at a time and cannot switch tabs automatically, you must manually direct it to the new tab. Failing to do so may result in errors like 'click element not found' because the bot remains active in the original tab. For multi-tab tasks, combine this step with the ",[659,54829,54830],{"href":21784},"'Close tab'"," step for seamless automation.",[26,54833,48689],{},[186,54835,54836,54839],{},[189,54837,54838],{},"Switch form one tab to a pop up that is a new tab",[189,54840,54841],{},"Jump between new tabs opened during a bot run",[107,54843,54845],{"id":54844},"how-to-configure-the-switch-browser-tab-step","How to configure the Switch browser tab step",[112,54847],{},[21,54849,49433],{"id":49432},[26,54851,49436],{},[107,54853,48720],{"id":48719},[26,54855,54856],{},"Some websites add '_blank' to their links, forcing a page to open a new tab, so keep an eye out for new tabs opening when testing your bot.",{"title":67,"searchDepth":68,"depth":68,"links":54858},[54859,54860,54863],{"id":54821,"depth":670,"text":54822},{"id":54844,"depth":670,"text":54845,"children":54861},[54862],{"id":49432,"depth":68,"text":49433},{"id":48719,"depth":670,"text":48720},"Use this step to switch active browser tabs during a run. Helps control which page the automation interacts with.",{"category":48952,"icon":54866},"WidgetDriverSwitchBrowserTab.svg",{"title":54813,"description":54864},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fswitch-browser-tab","qLfNCUz_DDX3OuUWVE16_Xkc-F818WMc2e1P5cdW1UE",{"id":54871,"title":54872,"body":54873,"date":71,"description":54968,"extension":73,"meta":54969,"navigation":75,"order":71,"path":1123,"seo":54971,"stem":54972,"__hash__":54973},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Ftrigger-webhook.md","Trigger webhook step",{"type":8,"value":54874,"toc":54959},[54875,54877,54881,54883,54886,54888,54901,54905,54907,54910,54917,54920,54926,54928,54935,54938,54944,54947],[32947,54876],{"video":53382},[107,54878,54880],{"id":54879},"what-to-use-the-trigger-webhook-step-for","What to Use the Trigger webhook step for",[112,54882],{},[26,54884,54885],{},"The Trigger webhook step sends a POST request containing data from your automation to an endpoint. The data is output in a 2D array.",[26,54887,48689],{},[186,54889,54890,54898],{},[189,54891,54892,54893,2344,54895,148],{},"Send data to ",[659,54894,1134],{"href":1191},[659,54896,41434],{"href":54897},"\u002Fguides\u002Fpost-data-to-make",[189,54899,54900],{},"Post data to any web app or API.",[107,54902,54904],{"id":54903},"how-to-configure-the-trigger-webhook-step","How to configure the Trigger webhook step",[112,54906],{},[21,54908,44808],{"id":54909},"payload",[26,54911,54912,54913,54916],{},"Enter the payload for the request as JSON. To send data from a step, click ",[192,54914,54915],{},"'Insert Data'",", select the token of the step you wish to post data from, and the payload will be set up automatically. The data will be posted in a 2D array.",[26,54918,54919],{},"You can also construct your own payload using JSON and a combination of the tokens available for selection. See the example below:",[2446,54921,54924],{"className":54922,"code":54923,"language":5402},[5400],"{\n  \"request\": \"[google-sheet-data?all&1]\",\n  \"customer\": {\n    \"first_name\": \"[google-sheet-data?all&2]\",\n    \"last_name\": \"[google-sheet-data?all&3]\",\n    \"email\": \"[google-sheet-data?all&4]\",\n    \"phone\": \"[google-sheet-data?all&5]\",\n    \"company\": {\n      \"name\": \"[google-sheet-data?all&6]\",\n      \"job_title\": \"[google-sheet-data?all&7]\",\n      \"industry\": \"[google-sheet-data?all&8]\"\n    },\n  }\n}\n",[145,54925,54923],{"__ignoreMap":67},[21,54927,4585],{"id":4584},[26,54929,54930,54931,54934],{},"Insert the URL of the ",[192,54932,54933],{},"'Endpoint'"," you wish to post to.",[21,54936,54937],{"id":52398},"API Key",[26,54939,54940,54941,54943],{},"You can access your ",[659,54942,4175],{"href":3097}," here, which is only available for Pro subscribers and higher.",[21,54945,54946],{"id":49965},"Keen to Learn More?",[186,54948,54949,54954],{},[189,54950,54951,54952,148],{},"Post data from ",[659,54953,1134],{"href":1191},[189,54955,54956,54957,148],{},"Read about our ",[659,54958,5345],{"href":5562},{"title":67,"searchDepth":68,"depth":68,"links":54960},[54961,54962],{"id":54879,"depth":670,"text":54880},{"id":54903,"depth":670,"text":54904,"children":54963},[54964,54965,54966,54967],{"id":54909,"depth":68,"text":44808},{"id":4584,"depth":68,"text":4585},{"id":52398,"depth":68,"text":54937},{"id":49965,"depth":68,"text":54946},"Post data to other web apps via webhook.",{"category":53531,"icon":54970},"WidgetRestApi.svg",{"title":54872,"description":54968},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Ftrigger-webhook","zrbVbaNkgQV_SbajQdmuVUVhYH-LGinmrjL_d9M8HDY",{"id":54975,"title":33111,"body":54976,"date":71,"description":55034,"extension":73,"meta":55035,"navigation":75,"order":71,"path":32798,"seo":55037,"stem":55038,"__hash__":55039},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Ftry-catch.md",{"type":8,"value":54977,"toc":55025},[54978,54981,54985,54987,54990,54992,54994,54999,55003,55005,55007,55010,55012,55015,55017],[32947,54979],{"video":54980},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=2445&end=2485?rel=0",[107,54982,54984],{"id":54983},"what-to-use-the-try-catch-step-for","What to use the Try catch step for",[112,54986],{},[26,54988,54989],{},"The Try catch step executes sub-steps within the 'Try' block. If these steps trigger an error, it is intercepted by the 'Catch' block. This block not only catches the error but also returns it as a token for debugging purposes. Additionally, it can execute a separate set of sub-steps tailored for error handling.",[107,54991,48689],{"id":51830},[112,54993],{},[186,54995,54996],{},[189,54997,54998],{},"Debug Axiom runs",[107,55000,55002],{"id":55001},"how-to-configure-the-try-catch-step","How to configure the Try catch step",[112,55004],{},[21,55006,39558],{"id":2645},[26,55008,55009],{},"Add the sub-steps you wish to execute as part of the 'Try' condition.",[21,55011,39564],{"id":2771},[26,55013,55014],{},"Add the sub-steps you wish to execute as part of the 'Catch' condition.",[21,55016,49545],{"id":49544},[26,55018,51943,55019,55021,55022,15415],{},[659,55020,51946],{"href":15650}," or the ",[659,55023,55024],{"href":50871},"IF condition",{"title":67,"searchDepth":68,"depth":68,"links":55026},[55027,55028,55029],{"id":54983,"depth":670,"text":54984},{"id":51830,"depth":670,"text":48689},{"id":55001,"depth":670,"text":55002,"children":55030},[55031,55032,55033],{"id":2645,"depth":68,"text":39558},{"id":2771,"depth":68,"text":39564},{"id":49544,"depth":68,"text":49545},"Execute a different set of steps if an error is encountered during runtime. Use to handle errors.",{"category":48739,"icon":55036},"TemplateTryCatch.svg",{"title":33111,"description":55034},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Ftry-catch","WJn35y1Q2hUbBkKsVJiEGEl3Isdu-KV1b-6_Sh5TMfk",{"id":55041,"title":55042,"body":55043,"date":71,"description":55114,"extension":73,"meta":55115,"navigation":75,"order":71,"path":36075,"seo":55117,"stem":55118,"__hash__":55119},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fupload-file.md","Upload a file step",{"type":8,"value":55044,"toc":55107},[55045,55048,55052,55054,55057,55060,55077,55088,55090,55092,55096,55099,55102,55104],[32947,55046],{"video":55047},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=3382&end=3486?rel=0",[107,55049,55051],{"id":55050},"what-to-use-the-upload-a-file-step-for","What to use the Upload a file step for",[112,55053],{},[26,55055,55056],{},"Use the Upload File step to attach files to an email and even automate uploading images to social media. This step is a ubiquitous step designed to work with file upload fields.",[26,55058,55059],{},"You can use this step to upload files to:",[186,55061,55062,55065,55068,55070,55072,55074],{},[189,55063,55064],{},"CMS pages",[189,55066,55067],{},"Social media platforms like Twitter",[189,55069,50515],{},[189,55071,50518],{},[189,55073,50521],{},[189,55075,55076],{},"NFT websites",[26,55078,55079,55080,55083,55084,6205,55086,50403],{},"Currently, the Upload and Download steps only work in conjunction with the Axiom Desktop Application, you can install the app by clicking ",[659,55081,55082],{"href":45946},"here."," We also now have Google Drive steps that allow you to ",[659,55085,50114],{"href":35908},[659,55087,50117],{"href":33871},[107,55089,314],{"id":49137},[112,55091],{},[21,55093,55095],{"id":55094},"how-to-configure-the-upload-a-file-step","How to configure the upload a file step",[26,55097,55098],{},"First up, select the file input field you wish to upload your file to. You do this with the selector tool click 'File Input Field'. The display will transform into the selector tool. Next, click on the input you wish to upload to and confirm your choice.",[26,55100,55101],{},"A custom selector option is available. We only recommend using this if the selector tool fails to find the element.",[21,55103,50349],{"id":50348},[26,55105,55106],{},"Set a folder you wish to upload from, copy and paste a path to the folder or use the 'Click to select' button to find the file.",{"title":67,"searchDepth":68,"depth":68,"links":55108},[55109,55110],{"id":55050,"depth":670,"text":55051},{"id":49137,"depth":670,"text":314,"children":55111},[55112,55113],{"id":55094,"depth":68,"text":55095},{"id":50348,"depth":68,"text":50349},"Using the desktop app, upload files locally from the computer where the app is installed.",{"category":223,"icon":55116},"WidgetDriverFileUpload.svg",{"title":55042,"description":55114},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fupload-file","c383dvxJfRTRyQnloz29PINVeym4YVACEbx30Qvw0ls",{"id":55121,"title":55122,"body":55123,"date":71,"description":55182,"extension":73,"meta":55183,"navigation":75,"order":71,"path":35908,"seo":55184,"stem":55185,"__hash__":55186},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fupload-file-google-drive.md","Upload a file from Google Drive step",{"type":8,"value":55124,"toc":55175},[55125,55128,55132,55134,55137,55139,55153,55159,55161,55163,55167,55170,55172],[32947,55126],{"video":55127},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=3312&end=3382?rel=0",[107,55129,55131],{"id":55130},"what-to-use-the-upload-load-a-file-to-google-drive-step-for","What to use the Upload load a file to Google Drive step for",[112,55133],{},[26,55135,55136],{},"Use this step to directly upload files from your Google Drive into any web app. This step works in Axiom Cloud. Previously, files had to be uploaded from the desktop application.",[26,55138,55059],{},[186,55140,55141,55143,55145,55147,55149,55151],{},[189,55142,55064],{},[189,55144,55067],{},[189,55146,50515],{},[189,55148,50518],{},[189,55150,50521],{},[189,55152,55076],{},[26,55154,50111,55155,6205,55157,50619],{},[659,55156,50114],{"href":36075},[659,55158,50117],{"href":34121},[107,55160,314],{"id":49137},[112,55162],{},[21,55164,55166],{"id":55165},"file-input-field","File Input Field",[26,55168,55169],{},"Click 'Select' to choose form element to upload the file to. Note that this is only guaranteed to work on standard HTML file upload fields - some customised file upload implementations may not function. Sorry!",[21,55171,35948],{"id":53298},[26,55173,55174],{},"Enter the URL of the file in Google Drive to upload.",{"title":67,"searchDepth":68,"depth":68,"links":55176},[55177,55178],{"id":55130,"depth":670,"text":55131},{"id":49137,"depth":670,"text":314,"children":55179},[55180,55181],{"id":55165,"depth":68,"text":55166},{"id":53298,"depth":68,"text":35948},"Upload files directly to a folder in your Google Drive.",{"category":223,"icon":53321},{"title":55122,"description":55182},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fupload-file-google-drive","3ZThg433R04Ct4Y57ekUHSJfP5C_I_ywhfazG9zvjv4",{"id":55188,"title":55189,"body":55190,"date":71,"description":55246,"extension":73,"meta":55247,"navigation":75,"order":71,"path":21702,"seo":55249,"stem":55250,"__hash__":55251},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwait.md","Wait step",{"type":8,"value":55191,"toc":55240},[55192,55195,55199,55201,55204,55207,55209,55223,55227,55229,55233,55236],[32947,55193],{"video":55194},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=1096&end=1131?rel=0",[107,55196,55198],{"id":55197},"what-to-use-the-wait-step-for","What to use the wait step for",[112,55200],{},[26,55202,55203],{},"This step allows you to add a wait to pause your bot run. You can do this to interact with the page and manually enter a password. But the most common use is to slow the bot by a fraction of a second to allow HTML elements, such as a button, to load.",[26,55205,55206],{},"A top tip when testing your Axiom: if you notice actions out of sync or misfiring clicks, try adding a wait. It's most likely the click fired before the button loaded.",[26,55208,48689],{},[186,55210,55211,55214,55217,55220],{},[189,55212,55213],{},"Pause your bot and interact with the page only on Desktop or VPS",[189,55215,55216],{},"Wait to allow data to load",[189,55218,55219],{},"Slow the bot to allow buttons and new elements to load",[189,55221,55222],{},"Allow long file uploads",[107,55224,55226],{"id":55225},"how-to-configure-the-wait-step","How to configure the Wait step",[112,55228],{},[21,55230,55232],{"id":55231},"set-a-time-in-milliseconds","Set a time in milliseconds",[26,55234,55235],{},"One second it 1000 milliseconds, for waits between click elements try 500.",[26,55237,50893,55238,148],{},[659,55239,50897],{"href":50896},{"title":67,"searchDepth":68,"depth":68,"links":55241},[55242,55243],{"id":55197,"depth":670,"text":55198},{"id":55225,"depth":670,"text":55226,"children":55244},[55245],{"id":55231,"depth":68,"text":55232},"Pause your automation to manually interact or wait for an event to conclude before continuing.",{"category":49189,"icon":55248},"WidgetDriverWait.svg",{"title":55189,"description":55246},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwait","Yw_ZDK95QwCHesVXsBUADIkEgEn1SLjsPtbNQkvcwcc",{"id":55253,"title":55254,"body":55255,"date":71,"description":55342,"extension":73,"meta":55343,"navigation":75,"order":71,"path":44340,"seo":55345,"stem":55346,"__hash__":55347},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-data-to-a-google-sheet-step.md","Write data to a Google Sheet step",{"type":8,"value":55256,"toc":55331},[55257,55260,55262,55264,55273,55275,55286,55292,55296,55298,55300,55302,55304,55306,55308,55311,55315,55318,55322,55325,55328],[32947,55258],{"video":55259},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=2315&end=2380?rel=0",[107,55261,50006],{"id":50005},[112,55263],{},[26,55265,55266,55267,6205,55269,55272],{},"Use this step to output data generated by your Axioms into a Google Sheet. You will also find steps to ",[659,55268,50120],{"href":24142},[659,55270,55271],{"href":32103},"delete"," data from Google Sheets.",[26,55274,48689],{},[186,55276,55277,55280,55283],{},[189,55278,55279],{},"Write scraped data to a Google Sheet",[189,55281,55282],{},"Transfer data stored in CSVs into a Google Sheet",[189,55284,55285],{},"Output repporting data into",[26,55287,55288,55289],{},"This step features in ",[659,55290,55291],{"href":338},"many of our bot templates.",[107,55293,55295],{"id":55294},"how-to-configure-the-write-data-to-a-google-sheet-step","How to configure the Write data to a Google Sheet step",[112,55297],{},[21,55299,36402],{"id":49040},[26,55301,50191],{},[21,55303,36408],{"id":49046},[26,55305,50208],{},[21,55307,581],{"id":580},[26,55309,55310],{},"Select the data you wish to write to the Google Sheet",[21,55312,55314],{"id":55313},"write-options-clear-data-before-writing-add-to-existing-data","Write options - Clear data before writing | Add to existing data",[26,55316,55317],{},"Select 'Add to existing data' to write the new data to the sheet without first deleting existing data; select 'Clear data before writing' to delete all data before writing any new data.",[21,55319,55321],{"id":55320},"starting-cell","Starting cell",[26,55323,55324],{},"To start writing to a particular cell in a Google Sheet, enter the column and row information, for example, 'D7'. You will also need to set 'Add to existing data' for this option to work.",[21,55326,44386],{"id":55327},"write-method",[26,55329,55330],{},"If you want to write formulas to the Google Sheet set this option to 'User entered'.",{"title":67,"searchDepth":68,"depth":68,"links":55332},[55333,55334],{"id":50005,"depth":670,"text":50006},{"id":55294,"depth":670,"text":55295,"children":55335},[55336,55337,55338,55339,55340,55341],{"id":49040,"depth":68,"text":36402},{"id":49046,"depth":68,"text":36408},{"id":580,"depth":68,"text":581},{"id":55313,"depth":68,"text":55314},{"id":55320,"depth":68,"text":55321},{"id":55327,"depth":68,"text":44386},"Output data from your automation to a Google Sheet.",{"category":48807,"icon":55344},"WidgetWriteGoogleSheet.svg",{"title":55254,"description":55342},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-data-to-a-google-sheet-step","jf5jpuFiZ9gCiBst5ltlF-EohCfLwA-sNAqYFNMC2mk",{"id":55349,"title":55350,"body":55351,"date":71,"description":55410,"extension":73,"meta":55411,"navigation":75,"order":71,"path":55413,"seo":55414,"stem":55415,"__hash__":55416},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-data-to-airtable.md","Write data to Airtable",{"type":8,"value":55352,"toc":55402},[55353,55357,55359,55362,55364,55383,55387,55389,55391,55393,55395,55397,55399],[107,55354,55356],{"id":55355},"what-to-use-the-write-data-to-airtable-step-for","What to use the Write data to Airtable step for",[112,55358],{},[26,55360,55361],{},"Write data to Airtable from your Axiom steps to store, organise, and use your automation results in a structured table.",[26,55363,48689],{},[186,55365,55366,55373,55380],{},[189,55367,55368,55369,55372],{},"Export ",[659,55370,55371],{"href":48831},"scraped"," data into Airtable",[189,55374,55375,55376,55379],{},"Send ",[659,55377,55378],{"href":17231},"form submissions"," directly to Airtable",[189,55381,55382],{},"Store automation results in Airtable for later use",[107,55384,55386],{"id":55385},"how-to-configure-the-write-data-to-airtable-step","How to configure the Write data to Airtable step",[112,55388],{},[21,55390,53161],{"id":53160},[26,55392,53164],{},[21,55394,53168],{"id":53167},[26,55396,53171],{},[21,55398,581],{"id":580},[26,55400,55401],{},"Select the data to write.",{"title":67,"searchDepth":68,"depth":68,"links":55403},[55404,55405],{"id":55355,"depth":670,"text":55356},{"id":55385,"depth":670,"text":55386,"children":55406},[55407,55408,55409],{"id":53160,"depth":68,"text":53161},{"id":53167,"depth":68,"text":53168},{"id":580,"depth":68,"text":581},"Export data to Airtable from your automations.",{"category":48807,"icon":55412},"WidgetWriteAirtable.svg","\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-data-to-airtable",{"title":55350,"description":55410},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-data-to-airtable","oUeRY4PKMUYQhXmFh1n52a7vYkmmISwo4Wzvxf5vc3o",{"id":55418,"title":55419,"body":55420,"date":71,"description":67,"extension":73,"meta":55501,"navigation":75,"order":71,"path":43960,"seo":55503,"stem":55504,"__hash__":55505},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-data-to-an-excel-sheet.md","Write data to a Excel sheet step",{"type":8,"value":55421,"toc":55490},[55422,55426,55428,55431,55433,55444,55446,55448,55450,55453,55455,55458,55460,55463,55465,55471,55477,55479,55485,55487],[107,55423,55425],{"id":55424},"what-to-use-the-write-data-to-an-excel-sheet-step-for","What to use the Write data to an Excel sheet step for",[112,55427],{},[26,55429,55430],{},"Use this step to output data generated by your automations into an Excel sheet.",[26,55432,48689],{},[186,55434,55435,55438,55441],{},[189,55436,55437],{},"Write scraped data to an Excel sheet.",[189,55439,55440],{},"Transfer data stored in CSVs into an Excel sheet.",[189,55442,55443],{},"Output reporting data into an Excel sheet.",[107,55445,53943],{"id":53942},[112,55447],{},[21,55449,36402],{"id":49040},[26,55451,55452],{},"Enter a URL for the sheet that you wish to write to, or enter the name in the search box.",[21,55454,36408],{"id":49046},[26,55456,55457],{},"The name of the sheet within the workspace to write data to.",[21,55459,581],{"id":580},[26,55461,55462],{},"The data token that contains the data that you wish to write to the Excel sheet.",[21,55464,36499],{"id":50769},[26,55466,55467,55470],{},[192,55468,55469],{},"Add to existing data:"," write data to the next available row within your sheet.",[26,55472,55473,55476],{},[192,55474,55475],{},"Clear data before writing:"," clear the spreadsheet, and then write the data into the newly cleared spreadsheet.",[21,55478,55321],{"id":55320},[26,55480,55481,55482,148],{},"The cell that you wish to start writing on. ",[26030,55483,55484],{},"Note: failure to change this will cause the cell to be re-written during subsequent runs",[21,55486,44386],{"id":55327},[26,55488,55489],{},"To write formulas, set this option to \"User entered\".",{"title":67,"searchDepth":68,"depth":68,"links":55491},[55492,55493],{"id":55424,"depth":670,"text":55425},{"id":53942,"depth":670,"text":53943,"children":55494},[55495,55496,55497,55498,55499,55500],{"id":49040,"depth":68,"text":36402},{"id":49046,"depth":68,"text":36408},{"id":580,"depth":68,"text":581},{"id":50769,"depth":68,"text":36499},{"id":55320,"depth":68,"text":55321},{"id":55327,"depth":68,"text":44386},{"descripition":55502,"category":48807,"icon":55344},"Write data from any step to a Microsoft Excel sheet using this step. Use to store, share, or process results outside the automation,",{"title":55419,"description":67},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-data-to-an-excel-sheet","dCwd9qkNu8l5j9ZYe3ftyIyAPqGGPmeyMKtYQSlRuzQ",{"id":55507,"title":55508,"body":55509,"date":71,"description":55593,"extension":73,"meta":55594,"navigation":75,"order":71,"path":19048,"seo":55596,"stem":55597,"__hash__":55598},"content\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-javascript.md","Write javascript step",{"type":8,"value":55510,"toc":55586},[55511,55514,55518,55520,55525,55532,55534,55557,55563,55567,55569,55572,55575,55577,55580,55583],[32947,55512],{"video":55513},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCYHijmR0jY?rel=0&start=706&end=734?rel=0",[107,55515,55517],{"id":55516},"what-to-use-the-write-javascript-step-for","What to use the Write javascript step for",[112,55519],{},[26,55521,55522,55523,148],{},"Are you a coder? Write custom javascript for any operation inside your Axiom, from posting to an API to formatting data from steps. You can also use data from other steps as variables in your custom JS. Please note Axiom data model is a 2D array, so when returning data as a token, remember to return an array (or it will not work). You can return values as an array of arrays from this step - they will be appended to the current row. To learn more about what you can do, ",[659,55524,36602],{"href":31331},[26,55526,55527,55528,55531],{},"Are you using this step to create a ",[659,55529,55530],{"href":1887},"required feature?"," Please do let us know we may create a new step for you.",[26,55533,48689],{},[186,55535,55536,55539,55542,55545,55548,55551,55554],{},[189,55537,55538],{},"Create custom logic",[189,55540,55541],{},"Format data from other steps",[189,55543,55544],{},"Use Puppeteer's API",[189,55546,55547],{},"Use the node filesystem API",[189,55549,55550],{},"Click buttons",[189,55552,55553],{},"Scrape content",[189,55555,55556],{},"Run JS in the browser or the App",[26,55558,55559,55560,148],{},"Some useful ",[659,55561,55562],{"href":26355},"JS snippets",[107,55564,55566],{"id":55565},"how-to-configure-the-write-javascript-step","How to configure the Write javascript step",[112,55568],{},[21,55570,55571],{"id":30479},"Script",[26,55573,55574],{},"Write your JS into our JS editor field. If tokens are available from other steps, you will see an 'Insert Data' button. Data is only available for steps added before your Javascript step.",[21,55576,26470],{"id":26469},[26,55578,55579],{},"Toggle on, then Check to run the javascript in the context of the Axiom app, rather than in the browser window.",[26,55581,55582],{},"This allows you to javascript APIs available in the axiom desktop app - such as Puppeteer, FS, and Chat GPT - which are not available in the browser.",[26,55584,55585],{},"It is also a better method of sending API requests manually, because sending such requests from the browser often cause CORS errors.",{"title":67,"searchDepth":68,"depth":68,"links":55587},[55588,55589],{"id":55516,"depth":670,"text":55517},{"id":55565,"depth":670,"text":55566,"children":55590},[55591,55592],{"id":30479,"depth":68,"text":55571},{"id":26469,"depth":68,"text":26470},"Use JavaScript and Puppeteer in your no-code automation to extend functionality. Puppeteer library is already loaded, no need to include it.",{"category":49002,"icon":55595},"WidgetDriverCode.svg",{"title":55508,"description":55593},"docs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-javascript","2qZ8gf-H-ar-NDo7N6B-Tri601VO3PmmmUcxR2pnGgk",{"id":55600,"title":55601,"body":55602,"date":55666,"description":67,"extension":73,"meta":55667,"navigation":75,"order":71,"path":55670,"seo":55671,"stem":55672,"__hash__":55673},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-10-0.md","New Make integration, better loops, smarter scraping, and fixes",{"type":8,"value":55603,"toc":55662},[55604,55608,55610,55636,55640,55642],[107,55605,55607],{"id":55606},"new-features","New features",[112,55609],{},[186,55611,55612,55615,55618,55621,55624,55627,55630,55633],{},[189,55613,55614],{},"Integromat \u002F Make app integration added. Look out for the axiom app appearing on their platform soon!",[189,55616,55617],{},"New “unconditional jump” step - allows you to create more complex loops without having to provide a condition that always passes",[189,55619,55620],{},"Added a visual indication when data has been selected in scrapers and other interact steps",[189,55622,55623],{},"Improvements to step renaming",[189,55625,55626],{},"When your login expires, you can now re-enter your details right there rather than being sent back to the main login page",[189,55628,55629],{},"Visual indication of result grouping added, extended scraper tool tutorial to encompass it",[189,55631,55632],{},"Step number now available in error messages to help with debugging",[189,55634,55635],{},"Added the run time for each bot run to the Reports page",[107,55637,55639],{"id":55638},"bug-fixes","Bug fixes",[112,55641],{},[186,55643,55644,55647,55650,55653,55656,55659],{},[189,55645,55646],{},"Google Sheet previews no longer default to a maximum of 52 columns",[189,55648,55649],{},"Improved template setup flow by adding a confirmation when the setup is complete",[189,55651,55652],{},"Scraper now better supports pages which load content in via AJAX",[189,55654,55655],{},"Fixes to scrolling behaviour during scraping that should work better on some sites, such like Linkedin",[189,55657,55658],{},"Fixed several issues with writing to Google Sheets when there were a very large (1000+) number of columns",[189,55660,55661],{},"Select list behaviour is now smarter and is able to find elements in a larger variety of cases",{"title":67,"searchDepth":68,"depth":68,"links":55663},[55664,55665],{"id":55606,"depth":670,"text":55607},{"id":55638,"depth":670,"text":55639},"2022-07-19",{"version":55668,"featuredimg":55669},3.1,"\u002Fversion3-10.jpg","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-10-0",{"title":55601,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-10-0","bEFBkpfcYmbcjWkfizGFXVUVTNHORskCBFzBPoDEAF8",{"id":55675,"title":55676,"body":55677,"date":55728,"description":67,"extension":73,"meta":55729,"navigation":75,"order":71,"path":55732,"seo":55733,"stem":55734,"__hash__":55735},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-11-0.md","Dashboard redesign, better conditionals, stop remote bots, and more",{"type":8,"value":55678,"toc":55724},[55679,55681,55683,55703,55705,55707],[107,55680,55607],{"id":55606},[112,55682],{},[186,55684,55685,55688,55691,55694,55697,55700],{},[189,55686,55687],{},"All remote running bots (scheduled or via Zapier, API etc.) now show up as running in the main axiom.ai dashboard and can be stopped from there.",[189,55689,55690],{},"Conditional steps now have a “not” toggle, allowing jumping or continuing on error when a condition does not match.",[189,55692,55693],{},"New, cleaner dashboard design with integrated documentation.",[189,55695,55696],{},"“Continue on error” now prevents sub-steps within loops from being skipped when there’s an error.",[189,55698,55699],{},"Speed improvements on select list and when clicking by text.",[189,55701,55702],{},"Suggest a template banner and link added to step finder.",[107,55704,55639],{"id":55638},[112,55706],{},[186,55708,55709,55712,55715,55718,55721],{},[189,55710,55711],{},"Fixes to data replacement within javascript widgets for some data types.",[189,55713,55714],{},"Alerts now always automatically confirm, and correctly confirm in newly open tabs.",[189,55716,55717],{},"Improvements to preview result display.",[189,55719,55720],{},"Duplicate axioms now automatically renamed.",[189,55722,55723],{},"Download link to desktop app now available under run button.",{"title":67,"searchDepth":68,"depth":68,"links":55725},[55726,55727],{"id":55606,"depth":670,"text":55607},{"id":55638,"depth":670,"text":55639},"2022-08-22",{"version":55730,"featuredimg":55731},3.11,"\u002Fversion3.11.0-2.jpg","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-11-0",{"title":55676,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-11-0","47J3DcIWLk3ghFimLorI8I7Oa5i7VpE8TFikmHca7Rk",{"id":55737,"title":55738,"body":55739,"date":55784,"description":67,"extension":73,"meta":55785,"navigation":75,"order":71,"path":55788,"seo":55789,"stem":55790,"__hash__":55791},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-12-0.md","Solve captchas, press keys smarter, fix iframe hangs, and more",{"type":8,"value":55740,"toc":55780},[55741,55743,55745,55762,55764,55766],[107,55742,55607],{"id":55606},[112,55744],{},[186,55746,55747,55750,55753,55756,55759],{},[189,55748,55749],{},"Fixes to issues that caused pages to hang when certain types of iframe were present",[189,55751,55752],{},"Integrated CAPTCHA solve step using a third party service",[189,55754,55755],{},"Added new extension open \u002F close toggle",[189,55757,55758],{},"Press Key(s) step now can be set to automatically delay between key presses",[189,55760,55761],{},"Updated design for error reporting and displayed messages",[107,55763,55639],{"id":55638},[112,55765],{},[186,55767,55768,55771,55774,55777],{},[189,55769,55770],{},"Faster and less error-prone algorithm when writing huge volumes of data to Google Sheets",[189,55772,55773],{},"Added all missing Puppeteer page functions to code box, including page.screenshot",[189,55775,55776],{},"Fixes to click events on some sites",[189,55778,55779],{},"Local storage loading now optional",{"title":67,"searchDepth":68,"depth":68,"links":55781},[55782,55783],{"id":55606,"depth":670,"text":55607},{"id":55638,"depth":670,"text":55639},"2022-09-22",{"version":55786,"featuredimg":55787},3.12,"\u002Fversion3-12.jpg","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-12-0",{"title":55738,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-12-0","Fa_IF6XOSV9dghhWA4_fmsVQVjlpM5KxnItl72y_lTY",{"id":55793,"title":55794,"body":55795,"date":55910,"description":67,"extension":73,"meta":55911,"navigation":75,"order":71,"path":55914,"seo":55915,"stem":55916,"__hash__":55917},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-13-0.md","Optional steps, screenshot tool, scraper upgrades",{"type":8,"value":55796,"toc":55898},[55797,55799,55803,55805,55808,55811,55815,55819,55822,55826,55829,55833,55836,55840,55842,55844,55847,55851,55855,55857,55860,55863,55867,55869,55872,55875,55878,55882,55884],[32947,55798],{},[107,55800,55802],{"id":55801},"changes-to-steps","Changes to Steps",[112,55804],{},[21,55806,33383],{"id":55807},"optional-click",[26,55809,55810],{},"We have added the ability to set clicks as optional. Instead of throwing an error, axiom will click the element if present, and continue if not.",[1906,55812],{"src":55813,"alt":55814},"\u002Fblog\u002Foptional-click.png","Instead of throwing an error, axiom will click the element if present, and continue if not.",[21,55816,55818],{"id":55817},"improved-split-name-step","Improved 'Split Name' step",[26,55820,55821],{},"Improved support for foreign and unicode characters in the split name step.",[21,55823,55825],{"id":55824},"improved-captcha-step","Improved CAPTCHA step",[26,55827,55828],{},"Improved the CAPTCHA solver consistency and the number of CAPTCHAs supported.",[21,55830,55832],{"id":55831},"new-step-save-a-screenshot","New step: 'Save a Screenshot'",[26,55834,55835],{},"We have added a new step to save a screenshot of the current page.",[1906,55837],{"src":55838,"alt":55839},"\u002Fblog\u002Fscreenshot.png","Get you bot to take a screen shot of the browser.",[107,55841,31772],{"id":47631},[112,55843],{},[26,55845,55846],{},"Users can now schedule Axioms on the Desktop Runner application instead of on the Cloud Runner.",[1906,55848],{"src":55849,"alt":55850},"\u002Fblog\u002Fdesktop-runner.png","Users can now schedule Axioms on the Desktop Runner application instead of on the Cloud Runner",[107,55852,55854],{"id":55853},"chrome-extension-ui","Chrome Extension UI",[112,55856],{},[26,55858,55859],{},"Axiom builder can now be minimised and docked to the side of the browser.",[1906,55861],{"src":55862,"alt":55850},"\u002Fblog\u002Fexpand-collapse.gif",[107,55864,55866],{"id":55865},"web-scraper","Web scraper",[112,55868],{},[26,55870,55871],{},"We've made numerous scraper improvements to increase the number of pages we support and to improve general consistency and speed.",[26,55873,55874],{},"Most notably, Axiom will no longer scroll all the way to the bottom of the page before scraping, which allows us to scrape all data from pages that unload content when the screen\nscrolls below a certain point.",[26,55876,55877],{},"Successfully scraped data is now also highlighted orange, so you can see what's being grabbed as you go.",[107,55879,55881],{"id":55880},"minor-bug-fixes","Minor bug fixes",[112,55883],{},[186,55885,55886,55889,55892,55895],{},[189,55887,55888],{},"Remove words step now correctly removes no results when no words are given, instead of removing all",[189,55890,55891],{},"Improved error messaging when attempting to access bad URLs",[189,55893,55894],{},"Fixed issues where the UI would get stuck if the network connection to the backend was lost during saving",[189,55896,55897],{},"Added rename operation to the javascript API",{"title":67,"searchDepth":68,"depth":68,"links":55899},[55900,55906,55907,55908,55909],{"id":55801,"depth":670,"text":55802,"children":55901},[55902,55903,55904,55905],{"id":55807,"depth":68,"text":33383},{"id":55817,"depth":68,"text":55818},{"id":55824,"depth":68,"text":55825},{"id":55831,"depth":68,"text":55832},{"id":47631,"depth":670,"text":31772},{"id":55853,"depth":670,"text":55854},{"id":55865,"depth":670,"text":55866},{"id":55880,"depth":670,"text":55881},"2022-10-15",{"version":55912,"video":55913},3.13,"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FWiIhSol4DPM?rel=0&amp;","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-13-0",{"title":55794,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-13-0","7TrSiKekAdQJGSHwF3qAtYELGyhNfhMLTy8qDirBmTU",{"id":55919,"title":55920,"body":55921,"date":56066,"description":67,"extension":73,"meta":56067,"navigation":75,"order":71,"path":56070,"seo":56071,"stem":56072,"__hash__":56073},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-14-0.md","Selector overhaul, drag to reorder steps, new templates, and more",{"type":8,"value":55922,"toc":56056},[55923,55925,55929,55931,55934,55937,55956,55959,55964,55968,55970,55973,55976,55979,55983,55985,55988,55991,55994,55998,56000,56003,56006,56010,56012,56015,56019,56021,56024,56028,56030,56033,56037,56039],[32947,55924],{},[107,55926,55928],{"id":55927},"new-custom-selector-interface","New custom selector interface",[112,55930],{},[26,55932,55933],{},"This one has been in the works for quite some time, but we're pleased to anounce the new custom selector interface is here. Let us know if you have any feedback!",[26,55935,55936],{},"The new interface hugely improves the experience of adding and editing custom selectors, allowing the following features:",[186,55938,55939,55942,55945,55948,55951,55953],{},[189,55940,55941],{},"Custom selectors can be set per column in scrapes",[189,55943,55944],{},"Easily mix custom selectors with ones that have been automatically selected",[189,55946,55947],{},"Set selectors from previous data without having to manually edit JSON",[189,55949,55950],{},"See live previews of your custom selectors",[189,55952,33310],{},[189,55954,55955],{},"Get helpful suggestions for refining a selector which can help with automation accuracy",[1906,55957],{"src":55958},"\u002Fimg\u002Fselect-text.gif",[26,55960,55961,55962],{},"To learn more about the new custom selector tool ",[659,55963,40775],{"href":33297},[107,55965,55967],{"id":55966},"select-copy-and-move-steps","Select, copy and move steps",[112,55969],{},[26,55971,55972],{},"This feature has been in demand for a while, and we're pleased to announce it has now been released in axiom 3.14.",[26,55974,55975],{},"By clicking on the step number of a step, or selecting \"Select\" from the step menu, you can now select one or more steps. Once selected, these can either be copied or moved to a new place, making fixing your bots much easier!",[1906,55977],{"src":55978},"\u002Fimg\u002Fdraganddrop.gif",[107,55980,55982],{"id":55981},"expanded-file-download-system","Expanded file download system",[112,55984],{},[26,55986,55987],{},"For new bots, a new file download system has been created that prefers direct downloads from the Axiom application directly. This should significantly improve speed and consistency for many use cases, and the system still falls back to the previous browser-based method when the file cannot be located in this way.",[26,55989,55990],{},"Additionally we have provided a proxy to force downloads that are otherwise not possible to determine automatically.",[26,55992,55993],{},"Old bots will still use the previous method, so anything working should remain as it was.",[107,55995,55997],{"id":55996},"overhauled-template-system","Overhauled template system",[112,55999],{},[26,56001,56002],{},"We're delighted to announce that we have replaced our recipe system, which was getting a little long in the tooth. We have now added a set of fresh new templates with much improved user experience and design, and we hope to continue adding more in the upcoming releases.",[1906,56004],{"src":56005},"\u002Fimg\u002Ftemplate.gif",[107,56007,56009],{"id":56008},"expanded-iframe-support","Expanded iframe support",[112,56011],{},[26,56013,56014],{},"Iframe support in Axiom was limited and had some issues. These issues have now been fixed; all interact steps should now be compatible with iframes.",[107,56016,56018],{"id":56017},"error-messages-now-point-to-the-step-that-caused-the-error","Error messages now point to the step that caused the error",[112,56020],{},[26,56022,56023],{},"In long or complex bots, it can be difficult to work out where an error is being generated from. To help with this, whenever a runtime error is generated we now highlight the step that caused the error in red, and additionally scroll the builder down to focus on it.",[107,56025,56027],{"id":56026},"ui-design-cleanup","UI design cleanup",[112,56029],{},[26,56031,56032],{},"We've been working to improve the design language across the board in the axiom builder, with our focus being on consistency. We hope you like it! This general work is ongoing and will continue over the next few releases. Dropdowns, tables and buttons were all covered in this release.",[107,56034,56036],{"id":56035},"minor-fixes","Minor fixes",[112,56038],{},[186,56040,56041,56044,56047,56050,56053],{},[189,56042,56043],{},"Improved select list accuracy when whitespace was present in the option text",[189,56045,56046],{},"Fixes to infinite hanging issues in the scraper on one website",[189,56048,56049],{},"Removed desktop only warning for Captcha; you can now use it in the cloud without any issues",[189,56051,56052],{},"Simplified handling of unicode characters",[189,56054,56055],{},"Removed misleading output warning from gmail steps",{"title":67,"searchDepth":68,"depth":68,"links":56057},[56058,56059,56060,56061,56062,56063,56064,56065],{"id":55927,"depth":670,"text":55928},{"id":55966,"depth":670,"text":55967},{"id":55981,"depth":670,"text":55982},{"id":55996,"depth":670,"text":55997},{"id":56008,"depth":670,"text":56009},{"id":56017,"depth":670,"text":56018},{"id":56026,"depth":670,"text":56027},{"id":56035,"depth":670,"text":56036},"2022-11-29",{"version":56068,"video":56069},3.14,"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FgMi8T54ETCU?rel=0&amp","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-14-0",{"title":55920,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-14-0","8fNb_e1Zl5N8TxZLw_KRiEREfBy__atiJyoTjtz-5Ns",{"id":56075,"title":56076,"body":56077,"date":56202,"description":67,"extension":73,"meta":56203,"navigation":75,"order":71,"path":56206,"seo":56207,"stem":56208,"__hash__":56209},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-15-0.md","Custom scraper settings, new templates, and payment upgrade",{"type":8,"value":56078,"toc":56194},[56079,56081,56085,56087,56090,56094,56097,56100,56103,56107,56109,56112,56116,56119,56123,56125,56128,56131,56134,56138,56144,56148,56150,56153,56158,56162,56164,56167,56169,56171],[32947,56080],{},[107,56082,56084],{"id":56083},"expanded-parameters-for-the-scraper","Expanded parameters for the scraper",[112,56086],{},[26,56088,56089],{},"We have exposed several new parameters in the scraper which were previously being automagically managed.",[1906,56091],{"src":56092,"alt":56093},"\u002Freleases\u002Fscraper-params.jpg","change scraper setting in Axiom for better performance",[26,56095,56096],{},"This was a nice idea in theory, but the reality is that the world of websites is too varied and contradictory for a single solution to ever be optimal. This resulted in Axiom often running slower than it needed to in order to accommodate relatively rare website features, or in order to maximise its reliability in all cases.",[26,56098,56099],{},"The new scraper parameters, in addition to the existing options, allow you to control the scroll speed and behaviour, and gives you more control over axiom's way of checking for new results. Playing with these new options will allow you to get much better performance for your specific use case.",[26,56101,56102],{},"Existing scrapers should not be affected.",[107,56104,56106],{"id":56105},"revamped-payment-system","Revamped payment system",[112,56108],{},[26,56110,56111],{},"We have migrated to a fully Stripe-hosted payment system, which should be much more reliable. It also gives us the option to support a broader range of payment systems, including alternate payment methods such as Apple pay, Google pay or Paypal.",[1906,56113],{"src":56114,"alt":56115},"\u002Freleases\u002Fpayment.jpg","new axiom stripe payment pages",[26,56117,56118],{},"In addition, customers now have access to a customer portal, available from the \"Account\" page, which lets you view invoices and change your payment card details without having to contact support.",[107,56120,56122],{"id":56121},"new-templates-to-teach-common-design-patterns","New templates to teach common design patterns",[112,56124],{},[26,56126,56127],{},"As part of an ongoing effort to make learning axiom easier, and to make sure new users understand the best practices for building automations, we have released a number of new templates focused on teaching fundamental design patterns for building in axiom.",[26,56129,56130],{},"The new templates are general and can be used for a wide variety of automations.",[26,56132,56133],{},"Further work is being done to more intelligently suggest these design patterns when they are applicable. Stay tuned!",[1906,56135],{"src":56136,"alt":56137},"\u002Freleases\u002Ftemplates.jpg","new axiom templates in extension and on website",[26,56139,56140,56141,148],{},"See the templates on our website ",[659,56142,56143],{"href":338},"here",[107,56145,56147],{"id":56146},"new-documentation-on-javascript-snippets","New documentation on javascript snippets",[112,56149],{},[26,56151,56152],{},"We have added a number of new javascript snippets to the documentation. These are frequently useful in building automations; hopefully you find them so!",[26,56154,56155,56156,148],{},"The new page can be found ",[659,56157,56143],{"href":26355},[107,56159,56161],{"id":56160},"zapier-integration-within-axiomai","Zapier integration within axiom.ai",[112,56163],{},[26,56165,56166],{},"We have implemented Zapier's new embed feature to allow you to access your axiom.ai zaps from within the axiom.ai application.",[107,56168,56036],{"id":56035},[112,56170],{},[186,56172,56173,56176,56179,56182,56185,56188,56191],{},[189,56174,56175],{},"Validation messages no longer thrown when steps have been disabled.",[189,56177,56178],{},"Users now cannot get stuck if their session is expired immediately after registration.",[189,56180,56181],{},"Improvements to download error handling.",[189,56183,56184],{},"Implemented Net Promoter Score survey to take user feedback in-app.",[189,56186,56187],{},"Improved error message when a bot hits its single run limit.",[189,56189,56190],{},"Significantly improved speed when an axiom.ai is initially saved.",[189,56192,56193],{},"Added more information about steps that require data to be generated in order to work.",{"title":67,"searchDepth":68,"depth":68,"links":56195},[56196,56197,56198,56199,56200,56201],{"id":56083,"depth":670,"text":56084},{"id":56105,"depth":670,"text":56106},{"id":56121,"depth":670,"text":56122},{"id":56146,"depth":670,"text":56147},{"id":56160,"depth":670,"text":56161},{"id":56035,"depth":670,"text":56036},"2023-01-09",{"version":56204,"video":56205},3.15,"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FJFMFNBbJvhg?rel=0&amp","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-15-0",{"title":56076,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-15-0","jmgrZo20Ah1jX7xAcMtnejwX3vlxf7VBYch0oPnFTv0",{"id":56211,"title":56212,"body":56213,"date":56439,"description":67,"extension":73,"meta":56440,"navigation":75,"order":71,"path":56443,"seo":56444,"stem":56445,"__hash__":56446},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-16-0.md","Upload to drive, undo mistakes, upgrade steps, and more",{"type":8,"value":56214,"toc":56426},[56215,56217,56220,56224,56226,56230,56233,56236,56239,56243,56245,56249,56252,56256,56258,56261,56264,56268,56270,56273,56276,56280,56282,56285,56288,56292,56296,56298,56301,56304,56308,56310,56313,56317,56319,56322,56326,56330,56332,56335,56352,56356,56358,56361,56365,56367],[32947,56216],{},[26,56218,56219],{},"We're excited to present axiom version 3.16. This is a bumper release containing a huge number of improvements, and we've additionally been working on updates to our debugger and onboarding which we're excited to bring to you soon. Read on to find out what's new in 3.16.",[107,56221,56223],{"id":56222},"google-drive-integration-for-file-operations-in-the-cloud","Google Drive integration for file operations in the cloud",[112,56225],{},[1906,56227],{"src":56228,"alt":56229},"\u002Freleases\u002Fgoogle-drive.jpg","Use Axiom to automate file downloads and uploads to Google Drive",[26,56231,56232],{},"Previously, file uploads and downloads were only possible using the desktop application.",[26,56234,56235],{},"New in this release is an integration with Google Drive that allows you to upload files in our cloud runner. You can now upload files directly from Google Drive to a website, and download files from a website directly to Google Drive, all without needing the desktop application. Your remote drive folder acts as a 1-1 replacement for your own local filesystem.",[26,56237,56238],{},"This feature allows file operations to be directly integrated with tools like Zapier and with our cloud scheduler. Have fun!",[107,56240,56242],{"id":56241},"undo-redo","Undo \u002F redo",[112,56244],{},[1906,56246],{"src":56247,"alt":56248},"\u002Freleases\u002Fundo.jpg","Made a mistake, undo a new feature in axiom.ai",[26,56250,56251],{},"Undo and Redo is now available. Anything can be un\u002Fre-done in the builder, from text entry to adding new steps, up to a maximum of 50 interactions. Both buttons and handy keyboard shortcuts (ctrl+z and ctrl+y) are available.",[107,56253,56255],{"id":56254},"javascript-evaluation-in-conditional-steps","Javascript evaluation in conditional steps",[112,56257],{},[26,56259,56260],{},"Now, in addition to checking whether particular data is present or not, you can write a javascript expression in order to determine whether to trigger a conditional step.",[26,56262,56263],{},"This feature is available for both \"Continue only if a condtion is met\" and \"Conditional jump\" steps and will allow you to more precisely control flow within your automations.",[107,56265,56267],{"id":56266},"new-data-variable-options","New data variable options",[112,56269],{},[26,56271,56272],{},"Data variables can now be entered into the First Cell and Last Cell parameters of all Google Sheet widgets, allowing you to dynamically specify these values.",[26,56274,56275],{},"In addition, the \"Replace text\" step now allows data variables to be used for both of its parameters, making it more flexible and useful.",[107,56277,56279],{"id":56278},"improvements-to-date-step","Improvements to date step",[112,56281],{},[26,56283,56284],{},"The existing \"Current Date and Time\" step has been overhauled, allowing you to specify custom dates - previously, javascript had to be used for this. In addition to using the current date and time, you can also generate a date for either the last day of the previous month, first day of the month, or a number of days in the past of future.",[26,56286,56287],{},"In addition, formatting options have been expanded for times, primarily to make them more compatible with file names.",[1906,56289],{"src":56290,"alt":56291},"\u002Freleases\u002Fday.jpg","updated date step in axiom.ai",[107,56293,56295],{"id":56294},"upgrade-your-axiom-steps","Upgrade your axiom steps",[112,56297],{},[26,56299,56300],{},"We often release updated versions of steps in our releases. By default, your existing axioms keep you on the previous version of a step to maintain backwards compatibility, and in order to upgrade and take advantage of new features you were required to delete and re-add the step - rather a pain.",[26,56302,56303],{},"Now we've provided a button which automatically upgrades your old step to the new format, and automatically remaps your existing data, which should make taking advantage of new features in your older automations much more convenient.",[107,56305,56307],{"id":56306},"edit-token-selections","Edit token selections",[112,56309],{},[26,56311,56312],{},"Now you can click on a token in order to edit your selection, rather than having to remove and re-add the token. Handy!",[107,56314,56316],{"id":56315},"delete-multiple-steps-at-once","Delete multiple steps at once",[112,56318],{},[26,56320,56321],{},"The move and copy selection steps have been updated to include a \"Delete all\" function, so now you can clear out multiple steps with a few clicks.",[1906,56323],{"src":56324,"alt":56325},"\u002Freleases\u002Fdelete-all.jpg","select and delete multiple steps in axiom.ai",[107,56327,56329],{"id":56328},"new-templates","New templates",[112,56331],{},[26,56333,56334],{},"Several more templates have been added to get you started quicker with your automations:",[186,56336,56337,56340,56343,56346,56349],{},[189,56338,56339],{},"How to automate downloading files",[189,56341,56342],{},"How to automate taking screenshots",[189,56344,56345],{},"How to automate Apollo.io lists",[189,56347,56348],{},"How to automate data from LinkedIn to ClickUp",[189,56350,56351],{},"How to scrape Album data from Spotify",[107,56353,56355],{"id":56354},"new-api-endpoint-to-retrieve-google-sheet-data","New API endpoint to retrieve google sheet data",[112,56357],{},[26,56359,56360],{},"We've added a new API endpoint that lets you see the current running status of a bot and automatically extracts any google sheet data that was written, returning it back to you. This should come in handy for those who want to integrate axiom into other automation systems and would prefer not to manually check google sheets.",[107,56362,56364],{"id":56363},"and-many-other-improvements","... and many other improvements",[112,56366],{},[186,56368,56369,56372,56375,56378,56381,56384,56387,56390,56393,56396,56399,56402,56405,56408,56411,56414,56417,56420,56423],{},[189,56370,56371],{},"Extra caching has been added to axiom which will significantly improve performance over a session",[189,56373,56374],{},"Trial time is no longer counted towards your monthly total after you subscribe",[189,56376,56377],{},"Subscriptions now roll over at the date you subscribed rather than the beginning of the month",[189,56379,56380],{},"More error message improvements to the \"Press Key(s)\" and \"Webhook\" steps",[189,56382,56383],{},"Scheduler now notifies you by email when your runtime has run out",[189,56385,56386],{},"HTML scraper now can return outer HTML if inner HTML returns no results",[189,56388,56389],{},"Interaction points are now more clear when in template setup mode",[189,56391,56392],{},"New subscriber email updated with some tips and tricks",[189,56394,56395],{},"These release notes now appear in the Chrome extension ;)",[189,56397,56398],{},"You can now delete your account from within axiom",[189,56400,56401],{},"It's now possible to retrieve your API key without regenerating it",[189,56403,56404],{},"Multiple updates to the documentation",[189,56406,56407],{},"In fields where commas are inappropriate, like in filenames, the data variable system will no longer place commas when appending multiple values",[189,56409,56410],{},"The Test Data parameter in the \"Receive data from another app\" step now consistently generates a preview",[189,56412,56413],{},"Improvements to batching and retrying code, increasing the reliability of axioms that handle large amounts of data",[189,56415,56416],{},"Fixes and improvements to the Webhook step in handling JSON and returning useful error messages",[189,56418,56419],{},"Captcha solver now works in iframes",[189,56421,56422],{},"Stopped axiom cloud from hanging when it's sent axioms with hundreds of steps",[189,56424,56425],{},"Fixed issues with custom token replacement inside sub-axioms",{"title":67,"searchDepth":68,"depth":68,"links":56427},[56428,56429,56430,56431,56432,56433,56434,56435,56436,56437,56438],{"id":56222,"depth":670,"text":56223},{"id":56241,"depth":670,"text":56242},{"id":56254,"depth":670,"text":56255},{"id":56266,"depth":670,"text":56267},{"id":56278,"depth":670,"text":56279},{"id":56294,"depth":670,"text":56295},{"id":56306,"depth":670,"text":56307},{"id":56315,"depth":670,"text":56316},{"id":56328,"depth":670,"text":56329},{"id":56354,"depth":670,"text":56355},{"id":56363,"depth":670,"text":56364},"2023-02-22",{"version":56441,"video":56442},3.16,"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FiHl-0OBRwm8?rel=0&amp","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-16-0",{"title":56212,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-16-0","s4lABcN5d_Ge98QgbllW3GOrsMu4FeB-5UIEhHjJLjQ",{"id":56448,"title":56449,"body":56450,"date":56606,"description":67,"extension":73,"meta":56607,"navigation":75,"order":71,"path":56610,"seo":56611,"stem":56612,"__hash__":56613},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-17-0.md","Better notifications, custom errors, iframe tools, and more",{"type":8,"value":56451,"toc":56597},[56452,56454,56458,56460,56463,56466,56469,56472,56476,56480,56482,56485,56488,56499,56503,56507,56509,56512,56515,56519,56523,56525,56528,56531,56535,56537,56540,56543,56547,56550,56554,56558,56560,56563,56566,56570,56572,56574],[32947,56453],{},[107,56455,56457],{"id":56456},"iframe-support-is-back","Iframe support is back",[112,56459],{},[26,56461,56462],{},"Those with good memories may recall that this feature was added a while ago, but then had to be rolled back as it caused unintended problems. Now it has returned!",[26,56464,56465],{},"This time, you will need to turn on iframe support from the settings section of your axiom.ai; each axiom.ai can have iframe support on or off as required. The default is for iframe support to be turned off.",[26,56467,56468],{},"Once iframe support is turned on, axiom.ai will be able to interact with most elements within iframes, and scrape data in them too.",[26,56470,56471],{},"As a nice bonus, automation performance on sites that make heavy use of iframes (usually for things like ads or tracking) will now be much better out of the box.",[1906,56473],{"src":56474,"alt":56475},"\u002Freleases\u002Fiframe.jpg","iframe support - axiom.ai",[107,56477,56479],{"id":56478},"improved-notifications","Improved notifications",[112,56481],{},[26,56483,56484],{},"We have enanced the notification system to be more flexible and useful, particularly for those who are using axiom.ai as part of a larger automation stack.",[26,56486,56487],{},"Now you can:",[186,56489,56490,56493,56496],{},[189,56491,56492],{},"Turn on notifications for success, failure or both.",[189,56494,56495],{},"Specify an email address to send notifications to (previously, these always went to the email associated with your account).",[189,56497,56498],{},"Send a webhook as a success or failure notification.",[1906,56500],{"src":56501,"alt":56502},"\u002Freleases\u002Fnotifications.jpg","better notifications - axiom.ai",[107,56504,56506],{"id":56505},"custom-error-logging","Custom error logging",[112,56508],{},[26,56510,56511],{},"A new step has been added, \"Add error metadata\", which lets you augment error messages with custom data. This should be help bots that run on schedules or remotely to more accurately debug issues, or to simply give better information on what failed and why.",[26,56513,56514],{},"This feature works well in conjunction with the notification enhancements.",[1906,56516],{"src":56517,"alt":56518},"\u002Freleases\u002Fmetadata.jpg","custom error message logging - axiom.ai",[107,56520,56522],{"id":56521},"customised-line-breaks-in-the-enter-text-step","Customised line breaks in the Enter Text step",[112,56524],{},[26,56526,56527],{},"Many modern messaging apps, such as Instagram, use the \"Enter\" key as a way of sending a message rather than entering a line break. This means it is quite awkward to construct a single message with many paragraphs using axiom.ai.",[26,56529,56530],{},"Now we've added a custom line break feature to help with this. When turned on, it will let you record a custom keypress value to use instead of the enter key when a new line is encountered in your input.",[107,56532,56534],{"id":56533},"better-tab-handling","Better tab handling",[112,56536],{},[26,56538,56539],{},"Two features related to handling tabs have been introduced in 3.17.",[26,56541,56542],{},"Firstly, the goto step now has a checkbox that allows you to specify that the page should be opened in a new tab. The change means axiom.ai will automatically switch the context to the new tab when you do this.",[1906,56544],{"src":56545,"alt":56546},"\u002Freleases\u002Fnewtab.jpg","open page in new window - axiom.ai",[26,56548,56549],{},"Secondly, a new step has been added that allows tabs to be closed. Context in that case switches to the last open tab.",[1906,56551],{"src":56552,"alt":56553},"\u002Freleases\u002Fclose-tab.jpg","close tab - axiom.ai",[107,56555,56557],{"id":56556},"download-page-html-step","Download page HTML step",[112,56559],{},[26,56561,56562],{},"A new step has been added which allows you to download the entire HTML of a page and save it locally.",[26,56564,56565],{},"The page is downloaded after rendering is complete, which means that all javascript has run.",[1906,56567],{"src":56568,"alt":56569},"\u002Freleases\u002Fhtm-page.jpg","automate donwloading html pages with axiom.ai",[107,56571,56036],{"id":56035},[112,56573],{},[186,56575,56576,56579,56582,56585,56588,56591,56594],{},[189,56577,56578],{},"Enter text steps now do not click into the box if a passed token value is empty.",[189,56580,56581],{},"UI tweaked on conditional logic steps to clarify what the default state does.",[189,56583,56584],{},"Fixes to cases where automations would get stuck \"In Progress\" when stopped.",[189,56586,56587],{},"After a certain number of steps have passed, axiom.ai will now restart chrome, to try and stop websites that have memory leaks from breaking long automations.",[189,56589,56590],{},"Custom selectors containing double quotation marks no longer fail.",[189,56592,56593],{},"New video guides added for steps.",[189,56595,56596],{},"New retry logic added for external requests to reduce the chance that temporary network problems or outages will stop your automation from completing.",{"title":67,"searchDepth":68,"depth":68,"links":56598},[56599,56600,56601,56602,56603,56604,56605],{"id":56456,"depth":670,"text":56457},{"id":56478,"depth":670,"text":56479},{"id":56505,"depth":670,"text":56506},{"id":56521,"depth":670,"text":56522},{"id":56533,"depth":670,"text":56534},{"id":56556,"depth":670,"text":56557},{"id":56035,"depth":670,"text":56036},"2023-03-15",{"version":56608,"video":56609},3.17,"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FXISpGffrmTU?rel=0&amp","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-17-0",{"title":56449,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-17-0","gd5vDJTNqbi_AlYStocAfMkYCyEjQnloClHemOm5RCw",{"id":56615,"title":56616,"body":56617,"date":56761,"description":67,"extension":73,"meta":56762,"navigation":75,"order":71,"path":56765,"seo":56766,"stem":56767,"__hash__":56768},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-18-0.md","Structured scraping with chatgpt, new schedule view, filters, and fixes",{"type":8,"value":56618,"toc":56753},[56619,56621,56624,56626,56629,56632,56636,56639,56647,56651,56653,56657,56660,56663,56667,56669,56672,56676,56679,56683,56685,56688,56691,56694,56698,56700,56703,56707,56709,56711],[32947,56620],{},[107,56622,39147],{"id":56623},"extract-data-with-chatgpt",[112,56625],{},[26,56627,56628],{},"A new step has been added that allows you to use ChatGPT to get structured data from raw text. Think extracting prices, email addresses, phone, numbers, names etc. from any kind of unstructured data - a blog post, product page, document etc.",[26,56630,56631],{},"This is something that is very hard to do with traditional browser automation technology. We're excited to have a path to overcoming this limitation!",[1906,56633],{"src":56634,"alt":56635},"\u002Freleases\u002Fchatgpt-axiom-step.jpg","axiom.ai and chatGPT integration for scraping data",[26,56637,56638],{},"All you need is a ChatGPT API key, which can be grabbed for free from OpenAI. This is a beta feature, so it currently has some limitations (for example, it will not work when using the cloud scheduler, only the local scheduler). If you have any feedback, please let us know!",[26,56640,56641,56642,56646],{},"This is the first step in a wider roadmap for ChatGPT integration in Axiom; a potential game-changer for browser automation. For more info, check out this blog post:  ",[659,56643,56645],{"href":56644},"\u002Fblog\u002Fchatgpt-bot-ai-automation","AI Automation - building bots with ChatGPT",". More to come in upcoming releases, stay tuned...",[107,56648,56650],{"id":56649},"new-schedule-page","New Schedule page",[112,56652],{},[1906,56654],{"src":56655,"alt":56656},"\u002Freleases\u002Fschedule.jpg","new schedule bot page in axiom.ai",[26,56658,56659],{},"For subscribers at the pro tier or above who can schedule axiom runs, there's now a new Schedules page. Here you can see a timeline of your upcoming schedules and when they last ran, with a link to edit the axiom to which the schedule is attached.",[26,56661,56662],{},"In addition, if you are running local schedules, you can now turn these off on the current computer. This is very useful when you are signed into Axiom on multiple PCs and have local schedules; switching local schedules off on all except 1 PC will allow only that PC to run your axioms, preventing duplication.",[107,56664,56666],{"id":56665},"report-filtering","Report filtering",[112,56668],{},[26,56670,56671],{},"The \"Reporting\" section has been overhauled to include new filters. Now you can search for axiom runs by name, by status, and also select a data to filter by.",[1906,56673],{"src":56674,"alt":56675},"\u002Freleases\u002Ffilter.jpg","new report filtering in axiom.ai",[26,56677,56678],{},"The main goal here is to help those of you who do a lot of remote triggering or scheduling find and debug failed runs. This is part of our roadmap on making debugging easier and more convient - more to come.",[107,56680,56682],{"id":56681},"continue-if-empty-on-google-sheets","\"Continue if empty\" on Google Sheets",[112,56684],{},[26,56686,56687],{},"With automations that read from Google Sheets, we often need to check if the sheet is empty before continuing.",[26,56689,56690],{},"As this is a common operation, a checkbox has been added to the \"Read Google Sheet\" step. If the sheet contains no data and this box is ticked, the automation will end immediately.",[1906,56692],{"src":56693,"alt":56675},"\u002Freleases\u002Fcontinue-sheet.jpg",[107,56695,56697],{"id":56696},"go-back-when-automating","Go back when automating",[112,56699],{},[26,56701,56702],{},"Sometimes it's useful to go back to the previous page during an automation run. This was handled with a javascript snippet before, but we've now added a step to make this more convenient.",[1906,56704],{"src":56705,"alt":56706},"\u002Freleases\u002Fgo-back.jpg","new go back step in axiom.ai",[107,56708,56036],{"id":56035},[112,56710],{},[186,56712,56713,56716,56719,56722,56725,56728,56731,56734,56737,56740,56743,56746],{},[189,56714,56715],{},"Updated the icon design across the extension",[189,56717,56718],{},"Fixed a rare hanging issue when a data variable contained double quotation marks",[189,56720,56721],{},"Better file name validation",[189,56723,56724],{},"You can no longer save an automation with no name",[189,56726,56727],{},"Import template link is now directly accessible from the start screen on the builder",[189,56729,56730],{},"People who used a different email to subscribe than they did to sign up can now see both emails on the account page. It is also auto-filled when accessing the customer portal.",[189,56732,56733],{},"Only one run viewer can now be open at a time when running cloud automations; this should fix a number of issues with run viewer connections being interrupted",[189,56735,56736],{},"The \"multiple click\" step now has a \"Maximum clicks\" setting",[189,56738,56739],{},"Optional click will now ignore the error thrown when the selector happens to find an unclickable element",[189,56741,56742],{},"Fix for hanging issue on empty code steps",[189,56744,56745],{},"Fix to result grouping in scraping that would sometimes cause results to be associated with irrelevant data",[189,56747,56748,56749],{},"New Helium10 template ",[659,56750,56752],{"href":56751},"\u002Fguides\u002Fhelium10","See here",{"title":67,"searchDepth":68,"depth":68,"links":56754},[56755,56756,56757,56758,56759,56760],{"id":56623,"depth":670,"text":39147},{"id":56649,"depth":670,"text":56650},{"id":56665,"depth":670,"text":56666},{"id":56681,"depth":670,"text":56682},{"id":56696,"depth":670,"text":56697},{"id":56035,"depth":670,"text":56036},"2023-04-25",{"version":56763,"video":56764},3.18,"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FplpKWigqhxs?rel=0&amp","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-18-0",{"title":56616,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-18-0","6Z-9LE-VZdvcaAjKZJHC93tEIvkb1P1DiCr07zJS4tk",{"id":56770,"title":56771,"body":56772,"date":56931,"description":67,"extension":73,"meta":56932,"navigation":75,"order":71,"path":56935,"seo":56936,"stem":56937,"__hash__":56938},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-19-0.md","New debugger, generate text with chatgpt, save to drive, and more",{"type":8,"value":56773,"toc":56922},[56774,56776,56780,56782,56785,56788,56792,56795,56799,56801,56804,56807,56811,56814,56818,56820,56823,56826,56829,56833,56837,56839,56842,56845,56849,56853,56855,56858,56862,56866,56868,56871,56873,56875],[32947,56775],{},[107,56777,56779],{"id":56778},"debugger-improvements","Debugger improvements",[112,56781],{},[26,56783,56784],{},"We've added a new sidebar to allow you to view and filter errors more easily.",[26,56786,56787],{},"You can also now view multiple warnings or errors simultaneously, and disable or re-enable \"continue on error\" without having to go via the settings page.",[1906,56789],{"src":56790,"alt":56791},"\u002Freleases\u002Faxiom-debug.jpg","axiom.ai new debbuger view and filter in out chrome extension",[26,56793,56794],{},"We plan to expand this feature in the coming months with breakpoints, inline data viewing and more - stay tuned!",[107,56796,56798],{"id":56797},"chatgpt-text-generation","ChatGPT text generation",[112,56800],{},[26,56802,56803],{},"A new step has been added which allows you to generate text using ChatGPT.",[26,56805,56806],{},"This uses the ChatGPT API so will be much faster than the equivalent step of visiting the ChatGPT website and entering the text manually. Give it a try!",[1906,56808],{"src":56809,"alt":56810},"\u002Freleases\u002Fchatgpt-prompt-to-text.jpg","axiom.ai submit a prompt and get back text in ChatGPT",[26,56812,56813],{},"This step requires an OpenAI API key to use, and will not currently run on a schedule in cloud.",[107,56815,56817],{"id":56816},"minimum-interval-lowered-to-one-minute-for-local-scheduling","Minimum interval lowered to one minute for local scheduling",[112,56819],{},[26,56821,56822],{},"Quite a few people have asked us in the past how they can trigger the desktop application from Zapier. While this isn't directly possible, it is possible to have Zapier write to a google sheet, and then process that sheet on a schedule with Axiom.",[26,56824,56825],{},"However, the minimum frequencies for scheduling (1 day for Pro, down to 15 mins for Ultimate) are really too slow for this use case. So now we've removed those limits - everyone with access to the scheduler (Pro or above) can now trigger local schedules every minute. Remember to keep an eye on your runtime if you are doing this!",[26,56827,56828],{},"The previous limits still apply to cloud schedule runs.",[1906,56830],{"src":56831,"alt":56832},"\u002Freleases\u002Fschedule-every-minute.jpg","axiom.ai schedule evey minute on th desktop",[107,56834,56836],{"id":56835},"clear-a-range-from-a-google-sheet","Clear a range from a Google Sheet",[112,56838],{},[26,56840,56841],{},"As a companion to the \"Delete rows from a Google Sheet\" step, you can now clear rows from a Google Sheet too.",[26,56843,56844],{},"Instead of deleting the row, this simply wipes an area of the sheet. This is good for cases where you want to keep formatting or formulas intact!",[1906,56846],{"src":56847,"alt":56848},"\u002Freleases\u002Fclear-data.jpg","axiom.ai clear data from Google sheet",[107,56850,56852],{"id":56851},"save-a-screenshot-to-google-drive","Save a screenshot to Google Drive",[112,56854],{},[26,56856,56857],{},"Along with saving a screenshot to your desktop, you can now save a screenshot to Google Drive too.",[1906,56859],{"src":56860,"alt":56861},"\u002Freleases\u002Fscreen-shot-drive.jpg","axiom.ai save screen shot to google drive",[107,56863,56865],{"id":56864},"new-button-to-reboot-vps","New button to reboot VPS",[112,56867],{},[26,56869,56870],{},"For those on the ultimate tier who have access to a VPS, we have now provided a button to let you reboot your own server in case you run into issues.",[107,56872,56036],{"id":56035},[112,56874],{},[186,56876,56877,56880,56883,56886,56889,56892,56895,56898,56901,56904,56907,56910,56913,56916],{},[189,56878,56879],{},"You can now pass a data variable into \"Max Cycles\" when jumping",[189,56881,56882],{},"Custom file name field now available on the \"Export CSV\" step",[189,56884,56885],{},"Download to Google Drive now returns a token for filename",[189,56887,56888],{},"Desktop app \"busy\" check no longer triggers if the desktop app is not running",[189,56890,56891],{},"Fix to incorrect display on the upcoming schedules page if a start date for a schedule wasn't set",[189,56893,56894],{},"Big reduction on email send speed to nerf spam use cases",[189,56896,56897],{},"Jump steps will now reset the result count once they've finished, which will let sub-loops work much better",[189,56899,56900],{},"Small fixes to data output consistency across the board",[189,56902,56903],{},"When supplying multiple columns for words to filter on, now all columns are used instead of just the first",[189,56905,56906],{},"Fixed an issue with duplicated file extensions when \"Force file download\" was checked",[189,56908,56909],{},"When the Iframe box is ticked, iframes are now processed in reverse order to reduce the chance of selector collisions",[189,56911,56912],{},"Fixed an issue where the trial time would appear to still be subtracted from a user's runtime on the first day after subscription",[189,56914,56915],{},"You can now use the node filesystem library (fs) in javascript steps (only when running in app)",[189,56917,56918,56919],{},"Improved template loading from ",[659,56920,56921],{"href":338},"\u002Fguides\u002F",{"title":67,"searchDepth":68,"depth":68,"links":56923},[56924,56925,56926,56927,56928,56929,56930],{"id":56778,"depth":670,"text":56779},{"id":56797,"depth":670,"text":56798},{"id":56816,"depth":670,"text":56817},{"id":56835,"depth":670,"text":56836},{"id":56851,"depth":670,"text":56852},{"id":56864,"depth":670,"text":56865},{"id":56035,"depth":670,"text":56036},"2023-05-17",{"version":56933,"video":56934},3.19,"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fh9hQb4yLUfQ?rel=0&amp","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-19-0",{"title":56771,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-19-0","9t6N-bkri-ugAb0gVBV68vK7-p85ToxLDAPREEQqLTI",{"id":56940,"title":56941,"body":56942,"date":57072,"description":67,"extension":73,"meta":57073,"navigation":75,"order":71,"path":57076,"seo":57077,"stem":57078,"__hash__":57079},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-20-0.md","Affiliates, smarter queues, overwrite files, and a 4.0 teaser",{"type":8,"value":56943,"toc":57062},[56944,56948,56950,56957,56961,56963,56966,56970,56972,56975,56979,56983,56985,56991,56995,56997,57006,57010,57014,57016,57019,57022,57026,57030,57032,57035,57037,57039],[107,56945,56947],{"id":56946},"introducing-axiomai-affiliates","Introducing axiom.ai affiliates",[112,56949],{},[26,56951,56952,56953,56956],{},"We are pleased to announce our new affiliate system! Now you can sign up as an axiom affiliate at ",[659,56954,56955],{"href":1404},"axiom.ai\u002Faffiliates"," and get a 15% referral fee for anyone you get to sign up to Axiom. Make templates, share them with your friends, and make some money while doing so!",[107,56958,56960],{"id":56959},"queueing-system-added","Queueing system added",[112,56962],{},[26,56964,56965],{},"For those of you who use Axiom as part of wider workflows with Zapier, Make or via API, we've now introduced a queueing system to reduce errors. Whenever the Axiom server is busy or you run over your concurrency limit, the system will now automatically queue up and retry the runs that could not start.",[107,56967,56969],{"id":56968},"run-axiom-in-incognito-mode","Run Axiom in Incognito Mode",[112,56971],{},[26,56973,56974],{},"You can now run Axiom in incognito mode. By default, incognito mode does not copy any session data, so it's useful for testing automations that are intended to run as scheduled or via API on our cloud servers.",[1906,56976],{"src":56977,"alt":56978},"\u002Freleases\u002Fincog-mode-axiom.jpg","axiom.ai Run Axiom in Incognito Mode",[107,56980,56982],{"id":56981},"use-chatgpt-directly-from-within-the-write-javascript-step","Use ChatGPT directly from within the \"Write Javascript\" step",[112,56984],{},[26,56986,56987,56988],{},"You can now utilise our ChatGPT helper function to quickly access OpenAI's ChatGPT API and automatically ouput the response in an Axiom-compatible data format. Find out more ",[659,56989,56143],{"href":56990},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-javascript#use-chatgpt",[107,56992,56994],{"id":56993},"docs-integrated-with-phind-ai-search","Docs integrated with phind AI search",[112,56996],{},[26,56998,56999,57000,57005],{},"Thanks to our friends at ",[659,57001,57004],{"href":57002,"rel":57003},"https:\u002F\u002Fwww.phind.com",[1218],"phind",", we have integrated a search using ChatGPT into our documentation that will provide text-based answers to your questions. The option is always available at the bottom of any search query you make on our docs site.",[1906,57007],{"src":57008,"alt":57009},"\u002Freleases\u002Fphind.jpg","Docs integrated with phind AI searc",[107,57011,57013],{"id":57012},"overwrite-files-instead-of-renaming","Overwrite files instead of renaming",[112,57015],{},[26,57017,57018],{},"When downloading files, the default behaviour of axiom is to rename files that are duplicated. In some cases this is great, but in others it eats up your disk space and makes determining which file you want to use more difficult.",[26,57020,57021],{},"To solve those problems, we've introduced a new option to overwrite files instead of renaming them. This will reduce the number of files on your system and make it very easy to use that file in automations, as the filename will remain static.",[1906,57023],{"src":57024,"alt":57025},"\u002Freleases\u002Foverwrite-files.jpg","axiom.ai Overwrite files instead of renaming",[107,57027,57029],{"id":57028},"coming-soon-axiom-40","Coming soon - Axiom 4.0",[112,57031],{},[26,57033,57034],{},"We've been hard at work on our next generation of the builder interface, which overhauls the UI and brings new abilities for nesting and combining steps that should streamline the logic of more complex axioms. More info coming soon....",[107,57036,56036],{"id":56035},[112,57038],{},[186,57040,57041,57044,57047,57050,57053,57056,57059],{},[189,57042,57043],{},"Increased maximum size for uploading files to Google Drive (now 250MB)",[189,57045,57046],{},"Fixing issues where the click confirmation would show even though it didn't work",[189,57048,57049],{},"Fixing an issue caused by undoing all the way back to 0 steps",[189,57051,57052],{},"Stopping an axiom should now always work, even if the connection to the server has been lost",[189,57054,57055],{},"Update to the Google Sheet writing logic to prevent rare errors when accessing the Sheets API",[189,57057,57058],{},"Line breaks now work in emails",[189,57060,57061],{},"Auto-update will no longer restart the axiom desktop app if an automation is running, and will wait until it can proceed safely",{"title":67,"searchDepth":68,"depth":68,"links":57063},[57064,57065,57066,57067,57068,57069,57070,57071],{"id":56946,"depth":670,"text":56947},{"id":56959,"depth":670,"text":56960},{"id":56968,"depth":670,"text":56969},{"id":56981,"depth":670,"text":56982},{"id":56993,"depth":670,"text":56994},{"id":57012,"depth":670,"text":57013},{"id":57028,"depth":670,"text":57029},{"id":56035,"depth":670,"text":56036},"2023-06-21",{"version":57074,"featuredimg":57075},"3.20","\u002Freleases\u002Faxiom-v3-20.png","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-20-0",{"title":56941,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-20-0","4NzPr5TCWQ6_tgwdXK1dxKg063LUiQWLlZsBEqliI00",{"id":57081,"title":57082,"body":57083,"date":57225,"description":67,"extension":73,"meta":57226,"navigation":75,"order":71,"path":57230,"seo":57231,"stem":57232,"__hash__":57233},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-21-0.md","Sneak peek at 4.0, open linked axioms, new steps, and more",{"type":8,"value":57084,"toc":57216},[57085,57087,57089,57091,57094,57097,57100,57106,57110,57112,57116,57119,57121,57123,57127,57130,57133,57136,57140,57142,57145,57148,57152,57154,57158,57161,57165,57167,57171,57174,57176,57178],[32947,57086],{},[107,57088,57029],{"id":57028},[112,57090],{},[26,57092,57093],{},"We've been hard at work on our next generation of the builder interface, which overhauls the UI and brings new abilities for nesting and combining steps that should streamline the logic of more complex axioms. We want to achieve this without increasing the complexity of the interface for new users.",[26,57095,57096],{},"This feature has been taking up most of our product development work time, but it's almost done! See below for a sneak peek...",[26,57098,57099],{},"We'd love to hear your feedback, so please get in touch if you have any queries.",[26,57101,57102,57103,57105],{},"We're also looking for early access testers to get an advance copy of this feature and let us know what we should change. Please email us at ",[659,57104,2364],{"href":2363}," if you'd like to be part of this group!",[107,57107,57109],{"id":57108},"open-linked-axioms-from-run-another-axiom-step","Open linked axioms from \"Run another axiom\" step",[112,57111],{},[1906,57113],{"src":57114,"alt":57115},"\u002Freleases\u002Frun-another.jpg","Run another Axiom step link to Axiom added",[26,57117,57118],{},"Now when you use the \"Run another axiom\" step, a link is available that will let you go directly to that axiom and edit it, rather than having to go back to the main axiom listing and find it from there.",[107,57120,41817],{"id":41816},[112,57122],{},[1906,57124],{"src":57125,"alt":57126},"\u002Freleases\u002Fmonitor.jpg","Disable page change monitoring in Axiom settings",[26,57128,57129],{},"On some (rare) sites, animated elements can cause Axiom to hang indefinitely.",[26,57131,57132],{},"Previously we have fixed this as issues were reported, but now there's a new option available in the \"Settings\" page that will disable all page monitoring. This skips the code that waits for a page to stop changing, which will fix indefinite hanging issues and may work to speed up some slow sites.",[26,57134,57135],{},"Please note that disabling this will likely require more manual waits to be added!",[107,57137,57139],{"id":57138},"new-pricing-options-in-the-ultimate-tier","New pricing options in the Ultimate tier",[112,57141],{},[26,57143,57144],{},"Two new tiers have been added above Ultimate to capture use cases which need a lot of runtime each month. Previously, one would have to sign up to multiple accounts or request a custom package, which was inconvenient.",[26,57146,57147],{},"You can now select from the Ultimate 500 and Ultimate 750 tier, which offer 500 and 750 hours of runtime respectively.",[107,57149,57151],{"id":57150},"monthly-option-in-scheduler","Monthly option in Scheduler",[112,57153],{},[1906,57155],{"src":57156,"alt":57157},"\u002Freleases\u002Fsettings-schedule.jpg","monthly schedule option in Axiom",[26,57159,57160],{},"You can now set schedules to trigger once a month.",[107,57162,57164],{"id":57163},"new-step-count-rows","New step: \"Count rows\"",[112,57166],{},[1906,57168],{"src":57169,"alt":57170},"\u002Freleases\u002Fcount-rows.jpg","count rows in Axiom",[26,57172,57173],{},"As its name suggests, this new step will return the number of rows in a piece of data.",[107,57175,56036],{"id":56035},[112,57177],{},[186,57179,57180,57183,57186,57189,57192,57195,57198,57201,57204,57207,57210,57213],{},[189,57181,57182],{},"Fixed a permission issue that affected Google Sheets within Team Workspaces",[189,57184,57185],{},"Updated branding on desktop app splash screen to reflect current visual design language",[189,57187,57188],{},"Step finder now updates if the desktop app is started while it's open, removing the \"download desktop app\" errors",[189,57190,57191],{},"Prevented registration from anonymous email providers to protect against spammers abusing the free tier",[189,57193,57194],{},"A payment reminder is now shown in the extension for lapsed payments",[189,57196,57197],{},"Fixed minor bug in conditional widget",[189,57199,57200],{},"Fixed an issue where reading out of range of a google sheet was treated differently to reading an empty cell",[189,57202,57203],{},"New helper article on running multiple bots, linked for users with concurrency",[189,57205,57206],{},"Fixed display issues in some error messages caused by attempting to render the HTML of the element we tried to click",[189,57208,57209],{},"Clearer error message when files not found",[189,57211,57212],{},"Changes to runtime calculation to improve performance and fix some exploits that could extra runtime",[189,57214,57215],{},"The auto-convert option in Google Drive if a file is uploaded by axiom",{"title":67,"searchDepth":68,"depth":68,"links":57217},[57218,57219,57220,57221,57222,57223,57224],{"id":57028,"depth":670,"text":57029},{"id":57108,"depth":670,"text":57109},{"id":41816,"depth":670,"text":41817},{"id":57138,"depth":670,"text":57139},{"id":57150,"depth":670,"text":57151},{"id":57163,"depth":670,"text":57164},{"id":56035,"depth":670,"text":56036},"2023-08-03",{"version":57227,"featuredimg":57228,"video":57229},"3.21","\u002Freleases\u002Faxiom-3-2-1.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FxU-Bn2NPl48?rel=0&amp","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-21-0",{"title":57082,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-21-0","R-AnlI-qppagqROGtVTcDdumN0Q-3DXognLnS_u3qxI",{"id":57235,"title":57236,"body":57237,"date":57364,"description":67,"extension":73,"meta":57365,"navigation":75,"order":71,"path":57368,"seo":57369,"stem":57370,"__hash__":57371},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-22-0.md","Last stop before 4.0, Scrape images, reorder columns, and more",{"type":8,"value":57238,"toc":57356},[57239,57243,57245,57247,57250,57256,57260,57262,57265,57269,57273,57275,57278,57281,57285,57289,57291,57294,57298,57302,57304,57307,57310,57314,57316,57318],[107,57240,57242],{"id":57241},"axiom-40-early-access-is-ready","Axiom 4.0 - early access is ready",[112,57244],{},[26,57246,57093],{},[26,57248,57249],{},"This feature has been taking up most of our product development work time, but will finally be here in the next axiom release.",[26,57251,57252,57253,57255],{},"We're also looking for early access testers to get an advance copy of this feature and let us know what we should change. We'll be in touch with those of you who have already expressed an interest - thank you! Please email us at ",[659,57254,2364],{"href":2363}," if you'd like to be part of this group.",[107,57257,57259],{"id":57258},"image-type-added-to-selector-tool","Image type added to selector tool",[112,57261],{},[26,57263,57264],{},"A new \"Image\" type has been added to the selector tool. When scraping, this will return the URL for the selected image, so no more scraping the HTML and using splits to get at them.",[1906,57266],{"src":57267,"alt":57268},"\u002Freleases\u002Fimage-selector.jpg","Axiom selector tool new image selector option",[107,57270,57272],{"id":57271},"google-drive-steps-now-usable-on-desktop","Google Drive steps now usable on desktop",[112,57274],{},[26,57276,57277],{},"Previously, the upload from Google Drive and download to Google Drive features were available only for cloud runs.",[26,57279,57280],{},"Now, they are available when running on the desktop application too.",[1906,57282],{"src":57283,"alt":57284},"\u002Freleases\u002Fgoogle-drive-local.png","Axiom upload files from desktop feature with Google Drive",[107,57286,57288],{"id":57287},"columns-in-the-multi-select-tool-can-now-be-re-ordered","Columns in the multi-select tool can now be re-ordered",[112,57290],{},[26,57292,57293],{},"If you want to change the order of columns in a scrape, you can now use the provided arrows to move the column rather than having to delete and re-select.",[1906,57295],{"src":57296,"alt":57297},"\u002Freleases\u002Fmove-column.jpg","Multi selector tool new feature for re-ordering columns",[107,57299,57301],{"id":57300},"new-notification-option-added-for-warnings","New notification option added for warnings",[112,57303],{},[26,57305,57306],{},"In previous verisons of axiom, notification options allowed you to either send notifcations on success or failure (or on both).",[26,57308,57309],{},"We've now added a third option that allows notifications to only be sent on warnings, which should be particularly useful when \"Continue on error\" is used but you still want to know if an error was encountered.",[1906,57311],{"src":57312,"alt":57313},"\u002Freleases\u002Ferror.png","new error option in notifications",[107,57315,56036],{"id":56035},[112,57317],{},[186,57319,57320,57323,57326,57329,57332,57335,57338,57341,57344,57347,57350,57353],{},[189,57321,57322],{},"Improved handling of errors when using the Chat GPT features of axiom",[189,57324,57325],{},"You can no longer run a search on the dashboard before axioms have loaded and get incorrect results",[189,57327,57328],{},"Retry logic improved when connection issues occur, which should eliminate almost all axiom run failures with 502 or 504 error codes",[189,57330,57331],{},"New 30 min option for scheduling",[189,57333,57334],{},"You can now pass variables to specify the first and last rows in Google Sheet steps",[189,57336,57337],{},"Search added to \"Run another axiom\" step interface",[189,57339,57340],{},"Fixed a rare issue where the scraper would skip to the next page before it had fully scraped the current one",[189,57342,57343],{},"Added better error handling when all browser tabs are closed during an automation",[189,57345,57346],{},"Ctrl + S shortcut added for saving an axiom",[189,57348,57349],{},"Axioms can now be deleted from the builder, instead of just from the dashboard",[189,57351,57352],{},"Improved recursion detection in \"Run another axiom\" to reduce false positive errors",[189,57354,57355],{},"Icon and tier added to dashboard when subscribed",{"title":67,"searchDepth":68,"depth":68,"links":57357},[57358,57359,57360,57361,57362,57363],{"id":57241,"depth":670,"text":57242},{"id":57258,"depth":670,"text":57259},{"id":57271,"depth":670,"text":57272},{"id":57287,"depth":670,"text":57288},{"id":57300,"depth":670,"text":57301},{"id":56035,"depth":670,"text":56036},"2023-10-30",{"version":57366,"featuredimg":57367,"releasevideo":71},"3.22","\u002Faxiom-release-v3.22.png","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-22-0",{"title":57236,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-22-0","oNuYhyZqDV2nXb2q9LYANwPmvag0zYd7a8P8kAqVuxo",{"id":57373,"title":57374,"body":57375,"date":57429,"description":67,"extension":73,"meta":57430,"navigation":75,"order":71,"path":57434,"seo":57435,"stem":57436,"__hash__":57437},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-5-0.md","Live data previews, easier navigation, new onboarding tools",{"type":8,"value":57376,"toc":57425},[57377,57380,57382,57384,57410,57412,57414],[32947,57378],{"video":57379},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FlVReiiQwnL0?rel=0&",[107,57381,55607],{"id":55606},[112,57383],{},[186,57385,57386,57389,57392,57395,57398,57401,57404,57407],{},[189,57387,57388],{},"Categories added to the step list in builder to aid navigation.",[189,57390,57391],{},"Inline previews now update in real time rather than on opening a step.",[189,57393,57394],{},"Now when a field is toggled off it uses the default value instead of the entered value.",[189,57396,57397],{},"New design for install sucess page, now with an introduction video.",[189,57399,57400],{},"Split by character filter now allows you to enter a line break.",[189,57402,57403],{},"Fixes to the synchronisation of selected columns with the page highlights in the selector tool.",[189,57405,57406],{},"New onboarding system to allow us to provide contextual “getting started” help to new signups.",[189,57408,57409],{},"New design for login page.",[107,57411,55639],{"id":55638},[112,57413],{},[186,57415,57416,57419,57422],{},[189,57417,57418],{},"You can now back out of adding a recipe or template without going all the way back to the dashboard.",[189,57420,57421],{},"Minor improvements to showing the run times in the cloud run viewer.",[189,57423,57424],{},"Improved several error messages during run.",{"title":67,"searchDepth":68,"depth":68,"links":57426},[57427,57428],{"id":55606,"depth":670,"text":55607},{"id":55638,"depth":670,"text":55639},"2022-01-03",{"version":57431,"releasevideo":57432,"featuredimg":57433},3.5,"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FlVReiiQwnL0","\u002Fversion3-5-new.jpg","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-5-0",{"title":57374,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-5-0","O2PdFgXsPq4XOC_VUEFm9tcxYtFGcemoAstZeyo5COc",{"id":57439,"title":57440,"body":57441,"date":57489,"description":67,"extension":73,"meta":57490,"navigation":75,"order":71,"path":57494,"seo":57495,"stem":57496,"__hash__":57497},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-6-0.md","Better sheets integration, loop controls, and fixes",{"type":8,"value":57442,"toc":57485},[57443,57446,57448,57450,57470,57472,57474],[32947,57444],{"video":57445},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FyLtvtx1YKVg?rel=0&",[107,57447,55607],{"id":55606},[112,57449],{},[186,57451,57452,57455,57458,57461,57464,57467],{},[189,57453,57454],{},"New interface to select Google Sheets directly from your drive account - you no longer have to copy and paste the URLs (unless you want to of course - the old way is still supported).",[189,57456,57457],{},"New interface to explicitly present the concept of looping, and to allow it to be toggled on and off. Previously the implementation of loops happened automatically, with a hidden mechanism that could be confusing if you didn’t know the trick.",[189,57459,57460],{},"Max Wait parameter removed from scrapers; it was a trap for new users.",[189,57462,57463],{},"Improved error messages for some Google Sheets problems.",[189,57465,57466],{},"We now warn you if no output step has been added (and therefore the automation won’t do anything). You are prompted to either add an output step or to run anyway, in which case the automation engine will automatically display any scraped results.",[189,57468,57469],{},"Link to documentation added to the Custom Selector interface.",[107,57471,55639],{"id":55638},[112,57473],{},[186,57475,57476,57479,57482],{},[189,57477,57478],{},"More contextual information added to tokens to help aid in understanding.",[189,57480,57481],{},"Runs that are terminated for running over their maximum allowed runtime send a more helpful error message.",[189,57483,57484],{},"Improvements to how tokens created within loops work to prevent common errors.",{"title":67,"searchDepth":68,"depth":68,"links":57486},[57487,57488],{"id":55606,"depth":670,"text":55607},{"id":55638,"depth":670,"text":55639},"2022-02-03",{"version":57491,"releasevideo":57492,"featuredimg":57493},3.6,"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FyLtvtx1YKVg","\u002Fversion3-6-new.jpg","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-6-0",{"title":57440,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-6-0","HTvlL0J4PmFda3DaY_g1uCUl9kQ36THc9wZebTbQ6Ec",{"id":57499,"title":57500,"body":57501,"date":57554,"description":67,"extension":73,"meta":57555,"navigation":75,"order":71,"path":57560,"seo":57561,"stem":57562,"__hash__":57563},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-7-0.md","Better builder errors, webhook stability, test default data, and more",{"type":8,"value":57502,"toc":57550},[57503,57505,57507,57509,57526,57528,57530],[32947,57504],{},[107,57506,55607],{"id":55606},[112,57508],{},[186,57510,57511,57514,57517,57520,57523],{},[189,57512,57513],{},"“Receive data from another app” step now allows you to add default data to make testing easier.",[189,57515,57516],{},"Data tokens can now be passed in custom selectors.",[189,57518,57519],{},"Improvements to selector tool behaviour when no content of the selected type is found.",[189,57521,57522],{},"Clarifying error messages and step instruction text across the board.",[189,57524,57525],{},"Paid-only features now much more clearly marked.",[107,57527,55639],{"id":55638},[112,57529],{},[186,57531,57532,57535,57538,57541,57544,57547],{},[189,57533,57534],{},"Improvements to validation and error reporting when triggering axiom.ai via webhook or API.",[189,57536,57537],{},"Better handling on connections being dropped during long running  axiom.ai cloud sessions, when logging out or entering sleep mode etc.",[189,57539,57540],{},"Minor brand update for consistency with new website design.",[189,57542,57543],{},"Fixing an issue with result formatting if an error occurs during a looping bot run.",[189,57545,57546],{},"Sending a webhook from  axiom.ai now works as you would expect.",[189,57548,57549],{},"Updated help videos to latest versions.",{"title":67,"searchDepth":68,"depth":68,"links":57551},[57552,57553],{"id":55606,"depth":670,"text":55607},{"id":55638,"depth":670,"text":55639},"2022-04-05",{"version":57556,"releasevideo":57557,"featuredimg":57558,"video":57559},3.7,"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FfghWBAuBMiU","\u002Fv3-7.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FfghWBAuBMiU?rel=0&amp;","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-7-0",{"title":57500,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-7-0","MVHGek0rclSpFOwe-bjY9DXQJn6K7FcLdHilVTKu9Rc",{"id":57565,"title":57566,"body":57567,"date":57625,"description":67,"extension":73,"meta":57626,"navigation":75,"order":71,"path":57631,"seo":57632,"stem":57633,"__hash__":57634},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-8-0.md","Axiom academy is live, smarter scraping, improved validation",{"type":8,"value":57568,"toc":57622},[57569,57571,57573,57575,57595,57597,57599],[32947,57570],{},[93,57572,55607],{"id":55606},[112,57574],{},[186,57576,57577,57580,57583,57586,57589,57592],{},[189,57578,57579],{},"Improvements to scraper tool which should lead to fewer missing data errors, as well as better speed in many cases.",[189,57581,57582],{},"New axiom.ai academy site, replacing old docs.",[189,57584,57585],{},"Improvements to error messages and validation across the board.",[189,57587,57588],{},"Added a “report error” button into the scraper.",[189,57590,57591],{},"“Space” is now supported when providing key presses via data.",[189,57593,57594],{},"Some puppeteer functions are now usable in javascript steps.",[107,57596,55639],{"id":55638},[112,57598],{},[186,57600,57601,57604,57607,57610,57613,57616,57619],{},[189,57602,57603],{},"If your runs are blocked by the concurrency limit, you can now stop all of your running bots in case something is stuck.",[189,57605,57606],{},"Removed confusing column selection when adding a loop token.",[189,57608,57609],{},"Several fixes to scraper preview behaviour.",[189,57611,57612],{},"Fixed a bug in the multiple file downloader that meant only one file would be downloaded when a page change occurred.",[189,57614,57615],{},"Fixed bug in “Login” step where the username was not entered under some conditions.",[189,57617,57618],{},"Fixes for several cases where passing data into a custom selector did not work as expected.",[189,57620,57621],{},"Fixed conditional widgets when criteria were provided by data from another step.",{"title":67,"searchDepth":68,"depth":68,"links":57623},[57624],{"id":55638,"depth":670,"text":55639},"2022-05-05",{"version":57627,"releasevideo":57628,"featuredimg":57629,"video":57630},3.8,"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fav5nk8UqqV0","\u002Fv3-8.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fav5nk8UqqV0?rel=0&amp;","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-8-0",{"title":57566,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-8-0","f9vW6g8riu1Wm6BjwJPExPIy4e1QbfGtV5uviPK6gIU",{"id":57636,"title":57637,"body":57638,"date":57691,"description":67,"extension":73,"meta":57692,"navigation":75,"order":71,"path":57696,"seo":57697,"stem":57698,"__hash__":57699},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-9-0.md","Step-by-step templates, improved scraping, click multiple, and more",{"type":8,"value":57639,"toc":57687},[57640,57642,57644,57646,57669,57671,57673],[32947,57641],{},[107,57643,55607],{"id":55606},[112,57645],{},[186,57647,57648,57651,57654,57657,57660,57663,57666],{},[189,57649,57650],{},"New scraper design and tutorial flow.",[189,57652,57653],{},"New guided step-by step flow for configuring a template.",[189,57655,57656],{},"The scheduler returns! You can now schedule axioms to run automatically on the pro tier or above.",[189,57658,57659],{},"Fixing issues in the scraper with innacurate scrolling and results counting in some cases.",[189,57661,57662],{},"New step to append two data variables together into one.",[189,57664,57665],{},"New step to click multiple similar elements in one go rather than having to loop.",[189,57667,57668],{},"You can now shorten the default waiting time for scrapers that have no results.",[107,57670,55639],{"id":55638},[112,57672],{},[186,57674,57675,57678,57681,57684],{},[189,57676,57677],{},"Fixing issues where sometimes the connection to Axiom Cloud would be lost.",[189,57679,57680],{},"More improvements to error messages and linking to a docs section on commonly encountered errors.",[189,57682,57683],{},"Now when an error is encountered within an automation that loads another axiom, the error message will indicate in which axiom the error was encountered in.",[189,57685,57686],{},"Bad filenames are now validated properly when downloading files.",{"title":67,"searchDepth":68,"depth":68,"links":57688},[57689,57690],{"id":55606,"depth":670,"text":55607},{"id":55638,"depth":670,"text":55639},"2022-06-09",{"version":57693,"featuredimg":57694,"video":57695},3.9,"\u002Fv3.9.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FincZmYhynKI?rel=0&amp;","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-9-0",{"title":57637,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-3-9-0","XYRCfOqKAO7nt3Aui7nKH99GBw12sf5XfmmGPq7_rbU",{"id":57701,"title":57702,"body":57703,"date":57926,"description":67,"extension":73,"meta":57927,"navigation":75,"order":71,"path":57931,"seo":57932,"stem":57933,"__hash__":57934},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-0-0.md","Build smarter with nesting, chatgpt 4, and cloud sessions",{"type":8,"value":57704,"toc":57908},[57705,57707,57711,57713,57716,57719,57722,57726,57728,57731,57734,57738,57740,57744,57747,57751,57755,57758,57760,57764,57767,57771,57773,57777,57780,57784,57786,57790,57793,57796,57800,57802,57806,57809,57813,57815,57819,57822,57826,57828,57832,57835,57839,57841,57845,57848,57852,57854,57858,57861,57865,57867,57871,57874,57878,57880,57884,57887,57889,57891],[32947,57706],{},[107,57708,57710],{"id":57709},"axiom-40-is-here","Axiom 4.0 is here",[112,57712],{},[26,57714,57715],{},"After many months of development, we are proud to release Axiom 4.0!",[26,57717,57718],{},"This overhaul of the UI and underlying engine lays the groundwork for the 4.x version updates, which will focus on simplifying the onboarding and increasing the power of the features available in the builder.",[26,57720,57721],{},"We've also refreshed the design of the builder, with the main focus being reducing visual noise and making everything more compact and consistent.",[107,57723,57725],{"id":57724},"introducing-nested-steps","Introducing nested steps",[112,57727],{},[26,57729,57730],{},"Axiom previously used a flat structure in the builder. This works fine for simple axioms, but for more complex use cases builds can become confusing due to the use of multiple \"Jump\" steps. Looping functionality was also limited to \"Interact\" steps like clicking, which made some more complex builds difficult or even impossible to pull off.",[26,57732,57733],{},"With axiom 4.0 you can now nest steps within other steps in a more generalised way.",[1906,57735],{"src":57736,"alt":57737},"\u002Freleases\u002Fnesting-example.jpg","new nesting features in  - axiom.ai",[21,57739,15653],{"id":37896},[1906,57741],{"src":57742,"alt":57743},"\u002Freleases\u002Floop-through.jpg","Loop through data step - axiom.ai",[26,57745,57746],{},"Similar to the old \"Interact with a page's interface\" step, but much more flexible. You can now place any step inisde a loop (including another loop).",[21,57748,57750],{"id":57749},"if-statement","If statement",[1906,57752],{"src":57753,"alt":57754},"\u002Freleases\u002Fif-condition-r.jpg","If condition step - axiom.ai",[26,57756,57757],{},"When the condition in the If statement is true, all nested steps are run. If the condition is false, all steps are skipped.",[21,57759,22049],{"id":33110},[1906,57761],{"src":57762,"alt":57763},"\u002Freleases\u002Ftry-catch.jpg","Try catch step - axiom.ai",[26,57765,57766],{},"Enhance error handling with this step for advanced builders. First, the steps in the \"try\" section are run. Then, if an error is hit, execution switches to the \"catch\" section, running those steps. This opens the door to flexible and powerful error handling, well beyond what can be done with the existing notifications system.",[107,57768,57770],{"id":57769},"new-snippets-to-get-started-faster","New snippets to get started faster",[112,57772],{},[1906,57774],{"src":57775,"alt":57776},"\u002Freleases\u002Fsnippets.jpg","start makig an axiom with snippets - axiom.ai",[26,57778,57779],{},"You can now get into building in a single click by using the new beginner snippets, which cover common design patterns in axiom. Click to add and then fill in the details as you need.",[107,57781,57783],{"id":57782},"store-cookies-for-use-in-the-cloud","Store cookies for use in the cloud",[112,57785],{},[1906,57787],{"src":57788,"alt":57789},"\u002Freleases\u002Fstored-cookies.jpg","store cookies for use in the cloud - axiom.ai",[26,57791,57792],{},"You can now optionally store local session cookies remotely. This will allow you to use your local session to connect to websites using the cloud system, which allows the use of the cloud scheduler and API calls.",[26,57794,57795],{},"Cookies are stored encrypted and the feature is opt-in and fully configurable - no cookies are saved except the ones you specify.",[107,57797,57799],{"id":57798},"enhanced-select-move-and-copy-commands","Enhanced select, move and copy commands",[112,57801],{},[1906,57803],{"src":57804,"alt":57805},"\u002Freleases\u002Fmove.jpg","organizing your steps - axiom.ai",[26,57807,57808],{},"We have cleared up and improved the move and copy commands to work with the new interface. The toolbar has also been enhanced with new features, including adding the ability to loop all the selected steps.",[107,57810,57812],{"id":57811},"improved-step-finder","Improved step finder",[112,57814],{},[1906,57816],{"src":57817,"alt":57818},"\u002Freleases\u002Fenter-text-finder.jpg","new step finder in the axiom builder - axiom.ai",[26,57820,57821],{},"The step finder has been improved with a more compact design and significantly enhanced keyboard controls. You can now move up and down the list with the cursor keys after searching, press enter to add a step, and even add multiple steps by using the \"*x\" suffix. For example, \"Enter Text*4\" will add 4 of the \"Enter Text\" step to your axiom. This will always add the highlighted step, so you can still move the cursor to another step and keep the multiplier.",[107,57823,57825],{"id":57824},"support-for-chat-gpt-40","Support for Chat GPT 4.0",[112,57827],{},[1906,57829],{"src":57830,"alt":57831},"\u002Freleases\u002Fchatgptv4.jpg","support for ChatGpt4 - axiom.ai",[26,57833,57834],{},"Chat GPT 4.0 can now be selected for the AI steps, if you have an account with this enabled. You can still use 3.5 as the default.",[107,57836,57838],{"id":57837},"internal-docs-page","Internal docs page",[112,57840],{},[1906,57842],{"src":57843,"alt":57844},"\u002Freleases\u002Finternal-docs.jpg","new internal docs display - axiom.ai",[26,57846,57847],{},"Documentation is now available from within the sidebar while you're working on an axiom. You no longer have to switch to a separate tab to get advice on your issue.",[107,57849,57851],{"id":57850},"set-your-own-run-limits","Set your own run limits",[112,57853],{},[1906,57855],{"src":57856,"alt":57857},"\u002Freleases\u002Fruntime-limit.jpg","new run limit - axiom.ai",[26,57859,57860],{},"You can now set a maximum time your axiom can run to manually cut off slow or hanging bot runs. You cannot set this higher than the maximum enforced by your account level, of course!",[107,57862,57864],{"id":57863},"improved-iframe-support-in-the-selector-tool","Improved iframe support in the selector tool",[112,57866],{},[1906,57868],{"src":57869,"alt":57870},"\u002Freleases\u002Fiframe-selector.jpg","iframe support in selector tool - axiom.ai",[26,57872,57873],{},"You can now more clearly see whether an element you want to select is inside an iframe or not, and you can enable iframe support from right within the selector tool.",[107,57875,57877],{"id":57876},"control-scraper-scroll-distance","Control scraper scroll distance",[112,57879],{},[1906,57881],{"src":57882,"alt":57883},"\u002Freleases\u002Fscroll-height-scraper.jpg","set scroll distance scraper tool - axiom.ai",[26,57885,57886],{},"In very rare cases, the smart scrolling in axiom is not able to find the next item you want. In these cases we now provide the option to manually set the scroll distance that the scraper should use, bypassing the automated system and allowing those cases to work properly.",[107,57888,56036],{"id":56035},[112,57890],{},[186,57892,57893,57896,57899,57902,57905],{},[189,57894,57895],{},"Remote and local runs are now more clearly differentiated in run reports",[189,57897,57898],{},"Minor improvements to error messages for Google Sheet steps",[189,57900,57901],{},"Step names automatically assigned for more step types",[189,57903,57904],{},"You can now update your own email address from within the extension",[189,57906,57907],{},"Fixed an issue where some downloads did not overwrite existing files correctly",{"title":67,"searchDepth":68,"depth":68,"links":57909},[57910,57911,57916,57917,57918,57919,57920,57921,57922,57923,57924,57925],{"id":57709,"depth":670,"text":57710},{"id":57724,"depth":670,"text":57725,"children":57912},[57913,57914,57915],{"id":37896,"depth":68,"text":15653},{"id":57749,"depth":68,"text":57750},{"id":33110,"depth":68,"text":22049},{"id":57769,"depth":670,"text":57770},{"id":57782,"depth":670,"text":57783},{"id":57798,"depth":670,"text":57799},{"id":57811,"depth":670,"text":57812},{"id":57824,"depth":670,"text":57825},{"id":57837,"depth":670,"text":57838},{"id":57850,"depth":670,"text":57851},{"id":57863,"depth":670,"text":57864},{"id":57876,"depth":670,"text":57877},{"id":56035,"depth":670,"text":56036},"2024-01-11",{"version":57928,"featuredimg":57929,"video":57930},"4.0","\u002Frelease-4-0.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F9NTJ8yA3xyY?rel=0&amp","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-0-0",{"title":57702,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-0-0","BjQ5QybNLiqwwZuD02nxUJP_fZdH-Gpm77uKJwgZe4U",{"id":57936,"title":57937,"body":57938,"date":58137,"description":67,"extension":73,"meta":58138,"navigation":75,"order":71,"path":58142,"seo":58143,"stem":58144,"__hash__":58145},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-1-0.md","Guided templates, step help, datepickers, partial screenshots, and more",{"type":8,"value":57939,"toc":58124},[57940,57942,57946,57948,57951,57955,57958,57962,57964,57967,57971,57975,57977,57980,57983,57987,57991,57993,57996,57999,58003,58007,58009,58012,58016,58020,58022,58025,58029,58031,58034,58038,58040,58043,58047,58051,58053,58056,58059,58063,58067,58069,58072,58076,58078,58080],[32947,57941],{},[107,57943,57945],{"id":57944},"new-guided-template-system","New guided template system",[112,57947],{},[26,57949,57950],{},"Templates have been overhauled with a new UI and inline instructions to help guide you through the process of setting up botss - whether for the first time, or when you just need to get set up quickly.",[1906,57952],{"src":57953,"alt":57954},"\u002Freleases\u002Frelease-guided-templates2.png","new nestign features in  - axiom.ai",[26,57956,57957],{},"Further improvements are being prepared to templates to make them more user friendly, so watch this space!",[107,57959,57961],{"id":57960},"inline-step-help-improved","Inline step help improved",[112,57963],{},[26,57965,57966],{},"New help and help videos are available on all steps when added to the builder.",[1906,57968],{"src":57969,"alt":57970},"\u002Freleases\u002Frelease-help-step.png","new help panel for steps - axiom.ai",[107,57972,57974],{"id":57973},"sync-all-stored-cookies","Sync all stored cookies",[112,57976],{},[26,57978,57979],{},"In 4.0, cloud storage of cookies was introduced. Cookies are stored seprately for each bot, which makes re-syncing them quite awkward if you have many bots that share the same cookies.",[26,57981,57982],{},"In 4.1, a new button has been added to globally re-sync all cookies of a particular type, which should save some time!",[1906,57984],{"src":57985,"alt":57986},"\u002Freleases\u002Frelease-global-restore-cookies.png","restore broken cookies - axiom.ai",[107,57988,57990],{"id":57989},"search-for-and-edit-a-particular-row-in-a-google-sheet","Search for and edit a particular row in a Google Sheet",[112,57992],{},[26,57994,57995],{},"A new step has been added allowing you to get the row number of a row in Google Sheets that contains some specified text. This step returns the row number so that you can use it in subsequent write operations, allowing you to edit particular parts of the sheet.",[26,57997,57998],{},"A pre-set snippet has also been added to cover this functionality.",[1906,58000],{"src":58001,"alt":58002},"\u002Freleases\u002Frelease-find-rows.png","New find rows in a Google Sheet step - axiom.ai",[107,58004,58006],{"id":58005},"new-datepicker-step","New datepicker step",[112,58008],{},[26,58010,58011],{},"Datepickers have long been annoying to deal with in browser automation, due to the number of different implementations that exist. In 4.1, we've added a new step that lets axiom.ai better understand the structure of these datepickers, making many examples much easier to automate.",[1906,58013],{"src":58014,"alt":58015},"\u002Freleases\u002Frelease-date-picker.png","New automate datepickers step - axiom.ai",[107,58017,58019],{"id":58018},"settings-page-redesign","Settings page redesign",[112,58021],{},[26,58023,58024],{},"The settings page has been getting crowded, so has been redesigned to group information hierarchically and save on screen space.",[107,58026,58028],{"id":58027},"go-back-to-previous-bot","Go back to previous bot",[112,58030],{},[26,58032,58033],{},"When editing an bot linked to a parent, the back button now allows you to return to the parent instead of just to the dashboard.",[107,58035,58037],{"id":58036},"configure-download-wait-time","Configure download wait time",[112,58039],{},[26,58041,58042],{},"The time that axiom.ai will wait for a file download is now customisable, to cover cases where the download takes a long time to start. This is particularly helpful in cases where large reports are being generated by a website on demand.",[1906,58044],{"src":58045,"alt":58046},"\u002Freleases\u002Frelease-download-time.png","set download file time - axiom.ai",[107,58048,58050],{"id":58049},"use-your-local-timezone-in-cloud-runs","Use your local timezone in Cloud runs",[112,58052],{},[26,58054,58055],{},"Previously, axiom runs would occur in the UTC timezone when running remotely. In rare cases this can cause discrepancies between the time of a run according to the server, and the time of the run locally.",[26,58057,58058],{},"To resolve these issues, there's now an option to use your local timezone for cloud runs, under Settings. Desktop runs continue to use local timezone information as usual.",[1906,58060],{"src":58061,"alt":58062},"\u002Freleases\u002Frelease-timezone.png","schedule axiom.ai's by local timezone - axiom.ai",[107,58064,58066],{"id":58065},"take-partial-screenshots","Take partial screenshots",[112,58068],{},[26,58070,58071],{},"The screenshot step can now be used to screenshot a particular element instead of only the whole page; simply select the element you want to snapshot and axiom.ai will output an image of that section.",[1906,58073],{"src":58074,"alt":58075},"\u002Freleases\u002Frelease-screen-shot-element.png","Take partial screenshots - axiom.ai",[107,58077,56036],{"id":56035},[112,58079],{},[186,58081,58082,58085,58088,58091,58094,58097,58100,58103,58106,58109,58112,58115,58118,58121],{},[189,58083,58084],{},"Token replacement fixed in conditional check steps. Old bots continue to work as in previous versions.",[189,58086,58087],{},"axiom.ai can now recommend content for new users based on their activity.",[189,58089,58090],{},"Body selector can now be used in the selector tool, improving the ease of scraping with ChatGPT or other LLMs.",[189,58092,58093],{},"Wait and random wait steps combined.",[189,58095,58096],{},"Customisable message added into extension to report on any ongoing issues more transparently.",[189,58098,58099],{},"Invoices are now kept accessible to users who have previously unsubscribed.",[189,58101,58102],{},"Fixed issue with xlsx files being interpreted as zip files when uploading to Google Drive.",[189,58104,58105],{},"Schedules can no longer be set to start in the past, as this was causing confusion in some cases.",[189,58107,58108],{},"Load times improved for large bots by only rendering steps that have been scrolled down to.",[189,58110,58111],{},"First sheet now auto-selected in Google Sheet steps instead of having an implicit default behaviour only.",[189,58113,58114],{},"Delay setting now works if no element was selected on the \"Enter Text\" step.",[189,58116,58117],{},"Updated design of approval screen for Google authentication.",[189,58119,58120],{},"Fixes to a few issues with the \"Test Data\" parameter on the \"Receive data from webhook\" step.",[189,58122,58123],{},"Fixing issues with punctuation breaking the remove words steps.",{"title":67,"searchDepth":68,"depth":68,"links":58125},[58126,58127,58128,58129,58130,58131,58132,58133,58134,58135,58136],{"id":57944,"depth":670,"text":57945},{"id":57960,"depth":670,"text":57961},{"id":57973,"depth":670,"text":57974},{"id":57989,"depth":670,"text":57990},{"id":58005,"depth":670,"text":58006},{"id":58018,"depth":670,"text":58019},{"id":58027,"depth":670,"text":58028},{"id":58036,"depth":670,"text":58037},{"id":58049,"depth":670,"text":58050},{"id":58065,"depth":670,"text":58066},{"id":56035,"depth":670,"text":56036},"2024-03-18",{"version":58139,"featuredimg":58140,"video":58141},"4.1","\u002Frelease-4-1.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FZsUacpgY3rg?rel=0&amp","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-1-0",{"title":57937,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-1-0","tNmnuDBj5aX0twDIDQVm1dNzT1i9VW0mfTrtdutdPjU",{"id":58147,"title":58148,"body":58149,"date":58279,"description":67,"extension":73,"meta":58280,"navigation":75,"order":71,"path":58284,"seo":58285,"stem":58286,"__hash__":58287},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-2-0.md","Proxy auth, conditional logic, flexible scheduling, and more",{"type":8,"value":58150,"toc":58267},[58151,58153,58157,58159,58162,58166,58170,58172,58176,58179,58183,58185,58189,58193,58195,58199,58203,58205,58208,58212,58216,58218,58221,58225,58229,58231,58234,58236,58238],[32947,58152],{},[107,58154,58156],{"id":58155},"run-axiom-with-a-proxy","Run axiom with a proxy",[112,58158],{},[26,58160,58161],{},"Quickly scaffold a bot by answering a few questions about what you are trying to do, building towards a natural language AI interface for bot building. Give it a try!",[1906,58163],{"src":58164,"alt":58165},"\u002Freleases\u002Fquickbuilder-new.jpg","New axiom.ai quick builder",[107,58167,58169],{"id":58168},"reformat-date-and-time","Reformat date and time",[112,58171],{},[107,58173,58175],{"id":58174},"quick-action-sidebar","Quick action sidebar",[26,58177,58178],{},"We have introduced a new user interface element - a contextual sidebar with quick actions. This is another area for expansion, with more detailed run reports and other options coming soon. In addition, visuals have been altered to give more room to the debugger and documentation elements, and provide a more comfortable experience.",[107,58180,58182],{"id":58181},"if-else-step","If \u002F Else step",[112,58184],{},[107,58186,58188],{"id":58187},"basic-authentication-available-for-proxies","Basic authentication available for proxies",[107,58190,58192],{"id":58191},"compare-numbers-in-conditions","Compare numbers in conditions",[112,58194],{},[1906,58196],{"src":58197,"alt":58198},"\u002Freleases\u002Fproxy-auth.jpg","New axiom.ai proxy authentication",[107,58200,58202],{"id":58201},"more-flexible-scheduling","More flexible scheduling",[112,58204],{},[26,58206,58207],{},"Onboarding slides for new users added going over the basics of axiom automations. You can view them from the menu in the top right of the dashboard!",[1906,58209],{"src":58210,"alt":58211},"\u002Freleases\u002Fonboarding-flow.jpg","onboaridng flow",[107,58213,58215],{"id":58214},"copy-steps-to-another-axiom","Copy steps to another axiom",[112,58217],{},[26,58219,58220],{},"Saving as duplicate is the current way to copy and slightly modify an existing axiom, but we have now added a new method to copy only a small set of steps to another of your axioms. This should save some time where axioms need to have similar functionality!",[1906,58222],{"src":58223,"alt":58224},"\u002Freleases\u002Fcopy-steps-to-another-axiom.jpg","copy steps between automations - axiom.ai",[107,58226,58228],{"id":58227},"add-steps-without-closing-the-step-finder","Add steps without closing the step finder",[112,58230],{},[26,58232,58233],{},"You can now add new steps without closing the step finder by using shift+click or shift+enter to select the step, allowing multiple steps to be added more quickly.",[107,58235,56036],{"id":56035},[112,58237],{},[186,58239,58240,58243,58246,58249,58252,58255,58258,58261,58264],{},[189,58241,58242],{},"Fixes to the run viewer step tracker, making it more reliable with large automations",[189,58244,58245],{},"Indicate which axiom caused a runtime notification so that re-activating disabled schedules is easier",[189,58247,58248],{},"More inuitive data variable naming on loops",[189,58250,58251],{},"Fixing text formatting issues when adding a data variable into a URL",[189,58253,58254],{},"Fixed an issue with Create Google Sheet preview creating new sheets when it shouldn't",[189,58256,58257],{},"Fixed visual issue with empty data variable previews not toggling",[189,58259,58260],{},"Corrected broken link to API documentation",[189,58262,58263],{},"\"Use Element Text\" in the selector tool now works properly in conjunction with data variables",[189,58265,58266],{},"Fixed display bugs when re-selecting a data variable that's already been set",{"title":67,"searchDepth":68,"depth":68,"links":58268},[58269,58270,58271,58272,58273,58274,58275,58276,58277,58278],{"id":58155,"depth":670,"text":58156},{"id":58168,"depth":670,"text":58169},{"id":58174,"depth":670,"text":58175},{"id":58181,"depth":670,"text":58182},{"id":58187,"depth":670,"text":58188},{"id":58191,"depth":670,"text":58192},{"id":58201,"depth":670,"text":58202},{"id":58214,"depth":670,"text":58215},{"id":58227,"depth":670,"text":58228},{"id":56035,"depth":670,"text":56036},"2024-05-20",{"version":58281,"featuredimg":58282,"video":58283},"4.2","\u002Freleases\u002Fax-43.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F8pSPg2LuONU?rel=0&amp","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-2-0",{"title":58148,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-2-0","1ytZo1cMUmprwMIL3-ADfgV5j5kHkjcJ8kesBAxv1c8",{"id":58289,"title":58290,"body":58291,"date":58384,"description":67,"extension":73,"meta":58385,"navigation":75,"order":71,"path":58387,"seo":58388,"stem":58389,"__hash__":58390},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-3-0.md","Quick builder, new sidebar, better onboarding, and more",{"type":8,"value":58292,"toc":58376},[58293,58295,58299,58301,58303,58305,58307,58309,58311,58315,58317,58319,58322,58324,58328,58330,58332,58334,58338,58340,58343,58345,58347],[32947,58294],{},[107,58296,58298],{"id":58297},"quick-builder","Quick builder",[112,58300],{},[26,58302,58161],{},[1906,58304],{"src":58164,"alt":58165},[107,58306,58175],{"id":58174},[112,58308],{},[26,58310,58178],{},[1906,58312],{"src":58313,"alt":58314},"\u002Freleases\u002Fnew-sidebar.jpg","New axiom.ai sidebar",[107,58316,58188],{"id":58187},[112,58318],{},[26,58320,58321],{},"Continuing from the proxy support released in 4.2, we now have enabled basic auth support, as well as IP auth. Look out for proxy rotations coming soon, as we continue to develop this aspect of the tool.",[1906,58323],{"src":58197,"alt":58198},[107,58325,58327],{"id":58326},"new-onboarding-flow","New onboarding flow",[112,58329],{},[26,58331,58207],{},[1906,58333],{"src":58210,"alt":58211},[107,58335,58337],{"id":58336},"general-improvements-to-error-messaging","General improvements to error messaging",[112,58339],{},[26,58341,58342],{},"Error messages across much of the application have been streamlined to be more intuitive and helpful. As well as this, error reporting in loops have been tuned to remove redundant information and to bring them more in line with how other errors are reported. Further work is planned to push this farther, so stay tuned.",[107,58344,56036],{"id":56035},[112,58346],{},[186,58348,58349,58352,58355,58358,58361,58364,58367,58370,58373],{},[189,58350,58351],{},"Fixes to the run viewer step tracker, making it more reliable with large automations.",[189,58353,58354],{},"Indicate which axiom caused a runtime notification so that re-activating disabled schedules is easier.",[189,58356,58357],{},"More inuitive data variable naming on loops.",[189,58359,58360],{},"Fixing text formatting issues when adding a data variable into a URL.",[189,58362,58363],{},"Fixed an issue with Create Google Sheet preview creating new sheets when it shouldn't.",[189,58365,58366],{},"Fixed visual issue with empty data variable previews not toggling.",[189,58368,58369],{},"Corrected broken link to API documentation.",[189,58371,58372],{},"\"Use Element Text\" in the selector tool now works properly in conjunction with data variables.",[189,58374,58375],{},"Fixed display bugs when re-selecting a data variable that's already been set.",{"title":67,"searchDepth":68,"depth":68,"links":58377},[58378,58379,58380,58381,58382,58383],{"id":58297,"depth":670,"text":58298},{"id":58174,"depth":670,"text":58175},{"id":58187,"depth":670,"text":58188},{"id":58326,"depth":670,"text":58327},{"id":58336,"depth":670,"text":58337},{"id":56035,"depth":670,"text":56036},"2024-07-22",{"version":58386,"featuredimg":58282,"video":58283},"4.3","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-3-0",{"title":58290,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-3-0","KO0U0QqsiODmAJpi1CYL6VcbdXHKXvwNtApZAiKIiF4",{"id":58392,"title":58393,"body":58394,"date":58559,"description":67,"extension":73,"meta":58560,"navigation":75,"order":71,"path":58562,"seo":58563,"stem":58564,"__hash__":58565},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-4-0.md","Live run status, step recommendations, keyboard shortcuts, and more",{"type":8,"value":58395,"toc":58549},[58396,58398,58402,58404,58407,58410,58414,58418,58420,58423,58426,58430,58434,58436,58439,58447,58451,58455,58457,58460,58471,58475,58477,58480,58483,58487,58491,58493,58496,58499,58503,58507,58509,58512,58515,58519,58521,58523],[32947,58397],{},[107,58399,58401],{"id":58400},"new-run-status-overlay","New run status overlay",[112,58403],{},[26,58405,58406],{},"For users with multiple running bots, or those that run via API or schedule, it can be difficult to keep track of what is running and what isn't.",[26,58408,58409],{},"To help with this, we have introduced a new sidebar button that shows a summary of all running bots, as well as the status of the last three completed runs. This is available in the builder and on the dashboard.",[1906,58411],{"src":58412,"alt":58413},"\u002Freleases\u002Frun-status-sidebar.jpg","New automation run status in sidebar",[107,58415,58417],{"id":58416},"enhanced-step-recommendations","Enhanced step recommendations",[112,58419],{},[26,58421,58422],{},"Previously, Beginner Snippets were available to give a quick entry point for some common actions, but these always showed no matter the current status of the axiom.",[26,58424,58425],{},"We've altered this section so that it will now show 'Recommended' steps depending on the context of your automation. This should mean less time searching the step list!",[1906,58427],{"src":58428,"alt":58429},"\u002Freleases\u002Frecommended-steps.jpg","Enhanced step recommendations when using step finder in axiom.ai",[107,58431,58433],{"id":58432},"new-keyboard-shortcuts","New keyboard shortcuts",[112,58435],{},[26,58437,58438],{},"Two new shortcuts have been added:",[186,58440,58441,58444],{},[189,58442,58443],{},"When using the scraper, Ctrl-n will add a new column",[189,58445,58446],{},"When in the builder, '+' will open the step finder",[1906,58448],{"src":58449,"alt":58450},"\u002Freleases\u002Fshort-cut-new-column.jpg","New keyboard short cut to add new column",[107,58452,58454],{"id":58453},"live-system-status-available-in-sidebar","Live system status available in sidebar",[112,58456],{},[26,58458,58459],{},"The current live system status is now displayed in the extension on the sidebar.",[186,58461,58462,58465,58468],{},[189,58463,58464],{},"Green: all is well",[189,58466,58467],{},"Orange: degraded performance",[189,58469,58470],{},"Red: system is down",[107,58472,58474],{"id":58473},"inline-json-validation-added","Inline JSON validation added",[112,58476],{},[26,58478,58479],{},"For steps that allow JSON input (currently \"Trigger Webhook\"), live JSON validation has been added.",[26,58481,58482],{},"Now if there's a syntax error in your JSON, you can see the issue before running your axiom, which should speed debugging.",[1906,58484],{"src":58485,"alt":58486},"\u002Freleases\u002Fvalidate-json.jpg","New valitdate JSON in Trigger Webhook step",[107,58488,58490],{"id":58489},"refresh-preview-button-added","Refresh preview button added",[112,58492],{},[26,58494,58495],{},"Previews automatically refresh on certain events in the builder, but in some cases (for example, if data is manually altered in a Google Sheet) the preview would not refresh.",[26,58497,58498],{},"To cover these cases, a manual refresh button has been added to the preview header. Enjoy!",[1906,58500],{"src":58501,"alt":58502},"\u002Freleases\u002Frefresh-preview.jpg","New refreash data previews",[107,58504,58506],{"id":58505},"local-storage-now-available-to-save-in-cloud","Local storage now available to save in cloud",[112,58508],{},[26,58510,58511],{},"Most of the time, sessions are possible to recreate using only a session cookie. However, a few sites also require a local storage value in order for a login session to be properly recreated.",[26,58513,58514],{},"This option has now been added. If cookie storage alone is not sufficient to recreate your session, you can try turning this on and see if it helps.",[1906,58516],{"src":58517,"alt":58518},"\u002Freleases\u002Flocal-storage-to-cloud.jpg","Send local storage to cloud on run",[107,58520,56036],{"id":56035},[112,58522],{},[186,58524,58525,58528,58531,58534,58537,58540,58543,58546],{},[189,58526,58527],{},"Notifications on run ending now accept multiple email addresses",[189,58529,58530],{},"Fixed a bug caused by inner text selectors being too long and causing a hang",[189,58532,58533],{},"Schedules no longer have to be re-enabled if runtime expires; they will automatically start working once the account is updated",[189,58535,58536],{},"Bugfix on the number option in conditional check, which only evaluated 1 digit numbers correctly",[189,58538,58539],{},"Added explicit Copy \u002F Move item into step kebab menu to make the option more clear to users",[189,58541,58542],{},"Improved description of the \"First Cell\" option in the \"Write to a Google Sheet\" step",[189,58544,58545],{},"When writing to a Google Sheet the default option is now to append data instead of clear it",[189,58547,58548],{},"Re-allowed changing the run time of a schedule if the schedule date is in the past",{"title":67,"searchDepth":68,"depth":68,"links":58550},[58551,58552,58553,58554,58555,58556,58557,58558],{"id":58400,"depth":670,"text":58401},{"id":58416,"depth":670,"text":58417},{"id":58432,"depth":670,"text":58433},{"id":58453,"depth":670,"text":58454},{"id":58473,"depth":670,"text":58474},{"id":58489,"depth":670,"text":58490},{"id":58505,"depth":670,"text":58506},{"id":56035,"depth":670,"text":56036},"2024-10-07",{"version":58561,"featuredimg":58282,"video":58283},"4.4","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-4-0",{"title":58393,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-4-0","S506wyde9ai8czZ-nNkZacuP_jGVB9dVaeJhnwhrFM0",{"id":58567,"title":58568,"body":58569,"date":58748,"description":67,"extension":73,"meta":58749,"navigation":75,"order":71,"path":58753,"seo":58754,"stem":58755,"__hash__":58756},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-5-0.md","Scrape faster, set keys once, skip steps, end runs early, and more",{"type":8,"value":58570,"toc":58738},[58571,58580,58584,58586,58589,58593,58597,58599,58608,58612,58616,58618,58621,58625,58627,58634,58638,58642,58644,58651,58655,58659,58661,58664,58668,58670,58678,58682,58684,58686],[1270,58572,58575],{"className":58573},[58574,1852],"responsive-video",[58576,58577],"iframe",{"src":58578,"frameBorder":256,"allow":58579,"allowFullScreen":75},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F-blOwL8bALE?rel=0&","accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture",[107,58581,58583],{"id":58582},"quick-select-options-added-to-the-scraper","Quick select options added to the scraper",[112,58585],{},[26,58587,58588],{},"You can now use a shortcut button to select either all page HTML, or all page text with a single click. This is helpful when combined with ChatGPT data extraction, and also lets multiple different layouts of pages be scraped more easily.",[1906,58590],{"src":58591,"alt":58592},"\u002Freleases\u002Fquick-select.webp","Scrape all HTML or text from the webpage with axiom.ai's new quick select settings in the get data step.",[107,58594,58596],{"id":58595},"new-api-key-management-interface","New API key management interface",[112,58598],{},[26,58600,58601,58602,6205,58605,58607],{},"For ",[659,58603,58604],{"href":26084},"OpenAI",[659,58606,824],{"href":771}," keys, there is now a dedicated place these keys are stored globally so that you do not have to re-enter the same key in multiple automations. You can still override the default key with a different value, if you'd like.",[1906,58609],{"src":58610,"alt":58611},"\u002Freleases\u002Fchat-gpt-api-key.webp","store chatgpt api key globabbly",[107,58613,58615],{"id":58614},"update-status-now-displayed-on-desktop-application","Update status now displayed on desktop application",[112,58617],{},[26,58619,58620],{},"Previously, the desktop application would automatically update in the background with limited messaging. Now, the desktop splash screen will display a message about what state it's in and what it's doing.",[107,58622,58624],{"id":58623},"improved-receive-data-from-another-app-step","Improved \"Receive data from another app\" step",[112,58626],{},[26,58628,58629,58630,58633],{},"With new ",[659,58631,58632],{"href":5562},"API guides",", improved documentation and a much cleaner design, we hope this step now should be a lot easier to understand and use for those triggering an automation from other systems.",[1906,58635],{"src":58636,"alt":58637},"\u002Freleases\u002Frecieve-data-step-redesign.webp","New design for Receive data from another app step",[107,58639,58641],{"id":58640},"optional-enter-text-step","Optional enter text step",[112,58643],{},[26,58645,58646,58647,58650],{},"Just as with clicks, you can now set ",[659,58648,58649],{"href":17231},"enter text"," steps to be optional. Useful if you have fields that don't always appear in a form, and you don't want them to raise an error.",[1906,58652],{"src":58653,"alt":58654},"\u002Freleases\u002Fenter-text.webp","Enter text step, set to optional.",[107,58656,58658],{"id":58657},"open-axiomai-with-the-keyboard","Open axiom.ai with the keyboard",[112,58660],{},[26,58662,58663],{},"As part of the ongoing push to incorporate more keyboard shortcuts, the axiom.ai [builder](\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder can now be opened using a Chrome shortcut. By default, this is set to Alt + Shift + X on Windows and Linux, and Option + Shift + X on OSX. This is a default, and can be configured as you please.",[107,58665,58667],{"id":58666},"new-end-run-step","New \"End Run\" step",[112,58669],{},[26,58671,58672,58673,58677],{},"Adding this step will end the run immediately - use it inside an ",[659,58674,58676],{"href":58675},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogic#run-a-set-of-steps-depending-on-an-if-condition","if statement"," to save on runtime!",[1906,58679],{"src":58680,"alt":58681},"\u002Freleases\u002Fend-run-step.webp","New end bot run step",[107,58683,56036],{"id":56035},[112,58685],{},[186,58687,58688,58691,58694,58697,58705,58708,58711,58714,58717,58720,58723,58729,58732],{},[189,58689,58690],{},"Messaging for Google Docs \u002F Sheets auth flow improved when authentication fails",[189,58692,58693],{},"Error message made more obvious when axiom.ai login failed",[189,58695,58696],{},"Fixed issues where hanging automation would ignore the user's runtime limit setting",[189,58698,58699,58700,58704],{},"Improved ",[659,58701,58703],{"href":58702},"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002F","error message"," when trying to run in cloud with bot blocking on",[189,58706,58707],{},"Removed dependency on Google Drive API in the spreadsheet picker interface",[189,58709,58710],{},"Improved authentication handling between Google Drive and Google Sheets",[189,58712,58713],{},"Fixed an issue where the CSV download and Display Message steps did not trigger during locally scheduled runs",[189,58715,58716],{},"New write CSV step that works much more like the Download File step. The old step is deprecated but will still work on existing automations.",[189,58718,58719],{},"Fixed the selector tool vanishing on some pages",[189,58721,58722],{},"Improved reliability of run state tracking in the extension",[189,58724,58725,58728],{},[659,58726,58727],{"href":24705},"Proxies"," can now be used when bot detection bypassing is switched on",[189,58730,58731],{},"Made it more clear that local schedules can run every minute, on all tiers",[189,58733,58734,58735,58737],{},"Fixed some inconsistencies in the naming of ",[659,58736,26048],{"href":963}," steps",{"title":67,"searchDepth":68,"depth":68,"links":58739},[58740,58741,58742,58743,58744,58745,58746,58747],{"id":58582,"depth":670,"text":58583},{"id":58595,"depth":670,"text":58596},{"id":58614,"depth":670,"text":58615},{"id":58623,"depth":670,"text":58624},{"id":58640,"depth":670,"text":58641},{"id":58657,"depth":670,"text":58658},{"id":58666,"depth":670,"text":58667},{"id":56035,"depth":670,"text":56036},"2024-12-02",{"version":58750,"canonicalUrl":58751,"featuredimg":71,"video":58752},"4.5","\u002Frelease-notes\u002F","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F-blOwL8bALE?rel=0&amp;","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-5-0",{"title":58568,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-5-0","zNaRlJjJe6luJDnUZQziPilypbcrNdvuSgrcmKAxjV4",{"id":58758,"title":58759,"body":58760,"date":58909,"description":67,"extension":73,"meta":58910,"navigation":75,"order":71,"path":58913,"seo":58914,"stem":58915,"__hash__":58916},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-6-0.md","Excel steps, folder sorting, GPT-4o smarts, end loop control, quick filters, and more",{"type":8,"value":58761,"toc":58899},[58762,58764,58768,58770,58773,58777,58781,58783,58786,58790,58794,58796,58799,58803,58807,58809,58812,58816,58820,58822,58825,58829,58833,58835,58838,58840,58842,58890,58894,58896],[32947,58763],{},[107,58765,58767],{"id":58766},"excel-read-and-write-steps","Excel read and write steps",[112,58769],{},[26,58771,58772],{},"We've expanded our integrations by introducing Excel read and write steps. Similar to our existing Google Sheets steps, these new Excel steps allow you to automate data extraction and input within Excel spreadsheets. This feature brings greater flexibility for those of you who prefer to work with Microsoft Excel files instead of Google Sheets.",[1906,58774],{"src":58775,"alt":58776},"\u002Freleases\u002Fms-excel.webp","New to axiom.ai read and write to Excel by Microsoft",[107,58778,58780],{"id":58779},"axiom-listings-sort-with-folders","Axiom listings - sort with folders",[112,58782],{},[26,58784,58785],{},"Axiom listings now support sorting your automations by adding them to a folder, allowing you to better organize and manage your automation workflows. This enhancement should make it easier to find and access the automations you need.",[1906,58787],{"src":58788,"alt":58789},"\u002Freleases\u002Ffolders.webp","New to axiom.ai sort your automations into folders",[107,58791,58793],{"id":58792},"end-loop-step","End Loop step",[112,58795],{},[26,58797,58798],{},"A new \"End Loop\" step has been added, providing better control over loop execution. This step allows you to explicitly terminate a loop under specific conditions, preventing unnecessary iterations and improving automation performance.",[1906,58800],{"src":58801,"alt":58802},"\u002Freleases\u002Fend-run.webp","New to axiom.ai end loop step",[107,58804,58806],{"id":58805},"integration-of-gpt-4o-and-gpt-4o-mini-models","Integration of GPT-4o and GPT-4o mini models",[112,58808],{},[26,58810,58811],{},"We've upgraded our AI capabilities by integrating OpenAI's latest GPT-4o and GPT-4o Mini models. These models provide faster and more accurate text processing for AI-driven automation steps, enhancing data extraction, content generation, and decision-making workflows.",[1906,58813],{"src":58814,"alt":58815},"\u002Freleases\u002Fchatgpt-models.webp","Latest models for ChatGPT",[107,58817,58819],{"id":58818},"new-filter-button-for-data-preview","New \"+ Filter\" button for data preview",[112,58821],{},[26,58823,58824],{},"To enhance data management, we've added a \"+ Filter\" button to the data preview interface. This acts as a quick shortcut to add data filtering steps to your automations, hopefully speeding up the building process.",[1906,58826],{"src":58827,"alt":58828},"\u002Freleases\u002Ffilters-preview.webp","New to axiom.ai open filters from data preview",[107,58830,58832],{"id":58831},"predicted-runtime-usage-warning","Predicted runtime usage warning",[112,58834],{},[26,58836,58837],{},"We've introduced a new feature that predicts runtime usage for automations and warns you if you will run out of runtime in the next week, before your runtime is topped up. This should help you avoid situations where your runtime expires and your automations start failing!",[107,58839,56036],{"id":56035},[112,58841],{},[186,58843,58844,58847,58850,58853,58856,58859,58862,58865,58868,58871,58874,58877,58884,58887],{},[189,58845,58846],{},"Improved in-app messaging and support for Google Sheets token expiry",[189,58848,58849],{},"Added a link to a dedicated troubleshooting page for the \"failed to start\" error",[189,58851,58852],{},"Added the ability to close in-extension documentation",[189,58854,58855],{},"Improved text clarity for Google Sheets grant permission and required step",[189,58857,58858],{},"More than 10 URLs can now be displayed on the stored cookies tab",[189,58860,58861],{},"Fixed an issue where the add new step shortcut interrupted the javascript input box",[189,58863,58864],{},"Ensured new scrape page data buttons only appear on scrapers and not on unrelated UI elements",[189,58866,58867],{},"Reworked instructions for the \"Solve Captcha\" step for better clarity",[189,58869,58870],{},"Fixed an issue where the \"Extract data with ChatGPT\" input box was too small",[189,58872,58873],{},"Corrected an incorrect link in bot detection bypass settings",[189,58875,58876],{},"Changing the column type in the selector tool now also switches column",[189,58878,58879,58880,58883],{},"Fixed an issue where clearing token text boxes occasionally left behind a ",[145,58881,58882],{},"\u003Cbr>"," tag",[189,58885,58886],{},"Fixed an error that prevented automation imports when they contained a \"Remove Duplicates\" step",[189,58888,58889],{},"Resolved display issues with step titles and token displays when nested inside loops",[107,58891,58893],{"id":58892},"known-issues","Known issues",[112,58895],{},[26,58897,58898],{},"When updating the desktop application, there may be instances where you receive an error. If you experience an error while the application is updating, quit the application and reopen it and the update should complete as expected - we have already fixed this issue for later releases.",{"title":67,"searchDepth":68,"depth":68,"links":58900},[58901,58902,58903,58904,58905,58906,58907,58908],{"id":58766,"depth":670,"text":58767},{"id":58779,"depth":670,"text":58780},{"id":58792,"depth":670,"text":58793},{"id":58805,"depth":670,"text":58806},{"id":58818,"depth":670,"text":58819},{"id":58831,"depth":670,"text":58832},{"id":56035,"depth":670,"text":56036},{"id":58892,"depth":670,"text":58893},"2025-03-24",{"version":58911,"video":58912},"4.6","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fv_FLqUB7yI4?rel=0&amp;","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-6-0",{"title":58759,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-6-0","G1fGd5r1_5gRAdYPqK-_HJXo60zBpENwu2AehSWBzjs",{"id":58918,"title":58919,"body":58920,"date":59078,"description":67,"extension":73,"meta":59079,"navigation":75,"order":71,"path":59082,"seo":59083,"stem":59084,"__hash__":59085},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-7-0.md","Proxy rotation, AI updates, new run options and more",{"type":8,"value":58921,"toc":59066},[58922,58924,58928,58930,58933,58937,58941,58943,58946,58950,58954,58956,58959,58963,58967,58969,58972,58976,58980,58982,58985,58989,58991,58994,58998,59002,59004,59007,59011,59015,59017,59020,59024,59026,59029,59032,59034],[32947,58923],{},[107,58925,58927],{"id":58926},"run-dropdown","Run dropdown",[112,58929],{},[26,58931,58932],{},"A new dropdown has been added to the run button to surface some of the more useful runtime settings - cookie storage, scheduling, bot detection bypass and notifications.",[1906,58934],{"src":58935,"alt":58936},"\u002Freleases\u002Frun-menu.webp","New run menu dropdown in axiom.ai",[107,58938,58940],{"id":58939},"proxy-rotation","Proxy rotation",[112,58942],{},[26,58944,58945],{},"You can now specify a list of proxies to use; axiom will rotate through them randomly during runs.",[1906,58947],{"src":58948,"alt":58949},"\u002Freleases\u002Frotate-proxy.webp","Rotate your proxies in axiom.ai",[107,58951,58953],{"id":58952},"new-ai-step-and-new-providers","New AI step and new providers",[112,58955],{},[26,58957,58958],{},"We have revamped the AI step to both simplify the UI and to integrate new providers, with model options now provided from Claude.ai, Deepseek and Perplexity. You will need an API key for each of these providers to use these new models.",[1906,58960],{"src":58961,"alt":58962},"\u002Freleases\u002Fintergrate-ai.webp","Intergrate with any ai",[107,58964,58966],{"id":58965},"option-to-automatically-re-sync-a-cookie-during-axiom-runs","Option to automatically re-sync a cookie during axiom runs",[112,58968],{},[26,58970,58971],{},"You can now optionally turn on the ability to automatically re-sync cookies if they change while axiom is running. In some cases this should cut down significantly on the number of manual re-syncs you need to do to keep an automation running.",[1906,58973],{"src":58974,"alt":58975},"\u002Freleases\u002Fauto-re-sync.webp","re-sync cookies in axiom.ai",[107,58977,58979],{"id":58978},"new-api-routes","New API routes",[112,58981],{},[26,58983,58984],{},"We've added some new utility routes to our API: Get remaining runtime, get list of automations, and get last n run reports.",[107,58986,58988],{"id":58987},"optionally-block-resources","Optionally block resources",[112,58990],{},[26,58992,58993],{},"A new setting has been added to allow you to specify resource blocking rules for images, files etc. This can be used on heavy pages to speed up runs and reduce memory usage.",[1906,58995],{"src":58996,"alt":58997},"\u002Freleases\u002Fblock-resources.webp","speed up scraping block resources axiom.ai",[107,58999,59001],{"id":59000},"restart-chromium-step","Restart Chromium step",[112,59003],{},[26,59005,59006],{},"On some sites, Chrome can run out of memory during long automations. We've added a step which restarts the tab when triggered, clearing any memory buildup on such sites.",[1906,59008],{"src":59009,"alt":59010},"\u002Freleases\u002Frestart-browser.webp","restart chromium to prevent running out of memory",[107,59012,59014],{"id":59013},"general-performance-improvements","General performance improvements",[112,59016],{},[26,59018,59019],{},"We've made a number of changes to improve the performance of axiom in certain edge cases. This involves reducing the memory usage of the app during long automations, preventing issues with Chrome crashes when a large number of sites are used in one automations, and significantly improving the performance of the auto-wait functionality on long or complex pages.",[107,59021,59023],{"id":59022},"re-sync-cookies-from-the-go-to-page-step","Re-sync cookies from the \"Go to page\" step",[112,59025],{},[26,59027,59028],{},"We've added a new button so you can re-sync any cloud cookie storage directly from the \"Go to page\" step, rather than needing to go via the settings.",[1906,59030],{"src":59031,"alt":58975},"\u002Freleases\u002Fresync-cookies.webp",[107,59033,56036],{"id":56035},[186,59035,59036,59039,59042,59045,59048,59051,59054,59057,59060,59063],{},[189,59037,59038],{},"Cleaned up some request spam when authenticating a Google account",[189,59040,59041],{},"Made sure step finder does not open in collapsed state when it shouldn't",[189,59043,59044],{},"Fixed a bug where the infinite loader on the axiom listing would stop working in some cases",[189,59046,59047],{},"Added ability to search the run report page by error message",[189,59049,59050],{},"Removed invisible reCaptchaV3 from list of captchas solved by the captcha solving step",[189,59052,59053],{},"Fixed an issue with reading from sheets with colons or exclamation marks in their names",[189,59055,59056],{},"Delete modal now displays the automation name to reduce the chance of deleting the wrong thing",[189,59058,59059],{},"Hourly intervals in the scheduler now preserve the starting minute, preventing schedules from drifting from their chosen start time",[189,59061,59062],{},"Downgrading from pro to started now properly disables local schedules",[189,59064,59065],{},"Fixed an issue where token replacement for javascript if statements inside loops did not replace properly",{"title":67,"searchDepth":68,"depth":68,"links":59067},[59068,59069,59070,59071,59072,59073,59074,59075,59076,59077],{"id":58926,"depth":670,"text":58927},{"id":58939,"depth":670,"text":58940},{"id":58952,"depth":670,"text":58953},{"id":58965,"depth":670,"text":58966},{"id":58978,"depth":670,"text":58979},{"id":58987,"depth":670,"text":58988},{"id":59000,"depth":670,"text":59001},{"id":59013,"depth":670,"text":59014},{"id":59022,"depth":670,"text":59023},{"id":56035,"depth":670,"text":56036},"2025-07-07",{"version":59080,"video":59081},"4.7","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F0VHj5sxmfmQ?si=pUk3YOD1YHT1HNpX?rel=0&amp;","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-7-0",{"title":58919,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-7-0","PRmjFE9lZ4eGXBi0l2sQ9Dz1I44fl14Ajh-zYjh6gxk",{"id":59087,"title":59088,"body":59089,"date":59235,"description":67,"extension":73,"meta":59236,"navigation":75,"order":71,"path":59239,"seo":59240,"stem":59241,"__hash__":59242},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-8-0.md","Axiom.ai v4.8",{"type":8,"value":59090,"toc":59226},[59091,59093,59097,59099,59102,59106,59110,59112,59115,59117,59121,59123,59126,59130,59134,59136,59139,59143,59147,59149,59156,59160,59164,59166,59169,59173,59176],[32947,59092],{},[107,59094,59096],{"id":59095},"unlimited-desktop-concurrency","Unlimited Desktop concurrency",[112,59098],{},[26,59100,59101],{},"The desktop application now supports unlimited concurrency, allowing for any number of automations to run simultaneously on your local machine, limited only by your computer's resources. Furthermore, users can now individually enable or disable concurrency for specific axioms, for both desktop and cloud runs, giving finer control over resource usage and task execution logic.",[1906,59103],{"src":59104,"alt":59105},"\u002Freleases\u002Fconcurrency-desktop.webp","run unlimited bots on the desktop using axiom.ai",[107,59107,59109],{"id":59108},"airtable-integration","Airtable integration",[112,59111],{},[26,59113,59114],{},"We have now integrated axiom with Airtable, providing dedicated steps for both reading and writing data to Airtable bases. This simplifies data exchange with one of the leading no-code database platforms. Users can now seamlessly pull data from Airtable into an axiom or push collected data directly into an Airtable base.",[1906,59116],{"src":58935,"alt":58936},[107,59118,59120],{"id":59119},"file-read-capabilities","File read capabilities",[112,59122],{},[26,59124,59125],{},"Axiom.ai can now read a local file (on Desktop) or from Google Drive (on Cloud or Desktop). This new step allows users to read the contents of a specified file (such as a CSV, TXT, or JSON file) directly within an automation. The data read from the file can then be passed to subsequent steps in the bot, such as filters, AI, javascript or anything else you can think of!",[1906,59127],{"src":59128,"alt":59129},"\u002Freleases\u002Fread-files.webp","Import data from files and pass to subsequent steps in axiom.ai",[107,59131,59133],{"id":59132},"runtime-usage-email-warnings","Runtime usage email warnings",[112,59135],{},[26,59137,59138],{},"To help users manage their resources proactively, Axiom will now automatically send email warnings when your runtime usage reaches certain thresholds. You'll receive alerts at 80%, 90%, and 100% of your allocated runtime. These notifications are designed to prevent unexpected interruptions to your automation runs. Users have the flexibility to disable these warnings in the application's options settings if they prefer.",[1906,59140],{"src":59141,"alt":59142},"\u002Freleases\u002Fruntime-warnings.webp","Get email notifications when your runtime is almost out in axiom.ai",[107,59144,59146],{"id":59145},"new-step-metadata-scraping","New step: Metadata scraping",[112,59148],{},[26,59150,59151,59152,59155],{},"A dedicated step has been added for scraping metadata from any web page. This feature provides a targeted way to extract valuable information typically found in the ",[145,59153,59154],{},"\u003Chead>"," section of a webpage's HTML, such as the page title, description, keywords, or Open Graph tags. The step is configurable, allowing you to specify which metadata attributes you want to collect.",[1906,59157],{"src":59158,"alt":59159},"\u002Freleases\u002Fscrape-meta.webp","extract meta data from web pages in axiom.ai",[107,59161,59163],{"id":59162},"cloud-bot-bypass-enabled","Cloud Bot Bypass enabled",[112,59165],{},[26,59167,59168],{},"Cloud bots are now able to bypass certain bot detection mechanisms, as on Desktop. This new feature provides an option to run automations in the cloud with configurations that are more resilient to anti-bot measures, potentially allowing for more reliable and successful runs on websites with sophisticated bot protection.",[1906,59170],{"src":59171,"alt":59172},"\u002Freleases\u002Fcloudflare-bypass-cloud.webp","bypass cloudflare on the desktop and in the cloud using axiom.ai",[107,59174,59175],{"id":56035},"Minor Fixes",[186,59177,59178,59181,59184,59187,59190,59193,59196,59199,59202,59205,59208,59211,59214,59217,59220,59223],{},[189,59179,59180],{},"Tasks now no longer incorrectly remain stuck \"In Progress\" if they have failed but could not update the server with the failure state",[189,59182,59183],{},"Prevented axiom application from crashing if internet disconnects during a run",[189,59185,59186],{},"Fixed rare cases of filename collisions when two axioms are running concurrently in the same environment",[189,59188,59189],{},"Fixed issue where switching filters on run reports while loading caused incorrect results",[189,59191,59192],{},"Fixed occasional issue where previous selector entries would be incorrectly cleared when opening the selector tool",[189,59194,59195],{},"Fixed issue where changing folders during task loading on the dashboard resulted in incorrect data",[189,59197,59198],{},"Added Gemini as an AI provider",[189,59200,59201],{},"Fixed issues where screenshots would occasionally fire before the canvas had completed rendering",[189,59203,59204],{},"Fixed an issue where when removing a step, the preview was not entirely deleted",[189,59206,59207],{},"Fixed clicking '+Filter' in the output preview occasionally failed to open the Step Finder",[189,59209,59210],{},"Fixed issue with HTML passed to the Integrate AI step causing the axiom to stop",[189,59212,59213],{},"Fixed rare issue where a duplicate schedule could be created, resulting in double axiom runs",[189,59215,59216],{},"Wildcards improved when blocking resources",[189,59218,59219],{},"Fixed issue where current date and time widget was ignoring the \"use local timezone\" setting",[189,59221,59222],{},"MIME type can be optionally forced for file downloads to work around issues where the correct file extension is not present in a download URL",[189,59224,59225],{},"Improved API key display",{"title":67,"searchDepth":68,"depth":68,"links":59227},[59228,59229,59230,59231,59232,59233,59234],{"id":59095,"depth":670,"text":59096},{"id":59108,"depth":670,"text":59109},{"id":59119,"depth":670,"text":59120},{"id":59132,"depth":670,"text":59133},{"id":59145,"depth":670,"text":59146},{"id":59162,"depth":670,"text":59163},{"id":56035,"depth":670,"text":59175},"2025-10-20",{"version":59237,"video":59238},"4.8","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FQy7KfvCqjR4?rel=0&amp;","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-8-0",{"title":59088,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-8-0","A9zGTBLrhGVl_6SNzwc-D6r6sV41aX_dPIThmx4ncJc",{"id":59244,"title":59245,"body":59246,"date":59372,"description":67,"extension":73,"meta":59373,"navigation":75,"order":71,"path":59376,"seo":59377,"stem":59378,"__hash__":59379},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-9-0.md","Axiom.ai v4.9",{"type":8,"value":59247,"toc":59364},[59248,59250,59254,59256,59259,59263,59267,59269,59272,59276,59280,59282,59285,59289,59293,59295,59298,59302,59306,59308,59311,59315,59317],[32947,59249],{},[107,59251,59253],{"id":59252},"team-requests-for-ultimate-tier","Team requests for Ultimate tier",[112,59255],{},[26,59257,59258],{},"Ultimate tier users can now request team access, allowing runtimes to be shared across selected accounts for improved collaboration, billing and resource management.",[1906,59260],{"src":59261,"alt":59262},"\u002Freleases\u002Fteam-account.webp","New to axiom.ai team accounts share runtime with your team.",[107,59264,59266],{"id":59265},"code-editor-improvements","Code editor improvements",[112,59268],{},[26,59270,59271],{},"The code editor has been significantly improved with support for templated snippets, a full-screen editing mode, and multiple quality-of-life enhancements to improve usability.",[1906,59273],{"src":59274,"alt":59275},"\u002Freleases\u002Fupdated-code-step.webp","New code snippet feature in the Javascript step, axiom.ai",[107,59277,59279],{"id":59278},"improvements-to-support-flows","Improvements to support flows",[112,59281],{},[26,59283,59284],{},"Added an improved support pane into the builder, with better instructions, shortcuts and the ability to export the currently active browser tab as an HTML file to share in case the site is behind a login.",[1906,59286],{"src":59287,"alt":59288},"\u002Freleases\u002Fnew-support-flow.webp","New support workflow in axiom.ai",[107,59290,59292],{"id":59291},"double-click-option-for-click-step","Double click option for Click step",[112,59294],{},[26,59296,59297],{},"The Click step now supports a double-click option, expanding interaction capabilities for sites that require more advanced UI actions.",[1906,59299],{"src":59300,"alt":59301},"\u002Freleases\u002Fdouble-click.webp","New double click feature in the Click element step, axiom.ai",[107,59303,59305],{"id":59304},"new-row-numbers-step","New Row Numbers step",[112,59307],{},[26,59309,59310],{},"Introduced a new data step that allows row numbers to be automatically added to datasets, making it easier to reference, debug, and post-process extracted data.",[1906,59312],{"src":59313,"alt":59314},"\u002Freleases\u002Frow-numbers.webp","New row number step in axiom.ai",[107,59316,59175],{"id":56035},[186,59318,59319,59322,59325,59328,59331,59334,59337,59340,59343,59346,59349,59352,59355,59358,59361],{},[189,59320,59321],{},"Fixed issue in Go To step where IP addresses were incorrectly prevented from loading",[189,59323,59324],{},"Fixed empty error message when “Upload a file from Google Drive” element is not found",[189,59326,59327],{},"Added refresh button to run reports",[189,59329,59330],{},"Added ability to choose fixed columns for the Append Data step when input data has variable lengths",[189,59332,59333],{},"Operating system is now shown in task reports for desktop runs",[189,59335,59336],{},"Fixed issue where inserting data into the Integrate AI token field cleared all text",[189,59338,59339],{},"Fixed issue where upgrading a step did not set the default value correctly, resulting in issues with the optional field toggles",[189,59341,59342],{},"Fixed resource blocking not working when “open in new tab” is used",[189,59344,59345],{},"Fixed override of website iframe classes breaking builder",[189,59347,59348],{},"Added data refresh button to data preview",[189,59350,59351],{},"Fixed unhandled exceptions hanging the desktop app and requiring a restart",[189,59353,59354],{},"Fixed “Do not share local storage” option being ignored on Go To Page step",[189,59356,59357],{},"Fixed UI issue on Proxy page when protocol is entered twice",[189,59359,59360],{},"Fixed YouTube video embedding in the extension",[189,59362,59363],{},"Fixed inaccuracy in the 1-minute runtime interval on the desktop scheduler",{"title":67,"searchDepth":68,"depth":68,"links":59365},[59366,59367,59368,59369,59370,59371],{"id":59252,"depth":670,"text":59253},{"id":59265,"depth":670,"text":59266},{"id":59278,"depth":670,"text":59279},{"id":59291,"depth":670,"text":59292},{"id":59304,"depth":670,"text":59305},{"id":56035,"depth":670,"text":59175},"2025-11-04",{"version":59374,"video":59375},"4.9","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FuTqrBrNWH7Q?rel=0&amp;","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-9-0",{"title":59245,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Faxiom-version-4-9-0","Y83RuKvnBJuLC2OGCPyKBl5pRyPuZk-3wBt6TcVng4s",{"id":59381,"title":42709,"body":59382,"date":71,"description":59418,"extension":73,"meta":59419,"navigation":75,"order":2623,"path":42707,"seo":59421,"stem":59422,"__hash__":59423},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Findex.md",{"type":8,"value":59383,"toc":59414},[59384,59390,59394,59396,59399,59402,59404,59407],[26,59385,59386,59387,2264],{},"The latest release is shown below. For older releases, scroll to the ",[192,59388,59389],{},"Previous releases",[107,59391,59393],{"id":59392},"latest-release","Latest release",[112,59395],{},[59397,59398],"content-latest-release",{},[107,59400,59389],{"id":59401},"previous-releases",[112,59403],{},[59405,59406],"content-release-cards",{},[26,59408,2222,59409,2226,59411,148],{},[659,59410,2225],{"href":1887},[659,59412,2231],{"href":2229,"rel":59413},[1218],{"title":67,"searchDepth":68,"depth":68,"links":59415},[59416,59417],{"id":59392,"depth":670,"text":59393},{"id":59401,"depth":670,"text":59389},"See what's new in the latest axiom.ai release, plus the full archive of previous releases covering features, fixes, and improvements.",{"metaTitle":59420},"Latest axiom.ai release notes and previous updates",{"title":42709,"description":59418},"docs\u002Fno-code-tool\u002Frelease-notes\u002Findex","PECBz8Bz3U4YSvw_VtwLBWhRa3EJVMvY5DH4lYY_8q0",{"id":59425,"title":59426,"body":59427,"date":59496,"description":67,"extension":73,"meta":59497,"navigation":75,"order":71,"path":59499,"seo":59500,"stem":59501,"__hash__":59502},"content\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Flatest.md","Axiom.ai v4.10",{"type":8,"value":59428,"toc":59491},[59429,59431,59435,59437,59440,59443,59446,59450,59454,59456,59459,59463,59465],[32947,59430],{},[107,59432,59434],{"id":59433},"run-recording-and-improved-error-logging","Run recording and improved error logging",[112,59436],{},[26,59438,59439],{},"You can now optionally turn on run recording for unattended axiom runs (such as those run from a schedule or an API call) in order to review cases where the bot may have failed to complete.",[26,59441,59442],{},"In addition, much more comprehensive browser and axiom logs are provided in run reports when this is turned on, helping with debugging.",[26,59444,59445],{},"This feature is available for Ultimate users only.",[1906,59447],{"src":59448,"alt":59449},"\u002Freleases\u002Frecord-runs.webp","record runs for better debugging axiom.ai",[107,59451,59453],{"id":59452},"delete-file-from-google-drive-step","Delete file from Google Drive step",[112,59455],{},[26,59457,59458],{},"You can now delete files from Google Drive from within an axiom, useful for cases where you need to clean up temporary files or ensure certain states for the rest of your run.",[1906,59460],{"src":59461,"alt":59462},"\u002Freleases\u002Fg-drive-delete.webp","Delete files from your Google Drive with axiom.ai",[107,59464,59175],{"id":56035},[186,59466,59467,59470,59473,59476,59479,59482,59485,59488],{},[189,59468,59469],{},"Fixed issue with clicking folder after coming back from the builder",[189,59471,59472],{},"Increased maximum file size for Google Drive uploads",[189,59474,59475],{},"Fixed a bug with using a custom profile that would cause the profile to be deleted in some cases",[189,59477,59478],{},"Open in new tab now also uses the incognito window if this is set",[189,59480,59481],{},"Can now use a token as the local folder path in the \"Read File from Google Drive\" step",[189,59483,59484],{},"Fixed an issue with bot blocking bypass not being attached to new tabs sometimes",[189,59486,59487],{},"Prevented the validator from incorrectly blocking a run when a partial token is used in a file path",[189,59489,59490],{},"Fixed a misleading message when there are no sheets in a Google account on the sheet picker, and some other cases",{"title":67,"searchDepth":68,"depth":68,"links":59492},[59493,59494,59495],{"id":59433,"depth":670,"text":59434},{"id":59452,"depth":670,"text":59453},{"id":56035,"depth":670,"text":59175},"2026-05-19",{"version":59498},"4.10","\u002Fdocs\u002Fno-code-tool\u002Frelease-notes\u002Flatest",{"title":59426,"description":67},"docs\u002Fno-code-tool\u002Frelease-notes\u002Flatest","bUn0fGP-m-BoxqeuKqqnh8PaDlseM00SNxIsKJkrK2Y",{"id":59504,"title":59505,"body":59506,"date":71,"description":60019,"extension":73,"meta":60020,"navigation":75,"order":2651,"path":60022,"seo":60023,"stem":60024,"__hash__":60025},"content\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fai-assistant.md","AI Assistant",{"type":8,"value":59507,"toc":60008},[59508,59511,59514,59517,59520,59524,59526,59539,59545,59580,59586,59590,59592,59595,59649,59653,59655,59661,59665,59754,59758,59837,59841,59908,59912,59962,59964],[26,59509,59510],{},"The AI Assistant's main job is to help you build and debug an automation.",[26,59512,59513],{},"It is an assistant, and still requires a human to be in the driving seat.",[26,59515,59516],{},"It can help you debug errors, suggest fixes and guide you through documentation with natural language.",[26,59518,59519],{},"It can also extend an automation by adding, looping, or modifying steps from a natural-language description.",[107,59521,59523],{"id":59522},"start-a-troubleshooting-conversation","Start a troubleshooting conversation",[112,59525],{},[26,59527,59528,59529,59532,59533,2344,59536,148],{},"Type ",[145,59530,59531],{},"\u002Fhelp"," and the assistant asks whether you want to ",[192,59534,59535],{},"Debug my automation",[192,59537,59538],{},"Extend my automation",[26,59540,59541,59542,59544],{},"If you choose ",[192,59543,48739],{},", the assistant offers a list of common problems and takes you to the right place:",[186,59546,59547,59550,59553,59556,59559,59562,59565,59568,59571,59574,59577],{},[189,59548,59549],{},"Incorrect data or element selected",[189,59551,59552],{},"Wrong page loading",[189,59554,59555],{},"No data output",[189,59557,59558],{},"Login or session failing",[189,59560,59561],{},"Interacting with an element failing",[189,59563,59564],{},"Wrong data mapping to a field",[189,59566,59567],{},"Wrong order of steps",[189,59569,59570],{},"Extra steps",[189,59572,59573],{},"Not looping",[189,59575,59576],{},"Need to add a new step",[189,59578,59579],{},"A specific error message",[26,59581,59541,59582,59585],{},[192,59583,59584],{},"Extend",", the assistant helps you change your automation by chat — adding, looping, or editing steps as described below.",[107,59587,59589],{"id":59588},"extend-your-automation","Extend your automation",[112,59591],{},[26,59593,59594],{},"You can ask the assistant to change the automation in plain English. It proposes the change, shows a preview, and asks before applying it.",[186,59596,59597,59609,59618,59631,59637,59643],{},[189,59598,59599,5210,59602,4468,59605,59608],{},[192,59600,59601],{},"Add steps.",[26030,59603,59604],{},"\"Add a click step after step 6\"",[26030,59606,59607],{},"\"write to a Google Sheet at the end\"",". The assistant proposes the step(s) and the position.",[189,59610,59611,5210,59614,59617],{},[192,59612,59613],{},"Loop steps.",[26030,59615,59616],{},"\"Loop steps 3 to 6\""," wraps a range of steps in a loop.",[189,59619,59620,59623,59624,16175,59626,16175,59628,59630],{},[192,59621,59622],{},"Fill a form."," Ask the assistant to fill a form and it walks you through the ",[192,59625,16065],{},[192,59627,17202],{},[192,59629,15767],{}," pattern.",[189,59632,59633,59636],{},[192,59634,59635],{},"Read and write Google Sheets."," Ask and it inserts the read-sheet \u002F find-row \u002F write-sheet trio.",[189,59638,59639,59642],{},[192,59640,59641],{},"Upload or download files."," Ask and it inserts the right file-transfer steps for local files or Google Drive.",[189,59644,59645,59648],{},[192,59646,59647],{},"Receive or trigger a webhook."," Ask and it sets up an incoming webhook (with a sample payload to test) or an outgoing webhook (you can paste a curl command for it to parse).",[107,59650,59652],{"id":59651},"what-the-assistant-can-help-with","What the assistant can help with",[112,59654],{},[26,59656,59657,59658,59660],{},"The assistant covers a lot of ground. The list below is a quick tour of the things you can ask it for. You can usually start any of them by typing what you want; the most common ones are also a click away in the ",[145,59659,59531],{}," menu.",[21,59662,59664],{"id":59663},"debugging-an-error","Debugging an error",[186,59666,59667,59676,59686,59696,59708,59717,59723,59733,59739,59748],{},[189,59668,59669,59672,59673,148],{},[192,59670,59671],{},"Error help."," When something goes wrong, the assistant looks at the error and suggests fixes. Opens automatically when a run fails, or type ",[26030,59674,59675],{},"\"error in step 3\"",[189,59677,59678,59681,59682,59685],{},[192,59679,59680],{},"Autofix."," Lets the AI try to fix the error for you by editing the automation. You'll see an ",[192,59683,59684],{},"Autofix"," button on supported errors, and the assistant might ask a quick clarifying question before making the change.",[189,59687,59688,59691,59692,59695],{},[192,59689,59690],{},"Skip non-critical errors."," Helps you tell the automation to keep going if a step fails, when that failure isn't important. Say ",[26030,59693,59694],{},"\"ignore this error\""," or pick it from the suggested fixes.",[189,59697,59698,59701,59702,59704,59705,148],{},[192,59699,59700],{},"Click not working."," When a ",[192,59703,15767],{}," step isn't hitting the right thing, the assistant offers to reselect the element, click by its text, use a custom selector, or get support. Pick \"Interacting with element failing\" or type ",[26030,59706,59707],{},"\"click not working\"",[189,59709,59710,59713,59714,148],{},[192,59711,59712],{},"Selector issues."," When a selector isn't finding the right element — iframes, hidden elements, attribute selectors and so on — the assistant walks you through the options. Pick \"Incorrect data or element selected\" or type ",[26030,59715,59716],{},"\"selector not working\"",[189,59718,59719,59722],{},[192,59720,59721],{},"Page won't load."," Helps with URL, network, VPN, and blocker issues. Offers autofix, a URL check, a login check, a network check, or support. Opens on page-load errors, or pick \"Wrong page loading\".",[189,59724,59725,59728,59729,59732],{},[192,59726,59727],{},"Empty Google Sheet."," Steps in when a ",[192,59730,59731],{},"Get data from Google Sheet"," step reads an empty sheet. Offers to open the sheet for you or set the step to continue when it's empty.",[189,59734,59735,59738],{},[192,59736,59737],{},"Cloudflare blocks."," Spots when a page is being blocked by Cloudflare and offers to turn on the bot-detection bypass. If it's already on, the assistant points you to support.",[189,59740,59741,59744,59745,59747],{},[192,59742,59743],{},"Run-in-app required."," Pops up when a ",[192,59746,19051],{}," step needs the desktop app's \"Run in app\" mode, and offers to switch it on.",[189,59749,59750,59753],{},[192,59751,59752],{},"Mac \"Chromium not supported\"."," When the desktop app shows this macOS error, the assistant walks you through gathering the system details support will need.",[21,59755,59757],{"id":59756},"editing-your-automation-by-chat","Editing your automation by chat",[186,59759,59760,59769,59778,59796,59804,59813,59825],{},[189,59761,59762,59764,59765,59768],{},[192,59763,59601],{}," Describe what you want and the assistant adds it. Type ",[26030,59766,59767],{},"\"add a step\"",", pick \"Need to add a new step\", or accept an autofix suggestion.",[189,59770,59771,59773,59774,59777],{},[192,59772,59613],{}," Wraps a range of steps in a loop. Try ",[26030,59775,59776],{},"\"loop steps 3 to 6\"",", or pick \"Not looping\".",[189,59779,59780,59782,59783,16175,59785,16175,59787,59789,59790,59793,59794,59660],{},[192,59781,59622],{}," Sets up the usual ",[192,59784,16065],{},[192,59786,17202],{},[192,59788,15767],{}," pattern for filling forms. Type ",[26030,59791,59792],{},"\"fill a form\""," or pick it from the ",[145,59795,59531],{},[189,59797,59798,59800,59801,148],{},[192,59799,59635],{}," Adds the read-sheet, find-row, and write-sheet steps in one go. Type ",[26030,59802,59803],{},"\"write to a Google Sheet\"",[189,59805,59806,59809,59810,148],{},[192,59807,59808],{},"Working with files."," Adds upload or download steps for local files or Google Drive. Type ",[26030,59811,59812],{},"\"upload a file\"",[189,59814,59815,59818,59819,2344,59822,148],{},[192,59816,59817],{},"Incoming webhook."," Sets up an endpoint so other tools — Zapier, your own service, anything that can make a request — can kick off your automation. You'll see the URL and a sample payload, and you can do a test run before saving. Type ",[26030,59820,59821],{},"\"trigger from Zapier\"",[26030,59823,59824],{},"\"webhook\"",[189,59826,59827,59830,59831,2344,59834,148],{},[192,59828,59829],{},"Send to a webhook."," Adds a step that calls an external endpoint. Paste a curl command and the assistant works out the rest. Type ",[26030,59832,59833],{},"\"send to an API\"",[26030,59835,59836],{},"\"call a webhook\"",[21,59838,59840],{"id":59839},"settings-and-scheduling","Settings and scheduling",[186,59842,59843,59856,59865,59877,59886,59898],{},[189,59844,59845,59848,59849,4468,59852,59855],{},[192,59846,59847],{},"Schedule a run."," Sets up a schedule — date, frequency, local or cloud — or turns an existing one off. Type ",[26030,59850,59851],{},"\"schedule\"",[26030,59853,59854],{},"\"run daily\"",", and so on.",[189,59857,59858,59861,59862,148],{},[192,59859,59860],{},"Schedule running at the wrong time."," Helps with timezone, daylight saving, and UTC mix-ups. Type ",[26030,59863,59864],{},"\"schedule running at the wrong time\"",[189,59866,59867,59870,59871,2344,59874,148],{},[192,59868,59869],{},"Notifications."," Sets up or changes email or webhook notifications for run results — failure, warning, or success. Type ",[26030,59872,59873],{},"\"notify me\"",[26030,59875,59876],{},"\"email on failure\"",[189,59878,59879,59882,59883,148],{},[192,59880,59881],{},"Proxy settings."," Walks you through proxy setup — SOCKS5 or HTTP, host, port, auth. Type ",[26030,59884,59885],{},"\"proxy\"",[189,59887,59888,59891,59892,2344,59895,148],{},[192,59889,59890],{},"Stay logged in."," Captures and re-syncs your login cookies so cloud runs stay signed in. Type ",[26030,59893,59894],{},"\"sync cookies\"",[26030,59896,59897],{},"\"stay logged in\"",[189,59899,59900,59903,59904,59907],{},[192,59901,59902],{},"Block resources."," Speeds up runs by blocking images, fonts, media, stylesheets, and other things the page doesn't strictly need. Type ",[26030,59905,59906],{},"\"block images\"",", or pick it from the Slow automation help.",[21,59909,59911],{"id":59910},"speed-and-reliability","Speed and reliability",[186,59913,59914,59926,59938,59950,59956],{},[189,59915,59916,59919,59920,2344,59923,148],{},[192,59917,59918],{},"Slow automation."," Help when runs are slow or Chrome crashes (\"Oh Snap\"). The assistant suggests blocking resources, or pointing you to support. Type ",[26030,59921,59922],{},"\"slow\"",[26030,59924,59925],{},"\"Oh Snap\"",[189,59927,59928,59931,59932,59934,59935,148],{},[192,59929,59930],{},"Slow scraper."," Spots ",[192,59933,194],{}," steps that are slow because of retry attempts, and offers to dial them down. Type ",[26030,59936,59937],{},"\"scrape is slow\"",[189,59939,59940,59943,59944,2344,59947,148],{},[192,59941,59942],{},"Stuck automation."," Helps when a run looks like it's hanging. The assistant can stop it for you, and set a max runtime so future runs cut themselves off. Type ",[26030,59945,59946],{},"\"stuck\"",[26030,59948,59949],{},"\"running forever\"",[189,59951,59952,59955],{},[192,59953,59954],{},"Runtime limit hit."," Shows up when a run goes over the maximum runtime on your plan. Offers tips to make the run shorter, or an upgrade.",[189,59957,59958,59961],{},[192,59959,59960],{},"Upgrade your plan."," Appears when you hit a plan limit. Shows the right plan to switch to, with a checkout button.",[21,59963,49002],{"id":52209},[186,59965,59966,59983,59995],{},[189,59967,59968,59971,59972,59974,59975,4468,59977,10147,59980,148],{},[192,59969,59970],{},"Troubleshooting menu."," The top-level ",[145,59973,59531],{}," menu that leads to everything above. Type ",[145,59976,59531],{},[26030,59978,59979],{},"\"troubleshoot\"",[26030,59981,59982],{},"\"help\"",[189,59984,59985,59987,59988,59991,59992,59994],{},[192,59986,31757],{}," Hands you off to human support, with the issue details and error already attached. Type ",[26030,59989,59990],{},"\"contact support\"",", or click any ",[192,59993,30989],{}," button you see in the chat.",[189,59996,59997,60000,60001,4468,60004,60007],{},[192,59998,59999],{},"Backing out."," If you change your mind partway through — ",[26030,60002,60003],{},"\"cancel\"",[26030,60005,60006],{},"\"never mind\""," — the assistant tidies up the pending step and lets you start fresh.",{"title":67,"searchDepth":68,"depth":68,"links":60009},[60010,60011,60012],{"id":59522,"depth":670,"text":59523},{"id":59588,"depth":670,"text":59589},{"id":59651,"depth":670,"text":59652,"children":60013},[60014,60015,60016,60017,60018],{"id":59663,"depth":68,"text":59664},{"id":59756,"depth":68,"text":59757},{"id":59839,"depth":68,"text":59840},{"id":59910,"depth":68,"text":59911},{"id":52209,"depth":68,"text":49002},"Use the in-Builder AI Assistant to debug failing automations, get suggested fixes, extend your automation with new steps, and resolve common configuration issues from a chat conversation.",{"metaTitle":60021},"Use the AI Assistant in the axiom.ai Builder","\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fai-assistant",{"title":59505,"description":60019},"docs\u002Fno-code-tool\u002Fthe-builder\u002Fai-assistant","nHLSPhPnQBWuAbD4_AN1J45kNdZh3fyKz3mg8nfH6Ws",{"id":60027,"title":60028,"body":60029,"date":71,"description":60897,"extension":73,"meta":60898,"navigation":75,"order":68,"path":60901,"seo":60902,"stem":60903,"__hash__":60904},"content\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder.md","The no-code Builder",{"type":8,"value":60030,"toc":60853},[60031,60034,60036,60043,60047,60049,60056,60062,60073,60075,60079,60081,60087,60101,60105,60107,60113,60119,60123,60125,60128,60134,60150,60153,60157,60159,60165,60171,60174,60178,60181,60184,60194,60198,60201,60218,60221,60224,60227,60245,60248,60252,60254,60257,60263,60267,60294,60297,60301,60304,60308,60318,60324,60328,60331,60337,60343,60357,60360,60364,60379,60385,60389,60391,60394,60431,60435,60437,60440,60446,60457,60460,60464,60475,60478,60482,60492,60495,60499,60509,60512,60516,60529,60532,60536,60549,60552,60556,60558,60563,60569,60572,60576,60579,60583,60586,60592,60596,60599,60603,60610,60616,60620,60624,60628,60637,60641,60644,60650,60653,60655,60664,60671,60673,60675,60682,60688,60691,60701,60704,60706,60712,60742,60744,60750,60756,60758,60764,60778,60780,60786,60809,60813,60815,60818,60830,60836,60839],[26,60032,60033],{},"The Builder is the visual editor where you create browser automations by combining steps. This guide covers the essentials: adding, duplicating, and moving steps, plus useful keyboard shortcuts.",[32947,60035],{"video":837},[26,60037,60038,60039,42265,60041,148],{},"To open the Builder, click ",[192,60040,42260],{},[659,60042,2836],{"href":37734},[107,60044,60046],{"id":60045},"name-your-automation","Name your automation",[112,60048],{},[26,60050,60051,60052,60055],{},"Give your automation a memorable title so you can find it later. We recommend including meta information in the title (such as version or status, for example ",[192,60053,60054],{},"In progress",") to help you keep track of work in flight.",[26,60057,60058],{},[1906,60059],{"alt":60060,"src":60061},"Naming a new automation in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Fstart-bot-build.jpg",[1923,60063,60064,60070],{},[189,60065,60066,60067,60069],{},"Click the title ",[192,60068,42260],{}," in the top left corner.",[189,60071,60072],{},"Delete the default text and type your own title.",[32973,60074],{"url":837},[107,60076,60078],{"id":60077},"save-your-automation","Save your automation",[112,60080],{},[26,60082,60083,60084,60086],{},"To save changes to your automation, click ",[192,60085,2388],{}," in the top right corner. We recommend saving periodically as you build.",[2093,60088,60089],{},[26,60090,60091,60093,60094,60096,60097,60100],{},[192,60092,2172],{}," Your automation saves automatically when you click ",[192,60095,3137],{},". For a quick save, press ",[192,60098,60099],{},"Ctrl + S"," with your mouse pointer inside the extension.",[107,60102,60104],{"id":60103},"return-to-the-dashboard","Return to the dashboard",[112,60106],{},[26,60108,60109,60110,60112],{},"To return to the ",[659,60111,2836],{"href":37734},", click the back button in the top left corner of the Builder. You will be prompted to save any unsaved changes before leaving.",[26,60114,60115],{},[1906,60116],{"alt":60117,"src":60118},"The back button to return to the dashboard from the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Fback-to-dashboard-builder-axiom.jpg",[107,60120,60122],{"id":60121},"duplicate-your-automation","Duplicate your automation",[112,60124],{},[26,60126,60127],{},"To duplicate your automation, use the kebab menu in the top right corner of the Builder.",[26,60129,60130],{},[1906,60131],{"alt":60132,"src":60133},"Duplicating an automation from the kebab menu in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Fsave-as-duplicate-axiom.jpg",[1923,60135,60136,60142,60147],{},[189,60137,4285,60138,60141],{},[192,60139,60140],{},"kebab"," menu icon in the top right corner.",[189,60143,4291,60144,60146],{},[192,60145,32017],{}," from the dropdown.",[189,60148,60149],{},"The Builder switches to editing the duplicate.",[32973,60151],{"url":60152},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRKzbfw7qna0?rel=0&start=84&end=109",[107,60154,60156],{"id":60155},"start-your-automation","Start your automation",[112,60158],{},[26,60160,60161,60162,148],{},"When you open the Builder, you are offered several starting points. For more on starting points for beginners, see ",[659,60163,60164],{"href":31364},"your first automation",[26,60166,60167],{},[1906,60168],{"alt":60169,"src":60170},"The starting points view shown when opening a new automation in the Builder","\u002Fdocs\u002Ftutorials\u002Ffirst-step-axiom.jpg",[32973,60172],{"url":60173},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRKzbfw7qna0?rel=0&start=109&end=162",[21,60175,60177],{"id":60176},"quick-builder-beta","Quick builder (Beta)",[26,60179,60180],{},"Let axiom.ai build an automation for you based on a description of what you want it to do.",[21,60182,42264],{"id":60183},"add-first-step",[26,60185,60186,60187,40274,60189,60193],{},"To start from scratch, click ",[192,60188,42264],{},[659,60190,60192],{"href":60191},"#using-the-step-finder","step finder"," opens so you can choose your first step.",[21,60195,60197],{"id":60196},"import-automation","Import automation",[26,60199,60200],{},"To import a previously shared or downloaded template:",[1923,60202,60203,60207,60212],{},[189,60204,1927,60205,148],{},[192,60206,60197],{},[189,60208,1927,60209,60211],{},[192,60210,33903],{}," and upload the template.",[189,60213,1927,60214,60217],{},[192,60215,60216],{},"Confirm"," to finish.",[32973,60219],{"url":60220},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRKzbfw7qna0?rel=0&start=130&end=162",[21,60222,60223],{"id":32978},"Start from template",[26,60225,60226],{},"To use a pre-built template:",[1923,60228,60229,60233,60236,60239],{},[189,60230,1927,60231,148],{},[192,60232,60223],{},[189,60234,60235],{},"Choose what you want to automate.",[189,60237,60238],{},"Click the template you want to use.",[189,60240,1927,60241,60244],{},[192,60242,60243],{},"Start setup"," and follow the guide.",[32973,60246],{"url":60247},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRKzbfw7qna0?rel=0&start=144&end=162",[107,60249,60251],{"id":60250},"using-the-step-finder","Using the step finder",[112,60253],{},[26,60255,60256],{},"The step finder is where you search for and add steps to your automation.",[26,60258,60259],{},[1906,60260],{"alt":60261,"src":60262},"The step finder in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Fstep-finder-open.jpg",[21,60264,60266],{"id":60265},"open-the-step-finder","Open the step finder",[186,60268,60269,60278,60285,60291],{},[189,60270,60271,60272,60274,60275,148],{},"In an empty automation, click ",[192,60273,42264],{}," or press ",[192,60276,60277],{},"Shift + +",[189,60279,60280,60281,60274,60283,148],{},"To add a step at the bottom of the automation, click ",[192,60282,51935],{},[192,60284,60277],{},[189,60286,60287,60288,60290],{},"To add a sub-step, click ",[192,60289,40412],{}," or click between existing sub-steps.",[189,60292,60293],{},"To add a step above or below an existing step, click between the step borders.",[32973,60295],{"url":60296},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRKzbfw7qna0?rel=0&start=162&end=417",[21,60298,60300],{"id":60299},"close-the-step-finder","Close the step finder",[26,60302,60303],{},"To close the step finder, click outside its borders or select a step.",[21,60305,60307],{"id":60306},"search-for-steps","Search for steps",[26,60309,60310,60311,4468,60313,10147,60315,60317],{},"Type a familiar term into the search bar, for example ",[192,60312,26048],{},[192,60314,15767],{},[192,60316,17816],{},", to find the step you want.",[26,60319,60320],{},[1906,60321],{"alt":60322,"src":60323},"Searching for steps inside the step finder","\u002Fdocs\u002Ftutorials\u002Fsearch-in-finder.jpg",[21,60325,60327],{"id":60326},"snippets","Snippets",[26,60329,60330],{},"Snippets are pre-built combinations of steps for common automation patterns. They appear at the top of the step finder and are a good way to start a new automation.",[26,60332,60333],{},[1906,60334],{"alt":60335,"src":60336},"Beginner snippets shown at the top of the step finder","\u002Fdocs\u002Ftutorials\u002Fsnippets-in-finder.jpg",[26,60338,60339,60340,3297],{},"There are four beginner ",[659,60341,60326],{"href":60342},"\u002Fdocs\u002Fno-code-tool\u002Fget-started#get-started-from-a-snippet",[186,60344,60345,60348,60351,60354],{},[189,60346,60347],{},"Scrape data from a page to a Google Sheet.",[189,60349,60350],{},"Scrape links from a website and scrape each page.",[189,60352,60353],{},"Scrape pages from a list of links in a Google Sheet.",[189,60355,60356],{},"Fill in a form.",[32973,60358],{"url":60359},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRKzbfw7qna0?rel=0&start=290&end=417",[21,60361,60363],{"id":60362},"see-all-steps","See all steps",[26,60365,60366,60367,60370,60371,60375,60376,148],{},"To see every available step, click ",[192,60368,60369],{},"Expand all"," at the bottom of the step finder. To learn more, see ",[659,60372,60374],{"href":60373},"\u002Fdocs\u002Ftutorials\u002Fbrowser-actions","browser action steps"," or the full ",[659,60377,60378],{"href":178},"steps reference",[26,60380,60381],{},[1906,60382],{"alt":60383,"src":60384},"The Expand all button at the bottom of the step finder","\u002Fdocs\u002Ftutorials\u002Fexpand-all-finder.jpg",[107,60386,60388],{"id":60387},"step-finder-shortcuts","Step finder shortcuts",[112,60390],{},[26,60392,60393],{},"You can interact with the step finder using these keyboard shortcuts:",[186,60395,60396,60401,60406,60415,60421],{},[189,60397,60398,60400],{},[192,60399,60277],{},": open the step finder.",[189,60402,60403,60405],{},[192,60404,33403],{},": add the selected step and close the finder.",[189,60407,60408,2344,60411,60414],{},[192,60409,60410],{},"Shift + Return",[192,60412,60413],{},"Shift + click",": add the selected step and keep the finder open.",[189,60416,60417,60420],{},[192,60418,60419],{},"Esc",": close the step finder.",[189,60422,60423,60426,60427,60430],{},[192,60424,60425],{},"Add multiple steps at once",": type the step name followed by an asterisk and a number, for example ",[145,60428,60429],{},"enter*8"," adds eight Enter text steps.",[107,60432,60434],{"id":60433},"disable-move-duplicate-delete-and-loop-steps","Disable, move, duplicate, delete, and loop steps",[112,60436],{},[26,60438,60439],{},"You can move, duplicate, or delete any step using the Move toolbar.",[26,60441,60442],{},[1906,60443],{"alt":60444,"src":60445},"The Move toolbar in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Fstep-move-toolbar.jpg",[1923,60447,60448,60451],{},[189,60449,60450],{},"To open the Move toolbar, click the checkbox to the left of any step title.",[189,60452,60453,60454,148],{},"To close the Move toolbar, click ",[192,60455,60456],{},"Deselect",[32973,60458],{"url":60459},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRKzbfw7qna0?rel=0&start=417&end=597",[21,60461,60463],{"id":60462},"move-steps","Move steps",[1923,60465,60466,60469],{},[189,60467,60468],{},"Tick the checkbox to the left of each step you want to move.",[189,60470,60471,60472,148],{},"Click above, below, or between steps, then click ",[192,60473,60474],{},"Move here",[32973,60476],{"url":60477},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRKzbfw7qna0?rel=0&start=453&end=555",[21,60479,60481],{"id":60480},"duplicate-steps","Duplicate steps",[1923,60483,60484,60487],{},[189,60485,60486],{},"Tick the checkbox to the left of each step you want to copy.",[189,60488,60471,60489,148],{},[192,60490,60491],{},"Copy selection here",[32973,60493],{"url":60494},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRKzbfw7qna0?rel=0&start=469&end=555",[21,60496,60498],{"id":60497},"delete-steps","Delete steps",[1923,60500,60501,60504],{},[189,60502,60503],{},"Tick the checkbox to the left of each step you want to delete.",[189,60505,40339,60506,148],{},[192,60507,60508],{},"Delete",[32973,60510],{"url":60511},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRKzbfw7qna0?rel=0&start=484&end=555",[21,60513,60515],{"id":60514},"move-steps-into-a-loop","Move steps into a loop",[1923,60517,60518,60521,60525],{},[189,60519,60520],{},"Tick the checkbox to the left of each step you want to loop.",[189,60522,40339,60523,148],{},[192,60524,32433],{},[189,60526,4291,60527,148],{},[192,60528,15653],{},[32973,60530],{"url":60531},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRKzbfw7qna0?rel=0&start=505&end=555",[21,60533,60535],{"id":60534},"disable-or-enable-steps","Disable or enable steps",[1923,60537,60538,60541],{},[189,60539,60540],{},"Tick the checkbox to the left of each step you want to disable or enable.",[189,60542,40339,60543,2344,60546,148],{},[192,60544,60545],{},"Disable",[192,60547,60548],{},"Enable",[32973,60550],{"url":60551},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRKzbfw7qna0?rel=0&start=529&end=555",[107,60553,60555],{"id":60554},"working-with-steps","Working with steps",[112,60557],{},[26,60559,60560,60561,148],{},"Every step in axiom.ai needs configuring once it's added. The configuration is usually self-explanatory; for detail on a specific step, see the ",[659,60562,60378],{"href":178},[26,60564,60565],{},[1906,60566],{"alt":60567,"src":60568},"Working with steps in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Fworking-with-steps.jpg",[32973,60570],{"url":60571},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRKzbfw7qna0?rel=0&start=553&end=702",[21,60573,60575],{"id":60574},"step-number","Step number",[26,60577,60578],{},"The step number shows the step's position in the automation.",[21,60580,60582],{"id":60581},"edit-a-step-title","Edit a step title",[26,60584,60585],{},"Edit a step's title to keep track of what it does or to add meta information.",[26,60587,60588],{},[1906,60589],{"alt":60590,"src":60591},"Editing a step title in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Fedit-title-step.jpg",[21,60593,60595],{"id":60594},"expand-or-collapse-a-step","Expand or collapse a step",[26,60597,60598],{},"To expand or collapse a step, click the blank space between the step title and the kebab menu.",[21,60600,60602],{"id":60601},"disable-a-step","Disable a step",[26,60604,60605,60606,60609],{},"Click the kebab menu and select ",[192,60607,60608],{},"Disable step",", or use the Move toolbar.",[26,60611,60612],{},[1906,60613],{"alt":60614,"src":60615},"Disabling and deleting individual steps from the kebab menu","\u002Fdocs\u002Ftutorials\u002Fstep-info-delete.jpg",[21,60617,60619],{"id":60618},"delete-a-step","Delete a step",[26,60621,60605,60622,60609],{},[192,60623,60508],{},[21,60625,60627],{"id":60626},"select-a-step-to-move-or-copy","Select a step to move or copy",[26,60629,60630,60631,2344,60633,60636],{},"Tick the checkbox to the left of the step number, then use the Move toolbar. You can also choose ",[192,60632,33198],{},[192,60634,60635],{},"Copy \u002F Move"," from the kebab menu on the right of the step.",[21,60638,60640],{"id":60639},"step-output-token","Step output token",[26,60642,60643],{},"Some steps generate tokens that let other steps access their data. A preview of the data appears in the step's footer. To refresh the preview, click the refresh icon in its header.",[26,60645,60646],{},[1906,60647],{"alt":60648,"src":60649},"A step output token preview in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Foutput-token-builder.jpg",[107,60651,41641],{"id":60652},"run-your-automation",[112,60654],{},[26,60656,60657,60658,60660,60661,148],{},"To run your automation, click ",[192,60659,3137],{}," and choose between cloud and desktop. We recommend testing on desktop. For the trade-offs between the two, see ",[659,60662,60663],{"href":37768},"running your automation",[2093,60665,60666],{},[26,60667,60668,60670],{},[192,60669,2172],{}," Run frequently as you build. Catching issues early is much easier than debugging a long automation at the end.",[107,60672,4171],{"id":20258},[112,60674],{},[26,60676,60677,60678,148],{},"Each automation has its own settings. Most beginners can ignore them. For details, see the ",[659,60679,60681],{"href":60680},"\u002Fdocs\u002Ftutorials\u002Fsettings","settings reference",[26,60683,60684],{},[1906,60685],{"alt":60686,"src":60687},"The settings panel button in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Fsettings-section-btn.jpg",[26,60689,60690],{},"To open the settings panel:",[1923,60692,60693,60696],{},[189,60694,60695],{},"In the Builder, look at the vertical sidebar on the far left.",[189,60697,4285,60698,31962],{},[192,60699,60700],{},"gear",[32973,60702],{"url":60703},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRKzbfw7qna0?rel=0&start=728&end=826",[21,60705,31660],{"id":47187},[26,60707,60708],{},[1906,60709],{"alt":60710,"src":60711},"The run options settings panel","\u002Fimg\u002Fschedule-and-run-settings.png",[186,60713,60714,60718,60722,60726,60730,60734,60738],{},[189,60715,60716],{},[659,60717,48012],{"href":24705},[189,60719,60720],{},[659,60721,41012],{"href":31771},[189,60723,60724],{},[659,60725,24761],{"href":24760},[189,60727,60728],{},[659,60729,24686],{"href":24685},[189,60731,60732],{},[659,60733,24726],{"href":24725},[189,60735,60736],{},[659,60737,24662],{"href":24661},[189,60739,60740],{},[659,60741,24601],{"href":24600},[21,60743,47017],{"id":47032},[26,60745,60746],{},[1906,60747],{"alt":60748,"src":60749},"The import and export settings panel","\u002Fdocs\u002Ftutorials\u002Fimport-export-setting.jpg",[186,60751,60752],{},[189,60753,60754],{},[659,60755,47095],{"href":25877},[21,60757,46866],{"id":47200},[26,60759,60760],{},[1906,60761],{"alt":60762,"src":60763},"The iframe support setting in the error handling panel","\u002Fdocs\u002Ftutorials\u002Fiframe-settings.jpg",[186,60765,60766,60770,60774],{},[189,60767,60768],{},[659,60769,23813],{"href":23812},[189,60771,60772],{},[659,60773,24621],{"href":24620},[189,60775,60776],{},[659,60777,23833],{"href":23832},[21,60779,46265],{"id":47210},[26,60781,60782],{},[1906,60783],{"alt":60784,"src":60785},"The Chrome settings panel with bot blocking options","\u002Fdocs\u002Ftutorials\u002Fbypass-bots-settings.jpg",[186,60787,60788,60793,60797,60801,60805],{},[189,60789,60790],{},[659,60791,60792],{"href":31697},"Bot blocking",[189,60794,60795],{},[659,60796,23853],{"href":23852},[189,60798,60799],{},[659,60800,46705],{"href":24780},[189,60802,60803],{},[659,60804,23873],{"href":23872},[189,60806,60807],{},[659,60808,24641],{"href":24640},[107,60810,60812],{"id":60811},"undo-and-redo","Undo and redo",[112,60814],{},[26,60816,60817],{},"The undo and redo options let you step back and forth through your changes, up to 50 actions deep.",[26,60819,60820,60821,60823,60824,2344,60827,148],{},"To undo or redo a change, click the three dots in the top right next to ",[192,60822,2388],{},", then select ",[192,60825,60826],{},"Undo",[192,60828,60829],{},"Redo",[26,60831,60832],{},[1906,60833],{"alt":60834,"src":60835},"Undo and redo controls in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Faxiom-builder-undo-redo.jpg",[26,60837,60838],{},"You can also use keyboard shortcuts:",[186,60840,60841,60847],{},[189,60842,60843,60846],{},[192,60844,60845],{},"Ctrl + Z"," undoes the last action.",[189,60848,60849,60852],{},[192,60850,60851],{},"Ctrl + Y"," redoes the last undone action.",{"title":67,"searchDepth":68,"depth":68,"links":60854},[60855,60856,60857,60858,60859,60865,60872,60873,60880,60889,60890,60896],{"id":60045,"depth":670,"text":60046},{"id":60077,"depth":670,"text":60078},{"id":60103,"depth":670,"text":60104},{"id":60121,"depth":670,"text":60122},{"id":60155,"depth":670,"text":60156,"children":60860},[60861,60862,60863,60864],{"id":60176,"depth":68,"text":60177},{"id":60183,"depth":68,"text":42264},{"id":60196,"depth":68,"text":60197},{"id":32978,"depth":68,"text":60223},{"id":60250,"depth":670,"text":60251,"children":60866},[60867,60868,60869,60870,60871],{"id":60265,"depth":68,"text":60266},{"id":60299,"depth":68,"text":60300},{"id":60306,"depth":68,"text":60307},{"id":60326,"depth":68,"text":60327},{"id":60362,"depth":68,"text":60363},{"id":60387,"depth":670,"text":60388},{"id":60433,"depth":670,"text":60434,"children":60874},[60875,60876,60877,60878,60879],{"id":60462,"depth":68,"text":60463},{"id":60480,"depth":68,"text":60481},{"id":60497,"depth":68,"text":60498},{"id":60514,"depth":68,"text":60515},{"id":60534,"depth":68,"text":60535},{"id":60554,"depth":670,"text":60555,"children":60881},[60882,60883,60884,60885,60886,60887,60888],{"id":60574,"depth":68,"text":60575},{"id":60581,"depth":68,"text":60582},{"id":60594,"depth":68,"text":60595},{"id":60601,"depth":68,"text":60602},{"id":60618,"depth":68,"text":60619},{"id":60626,"depth":68,"text":60627},{"id":60639,"depth":68,"text":60640},{"id":60652,"depth":670,"text":41641},{"id":20258,"depth":670,"text":4171,"children":60891},[60892,60893,60894,60895],{"id":47187,"depth":68,"text":31660},{"id":47032,"depth":68,"text":47017},{"id":47200,"depth":68,"text":46866},{"id":47210,"depth":68,"text":46265},{"id":60811,"depth":670,"text":60812},"Learn how to add, duplicate, move, and configure steps in the axiom.ai Builder, plus useful keyboard shortcuts.",{"metaTitle":60899,"video":60900},"Build browser automations with the no-code Builder","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRKzbfw7qna0?rel=0&amp;start=19&end=49","\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder",{"title":60028,"description":60897},"docs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder","Ff4y3XgQnFElfEQRo8sKa9EhbCpQN87bOpP3werwv8o",{"id":60906,"title":60907,"body":60908,"date":71,"description":61277,"extension":73,"meta":61278,"navigation":75,"order":670,"path":37734,"seo":61280,"stem":61281,"__hash__":61282},"content\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fdashboard.md","The dashboard",{"type":8,"value":60909,"toc":61250},[60910,60913,60916,60920,60922,60925,60958,60964,60968,60970,60973,60979,60982,60993,60999,61011,61014,61016,61019,61023,61026,61032,61038,61041,61045,61048,61054,61058,61061,61067,61071,61073,61076,61078,61081,61083,61089,61095,61099,61105,61111,61114,61124,61130,61134,61143,61149,61153,61155,61158,61163,61167,61170,61174,61179,61183,61188,61192,61198,61205,61209,61211,61217,61221,61227,61233,61237,61244],[26,60911,60912],{},"New to the dashboard? This guide walks through the features you'll use most: creating automations, checking run reports, and finding video guides.",[32947,60914],{"video":60915},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FTi5mX--PC74?rel=0",[107,60917,60919],{"id":60918},"dashboard-overview","Dashboard overview",[112,60921],{},[26,60923,60924],{},"The dashboard is split into three areas, plus a vertical icon toolbar on the far left.",[186,60926,60927,60937,60946,60952],{},[189,60928,60929,60932,60933,60936],{},[192,60930,60931],{},"Icon toolbar (far left)."," The burger menu opens ",[659,60934,60935],{"href":2238},"account"," settings. Other icons cover home, run status, embedded docs, and video guides. Desktop and extension version numbers sit at the bottom.",[189,60938,60939,60942,60943,60945],{},[192,60940,60941],{},"Header (top)."," Shows your runtime, subscription plan, and the ",[192,60944,42260],{}," button.",[189,60947,60948,60951],{},[192,60949,60950],{},"Left column."," Menu links to recommended content, run reports, scheduled automations, Google Sheets, API keys, and your subscription plan.",[189,60953,60954,60957],{},[192,60955,60956],{},"Main column (right)."," A searchable list of your automations.",[26,60959,60960],{},[1906,60961],{"alt":60962,"src":60963},"The axiom.ai dashboard with the icon toolbar, header, left menu, and automations list","\u002Fdocs\u002Ftutorials\u002Faxiom-dasboard-vertical-icon-toolbar.jpg",[107,60965,60967],{"id":60966},"vertical-icon-toolbar","Vertical icon toolbar",[112,60969],{},[26,60971,60972],{},"The icon toolbar gives you quick access to your account, the home dashboard, run status, and embedded help.",[26,60974,60975],{},[1906,60976],{"alt":60977,"src":60978},"The axiom.ai dashboard icon toolbar","\u002Fdocs\u002Ftutorials\u002Fvertical-icon-toolbar-axiom-ai-dashboard.jpg",[21,60980,1901],{"id":60981},"my-account",[26,60983,60984,60985,60987,60988,60990,60991,148],{},"From ",[192,60986,1901],{}," you can edit your email and password, manage your ",[659,60989,40960],{"href":2108}," plan, and delete your ",[659,60992,60935],{"href":2238},[26,60994,60995],{},[1906,60996],{"alt":60997,"src":60998},"The My account view in the axiom.ai dashboard","\u002Fdocs\u002Ftutorials\u002Fmy-account-axiom-ai.jpg",[1923,61000,61001,61007],{},[189,61002,4285,61003,61006],{},[192,61004,61005],{},"burger"," icon at the top left.",[189,61008,1927,61009,148],{},[192,61010,1901],{},[32973,61012],{"url":61013},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FTi5mX--PC74?rel=0&start=65",[21,61015,25362],{"id":1071},[26,61017,61018],{},"The home icon returns you to the default dashboard view, where your automations are listed.",[21,61020,61022],{"id":61021},"run-status","Run status",[26,61024,61025],{},"The play icon shows the status of any currently running automations.",[26,61027,61028],{},[1906,61029],{"alt":61030,"src":61031},"Run status view in the axiom.ai dashboard","\u002Fdocs\u002Fschedule-and-run-status-axiom.png",[26,61033,61034,61035,31962],{},"To see your run status, click the ",[192,61036,61037],{},"play",[32973,61039],{"url":61040},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FTi5mX--PC74?rel=0&start=155",[21,61042,61044],{"id":61043},"embedded-documentation","Embedded documentation",[26,61046,61047],{},"You can read the axiom.ai documentation inside the extension without leaving the app.",[26,61049,61050],{},[1906,61051],{"alt":61052,"src":61053},"The embedded documentation view inside the axiom.ai dashboard","\u002Fdocs\u002Ftutorials\u002Faxiom-ai-dashboard-embedded-doc.jpg",[21,61055,61057],{"id":61056},"video-guides","Video guides",[26,61059,61060],{},"Video guides cover use cases ranging from web scraping to social media automation, all accessible from the dashboard.",[26,61062,61063],{},[1906,61064],{"alt":61065,"src":61066},"Video guides accessible from the axiom.ai dashboard","\u002Fdocs\u002Ftutorials\u002Fdashboard-video-guides.jpg",[107,61068,61070],{"id":61069},"vertical-menu","Vertical menu",[112,61072],{},[26,61074,61075],{},"The vertical menu, to the right of the icon toolbar, changes the content shown in the main dashboard area.",[21,61077,2836],{"id":41650},[26,61079,61080],{},"The default view, showing a list of your automations.",[21,61082,3166],{"id":12029},[26,61084,61085,61086,61088],{},"To check the status of all your runs, click ",[192,61087,3166],{},". Reports load into the main dashboard area.",[26,61090,61091],{},[1906,61092],{"alt":61093,"src":61094},"Run reports view in the axiom.ai dashboard","\u002Fdocs\u002Ftutorials\u002Faxiom-run-reports.jpg",[21,61096,61098],{"id":61097},"scheduled-automations","Scheduled automations",[26,61100,61101,61102,148],{},"To view your scheduled automations, click ",[659,61103,61104],{"href":40980},"Scheduled axioms",[26,61106,61107],{},[1906,61108],{"alt":61109,"src":61110},"Scheduled automations view in the axiom.ai dashboard","\u002Fdocs\u002Ftutorials\u002Faxiom-schedule-list.jpg",[21,61112,44219],{"id":61113},"google-sheets-and-api-key",[26,61115,61116,61117,61119,61120,34008,61122,148],{},"To connect or disconnect your ",[659,61118,41247],{"href":963}," account, or fetch your ",[659,61121,4175],{"href":5562},[192,61123,44219],{},[26,61125,61126],{},[1906,61127],{"alt":61128,"src":61129},"Google Sheets and API key view in the axiom.ai dashboard","\u002Fdocs\u002Ftutorials\u002Faxiom-google-sheets-and-api.jpg",[21,61131,61133],{"id":61132},"change-my-plan","Change my plan",[26,61135,61136,61137,9879,61139,61142],{},"Out of runtime? Click ",[192,61138,2263],{},[659,61140,61141],{"href":2108},"upgrade"," for more.",[26,61144,61145],{},[1906,61146],{"alt":61147,"src":61148},"The change subscription plan view in the axiom.ai dashboard","\u002Fdocs\u002Ftutorials\u002Faxiom-manage-plan.jpg",[107,61150,61152],{"id":61151},"main-column","Main column",[112,61154],{},[26,61156,61157],{},"The main column lists your automations and is shown by default. From here you can search, edit, run, and delete automations.",[26,61159,61160],{},[1906,61161],{"alt":61162,"src":60963},"The main automations list in the axiom.ai dashboard",[21,61164,61166],{"id":61165},"search-for-an-automation","Search for an automation",[26,61168,61169],{},"Use the search field to find an automation by name.",[21,61171,61173],{"id":61172},"edit-an-automation","Edit an automation",[26,61175,61176,61177,148],{},"Click an automation in the list to open it in the ",[659,61178,10785],{"href":60901},[21,61180,61182],{"id":61181},"run-an-automation","Run an automation",[26,61184,4285,61185,61187],{},[192,61186,3137],{}," button next to any automation to start a run.",[21,61189,61191],{"id":61190},"delete-an-automation","Delete an automation",[26,61193,4285,61194,61197],{},[192,61195,61196],{},"bin"," icon to delete an automation.",[2093,61199,61200],{},[26,61201,61202,61204],{},[192,61203,2099],{}," Deleted automations cannot be recovered.",[107,61206,61208],{"id":61207},"dashboard-header","Dashboard header",[112,61210],{},[26,61212,61213,61214,61216],{},"The header sits across the top of the dashboard and contains the ",[192,61215,42260],{}," button along with your runtime and subscription details.",[21,61218,61220],{"id":61219},"create-a-new-automation","Create a new automation",[26,61222,61223,61224,61226],{},"The dashboard is the starting point for every automation. Click ",[192,61225,42260],{}," in the top right corner to begin.",[26,61228,61229],{},[1906,61230],{"alt":61231,"src":61232},"The New automation button in the top right of the axiom.ai dashboard","\u002Fdocs\u002Ftutorials\u002Fnew-automation-dash.jpg",[21,61234,61236],{"id":61235},"runtime-and-subscription","Runtime and subscription",[26,61238,61239,61240,61243],{},"Your ",[659,61241,61242],{"href":2108},"subscription plan"," and runtime usage are shown in the top right corner. Runtime resets monthly and unused runtime does not carry over. Hover over the percentage to see a detailed breakdown.",[26,61245,61246],{},[1906,61247],{"alt":61248,"src":61249},"Hover the runtime percentage to see a detailed breakdown of runtime used","\u002Fdocs\u002Ftutorials\u002Faxiom-dashboard-subscription-detials.jpg",{"title":67,"searchDepth":68,"depth":68,"links":61251},[61252,61253,61260,61267,61273],{"id":60918,"depth":670,"text":60919},{"id":60966,"depth":670,"text":60967,"children":61254},[61255,61256,61257,61258,61259],{"id":60981,"depth":68,"text":1901},{"id":1071,"depth":68,"text":25362},{"id":61021,"depth":68,"text":61022},{"id":61043,"depth":68,"text":61044},{"id":61056,"depth":68,"text":61057},{"id":61069,"depth":670,"text":61070,"children":61261},[61262,61263,61264,61265,61266],{"id":41650,"depth":68,"text":2836},{"id":12029,"depth":68,"text":3166},{"id":61097,"depth":68,"text":61098},{"id":61113,"depth":68,"text":44219},{"id":61132,"depth":68,"text":61133},{"id":61151,"depth":670,"text":61152,"children":61268},[61269,61270,61271,61272],{"id":61165,"depth":68,"text":61166},{"id":61172,"depth":68,"text":61173},{"id":61181,"depth":68,"text":61182},{"id":61190,"depth":68,"text":61191},{"id":61207,"depth":670,"text":61208,"children":61274},[61275,61276],{"id":61219,"depth":68,"text":61220},{"id":61235,"depth":68,"text":61236},"A tour of the axiom.ai dashboard, where you create new automations, check run reports, and find your scheduled automations.",{"metaTitle":61279},"The axiom.ai dashboard for managing automations",{"title":60907,"description":61277},"docs\u002Fno-code-tool\u002Fthe-builder\u002Fdashboard","ztMM1kpusj-mJUeWWmLCLj2oUN0MKWlkvdwtHlka4MU",{"id":61284,"title":37650,"body":61285,"date":71,"description":61345,"extension":73,"meta":61346,"navigation":75,"order":2131,"path":1725,"seo":61348,"stem":61349,"__hash__":61350},"content\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Findex.md",{"type":8,"value":61286,"toc":61340},[61287,61298,61302,61304,61307,61310,61314,61316,61319,61322,61325,61327,61330,61333],[26,61288,42675,61289,61291,61292,9879,61295,148],{},[659,61290,10785],{"href":1725}," inside the axiom.ai Chrome extension. Drag and drop steps to record clicks, scrape data, fill forms, and connect to Google Sheets, no code required. This section covers everything you need to go from ",[659,61293,61294],{"href":31161},"installation",[659,61296,61297],{"href":31364},"running your first automation",[107,61299,61301],{"id":61300},"get-set-up","Get set up",[112,61303],{},[26,61305,61306],{},"Install the Chrome extension and get familiar with the dashboard before you build your first automation. Every new account gets 120 minutes of free runtime so you can build and test without committing to a plan.",[2218,61308],{"path":61309,"scope":37937},"install,dashboard",[107,61311,61313],{"id":61312},"use-the-builder","Use the Builder",[112,61315],{},[26,61317,61318],{},"The Builder is where automations come together. Add steps from the step finder, configure each one, and pass data between them with tokens. The selector tool helps you point steps at the exact elements on a page you want them to interact with.",[2218,61320],{"path":61321,"scope":37937},"builder,pass, selector-tool",[107,61323,61324],{"id":37781},"Share",[112,61326],{},[26,61328,61329],{},"Export an automation as a JSON file to share it with a teammate or back it up. Imported files replace the current automation, so import into a fresh automation if you don't want to overwrite an existing one.",[2218,61331],{"path":61332,"scope":37937},"sharing",[26,61334,2222,61335,2226,61337,148],{},[659,61336,2225],{"href":1887},[659,61338,2231],{"href":2229,"rel":61339},[1218],{"title":67,"searchDepth":68,"depth":68,"links":61341},[61342,61343,61344],{"id":61300,"depth":670,"text":61301},{"id":61312,"depth":670,"text":61313},{"id":37781,"depth":670,"text":61324},"Get started with the axiom.ai No-Code Tool. Install the Chrome extension, create an account, and build your first browser automation.",{"metaTitle":61347},"No-Code browser automation builder",{"title":37650,"description":61345},"docs\u002Fno-code-tool\u002Fthe-builder\u002Findex","TSFxNCu0tf_D4e4gT48xElc-afZu7f_rQxZEwMK8_Mw",{"id":61352,"title":61353,"body":61354,"date":71,"description":61438,"extension":73,"meta":61439,"navigation":75,"order":2131,"path":31161,"seo":61440,"stem":61441,"__hash__":61442},"content\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Finstall.md","Installation",{"type":8,"value":61355,"toc":61431},[61356,61359,61363,61365,61374,61379,61383,61399,61403,61406,61409,61413,61415,61418,61424],[26,61357,61358],{},"The axiom.ai Chrome extension lets you build automations and run them on cloud infrastructure. Optionally, install the desktop application to run automations locally. The extension is required either way.",[107,61360,61362],{"id":61361},"install-the-chrome-extension","Install the Chrome extension",[112,61364],{},[26,61366,61367,61368,43261,61372,148],{},"To install the extension, open the ",[659,61369,61371],{"href":174,"rel":61370},[1218],"axiom.ai listing on the Chrome Web Store",[192,61373,119],{},[26,61375,61376],{},[1906,61377],{"alt":61378,"src":37681},"The axiom.ai listing in the Chrome Web Store with the Add to Chrome button highlighted",[21,61380,61382],{"id":61381},"set-up-the-extension","Set up the extension",[1923,61384,61385,61390,61396],{},[189,61386,1927,61387,61389],{},[192,61388,119],{}," to install the extension.",[189,61391,4285,61392,61395],{},[192,61393,61394],{},"jigsaw"," icon in the Chrome toolbar, then click the pin icon to keep axiom.ai visible.",[189,61397,61398],{},"Click the axiom.ai icon to open the extension.",[21,61400,61402],{"id":61401},"permissions","Permissions",[26,61404,61405],{},"The axiom.ai Chrome extension requests permission to read and change all sites you visit. This is required to display the extension window inside web pages and to run your automations. axiom.ai does not collect data from the sites you visit.",[26,61407,61408],{},"You can restrict this permission to specific sites in Chrome's extension settings, but axiom.ai may not work as expected.",[107,61410,61412],{"id":61411},"install-the-desktop-application","Install the desktop application",[112,61414],{},[26,61416,61417],{},"The desktop application is an optional companion to the Chrome extension. It lets your automations run locally and use local files. The extension is still required to build and run automations.",[26,61419,61420,61421,61423],{},"To install it, head to the ",[659,61422,45947],{"href":45946}," and follow the instructions for your operating system. The application needs to be active to run automations, but it doesn't need to be open in a window.",[2093,61425,61426],{},[26,61427,61428,61430],{},[192,61429,2359],{}," Automations run locally count towards your overall runtime.",{"title":67,"searchDepth":68,"depth":68,"links":61432},[61433,61437],{"id":61361,"depth":670,"text":61362,"children":61434},[61435,61436],{"id":61381,"depth":68,"text":61382},{"id":61401,"depth":68,"text":61402},{"id":61411,"depth":670,"text":61412},"Install the axiom.ai Chrome extension and optional desktop application to build and run browser automations.",{"metaTitle":61353},{"title":61353,"description":61438},"docs\u002Fno-code-tool\u002Fthe-builder\u002Finstall","x2MMYrfvDRi3ty6e1Vsu9C59vxMDja4qzth63OB2L1Q",{"id":61444,"title":61445,"body":61446,"date":71,"description":61687,"extension":73,"meta":61688,"navigation":75,"order":1478,"path":31803,"seo":61691,"stem":61692,"__hash__":61693},"content\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fpass.md","Pass data between steps",{"type":8,"value":61447,"toc":61673},[61448,61458,61460,61464,61466,61472,61475,61479,61482,61493,61499,61502,61506,61512,61518,61521,61524,61568,61572,61575,61581,61588,61591,61597,61600,61604,61607,61614,61620,61624,61627,61634,61637,61640,61644,61646,61649,61652,61656,61659,61663,61666,61670],[26,61449,61450,61451,61454,61455,148],{},"Data imported or generated by one step can be passed to another step in the same automation. Steps expose their output as ",[192,61452,61453],{},"data variables",", which you plug into later steps to transform, filter, or write that data elsewhere. To learn how to import data first, see the ",[659,61456,61457],{"href":33079},"data tutorials",[32947,61459],{},[107,61461,61463],{"id":61462},"pass-data-from-one-step-to-another","Pass data from one step to another",[112,61465],{},[26,61467,61468,61469,61471],{},"To pass data into a step, look for the ",[192,61470,31794],{}," button on any field that accepts it. Clicking it shows a list of variables produced by earlier steps.",[26,61473,61474],{},"Like variables in code, a data variable is only available to steps added after the step that produced it.",[21,61476,61478],{"id":61477},"steps-that-output-data","Steps that output data",[26,61480,61481],{},"Many steps in axiom.ai output data. You can spot them by the orange plug icon in their header.",[26,61483,61484,61485,4468,61488,10147,61491,148],{},"Each variable has a unique name that identifies the step it came from, for example ",[145,61486,61487],{},"google-sheet-data",[145,61489,61490],{},"custom-data",[145,61492,37875],{},[26,61494,61495],{},[1906,61496],{"alt":61497,"src":61498},"A step header showing an orange plug icon and the output data variable name","\u002Fimg\u002Fread-data-from-google-sheet-output.png",[32973,61500],{"url":61501},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FhsAZ9i_PitQ?rel=0&start=48&end=453",[21,61503,61505],{"id":61504},"steps-that-accept-data","Steps that accept data",[26,61507,61508,61509,61511],{},"Fields that accept data show an ",[192,61510,31794],{}," dropdown. Selecting a variable from the dropdown passes that data into the current step.",[26,61513,61514],{},[1906,61515],{"alt":61516,"src":61517},"The Insert data dropdown on a field that accepts data","\u002Fimg\u002Finsert_data.png",[32973,61519],{"url":61520},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FhsAZ9i_PitQ?rel=0&start=137&end=453",[26,61522,61523],{},"These are some of the steps you can pass data into:",[186,61525,61526,61530,61534,61539,61544,61549,61554,61559,61563],{},[189,61527,61528],{},[659,61529,17849],{"href":17846},[189,61531,61532],{},[659,61533,16065],{"href":17231},[189,61535,61536],{},[659,61537,39147],{"href":61538},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fextract-data-with-chatgpt",[189,61540,61541],{},[659,61542,19146],{"href":61543},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fgenerate-text-with-chatgpt",[189,61545,61546],{},[659,61547,61548],{"href":51124},"Export CSV",[189,61550,61551],{},[659,61552,61553],{"href":44340},"Write to a Google Sheet",[189,61555,61556],{},[659,61557,61558],{"href":19048},"Write JavaScript",[189,61560,61561],{},[659,61562,36887],{"href":36855},[189,61564,61565],{},[659,61566,61567],{"href":36795},"Append data",[21,61569,61571],{"id":61570},"select-what-data-to-pass","Select what data to pass",[26,61573,61574],{},"When passing data, you can pass everything or select a subset. For variables that support this, a column-picker window appears when you add the data.",[26,61576,61577],{},[1906,61578],{"alt":61579,"src":61580},"The column-picker window for selecting which columns of data to pass","\u002Fimg\u002Fdata_select.png",[26,61582,61583,61584,61587],{},"To pass specific columns, click ",[192,61585,61586],{},"Clear all"," then click each column header you want to include.",[26,61589,61590],{},"At runtime, the variable is replaced with the output from its associated step, exactly as if you had typed the data into the field manually.",[26,61592,61593],{},[1906,61594],{"alt":61595,"src":61596},"A field showing the selected columns that will be passed into the step at runtime","\u002Fimg\u002Fselected_data.png",[32973,61598],{"url":61599},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FhsAZ9i_PitQ?rel=0&start=174&end=453",[21,61601,61603],{"id":61602},"steps-that-require-data-input","Steps that require data input",[26,61605,61606],{},"Some steps need data passed in to function. If you add one of these steps before a step that outputs data, you'll see this warning:",[2093,61608,61609],{},[26,61610,61611,61613],{},[192,61612,2099],{}," This step requires data input to function. You should add a step that outputs data before this one to use it.",[26,61615,61616],{},[1906,61617],{"alt":61618,"src":61619},"A step showing the data-required warning message","\u002Fimg\u002Fdata_required.png",[21,61621,61623],{"id":61622},"data-formats-between-steps","Data formats between steps",[26,61625,61626],{},"Almost all step output is formatted as a two-dimensional array of rows and columns, the same as a spreadsheet. Steps that handle data accept this format and behave accordingly.",[26,61628,61629,61630,61633],{},"Data in axiom.ai is ",[192,61631,61632],{},"immutable",": once a step outputs data, no other step modifies it in place.",[26,61635,61636],{},"When a step processes data, it reads the input variable and produces a new variable with the modified result. The original is left unchanged. This is how steps remove duplicates, filter rows, replace text, and so on.",[32973,61638],{"url":61639},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FhsAZ9i_PitQ?rel=0&start=279&end=453",[107,61641,61643],{"id":61642},"data-variable-types","Data variable types",[112,61645],{},[26,61647,61648],{},"Data variables store information for use during a run. axiom.ai has three variable types, each with a different appearance and behaviour.",[32973,61650],{"url":61651},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FhsAZ9i_PitQ?rel=0&start=392&end=453",[21,61653,61655],{"id":61654},"global-variable","Global variable",[26,61657,61658],{},"A global variable is accessible anywhere in the automation, and you always have direct access to all the data it holds. It is overwritten each time it's regenerated, so loops do not accumulate data into a global variable. To accumulate, use an accumulator variable instead.",[21,61660,61662],{"id":61661},"loop-variable","Loop variable",[26,61664,61665],{},"A loop variable is the input to a loop. axiom.ai automatically selects the current row for each iteration. You can still pick a specific column from the row.",[21,61667,61669],{"id":61668},"accumulator-variable","Accumulator variable",[26,61671,61672],{},"An accumulator is a special global variable that collects the output of every sub-step inside a loop. Data is appended in step order, and the accumulator persists across multiple loops.",{"title":67,"searchDepth":68,"depth":68,"links":61674},[61675,61682],{"id":61462,"depth":670,"text":61463,"children":61676},[61677,61678,61679,61680,61681],{"id":61477,"depth":68,"text":61478},{"id":61504,"depth":68,"text":61505},{"id":61570,"depth":68,"text":61571},{"id":61602,"depth":68,"text":61603},{"id":61622,"depth":68,"text":61623},{"id":61642,"depth":670,"text":61643,"children":61683},[61684,61685,61686],{"id":61654,"depth":68,"text":61655},{"id":61661,"depth":68,"text":61662},{"id":61668,"depth":68,"text":61669},"Learn how data variables work in axiom.ai and how to pass data from one step to another in your automation.",{"metaTitle":61689,"video":61690},"Pass data between steps with axiom.ai variables","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FhsAZ9i_PitQ?rel=0&amp;start=0&end=453",{"title":61445,"description":61687},"docs\u002Fno-code-tool\u002Fthe-builder\u002Fpass","6Z_h4jZ34l5W22RpYcddfvs1tJE1mIPgBtJbaMVVMM0",{"id":61695,"title":61696,"body":61697,"date":71,"description":62338,"extension":73,"meta":62339,"navigation":75,"order":68,"path":31856,"seo":62341,"stem":62342,"__hash__":62343},"content\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fcustom-css-selectors.md","Use custom CSS selectors",{"type":8,"value":61698,"toc":62322},[61699,61709,61716,61720,61722,61725,61728,61741,61747,61750,61765,61771,61777,61783,61789,61793,61795,61800,61814,61817,61854,61860,61871,61875,61877,61880,61885,61890,61894,61897,61922,61925,61936,61940,61942,61966,61968,61977,61981,61983,62048,62051,62081,62085,62088,62091,62107,62110,62129,62132,62144,62148,62151,62178,62185,62204,62213,62238,62242,62244,62250,62256,62288,62291,62294,62296,62319],[26,61700,2273,61701,6205,61704,61708],{},[659,61702,61703],{"href":33297},"Single Selector",[659,61705,61707],{"href":61706},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fmulti","Multi Selector"," tools pick elements on a webpage for your automation to interact with. When the default picker doesn't get a unique match, you can supply your own CSS selector instead.",[26,61710,61711,61712,148],{},"For background on CSS selectors, see ",[659,61713,61715],{"href":61714},"#additional-resources","Additional resources",[107,61717,61719],{"id":61718},"add-a-custom-css-selector","Add a custom CSS selector",[112,61721],{},[26,61723,61724],{},"You can use custom CSS selectors in both the Single Selector and Multi Selector tools.",[21,61726,61703],{"id":61727},"single-selector",[1923,61729,61730,61736],{},[189,61731,61732,61733,61735],{},"Open the Selector Tool by clicking ",[192,61734,33198],{}," in an interact step.",[189,61737,1927,61738,61740],{},[192,61739,33331],{}," and enter your selector in the text box.",[26,61742,61743],{},[1906,61744],{"alt":61745,"src":61746},"The Single Selector tool with the Custom CSS selector field","\u002Fdocs\u002Ftutorials\u002Fsingle-selector-tool-custom-css.jpg",[21,61748,61707],{"id":61749},"multi-selector",[1923,61751,61752,61756,61762],{},[189,61753,61732,61754,61735],{},[192,61755,33198],{},[189,61757,61758,61759,148],{},"In the data column you want to target, click the arrow and choose ",[192,61760,61761],{},"Custom selector",[189,61763,61764],{},"Enter your selector in the text box.",[26,61766,61767],{},[1906,61768],{"alt":61769,"src":61770},"The Multi Selector tool showing the Custom selector option in a column dropdown","\u002Fdocs\u002Ftutorials\u002Fmulti-selector-tool-custom.jpg",[26,61772,61773],{},[1906,61774],{"alt":61775,"src":61776},"A custom CSS selector entered into the Multi Selector text field","\u002Fdocs\u002Ftutorials\u002Fusing-custom-selector.jpg",[26,61778,61779,61780,61782],{},"To set the custom selector dynamically from a data variable, click ",[192,61781,34017],{}," and pick the token that contains the selector. This is useful when you want to loop through several different selectors at runtime.",[26,61784,61785],{},[1906,61786],{"alt":61787,"src":61788},"Passing a data variable into the custom selector field","\u002Fdocs\u002Ftutorials\u002Fpass-data-into-selector-tool.jpg",[107,61790,61792],{"id":61791},"loop-through-custom-selectors","Loop through custom selectors",[112,61794],{},[26,61796,31861,61797,61799],{},[659,61798,15653],{"href":31407}," step to run an interaction against multiple custom selectors in turn. Common use cases:",[186,61801,61802,61805,61808,61811],{},[189,61803,61804],{},"Click through multiple buttons on a page.",[189,61806,61807],{},"Tick a series of checkboxes.",[189,61809,61810],{},"Walk a list of items, perform actions on each, then move to the next.",[189,61812,61813],{},"Scrape data from inconsistent layouts where each row needs a different selector.",[26,61815,61816],{},"To set this up:",[1923,61818,61819,61828,61836,61848],{},[189,61820,61821,61824,61825,61827],{},[192,61822,61823],{},"Read."," Add a ",[659,61826,22098],{"href":24142}," step to load your list of CSS selectors.",[189,61829,61830,61824,61833,61835],{},[192,61831,61832],{},"Loop.",[659,61834,15653],{"href":15650}," step using the output of the Read data step.",[189,61837,61838,61841,61842,61844,61845,148],{},[192,61839,61840],{},"Interact."," Inside the loop, add your interact step (for example ",[659,61843,15781],{"href":15778},") and configure it using a custom CSS selector. Follow the instructions in ",[659,61846,61719],{"href":61847},"#add-a-custom-css-selector",[189,61849,61850,61853],{},[192,61851,61852],{},"Run."," Run the automation and check that each selector matches the right element.",[26,61855,61856],{},[1906,61857],{"alt":61858,"src":61859},"A Google Sheet containing a column of CSS selectors used to drive the loop","\u002Fdocs\u002Ftutorials\u002Fcustom-selector-gsheets-example.png",[2093,61861,61862],{},[26,61863,61864,61866,61867,61870],{},[192,61865,2172],{}," Use the ",[659,61868,61869],{"href":50796},"Edit a row in a Google Sheet"," step to write scraped data back to the same row as the selector that produced it.",[107,61872,61874],{"id":61873},"choose-a-good-selector","Choose a good selector",[112,61876],{},[26,61878,61879],{},"A good selector is unique to the element you want, and stable enough to keep working when the page changes. Some sites make this deliberately hard to deter automation.",[26,61881,61882,61883,148],{},"The examples below introduce the main selector types in the context of axiom.ai. For deeper tutorials, see ",[659,61884,61715],{"href":61714},[26,61886,61887,61888,148],{},"To inspect the underlying HTML, right-click anywhere on the page and choose ",[192,61889,45263],{},[21,61891,61893],{"id":61892},"class-based-selectors","Class-based selectors",[26,61895,61896],{},"HTML:",[2446,61898,61900],{"className":35038,"code":61899,"language":35040,"meta":67,"style":67},"\u003Ch1 class=\"main-heading\">Interest rates cut for first time in over four years\u003C\u002Fh1>\n",[145,61901,61902],{"__ignoreMap":67},[1332,61903,61904,61906,61908,61910,61912,61915,61918,61920],{"class":2455,"line":2131},[1332,61905,23299],{"class":2521},[1332,61907,93],{"class":6125},[1332,61909,35071],{"class":2511},[1332,61911,5110],{"class":2521},[1332,61913,61914],{"class":2462},"\"main-heading\"",[1332,61916,61917],{"class":2521},">Interest rates cut for first time in over four years\u003C\u002F",[1332,61919,93],{"class":6125},[1332,61921,35052],{"class":2521},[26,61923,61924],{},"axiom.ai selector:",[2446,61926,61930],{"className":61927,"code":61928,"language":61929,"meta":67,"style":67},"language-css shiki shiki-themes github-light-default github-dark-default",".main-heading\n","css",[145,61931,61932],{"__ignoreMap":67},[1332,61933,61934],{"class":2455,"line":2131},[1332,61935,61928],{"class":2511},[21,61937,61939],{"id":61938},"id-based-selectors","ID-based selectors",[26,61941,61896],{},[2446,61943,61945],{"className":35038,"code":61944,"language":35040,"meta":67,"style":67},"\u003Ch1 id=\"main-heading\">Interest rates cut for first time in over four years\u003C\u002Fh1>\n",[145,61946,61947],{"__ignoreMap":67},[1332,61948,61949,61951,61953,61956,61958,61960,61962,61964],{"class":2455,"line":2131},[1332,61950,23299],{"class":2521},[1332,61952,93],{"class":6125},[1332,61954,61955],{"class":2511}," id",[1332,61957,5110],{"class":2521},[1332,61959,61914],{"class":2462},[1332,61961,61917],{"class":2521},[1332,61963,93],{"class":6125},[1332,61965,35052],{"class":2521},[26,61967,61924],{},[2446,61969,61971],{"className":61927,"code":61970,"language":61929,"meta":67,"style":67},"#main-heading\n",[145,61972,61973],{"__ignoreMap":67},[1332,61974,61975],{"class":2455,"line":2131},[1332,61976,61970],{"class":2511},[21,61978,61980],{"id":61979},"attribute-based-selectors","Attribute-based selectors",[26,61982,61896],{},[2446,61984,61986],{"className":35038,"code":61985,"language":35040,"meta":67,"style":67},"\u003Cinput aria-activedescendant=\"\" aria-controls=\"suggestions\" aria-expanded=\"false\" aria-haspopup=\"listbox\" id=\"searchInput\" placeholder=\"Search the BBC\" role=\"combobox\">\n",[145,61987,61988],{"__ignoreMap":67},[1332,61989,61990,61992,61994,61997,61999,62001,62004,62006,62009,62012,62014,62016,62019,62021,62024,62026,62028,62031,62033,62035,62038,62041,62043,62046],{"class":2455,"line":2131},[1332,61991,23299],{"class":2521},[1332,61993,28634],{"class":6125},[1332,61995,61996],{"class":2511}," aria-activedescendant",[1332,61998,5110],{"class":2521},[1332,62000,8573],{"class":2462},[1332,62002,62003],{"class":2511}," aria-controls",[1332,62005,5110],{"class":2521},[1332,62007,62008],{"class":2462},"\"suggestions\"",[1332,62010,62011],{"class":2511}," aria-expanded",[1332,62013,5110],{"class":2521},[1332,62015,38599],{"class":2462},[1332,62017,62018],{"class":2511}," aria-haspopup",[1332,62020,5110],{"class":2521},[1332,62022,62023],{"class":2462},"\"listbox\"",[1332,62025,61955],{"class":2511},[1332,62027,5110],{"class":2521},[1332,62029,62030],{"class":2462},"\"searchInput\"",[1332,62032,26977],{"class":2511},[1332,62034,5110],{"class":2521},[1332,62036,62037],{"class":2462},"\"Search the BBC\"",[1332,62039,62040],{"class":2511}," role",[1332,62042,5110],{"class":2521},[1332,62044,62045],{"class":2462},"\"combobox\"",[1332,62047,35052],{"class":2521},[26,62049,62050],{},"axiom.ai selectors (either works):",[2446,62052,62054],{"className":61927,"code":62053,"language":61929,"meta":67,"style":67},"[aria-controls=\"suggestions\"]\n[placeholder=\"Search the BBC\"]\n",[145,62055,62056,62069],{"__ignoreMap":67},[1332,62057,62058,62060,62063,62065,62067],{"class":2455,"line":2131},[1332,62059,19386],{"class":2521},[1332,62061,62062],{"class":2511},"aria-controls",[1332,62064,5110],{"class":2507},[1332,62066,62008],{"class":2462},[1332,62068,5164],{"class":2521},[1332,62070,62071,62073,62075,62077,62079],{"class":2455,"line":670},[1332,62072,19386],{"class":2521},[1332,62074,27103],{"class":2511},[1332,62076,5110],{"class":2507},[1332,62078,62037],{"class":2462},[1332,62080,5164],{"class":2521},[21,62082,62084],{"id":62083},"grouped-selectors","Grouped selectors",[26,62086,62087],{},"When a single selector isn't unique, combine two or more to narrow the match. Try different combinations until the selector picks only the element you want.",[26,62089,62090],{},"Group by class and element:",[2446,62092,62094],{"className":61927,"code":62093,"language":61929,"meta":67,"style":67},"header .consent-banner-text a\n",[145,62095,62096],{"__ignoreMap":67},[1332,62097,62098,62101,62104],{"class":2455,"line":2131},[1332,62099,62100],{"class":6125},"header",[1332,62102,62103],{"class":2511}," .consent-banner-text",[1332,62105,62106],{"class":6125}," a\n",[26,62108,62109],{},"Group by attribute and element:",[2446,62111,62113],{"className":61927,"code":62112,"language":61929,"meta":67,"style":67},"input[aria-controls=\"suggestions\"]\n",[145,62114,62115],{"__ignoreMap":67},[1332,62116,62117,62119,62121,62123,62125,62127],{"class":2455,"line":2131},[1332,62118,28634],{"class":6125},[1332,62120,19386],{"class":2521},[1332,62122,62062],{"class":2511},[1332,62124,5110],{"class":2507},[1332,62126,62008],{"class":2462},[1332,62128,5164],{"class":2521},[26,62130,62131],{},"Group by ID and element:",[2446,62133,62135],{"className":61927,"code":62134,"language":61929,"meta":67,"style":67},"#main-heading a\n",[145,62136,62137],{"__ignoreMap":67},[1332,62138,62139,62142],{"class":2455,"line":2131},[1332,62140,62141],{"class":2511},"#main-heading",[1332,62143,62106],{"class":6125},[21,62145,62147],{"id":62146},"advanced-selectors","Advanced selectors",[26,62149,62150],{},"For more specific cases, CSS pseudo-classes give you finer control:",[186,62152,62153,62166],{},[189,62154,62155,62158,62159,148],{},[145,62156,62157],{},":not()"," excludes elements that match a sub-selector. See ",[659,62160,62163,62165],{"href":62161,"rel":62162},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002F:not",[1218],[145,62164,62157],{}," on MDN",[189,62167,62168,62171,62172,148],{},[145,62169,62170],{},":has()"," matches elements that contain a descendant matching a sub-selector. See ",[659,62173,62176,62165],{"href":62174,"rel":62175},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002F:has",[1218],[145,62177,62170],{},[26,62179,62180,62181,62184],{},"For example, to select list items that don't also have the ",[145,62182,62183],{},"link"," class:",[2446,62186,62188],{"className":61927,"code":62187,"language":61929,"meta":67,"style":67},"p.list-item:not(.list-item.link)\n",[145,62189,62190],{"__ignoreMap":67},[1332,62191,62192,62194,62197,62199,62202],{"class":2455,"line":2131},[1332,62193,26],{"class":6125},[1332,62195,62196],{"class":2511},".list-item:not",[1332,62198,1213],{"class":2521},[1332,62200,62201],{"class":2511},".list-item.link",[1332,62203,5174],{"class":2521},[26,62205,62206,62207,62209,62210,3297],{},"To target an anchor whose ",[145,62208,20614],{}," contains ",[145,62211,62212],{},"checkout-",[2446,62214,62216],{"className":61927,"code":62215,"language":61929,"meta":67,"style":67},"a:has([href*=\"checkout-\"])\n",[145,62217,62218],{"__ignoreMap":67},[1332,62219,62220,62222,62225,62227,62229,62232,62235],{"class":2455,"line":2131},[1332,62221,659],{"class":6125},[1332,62223,62224],{"class":2511},":has",[1332,62226,19790],{"class":2521},[1332,62228,20614],{"class":2511},[1332,62230,62231],{"class":2507},"*=",[1332,62233,62234],{"class":2462},"\"checkout-\"",[1332,62236,62237],{"class":2521},"])\n",[107,62239,62241],{"id":62240},"use-nth-child-to-target-elements-by-position","Use nth-child() to target elements by position",[112,62243],{},[26,62245,62246,62249],{},[145,62247,62248],{},"nth-child()"," selects an element by its position within a parent. This is useful for picking out one specific item from a list, or for looping through every item in a series.",[26,62251,62252,62253,62255],{},"To loop through a series of elements, list each ",[145,62254,62248],{}," selector as a row in a Google Sheet:",[4589,62257,62258,62265],{},[4592,62259,62260],{},[4595,62261,62262],{},[4598,62263,62264],{},"Selector",[4605,62266,62267,62274,62281],{},[4595,62268,62269],{},[4610,62270,62271],{},[145,62272,62273],{},"button.download:nth-child(1)",[4595,62275,62276],{},[4610,62277,62278],{},[145,62279,62280],{},"button.download:nth-child(2)",[4595,62282,62283],{},[4610,62284,62285],{},[145,62286,62287],{},"button.download:nth-child(3)",[26,62289,62290],{},"Then use a Loop through data step to set the custom selector on your interact step to each row in turn.",[107,62292,61715],{"id":62293},"additional-resources",[112,62295],{},[186,62297,62298,62305,62312],{},[189,62299,62300],{},[659,62301,62304],{"href":62302,"rel":62303},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FLearn\u002FCSS\u002FBuilding_blocks\u002FSelectors",[1218],"Selectors on MDN",[189,62306,62307],{},[659,62308,62311],{"href":62309,"rel":62310},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FLearn\u002FCSS\u002FBuilding_blocks\u002FSelectors\u002FType_Class_and_ID_Selectors",[1218],"Type, class, and ID selectors on MDN",[189,62313,62314],{},[659,62315,62318],{"href":62316,"rel":62317},"https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fdevtools\u002Fcss",[1218],"Chrome DevTools CSS reference",[2819,62320,62321],{},"html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}",{"title":67,"searchDepth":68,"depth":68,"links":62323},[62324,62328,62329,62336,62337],{"id":61718,"depth":670,"text":61719,"children":62325},[62326,62327],{"id":61727,"depth":68,"text":61703},{"id":61749,"depth":68,"text":61707},{"id":61791,"depth":670,"text":61792},{"id":61873,"depth":670,"text":61874,"children":62330},[62331,62332,62333,62334,62335],{"id":61892,"depth":68,"text":61893},{"id":61938,"depth":68,"text":61939},{"id":61979,"depth":68,"text":61980},{"id":62083,"depth":68,"text":62084},{"id":62146,"depth":68,"text":62147},{"id":62240,"depth":670,"text":62241},{"id":62293,"depth":670,"text":61715},"Set custom CSS selectors in the Single Selector and Multi Selector tools to target elements that the default picker can't reach.",{"metaTitle":62340},"Use custom CSS selectors in the axiom.ai selector tools",{"title":61696,"description":62338},"docs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fcustom-css-selectors","ckywkTAHVz2KxmtFtNpYKgP9hV3egMqVranGAaq9H0g",{"id":62345,"title":62346,"body":62347,"date":71,"description":62393,"extension":73,"meta":62394,"navigation":75,"order":293,"path":49163,"seo":62396,"stem":62397,"__hash__":62398},"content\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Findex.md","The selector tool",{"type":8,"value":62348,"toc":62390},[62349,62366,62370,62372,62375,62378],[26,62350,62351,62352,62354,62355,62357,62358,62361,62362,148],{},"The selector tool is how you tell axiom.ai which elements on a page to interact with or scrape. Use the ",[659,62353,61703],{"href":33297}," to target one element at a time, or the ",[659,62356,61707],{"href":61706}," to extract data from a list. Both support ",[659,62359,31857],{"href":62360},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fsingle#select-with-a-custom-selector"," and can ",[659,62363,62365],{"href":62364},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fsingle#pass-selectors-from-a-google-sheet","accept selectors passed in from a data source",[107,62367,62369],{"id":62368},"tutorials-for-the-selector-tool","Tutorials for the selector tool",[112,62371],{},[26,62373,62374],{},"Walk through each tool below. The Single Selector is the right starting point for most steps. Move on to the Multi Selector when you're working with lists or tables, and to custom CSS selectors when the visual selector picks an element that doesn't generalise across pages.",[2218,62376],{"path":62377,"scope":37937},"single,multi,custom-css-selectors",[26,62379,2222,62380,2226,62382,62385,62386,148],{},[659,62381,2225],{"href":1887},[659,62383,2231],{"href":2229,"rel":62384},[1218],". For a deeper look at building selectors, see our blog post on ",[659,62387,62389],{"href":62388},"\u002Fblog\u002Fcss-attribute-selectors","CSS attribute selectors",{"title":67,"searchDepth":68,"depth":68,"links":62391},[62392],{"id":62368,"depth":670,"text":62369},"Use the no-code selector tool to pick elements to interact with, extract data from a page, and pass custom CSS selectors into your automations.",{"metaTitle":62395},"Pick elements and scrape data with the axiom.ai selector tool",{"title":62346,"description":62393},"docs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Findex","9OL4N89Qm-9KoEK2-tpaVfibtlsBfMSfD8cTHh_Ur1k",{"id":62400,"title":62401,"body":62402,"date":71,"description":62575,"extension":73,"meta":62576,"navigation":75,"order":670,"path":61706,"seo":62579,"stem":62580,"__hash__":62581},"content\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fmulti.md","Use the Multi Selector tool",{"type":8,"value":62403,"toc":62563},[62404,62410,62412,62415,62417,62423,62430,62433,62436,62440,62446,62450,62459,62463,62466,62474,62477,62481,62484,62487,62501,62504,62507,62511,62513,62517,62522,62525,62534,62537,62541,62547],[26,62405,62406,62407,62409],{},"The Multi Selector tool is built into the web scraping steps, such as ",[192,62408,40515],{},". It lets you point and click to choose what to extract from a webpage, set the data type for each column (text, image, link, or HTML), and group repeating content into rows. Advanced users can switch to custom CSS selectors when the visual picker isn't enough.",[32947,62411],{},[107,62413,62401],{"id":62414},"use-the-multi-selector-tool",[112,62416],{},[26,62418,62419,62420,62422],{},"To start, use the step finder to search for ",[145,62421,53127],{}," and add the scrape step you want.",[1923,62424,62425],{},[189,62426,1927,62427,62429],{},[192,62428,33198],{}," to start choosing the data to extract.",[32973,62431],{"url":62432},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F8QvfRWUSOuI?rel=0&start=80&end=543",[26,62434,62435],{},"The features below cover everything from a simple point-and-click selection to the grouping algorithm that powers row-by-row scraping.",[21,62437,62439],{"id":62438},"select-content","Select content",[26,62441,62442,62443,62445],{},"The simplest way to choose data is to point and click. After you click ",[192,62444,33198],{},", an orange highlight shows the selected element. Click an element again to unselect it. Set the data type (text, image, link, or HTML) to match what you want to extract.",[21,62447,62449],{"id":62448},"use-columns","Use columns",[26,62451,62452,62453,60274,62456,148],{},"Columns arrange the data you extract into a table. Each column has its own selector, data type, and optional custom CSS selector. To add a column, click ",[192,62454,62455],{},"Add column",[192,62457,62458],{},"Shift + N",[21,62460,62462],{"id":62461},"set-the-data-type","Set the data type",[26,62464,62465],{},"axiom.ai supports four data types: text, image, link, and HTML. Set the type per column based on what you want to extract.",[1923,62467,62468,62471],{},[189,62469,62470],{},"Click the dropdown menu at the top right of the column.",[189,62472,62473],{},"Choose the data type.",[32973,62475],{"url":62476},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F8QvfRWUSOuI?rel=0&start=128&end=543",[21,62478,62480],{"id":62479},"group-repeating-content-into-rows","Group repeating content into rows",[26,62482,62483],{},"axiom.ai detects patterns when you select two similar elements, then groups every matching element on the page into rows. This is how you scrape lists like profiles, search results, or product cards.",[26,62485,62486],{},"For example, to scrape a list of profiles with names, job titles, and profile links:",[1923,62488,62489,62492,62495],{},[189,62490,62491],{},"Select the first name at the top of the list.",[189,62493,62494],{},"Scroll down and select another name further down. axiom.ai detects the pattern and selects every name in the list.",[189,62496,62497,62498,62500],{},"Add a new column, change the data type to ",[192,62499,62183],{},", and select the same name again to capture its link.",[32973,62502],{"url":62503},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F8QvfRWUSOuI?rel=0&start=134&end=543",[26,62505,62506],{},"axiom.ai aligns the columns into rows automatically, so each profile's name, title, and link end up on the same row.",[107,62508,62510],{"id":62509},"advanced-features","Advanced features",[112,62512],{},[21,62514,62516],{"id":62515},"custom-css-selectors","Custom CSS selectors",[26,62518,62519,62520,148],{},"For sites where the visual picker can't get a clean match, switch to a custom CSS selector. Any valid CSS selector works. For background and examples, see ",[659,62521,31857],{"href":31856},[26,62523,62524],{},"To use a custom selector:",[1923,62526,62527,62529],{},[189,62528,62470],{},[189,62530,2340,62531,62533],{},[192,62532,61761],{}," and enter your CSS selector.",[32973,62535],{"url":62536},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F8QvfRWUSOuI?rel=0&start=164&end=543",[21,62538,62540],{"id":62539},"pass-a-selector-from-a-data-source","Pass a selector from a data source",[26,62542,37777,62543,62546],{},[659,62544,62545],{"href":31856},"pass selectors"," into the Multi Selector from another data source, for example a Google Sheet. This lets you change which elements to scrape at runtime without editing the automation.",[1923,62548,62549,62551,62558],{},[189,62550,62470],{},[189,62552,2340,62553,62555,62556,148],{},[192,62554,61761],{}," and tick ",[192,62557,34017],{},[189,62559,1927,62560,62562],{},[192,62561,31794],{}," and choose your data source.",{"title":67,"searchDepth":68,"depth":68,"links":62564},[62565,62571],{"id":62414,"depth":670,"text":62401,"children":62566},[62567,62568,62569,62570],{"id":62438,"depth":68,"text":62439},{"id":62448,"depth":68,"text":62449},{"id":62461,"depth":68,"text":62462},{"id":62479,"depth":68,"text":62480},{"id":62509,"depth":670,"text":62510,"children":62572},[62573,62574],{"id":62515,"depth":68,"text":62516},{"id":62539,"depth":68,"text":62540},"Point and click to select text, images, links, and HTML for extraction, group repeating content into rows, and apply custom CSS selectors.",{"metaTitle":62577,"video":62578},"Scrape data from a webpage with the axiom.ai Multi Selector","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F8QvfRWUSOuI?rel=0",{"title":62401,"description":62575},"docs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fmulti","BnE2uZ6DQ25Hh0qPqrNkUPYHue-VT-4JgxoKiltqKCQ",{"id":62583,"title":62584,"body":62585,"date":71,"description":62708,"extension":73,"meta":62709,"navigation":75,"order":2131,"path":33297,"seo":62712,"stem":62713,"__hash__":62714},"content\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fsingle.md","Use the Single Selector",{"type":8,"value":62586,"toc":62698},[62587,62590,62611,62613,62616,62618,62627,62631,62637,62643,62645,62647,62649,62652,62658,62663,62667,62675,62678,62682,62689,62695],[26,62588,62589],{},"The Single Selector captures the location of an HTML element you want to interact with, like a button or input field, without writing any code. The most direct way to use it is point and click, but you can also match by text, paste a custom CSS selector, or pass selectors in from a data source.",[26,62591,62592,62593,4468,62597,4468,62601,4468,62605,62610],{},"The Single Selector appears in the ",[659,62594,62595],{"href":15778},[192,62596,15781],{},[659,62598,62599],{"href":17231},[192,62600,16065],{},[659,62602,62603],{"href":16493},[192,62604,16496],{},[659,62606,62608],{"href":62607},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fselect-lists",[192,62609,17202],{},", and file upload and download steps.",[32947,62612],{},[107,62614,62584],{"id":62615},"use-the-single-selector",[112,62617],{},[26,62619,62620,62621,62623,62624,62626],{},"Open the step finder, search for a step that uses the tool (for example, ",[192,62622,15781],{},"), and add it to your automation. Inside the step, click ",[192,62625,33198],{}," to start picking the element.",[21,62628,62630],{"id":62629},"point-and-click","Point and click",[26,62632,62633,62634,62636],{},"The simplest way to pick an element is point and click. After clicking ",[192,62635,33198],{},", hover over the page and click the element you want. The selected element is highlighted in orange. To deselect, click the element again.",[26,62638,62639],{},[1906,62640],{"alt":62641,"src":62642},"Picking an element on a page using the Single Selector point-and-click mode","\u002Fimg\u002Fclick-single-selector.gif",[107,62644,62510],{"id":62509},[112,62646],{},[21,62648,33345],{"id":33344},[26,62650,62651],{},"Use the custom selector field to type or paste any valid CSS selector. This is useful when the point-and-click mode picks an element whose generated selector doesn't generalise to other pages, or when you already know the selector you need.",[26,62653,62654],{},[1906,62655],{"alt":62656,"src":62657},"The custom selector field on the Single Selector tool","\u002Fimg\u002Fcustom-selector-single.jpg",[26,62659,62660,62661,148],{},"For details on writing CSS selectors, see ",[659,62662,31857],{"href":31856},[21,62664,62666],{"id":62665},"match-by-element-text","Match by element text",[26,62668,62669,62670,62672,62673,148],{},"To pick an element by the text it contains, type the text into the selector. For example, type ",[145,62671,37781],{}," to match a button labelled ",[192,62674,61324],{},[26,62676,62677],{},"This is useful when an element doesn't have a stable class or ID, but its visible label stays the same across pages.",[21,62679,62681],{"id":62680},"pass-selectors-from-a-data-source","Pass selectors from a data source",[26,62683,62684,62685,62688],{},"Selectors can be passed in from a ",[659,62686,62687],{"href":31856},"data source",", such as a Google Sheet. The automation loops through the selectors in the data source and runs the step against each one.",[26,62690,62691],{},[1906,62692],{"alt":62693,"src":62694},"Passing selectors into the Single Selector from a Google Sheet","\u002Fimg\u002Fcustom-data.jpg",[26,62696,62697],{},"This pattern is useful for repeating UIs like calendars, where each cell needs a different selector but the action against each is the same.",{"title":67,"searchDepth":68,"depth":68,"links":62699},[62700,62703],{"id":62615,"depth":670,"text":62584,"children":62701},[62702],{"id":62629,"depth":68,"text":62630},{"id":62509,"depth":670,"text":62510,"children":62704},[62705,62706,62707],{"id":33344,"depth":68,"text":33345},{"id":62665,"depth":68,"text":62666},{"id":62680,"depth":68,"text":62681},"Use the no-code Single Selector to point and click an element on a page, type a text label to match it, paste a custom CSS selector, or pass selectors in from a data source.",{"metaTitle":62710,"video":62711},"Pick an element to interact with using the Single Selector","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fyrezy_068qs?rel=0",{"title":62584,"description":62708},"docs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fsingle","ijmRyCM1Sr9KCB_W8rkV34xfqYzJHmz6TQqytlmPhtw",{"id":62716,"title":62717,"body":62718,"date":71,"description":62776,"extension":73,"meta":62777,"navigation":75,"order":2237,"path":37780,"seo":62779,"stem":62780,"__hash__":62781},"content\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fsharing.md","Share an automation",{"type":8,"value":62719,"toc":62773},[62720,62723,62725,62729,62731,62736,62742,62765,62768],[26,62721,62722],{},"Every axiom.ai user can download an automation as a template file and share it. Use this to send a copy to our support team if you need help, or to share working automations with other users.",[32947,62724],{},[107,62726,62728],{"id":62727},"download-an-automation-to-share","Download an automation to share",[112,62730],{},[26,62732,62733,62734,148],{},"Downloading takes a few seconds. Once you have the file, you can share it however you choose. To start, open the automation you want to share in the ",[659,62735,10785],{"href":60901},[26,62737,62738],{},[1906,62739],{"alt":62740,"src":62741},"Click the gear icon in the Builder sidebar to open settings and share an automation","\u002Fdocs\u002Ftutorials\u002Fshare-automation-setting.jpg",[1923,62743,62744,62751,62757],{},[189,62745,4285,62746,62748,62749,148],{},[192,62747,60700],{}," icon in the vertical sidebar on the left of the Builder. Or click the kebab menu in the top right and choose ",[192,62750,4171],{},[189,62752,34005,62753,34008,62755,148],{},[659,62754,4171],{"href":60680},[192,62756,47095],{},[189,62758,62759,62760,34008,62763,148],{},"Under ",[192,62761,62762],{},"Share automation",[192,62764,2413],{},[32973,62766],{"url":62767},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F2fxhVQfjfqU?rel=0&start=0&end=42",[26,62769,62770],{},[1906,62771],{"alt":62772,"src":47111},"The Share automation panel in the axiom.ai Builder settings",{"title":67,"searchDepth":68,"depth":68,"links":62774},[62775],{"id":62727,"depth":670,"text":62728},"Download your axiom.ai automation as a template file so you can share it with our support team or with other users.",{"metaTitle":62778,"video":47148},"Share an axiom.ai automation as a downloadable template",{"title":62717,"description":62776},"docs\u002Fno-code-tool\u002Fthe-builder\u002Fsharing","grI2b5OMgifPpp9rGCE9vJwrZ5VU-E9CrU_jKxrSq7s",{"id":62783,"title":62784,"body":62785,"date":71,"description":62912,"extension":73,"meta":62913,"navigation":75,"order":670,"path":62915,"seo":62916,"stem":62917,"__hash__":62918},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferror-handling.md","Handle errors in an automation",{"type":8,"value":62786,"toc":62906},[62787,62798,62800,62802,62814,62820,62835,62839,62841,62847,62852,62864,62868,62870,62875,62879,62881,62890,62901],[26,62788,62789,62790,62794,62795,62797],{},"axiom.ai gives you a few ways to deal with errors that come up during a run. Use ",[659,62791,62792],{"href":32798},[192,62793,22049],{}," to recover and continue along a different path, or ",[659,62796,31955],{"href":23812}," to ignore failures entirely.",[107,62799,39528],{"id":39527},[112,62801],{},[26,62803,62804,62805,62807,62808,62810,62811,62813],{},"Wrap risky steps in a ",[192,62806,22049],{}," step to handle errors without stopping the whole automation. The steps inside the ",[192,62809,39558],{}," branch run as normal. If any of them throw an error, the automation jumps to the ",[192,62812,39564],{}," branch and runs those steps instead.",[26,62815,62816],{},[1906,62817],{"alt":62818,"src":62819},"The Try \u002F Catch step shown in the axiom.ai Builder with steps in both branches","\u002Fdocs\u002Ftutorials\u002Ftry-catch-error-handling.jpg",[26,62821,62822,62823,62825,62826,62828,62829,62831,62832,62834],{},"For example, put a ",[192,62824,40515],{}," step in the ",[192,62827,39558],{}," branch and recovery actions in the ",[192,62830,39564],{}," branch. If the data isn't found on the page, the automation runs the recovery actions instead of failing the whole run. Without ",[192,62833,22049],{},", the automation would stop at the failing step.",[107,62836,62838],{"id":62837},"ignore-errors-with-continue-on-error","Ignore errors with Continue on error",[112,62840],{},[26,62842,62843,62844,62846],{},"By default, axiom.ai stops on the first error to prevent unexpected side effects. Toggle ",[659,62845,31955],{"href":23812}," on to override that behaviour and let the automation push through errors.",[26,62848,62849],{},[1906,62850],{"alt":62851,"src":46846},"The Continue on error setting in the axiom.ai Builder",[2093,62853,62854],{},[26,62855,62856,62858,62859,62861,62862,31983],{},[192,62857,2359],{}," With ",[145,62860,23813],{}," enabled, every run reports as ",[192,62863,31982],{},[107,62865,62867],{"id":62866},"first-iteration-loop-errors","First-iteration loop errors",[112,62869],{},[26,62871,31911,62872,62874],{},[659,62873,37904],{"href":31407}," hits an error on its first row, axiom.ai treats it as a warning instead of an error. This means an empty data source or an unexpectedly bad first row doesn't stop the whole automation; subsequent iterations still run.",[107,62876,62878],{"id":62877},"get-notified-on-run-status","Get notified on run status",[112,62880],{},[26,62882,62883,62884,62886,62887,62889],{},"Set up ",[659,62885,24669],{"href":24685}," so you find out as soon as a run fails or finishes with warnings, instead of having to check the dashboard. Notifications can be sent by email or ",[659,62888,41659],{"href":36601}," and can fire on any combination of these events:",[186,62891,62892,62895,62898],{},[189,62893,62894],{},"A run fails.",[189,62896,62897],{},"A run succeeds.",[189,62899,62900],{},"A run succeeds with warnings.",[26,62902,62903],{},[1906,62904],{"alt":62905,"src":47748},"The notifications settings panel in the axiom.ai Builder",{"title":67,"searchDepth":68,"depth":68,"links":62907},[62908,62909,62910,62911],{"id":39527,"depth":670,"text":39528},{"id":62837,"depth":670,"text":62838},{"id":62866,"depth":670,"text":62867},{"id":62877,"depth":670,"text":62878},"Catch errors with Try \u002F Catch, ignore them with Continue on error, handle empty loops gracefully, and get notified when runs fail.",{"metaTitle":62914},"Catch and handle errors during axiom.ai automation runs","\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferror-handling",{"title":62784,"description":62912},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferror-handling","AJbKJk65ilUZ_lyjqb7cfCNG_jR2DkH8PgWbf7LAsD0",{"id":62920,"title":62921,"body":62922,"date":71,"description":63043,"extension":73,"meta":63044,"navigation":75,"order":1478,"path":63046,"seo":63047,"stem":63048,"__hash__":63049},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fdesktop-app.md","Desktop app errors",{"type":8,"value":62923,"toc":63039},[62924,62927,62931,62933,62938,62943,62946,62960,62965,62976,62982,62984,62986,62994,62999,63017,63021],[26,62925,62926],{},"The errors on this page can occur when running or debugging automations through the axiom.ai desktop application.",[107,62928,62930],{"id":62929},"port-3333-in-use","Port 3333 in use",[112,62932],{},[26,62934,62935,62937],{},[192,62936,30534],{}," Port 3333 in use.",[26,62939,62940,62942],{},[192,62941,30540],{}," The desktop app uses port 3333 to communicate with the Chrome extension. If another application is already bound to that port, or if a second instance of the desktop app is running, the app can't start.",[26,62944,62945],{},"Common causes:",[186,62947,62948,62951,62954,62957],{},[189,62949,62950],{},"Another desktop application is using port 3333.",[189,62952,62953],{},"A second instance of the axiom.ai desktop app is already running.",[189,62955,62956],{},"A previous axiom.ai process didn't shut down cleanly and is still holding the port.",[189,62958,62959],{},"A firewall, antivirus, or system-level process is blocking the port.",[26,62961,62962,62964],{},[192,62963,25693],{}," Work through these in order:",[1923,62966,62967,62970,62973],{},[189,62968,62969],{},"Quit and reopen the axiom.ai desktop app.",[189,62971,62972],{},"Check whether a second instance of the desktop app is running and quit it.",[189,62974,62975],{},"If the issue persists, restart your computer to release any hung processes.",[26,62977,62978,62979,62981],{},"If the error continues after a restart, ",[659,62980,26195],{"href":1887}," with details of any other applications you suspect may be using port 3333.",[107,62983,46477],{"id":46476},[112,62985],{},[26,62987,62988,62990,62991,62993],{},[192,62989,30534],{}," Browser could not be started. This may be an incompatibility between the axiom.ai desktop application and your operating system. Please contact ",[145,62992,2364],{}," and let us know about the issue. This error can also occur on Mac if you have tried to load a missing or broken extension.",[26,62995,62996,62998],{},[192,62997,30540],{}," This error has several possible causes:",[186,63000,63001,63004,63009,63014],{},[189,63002,63003],{},"An incompatibility between the desktop app and your operating system.",[189,63005,7407,63006,63008],{},[145,63007,23853],{}," setting pointing at the wrong Chrome executable.",[189,63010,7407,63011,63013],{},[145,63012,23873],{}," setting pointing at a missing or broken extension.",[189,63015,63016],{},"A hanging axiom.ai process on your machine.",[26,63018,63019,62964],{},[192,63020,25693],{},[1923,63022,63023,63026,63031,63036],{},[189,63024,63025],{},"Make sure your operating system is up to date. Older OS versions may not be compatible.",[189,63027,63028,63029,148],{},"Verify the Chrome path. See ",[659,63030,32358],{"href":23852},[189,63032,63033,63034,148],{},"Verify any loaded extension is installed and the path is correct. See ",[659,63035,46282],{"href":23872},[189,63037,63038],{},"Restart your computer to clear any hanging processes.",{"title":67,"searchDepth":68,"depth":68,"links":63040},[63041,63042],{"id":62929,"depth":670,"text":62930},{"id":46476,"depth":670,"text":46477},"Errors that can occur with the axiom.ai desktop application, including port conflicts that prevent the app from starting.",{"metaTitle":63045},"Fix errors with the axiom.ai desktop application","\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fdesktop-app",{"title":62921,"description":63043},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fdesktop-app","Fs6mbOaDb1Qg-ba_g7zYC5r7LWPxyDU1ar8J1OhkTww",{"id":63051,"title":63052,"body":63053,"date":71,"description":63160,"extension":73,"meta":63161,"navigation":75,"order":670,"path":63163,"seo":63164,"stem":63165,"__hash__":63166},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fgeneral.md","General errors",{"type":8,"value":63054,"toc":63154},[63055,63058,63062,63064,63069,63074,63081,63085,63087,63092,63097,63105,63109,63111,63116,63124,63131,63135,63137,63142,63147],[26,63056,63057],{},"The errors on this page are general issues that can occur during automation runs or when starting the desktop application.",[107,63059,63061],{"id":63060},"internal-server-error","Internal server error",[112,63063],{},[26,63065,63066,63068],{},[192,63067,30534],{}," Internal server error.",[26,63070,63071,63073],{},[192,63072,30540],{}," If you see this in the extension or when running an automation in the cloud, axiom.ai may be experiencing a service issue. If you see this on a page that isn't part of axiom.ai, contact the owner of that page.",[26,63075,63076,63078,63079,148],{},[192,63077,25693],{}," The team is likely already working on a resolution. If the error persists, ",[659,63080,26195],{"href":1887},[107,63082,63084],{"id":63083},"this-step-does-not-exist-in-your-version-of-the-axiomai-desktop-application","This step does not exist in your version of the axiom.ai desktop application",[112,63086],{},[26,63088,63089,63091],{},[192,63090,30534],{}," This step does not exist in your version of the axiom.ai desktop application.",[26,63093,63094,63096],{},[192,63095,30540],{}," A version mismatch between the installed desktop application and the automation you're running. The automation contains a step that was added in a newer version.",[26,63098,63099,63101,63102,63104],{},[192,63100,25693],{}," Update the ",[659,63103,30936],{"href":26107}," by opening it. If the Builder shows update prompts, follow them to update individual steps to the latest version.",[107,63106,63108],{"id":63107},"concurrency-limit-reached","Concurrency limit reached",[112,63110],{},[26,63112,63113,63115],{},[192,63114,30534],{}," All of your concurrency allocations are currently in use. Click below to stop them, or wait for them to finish.",[26,63117,63118,63120,63121,63123],{},[192,63119,30540],{}," Your account has hit its concurrency limit. See the ",[659,63122,7415],{"href":7414}," for the limits on each plan.",[26,63125,63126,63128,63129,148],{},[192,63127,25693],{}," Wait for in-flight runs to finish, or upgrade your plan for more ",[659,63130,31996],{"href":31995},[107,63132,63134],{"id":63133},"cloud-servers-busy","Cloud servers busy",[112,63136],{},[26,63138,63139,63141],{},[192,63140,30534],{}," Oh no, all our cloud servers are busy right now.",[26,63143,63144,63146],{},[192,63145,30540],{}," Very rare. axiom.ai's cloud capacity is fully in use.",[26,63148,63149,63151,63152,148],{},[192,63150,25693],{}," Try again in a few minutes, or run the automation locally in the ",[659,63153,26108],{"href":26107},{"title":67,"searchDepth":68,"depth":68,"links":63155},[63156,63157,63158,63159],{"id":63060,"depth":670,"text":63061},{"id":63083,"depth":670,"text":63084},{"id":63107,"depth":670,"text":63108},{"id":63133,"depth":670,"text":63134},"Errors that can occur during automation runs, including server errors, version mismatches, concurrency limits, and browser launch failures.",{"metaTitle":63162},"Fix common general errors in axiom.ai automations","\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fgeneral",{"title":63052,"description":63160},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fgeneral","4BVhPpSNJMLYGoSY8Ng7v9b0HzW5_qYaLNRdCmNkkoM",{"id":63168,"title":63169,"body":63170,"date":71,"description":63223,"extension":73,"meta":63224,"navigation":75,"order":2131,"path":45520,"seo":63226,"stem":63227,"__hash__":63228},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Findex.md","Common errors",{"type":8,"value":63171,"toc":63220},[63172,63175,63184,63188,63190,63210,63213],[26,63173,63174],{},"This section lists the errors most commonly seen in axiom.ai. Pick a category below and search for the message you're seeing for a description of the cause and the steps to fix it.",[26,63176,63177,63178,63181,63182,148],{},"If you can't find the error you're experiencing, free users can ask in the ",[659,63179,2231],{"href":2229,"rel":63180},[1218],", and subscribers can contact ",[659,63183,32296],{"href":1887},[107,63185,63187],{"id":63186},"error-categories","Error categories",[112,63189],{},[26,63191,63192,63193,63195,63196,6205,63198,63201,63202,6205,63204,63206,63207,63209],{},"The categories below group errors by where they originate. ",[192,63194,31280],{}," covers errors that span the platform. ",[192,63197,61353],{},[192,63199,63200],{},"Desktop app"," cover errors specific to those parts of the product. ",[192,63203,730],{},[192,63205,417],{}," cover errors thrown by specific automation components. ",[192,63208,2900],{}," covers errors that surface during a run, regardless of which step caused them.",[2218,63211],{"path":63212,"scope":37937},"general,installation,steps,integrations,desktop-app,runtime",[26,63214,2222,63215,2226,63217,148],{},[659,63216,2225],{"href":1887},[659,63218,2231],{"href":2229,"rel":63219},[1218],{"title":67,"searchDepth":68,"depth":68,"links":63221},[63222],{"id":63186,"depth":670,"text":63187},"Browse common errors by category to find the cause and recommended fix for issues with installation, runs, and the desktop application.",{"metaTitle":63225},"Common errors and fixes for axiom.ai automations",{"title":63169,"description":63223},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Findex","BXuTXT2pbEZjCIQX95jK_9WllI9s0yWjSdPJ6rCvwwY",{"id":63230,"title":63231,"body":63232,"date":71,"description":63296,"extension":73,"meta":63297,"navigation":75,"order":2131,"path":31231,"seo":63299,"stem":63300,"__hash__":63301},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Finstallation.md","Installation and uninstallation errors",{"type":8,"value":63233,"toc":63293},[63234,63237,63241,63243,63248,63253,63262,63274,63284],[26,63235,63236],{},"The errors on this page are related to installing or uninstalling the axiom.ai Chrome extension and desktop application.",[107,63238,63240],{"id":63239},"a-javascript-error-occurred-in-the-main-process","A JavaScript error occurred in the main process",[112,63242],{},[26,63244,63245,63247],{},[192,63246,30534],{}," A JavaScript error occurred in the main process.",[26,63249,63250,63252],{},[192,63251,30540],{}," A long-standing Windows issue when uninstalling Electron applications: the uninstaller occasionally leaves files behind on disk.",[26,63254,63255,63257,63258,63261],{},[192,63256,25693],{}," Remove the leftover files manually. axiom.ai stores few files on your machine, so this is a quick clean-up. Delete both of these folders, where ",[145,63259,63260],{},"\u003CUSER>"," is your Windows username:",[186,63263,63264,63269],{},[189,63265,63266],{},[145,63267,63268],{},"C:\\Users\\\u003CUSER>\\AppData\\Roaming\\axiom-desktop",[189,63270,63271],{},[145,63272,63273],{},"C:\\Users\\\u003CUSER>\\AppData\\Local\\Programs\\axiom-desktop",[26,63275,63276,63277,63279,63280,63283],{},"A search for ",[145,63278,31202],{}," from File Explorer also shows both folders. If axiom.ai was installed on a drive other than ",[145,63281,63282],{},"C:",", adjust the path accordingly.",[2093,63285,63286],{},[26,63287,63288,63290,63291,148],{},[192,63289,2359],{}," This issue is specific to Windows. If you see it on macOS or Linux, ",[659,63292,26195],{"href":1887},{"title":67,"searchDepth":68,"depth":68,"links":63294},[63295],{"id":63239,"depth":670,"text":63240},"Errors that can appear when installing or uninstalling the axiom.ai Chrome extension or desktop application, and how to resolve them.",{"metaTitle":63298},"Fix installation and uninstallation errors in axiom.ai",{"title":63231,"description":63296},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Finstallation","YqcZ3fo9Rx63PxcoaGXjqXGLS9IYwuxkcpizbM2_2SY",{"id":63303,"title":63304,"body":63305,"date":71,"description":63399,"extension":73,"meta":63400,"navigation":75,"order":68,"path":63402,"seo":63403,"stem":63404,"__hash__":63405},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fintegrations\u002F2captcha.md","2Captcha errors",{"type":8,"value":63306,"toc":63395},[63307,63323,63325,63327,63334,63342,63354,63356,63358,63365,63372,63383],[26,63308,63309,63310,63314,63315,63317,63318,148],{},"The errors on this page can occur when using the ",[659,63311,63312],{"href":21022},[192,63313,21025],{}," step. For background on the integration, see the ",[659,63316,35674],{"href":771}," page. For errors returned directly by the 2Captcha API, see the ",[659,63319,63322],{"href":63320,"rel":63321},"https:\u002F\u002F2captcha.com\u002F2captcha-api",[1218],"2Captcha API documentation",[107,63324,30561],{"id":30560},[112,63326],{},[26,63328,63329,5210,63331,148],{},[192,63330,30534],{},[145,63332,63333],{},"2captcha error: ERROR_WRONG_USER_KEY",[26,63335,63336,63338,63339,63341],{},[192,63337,30540],{}," The API key set on the ",[192,63340,21025],{}," step doesn't match a valid 2Captcha account.",[26,63343,63344,63346,63347,63350,63351,63353],{},[192,63345,25693],{}," Find your API key on the ",[659,63348,42790],{"href":42788,"rel":63349},[1218],", copy it in full, and paste it into ",[145,63352,4175],{}," on the step.",[107,63355,30527],{"id":30526},[112,63357],{},[26,63359,63360,5210,63362,148],{},[192,63361,30534],{},[145,63363,63364],{},"2Captcha API key: API key is required",[26,63366,63367,24126,63369,63371],{},[192,63368,30540],{},[192,63370,21025],{}," step doesn't have an API key set.",[26,63373,63374,63376,63377,63380,63381,63353],{},[192,63375,25693],{}," Sign up for a ",[659,63378,35700],{"href":35698,"rel":63379},[1218]," if you don't already have one, then paste your API key into ",[145,63382,4175],{},[2093,63384,63385],{},[26,63386,63387,63389,63390,63394],{},[192,63388,2359],{}," 2Captcha charges a small fee per successfully solved captcha. See ",[659,63391,63393],{"href":54549,"rel":63392},[1218],"2Captcha's pricing"," for current rates.",{"title":67,"searchDepth":68,"depth":68,"links":63396},[63397,63398],{"id":30560,"depth":670,"text":30561},{"id":30526,"depth":670,"text":30527},"Errors that can occur when using the Solve Captcha step with 2Captcha, mostly related to missing or invalid API keys.",{"metaTitle":63401},"Fix 2Captcha integration errors in axiom.ai","\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fintegrations\u002F2captcha",{"title":63304,"description":63399},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fintegrations\u002F2captcha","P9B1oV5LfSm3AqHAlDRhmUV7K6atiCbjIPrbdkZENAI",{"id":63407,"title":63408,"body":63409,"date":71,"description":63529,"extension":73,"meta":63530,"navigation":75,"order":670,"path":63532,"seo":63533,"stem":63534,"__hash__":63535},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fintegrations\u002Fai.md","AI integration errors",{"type":8,"value":63410,"toc":63525},[63411,63414,63428,63434,63438,63440,63449,63454,63461,63490,63494,63496,63501,63506,63511,63522],[26,63412,63413],{},"The errors on this page can occur when using AI steps in an automation. axiom.ai's AI steps connect to several providers:",[186,63415,63416,63419,63422,63425],{},[189,63417,63418],{},"OpenAI (ChatGPT and GPT models)",[189,63420,63421],{},"Google (Gemini)",[189,63423,63424],{},"Anthropic (Claude)",[189,63426,63427],{},"Perplexity AI (Sonar)",[26,63429,63430,63431,2679],{},"For background on the AI steps, see the ",[659,63432,63433],{"href":26084},"ChatGPT integration",[107,63435,63437],{"id":63436},"api-key-not-provided","API key not provided",[112,63439],{},[26,63441,63442,63444,63445,63448],{},[192,63443,30534],{}," You didn't provide an API key. You need to provide your API key in an Authorization header using Bearer auth (i.e. ",[145,63446,63447],{},"Authorization: Bearer YOUR_KEY","), or as the password field (with blank username) if you're accessing the API from your browser and are prompted for a username and password.",[26,63450,63451,63453],{},[192,63452,30540],{}," No API key was set on the AI step (for example a generate-text or LLM-prompt step).",[26,63455,63456,40370,63458,63460],{},[192,63457,25693],{},[145,63459,4175],{}," on the step. Get a key from the relevant provider's dashboard:",[186,63462,63463,63469,63475,63482],{},[189,63464,63465],{},[659,63466,63468],{"href":43258,"rel":63467},[1218],"OpenAI API keys",[189,63470,63471,63474],{},[659,63472,44017],{"href":44023,"rel":63473},[1218]," (Gemini)",[189,63476,63477,63481],{},[659,63478,63480],{"href":43495,"rel":63479},[1218],"Anthropic Console"," (Claude)",[189,63483,63484,63489],{},[659,63485,63488],{"href":63486,"rel":63487},"https:\u002F\u002Fwww.perplexity.ai\u002Fsettings\u002Fapi",[1218],"Perplexity API settings"," (Sonar)",[107,63491,63493],{"id":63492},"api-key-invalid","API key invalid",[112,63495],{},[26,63497,63498,63500],{},[192,63499,30534],{}," Incorrect API key provided.",[26,63502,63503,63505],{},[192,63504,30540],{}," The API key on the step is invalid, expired, or doesn't match the provider expected by the step.",[26,63507,63508,63510],{},[192,63509,25693],{}," Open the relevant provider's dashboard and check that:",[186,63512,63513,63516,63519],{},[189,63514,63515],{},"The key is still active.",[189,63517,63518],{},"The key matches the provider the step is configured for.",[189,63520,63521],{},"The key has no leading or trailing whitespace and was copied in full.",[26,63523,63524],{},"If the key looks correct and the error persists, regenerate it in the provider's dashboard and paste the new key into the step.",{"title":67,"searchDepth":68,"depth":68,"links":63526},[63527,63528],{"id":63436,"depth":670,"text":63437},{"id":63492,"depth":670,"text":63493},"Errors that can occur when using AI steps with OpenAI, Google Gemini, Anthropic Claude, or Perplexity Sonar, mostly related to missing or invalid API keys.",{"metaTitle":63531},"Fix API key errors in axiom.ai AI steps","\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fintegrations\u002Fai",{"title":63408,"description":63529},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fintegrations\u002Fai","VVzEUe1z3hosT3pqt8VMXkLsN7q1LynvBS_szmFw-nk",{"id":63537,"title":63538,"body":63539,"date":71,"description":63827,"extension":73,"meta":63828,"navigation":75,"order":2131,"path":63830,"seo":63831,"stem":63832,"__hash__":63833},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fintegrations\u002Fgoogle-sheets.md","Google Sheets errors",{"type":8,"value":63540,"toc":63816},[63541,63546,63550,63552,63557,63562,63571,63575,63577,63585,63590,63601,63605,63607,63612,63617,63625,63629,63631,63639,63644,63649,63653,63655,63663,63671,63682,63686,63688,63696,63709,63720,63724,63726,63738,63746,63764,63768,63770,63775,63780,63793,63797,63799,63804,63809],[26,63542,63543,63544,148],{},"The errors on this page are specific to the Google Sheets integration. For general background on the integration, see ",[659,63545,41247],{"href":963},[107,63547,63549],{"id":63548},"google-access-token-has-expired","Google access token has expired",[112,63551],{},[26,63553,63554,63556],{},[192,63555,30534],{}," Your Google access token is invalid or has expired. Please connect your Google account to continue.",[26,63558,63559,63561],{},[192,63560,30540],{}," Google has revoked the token axiom.ai uses to act on your behalf, usually as a security precaution. This is controlled by Google, not axiom.ai.",[26,63563,63564,5210,63566,63570],{},[192,63565,25693],{},[659,63567,63569],{"href":63568},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fgoogle-sheets#connect-a-google-sheets-account","Reconnect your Google account"," and re-run the automation.",[107,63572,63574],{"id":63573},"no-data-in-google-sheet","No data in Google Sheet",[112,63576],{},[26,63578,63579,63581,63582,63584],{},[192,63580,30534],{}," No data read from spreadsheet, aborting run. Turn on ",[145,63583,44315],{}," in this step if you want the run to proceed.",[26,63586,63587,63589],{},[192,63588,30540],{}," The automation couldn't find any data in the Google Sheet referenced by the step. Most often this is because the sheet itself is empty, but it can also happen if the sheet name or cell range points at an empty area.",[26,63591,63592,63594,63595,42265,63597,15415],{},[192,63593,25693],{}," Confirm there's data in the sheet. If you genuinely want the automation to continue when the sheet is empty, enable ",[145,63596,44315],{},[659,63598,63599],{"href":24142},[192,63600,22098],{},[107,63602,63604],{"id":63603},"no-editor-permission-for-google-sheet","No editor permission for Google Sheet",[112,63606],{},[26,63608,63609,63611],{},[192,63610,30534],{}," You do not have editor permissions for this Google Sheet with the Google account connected to your axiom.ai account. You will not be able to write to it.",[26,63613,63614,63616],{},[192,63615,30540],{}," The Google account connected to axiom.ai has read-only access to the sheet, so write operations fail.",[26,63618,63619,63621,63622,63624],{},[192,63620,25693],{}," Check the share settings on the ",[659,63623,26048],{"href":963},". If you don't have editor access, ask the sheet owner to grant it.",[107,63626,63628],{"id":63627},"sheet-not-found","Sheet not found",[112,63630],{},[26,63632,63633,63635,63636,148],{},[192,63634,30534],{}," The sheet cannot be found. Please verify the URL and the name are valid. The error can also appear as ",[192,63637,63638],{},"Requested entity not found",[26,63640,63641,63643],{},[192,63642,30540],{}," The Google Sheet URL or sheet tab name set in the step doesn't match a sheet your connected Google account can see.",[26,63645,63646,63648],{},[192,63647,25693],{}," Check the spreadsheet URL and the sheet name set in the step. Confirm the sheet exists, hasn't been deleted, and is shared with the Google account connected to axiom.ai.",[107,63650,63652],{"id":63651},"first-cell-is-not-correctly-formatted","First cell is not correctly formatted",[112,63654],{},[26,63656,63657,63659,63660,63662],{},[192,63658,30534],{}," First cell value is not in the correct format. It should be capital letters followed by optional numbers. For example, ",[145,63661,44310],{}," starts from column B and row 10.",[26,63664,63665,63667,63668,63670],{},[192,63666,30540],{}," The value in ",[145,63669,36414],{}," doesn't match Google Sheets' cell-reference format. This field appears in every spreadsheet step.",[26,63672,63673,40370,63675,63677,63678,2344,63680,148],{},[192,63674,25693],{},[145,63676,36414],{}," to a valid cell reference, for example ",[145,63679,36418],{},[145,63681,44310],{},[107,63683,63685],{"id":63684},"invalid-range","Invalid range",[112,63687],{},[26,63689,63690,63692,63693,63695],{},[192,63691,30534],{}," Invalid range set in step. Please adjust the value in ",[145,63694,44380],{}," to a valid range.",[26,63697,63698,63700,63701,63703,63704,63708],{},[192,63699,30540],{}," The range entered under ",[145,63702,44380],{}," in the ",[659,63705,63706],{"href":44340},[192,63707,22113],{}," step isn't a valid Google Sheets range.",[26,63710,63711,63713,63714,63717,63718,148],{},[192,63712,25693],{}," Set the range to a valid value such as ",[145,63715,63716],{},"A2:B10"," or a single cell like ",[145,63719,36418],{},[107,63721,63723],{"id":63722},"values-must-be-strings","Values must be strings",[112,63725],{},[26,63727,63728,63730,63731,63734,63735,63737],{},[192,63729,30534],{}," Values must be strings. Found value ",[145,63732,63733],{},"undefined"," of type ",[145,63736,63733],{}," on row 1.",[26,63739,63740,63742,63743,63745],{},[192,63741,30540],{}," axiom.ai writes string values to Google Sheets. A row in the data being written contains a value that isn't a string (often ",[145,63744,63733],{}," from an upstream step that didn't produce data).",[26,63747,63748,63750,63751,63755,63756,63760,63761,63763],{},[192,63749,25693],{}," Trace the data variable feeding the write step back to its source. Confirm every cell contains a string. If some rows can be empty, use a ",[659,63752,63753],{"href":37193},[192,63754,37206],{}," step or a ",[659,63757,63758],{"href":19048},[192,63759,19051],{}," step to substitute an empty string for any ",[145,63762,63733],{}," values before writing.",[107,63765,63767],{"id":63766},"cannot-delete-all-rows","Cannot delete all rows",[112,63769],{},[26,63771,63772,63774],{},[192,63773,30534],{}," You can't delete all the rows on a Google Sheet. Please make sure your sheet contains either empty rows, or rows with data.",[26,63776,63777,63779],{},[192,63778,30540],{}," Google Sheets requires at least one row in every sheet, so deleting them all isn't allowed.",[26,63781,63782,63784,63785,63789,63790,63792],{},[192,63783,25693],{}," Adjust the ",[659,63786,63787],{"href":32103},[192,63788,32106],{}," step so at least one row remains. Either lower ",[145,63791,44531],{},", or leave the header row in place.",[107,63794,63796],{"id":63795},"google-sheets-unavailable","Google Sheets unavailable",[112,63798],{},[26,63800,63801,63803],{},[192,63802,30534],{}," Unable to fetch data from the Google Sheet. Please try again shortly. If the issue persists, contact customer support.",[26,63805,63806,63808],{},[192,63807,30540],{}," axiom.ai couldn't reach Google Sheets. This is usually a temporary network issue or a Google Sheets outage.",[26,63810,63811,63813,63814,148],{},[192,63812,25693],{}," Wait a few minutes and try again. If the error persists, ",[659,63815,26195],{"href":1887},{"title":67,"searchDepth":68,"depth":68,"links":63817},[63818,63819,63820,63821,63822,63823,63824,63825,63826],{"id":63548,"depth":670,"text":63549},{"id":63573,"depth":670,"text":63574},{"id":63603,"depth":670,"text":63604},{"id":63627,"depth":670,"text":63628},{"id":63651,"depth":670,"text":63652},{"id":63684,"depth":670,"text":63685},{"id":63722,"depth":670,"text":63723},{"id":63766,"depth":670,"text":63767},{"id":63795,"depth":670,"text":63796},"Errors that can occur when reading from or writing to Google Sheets, including expired tokens, missing data, permission issues, and invalid ranges.",{"metaTitle":63829},"Fix common Google Sheets integration errors in axiom.ai","\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fintegrations\u002Fgoogle-sheets",{"title":63538,"description":63827},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fintegrations\u002Fgoogle-sheets","8a1wYXRibVx1y-TyqMOgKiCT9a0c_OpH8aVHMnEez5Q",{"id":63835,"title":63836,"body":63837,"date":71,"description":63867,"extension":73,"meta":63868,"navigation":75,"order":670,"path":63870,"seo":63871,"stem":63872,"__hash__":63873},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fintegrations\u002Findex.md","Integration errors",{"type":8,"value":63838,"toc":63864},[63839,63842,63849,63853,63855,63857],[26,63840,63841],{},"This section lists the errors most commonly seen with axiom.ai integrations. Pick a category below and search for the message you're seeing for a description of the cause and the steps to fix it.",[26,63843,63177,63844,63181,63847,148],{},[659,63845,2231],{"href":2229,"rel":63846},[1218],[659,63848,32296],{"href":1887},[107,63850,63852],{"id":63851},"integration-error-categories","Integration error categories",[112,63854],{},[2218,63856],{},[26,63858,2222,63859,2226,63861,148],{},[659,63860,2225],{"href":1887},[659,63862,2231],{"href":2229,"rel":63863},[1218],{"title":67,"searchDepth":68,"depth":68,"links":63865},[63866],{"id":63851,"depth":670,"text":63852},"Browse errors specific to axiom.ai integrations including Google Sheets, AI providers, and 2Captcha, with the cause and recommended fix for each.",{"metaTitle":63869},"Common errors with axiom.ai integrations","\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fintegrations",{"title":63836,"description":63867},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fintegrations\u002Findex","XJI6FPw1P3PYx4gV1ZSn-rTzNVD4GWBYLu1WtAvP3EQ",{"id":63875,"title":63876,"body":63877,"date":71,"description":64005,"extension":73,"meta":64006,"navigation":75,"order":68,"path":64008,"seo":64009,"stem":64010,"__hash__":64011},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fruntime.md","Runtime errors",{"type":8,"value":63878,"toc":63999},[63879,63882,63886,63888,63902,63907,63921,63938,63942,63944,63949,63956,63960,63962,63967,63972,63981,63985,63987,63992],[26,63880,63881],{},"The errors on this page occur during an automation run.",[107,63883,63885],{"id":63884},"selectors-found-no-content","Selectors found no content",[112,63887],{},[26,63889,63890,63892,63893,4468,63896,10147,63899,148],{},[192,63891,30534],{}," Your chosen selectors have failed to find any content on the page. The error can also appear as ",[192,63894,63895],{},"Could not find the requested element",[192,63897,63898],{},"Error in all rows of loop",[192,63900,63901],{},"Error in all rows of loop, your chosen selectors have failed to find any content on the page",[26,63903,63904,63906],{},[192,63905,30540],{}," The element your step is configured to interact with isn't on the page. Common causes:",[186,63908,63909,63912,63915,63918],{},[189,63910,63911],{},"The selector is inconsistent across pages.",[189,63913,63914],{},"The automation is on the wrong page when the step runs.",[189,63916,63917],{},"The page hasn't finished loading.",[189,63919,63920],{},"The site is blocking the automation.",[26,63922,63923,63925,63926,63930,63931,2344,63933,63935,63936,148],{},[192,63924,25693],{}," Confirm the element is on the page when you load it manually, and that the automation is on the correct page when the step runs. To handle slow-loading pages, increase the minimum wait time in the ",[659,63927,63929],{"href":63928},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fscraping#configure-the-scraper-for-speed","step's configure scraper options",". If the site is blocking the automation, try the ",[659,63932,26108],{"href":26107},[659,63934,31698],{"href":31697},". If none of these resolve the issue, ",[659,63937,26195],{"href":1887},[107,63939,63941],{"id":63940},"browser-closed","Browser closed",[112,63943],{},[26,63945,63946,63948],{},[192,63947,30540],{}," The browser was closed while the automation was still running.",[26,63950,63951,63953,63954,148],{},[192,63952,25693],{}," Don't close the browser during a run. If the browser closes on its own, ",[659,63955,26195],{"href":1887},[107,63957,63959],{"id":63958},"execution-context-was-destroyed-most-likely-because-of-a-navigation","Execution context was destroyed, most likely because of a navigation",[112,63961],{},[26,63963,63964,63966],{},[192,63965,30534],{}," Execution context was destroyed, most likely because of a navigation.",[26,63968,63969,63971],{},[192,63970,30540],{}," The browser navigated away from the page or tab the automation was working on.",[26,63973,63974,63976,63977,15415],{},[192,63975,25693],{}," Don't switch tabs while a run is in progress. If the automation needs to follow a link that opens in a new tab, handle the switch with the ",[659,63978,63979],{"href":35778},[192,63980,18071],{},[107,63982,63984],{"id":63983},"runtime-errors-on-long-automations","Runtime errors on long automations",[112,63986],{},[26,63988,63989,63991],{},[192,63990,30540],{}," Larger automations can hit single-run runtime limits or concurrency limits.",[26,63993,63994,63996,63997,148],{},[192,63995,25693],{}," Break large jobs into smaller batches. For example, split a 10,000-record scrape into ten runs of 1,000 records each. This reduces the chance of a single error costing you the whole job and makes restarts much faster. For runtime and concurrency limits per plan, see the ",[659,63998,7415],{"href":7414},{"title":67,"searchDepth":68,"depth":68,"links":64000},[64001,64002,64003,64004],{"id":63884,"depth":670,"text":63885},{"id":63940,"depth":670,"text":63941},{"id":63958,"depth":670,"text":63959},{"id":63983,"depth":670,"text":63984},"Errors that occur while an automation is running, including missing elements, browser navigation issues, and runtime limits on long jobs.",{"metaTitle":64007},"Fix errors that occur during an axiom.ai automation run","\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fruntime",{"title":63876,"description":64005},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fruntime","PU-XFwRO0k4wLvzvBiMnpVnbqZfdhtzs0Jy2Z9vA-CM",{"id":64013,"title":64014,"body":64015,"date":71,"description":64106,"extension":73,"meta":64107,"navigation":75,"order":2237,"path":64109,"seo":64110,"stem":64111,"__hash__":64112},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Fcontrol-flow.md","Control flow step errors",{"type":8,"value":64016,"toc":64102},[64017,64024,64028,64030,64040,64053,64064,64068,64070,64075,64088],[26,64018,64019,64020,6205,64022,148],{},"The errors on this page can occur with control flow steps such as ",[192,64021,34808],{},[192,64023,30823],{},[107,64025,64027],{"id":64026},"jump-target-step-does-not-exist","Jump target step does not exist",[112,64029],{},[26,64031,64032,5210,64034,64036,64037,148],{},[192,64033,30534],{},[145,64035,34808],{},": Step number given does not exist in this axiom. The error can also appear as ",[192,64038,64039],{},"Step number given does not exist in this axiom",[26,64041,64042,64044,64045,64047,64048,64052],{},[192,64043,30540],{}," The step number set in ",[145,64046,34831],{}," on a ",[659,64049,64050],{"href":34805},[192,64051,34808],{}," step doesn't match an actual step in the automation. This often happens after deleting or reordering steps.",[26,64054,64055,64057,64058,64060,64061,64063],{},[192,64056,25693],{}," Open the ",[192,64059,34808],{}," step and update ",[145,64062,34831],{}," to a step that exists. After moving steps around in an automation, check every jump step still points where you intended.",[107,64065,64067],{"id":64066},"continue-condition-did-not-pass","Continue condition did not pass",[112,64069],{},[26,64071,64072,64074],{},[192,64073,30534],{}," Continue condition check did not pass.",[26,64076,64077,64079,64080,64084,64085,64087],{},[192,64078,30540],{}," A ",[659,64081,64082],{"href":30820},[192,64083,30823],{}," step's condition evaluated to false (or to true if ",[145,64086,39315],{}," was on), so the automation stopped at that point.",[26,64089,64090,64092,64093,64095,64096,64098,64099,64101],{},[192,64091,25693],{}," Watch the run to see what value ",[145,64094,39327],{}," actually contained when the step fired, then adjust ",[145,64097,39332],{}," to match the data you're seeing. If the failed condition should be a clean stop rather than an error, leave ",[145,64100,39450],{}," off; the automation will end without an error.",{"title":67,"searchDepth":68,"depth":68,"links":64103},[64104,64105],{"id":64026,"depth":670,"text":64027},{"id":64066,"depth":670,"text":64067},"Errors that can occur with control flow steps including Jump to another step and Continue only if a condition is met.",{"metaTitle":64108},"Fix errors with Jump and Continue if condition met steps","\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Fcontrol-flow",{"title":64014,"description":64106},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Fcontrol-flow","WH1gl-Tsp6VRnMO6Bx7vRbgAGSxi3a5HJHIFum5silk",{"id":64114,"title":64115,"body":64116,"date":71,"description":64219,"extension":73,"meta":64220,"navigation":75,"order":293,"path":64222,"seo":64223,"stem":64224,"__hash__":64225},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Ffiles.md","File step errors",{"type":8,"value":64117,"toc":64214},[64118,64121,64125,64127,64132,64142,64157,64161,64163,64168,64173,64181,64185,64187,64192,64201],[26,64119,64120],{},"The errors on this page can occur with file upload and download steps.",[107,64122,64124],{"id":64123},"file-to-upload-not-found","File to upload not found",[112,64126],{},[26,64128,64129,64131],{},[192,64130,30534],{}," Could not find the file to upload. Please double check that a file exists at the given path.",[26,64133,64134,64136,64137,64141],{},[192,64135,30540],{}," The path set on an ",[659,64138,64139],{"href":36075},[192,64140,31171],{}," step doesn't point at a file that exists when the automation runs.",[26,64143,64144,64057,64146,64148,64149,64151,64152,64156],{},[192,64145,25693],{},[192,64147,31171],{}," step and click ",[192,64150,34168],{}," to browse for the file. Confirm the file is at that path on the machine running the automation. For desktop runs that's your local machine; for cloud runs you'll need a path the cloud runner can reach (typically a Google Drive file via the ",[659,64153,64154],{"href":35908},[192,64155,35911],{}," step instead).",[107,64158,64160],{"id":64159},"file-download-did-not-start","File download did not start",[112,64162],{},[26,64164,64165,64167],{},[192,64166,30534],{}," File download did not start.",[26,64169,64170,64172],{},[192,64171,30540],{}," axiom.ai triggered the download but no file started downloading. The most common cause is a network issue or the site blocking the download.",[26,64174,64175,64177,64178,64180],{},[192,64176,25693],{}," Try the download manually in your browser to confirm it works at all. If it does, run the automation in the ",[659,64179,26108],{"href":26107}," so the local browser handles the download instead of the cloud runner.",[107,64182,64184],{"id":64183},"could-not-create-folder","Could not create folder",[112,64186],{},[26,64188,64189,64191],{},[192,64190,30534],{}," Couldn't create folder. Try a different location or change write permissions.",[26,64193,64194,64079,64196,64200],{},[192,64195,30540],{},[659,64197,64198],{"href":34121},[192,64199,34124],{}," step couldn't create the destination folder. Either the parent folder doesn't exist, or the user running axiom.ai doesn't have write permission for the location.",[26,64202,64203,64205,64206,64209,64210,64213],{},[192,64204,25693],{}," Check that the parent folder exists. axiom.ai can only create one folder at a time, so a path like ",[145,64207,64208],{},"\u002FDownloads\u002Fscrapes\u002F2025\u002Fjanuary"," fails if ",[145,64211,64212],{},"2025"," doesn't already exist. Confirm your user account has write permission for the destination.",{"title":67,"searchDepth":68,"depth":68,"links":64215},[64216,64217,64218],{"id":64123,"depth":670,"text":64124},{"id":64159,"depth":670,"text":64160},{"id":64183,"depth":670,"text":64184},"Errors that can occur with file steps including Upload a file and Download file, with the cause and recommended fix for each.",{"metaTitle":64221},"Fix errors with axiom.ai file upload and download steps","\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Ffiles",{"title":64115,"description":64219},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Ffiles","LLXSUJXTcvmbG6BCRSy6I81FMtyKIjoRYm2xgepJM3k",{"id":64227,"title":64228,"body":64229,"date":71,"description":64259,"extension":73,"meta":64260,"navigation":75,"order":68,"path":64262,"seo":64263,"stem":64264,"__hash__":64265},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Findex.md","Step errors",{"type":8,"value":64230,"toc":64256},[64231,64234,64241,64245,64247,64249],[26,64232,64233],{},"This section lists errors specific to individual step categories. Pick a category below and search for the message you're seeing for a description of the cause and the steps to fix it.",[26,64235,63177,64236,63181,64239,148],{},[659,64237,2231],{"href":2229,"rel":64238},[1218],[659,64240,32296],{"href":1887},[107,64242,64244],{"id":64243},"step-error-categories","Step error categories",[112,64246],{},[2218,64248],{},[26,64250,2222,64251,2226,64253,148],{},[659,64252,2225],{"href":1887},[659,64254,2231],{"href":2229,"rel":64255},[1218],{"title":67,"searchDepth":68,"depth":68,"links":64257},[64258],{"id":64243,"depth":670,"text":64244},"Browse errors specific to axiom.ai steps by category, including interact, scrape, navigate, loop, files, control flow, JavaScript, and webhooks.",{"metaTitle":64261},"Common errors with axiom.ai steps","\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps",{"title":64228,"description":64259},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Findex","kFSBjUF4VdbKbiikXHZkD00j_4H9CGVoTT7rYjaeif4",{"id":64267,"title":64268,"body":64269,"date":71,"description":64408,"extension":73,"meta":64409,"navigation":75,"order":2131,"path":64411,"seo":64412,"stem":64413,"__hash__":64414},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Finteract.md","Interact step errors",{"type":8,"value":64270,"toc":64402},[64271,64280,64284,64286,64299,64304,64315,64320,64324,64326,64331,64347,64356,64360,64362,64370,64375,64380,64382,64384,64392,64397],[26,64272,64273,64274,4468,64276,2936,64278,148],{},"The errors on this page can occur with interact steps such as ",[192,64275,15781],{},[192,64277,16065],{},[192,64279,19564],{},[107,64281,64283],{"id":64282},"element-not-found-on-page","Element not found on page",[112,64285],{},[26,64287,64288,64290,64291,4468,64293,10147,64296,148],{},[192,64289,30534],{}," Your chosen selectors have failed to find any content on page. The error can also appear as ",[192,64292,63895],{},[192,64294,64295],{},"Error in all rows of loop, your chosen selectors have failed to find any content on page",[192,64297,64298],{},"Node is either not clickable or not an HTMLElement on row 1",[26,64300,64301,64303],{},[192,64302,30540],{}," The element selected in the step wasn't on the page when the automation ran. Common causes:",[186,64305,64306,64309,64312],{},[189,64307,64308],{},"The page didn't finish loading before the step fired.",[189,64310,64311],{},"The page changed since the automation was set up, and the selector no longer matches.",[189,64313,64314],{},"The automation is on a different page from the one the selector was built against.",[26,64316,64317,64319],{},[192,64318,25693],{}," Re-select the element using the selector tool inside the failing step. If the page is slow to load, increase the minimum wait time in the step's configure scraper options.",[107,64321,64323],{"id":64322},"text-is-not-iterable","Text is not iterable",[112,64325],{},[26,64327,64328,64330],{},[192,64329,30534],{}," Text is not iterable.",[26,64332,64333,64335,64336,2344,64340,64344,64345,4360],{},[192,64334,30540],{}," An ",[659,64337,64338],{"href":17231},[192,64339,16065],{},[659,64341,64342],{"href":19561},[192,64343,19564],{}," step has an empty ",[145,64346,33781],{},[26,64348,64349,40370,64351,64353,64354,148],{},[192,64350,25693],{},[145,64352,33781],{}," on the step to a value, or pass data in via ",[192,64355,31794],{},[107,64357,64359],{"id":64358},"character-not-recognised","Character not recognised",[112,64361],{},[26,64363,64364,5210,64366,64369],{},[192,64365,30534],{},[145,64367,64368],{},"(Something)"," is not a character.",[26,64371,64372,64374],{},[192,64373,30540],{}," The text contains a character axiom.ai doesn't recognise as a single character. This often happens with copy-pasted content that includes hidden formatting or zero-width characters.",[26,64376,64377,64379],{},[192,64378,25693],{}," Look at the text in the failing step and replace any unusual characters. If the text was copy-pasted, retype it manually to strip any invisible metadata.",[107,64381,63941],{"id":63940},[112,64383],{},[26,64385,64386,64388,64389,148],{},[192,64387,30534],{}," Browser closed. The error can also appear as ",[192,64390,64391],{},"Automation could not continue as all open browser tabs were closed",[26,64393,64394,64396],{},[192,64395,30540],{}," The browser or all of its tabs were closed during the run.",[26,64398,64399,64401],{},[192,64400,25693],{}," Keep the browser open while the automation runs. To run unattended without this risk, run the automation in the cloud instead of on the desktop.",{"title":67,"searchDepth":68,"depth":68,"links":64403},[64404,64405,64406,64407],{"id":64282,"depth":670,"text":64283},{"id":64322,"depth":670,"text":64323},{"id":64358,"depth":670,"text":64359},{"id":63940,"depth":670,"text":63941},"Errors that can occur with interact steps including click, enter text, and press key, with the cause and recommended fix for each.",{"metaTitle":64410},"Fix errors with click, enter text, and press key axiom.ai steps","\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Finteract",{"title":64268,"description":64408},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Finteract","Tdr4gKYri9wlfi4cz5whafU55ZheoCFHABlvct6P4_Y",{"id":64416,"title":64417,"body":64418,"date":71,"description":64484,"extension":73,"meta":64485,"navigation":75,"order":1478,"path":64487,"seo":64488,"stem":64489,"__hash__":64490},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Floop.md","Loop step errors",{"type":8,"value":64419,"toc":64481},[64420,64432,64435,64437,64444,64452,64457],[26,64421,64422,64423,64427,64428,64431],{},"The errors on this page relate to the ",[659,64424,64425],{"href":15650},[192,64426,15653],{}," step. Most loop errors are caused by a step ",[26030,64429,64430],{},"inside"," the loop failing on every iteration, not by the loop itself.",[107,64433,63898],{"id":64434},"error-in-all-rows-of-loop",[112,64436],{},[26,64438,64439,64441,64442,148],{},[192,64440,30534],{}," Error in all rows of loop. The error appears with the underlying message appended, for example ",[192,64443,64295],{},[26,64445,64446,64448,64449,64451],{},[192,64447,30540],{}," A step inside the ",[192,64450,15653],{}," step failed on every iteration. The text after the comma is the actual error from the failing inner step. The wrapping \"Error in all rows of loop\" prefix tells you the failure is consistent rather than intermittent.",[26,64453,64454,64456],{},[192,64455,25693],{}," Look up the underlying error in its specific section:",[186,64458,64459,64464,64469,64475],{},[189,64460,64461],{},[659,64462,63895],{"href":64463},"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Finteract#element-not-found-on-page",[189,64465,64466],{},[659,64467,64468],{"href":64463},"Your chosen selectors have failed to find any content on page",[189,64470,64471],{},[659,64472,64474],{"href":64473},"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Fnavigate","Protocol error (Page.navigate)",[189,64476,64477],{},[659,64478,64480],{"href":64479},"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fgeneral#evaluation-failed","Evaluation failed",{"title":67,"searchDepth":68,"depth":68,"links":64482},[64483],{"id":64434,"depth":670,"text":63898},"Errors that can occur with loop steps, including how to debug a loop where every iteration fails.",{"metaTitle":64486},"Fix errors with Loop through data and other axiom.ai loop steps","\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Floop",{"title":64417,"description":64484},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Floop","LpnOXiqyqRMMze5SGUzQcxLG9p9r5ncKmKuJGdiSQQk",{"id":64492,"title":64493,"body":64494,"date":71,"description":64535,"extension":73,"meta":64536,"navigation":75,"order":2623,"path":64538,"seo":64539,"stem":64540,"__hash__":64541},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Fmisc.md","Other step errors",{"type":8,"value":64495,"toc":64532},[64496,64499,64503,64505,64513,64525],[26,64497,64498],{},"The errors on this page don't fit the other step categories.",[107,64500,64502],{"id":64501},"javascript-runtime-error","JavaScript runtime error",[112,64504],{},[26,64506,64507,5210,64509,64512],{},[192,64508,30534],{},[145,64510,64511],{},"[javascript error message]",". Please check your code.",[26,64514,64515,64079,64517,64521,64522,64524],{},[192,64516,30540],{},[659,64518,64519],{"href":19048},[192,64520,19051],{}," step threw an error when it ran. The actual JavaScript error appears in place of ",[145,64523,64511],{}," in the displayed message.",[26,64526,64527,64529,64530,148],{},[192,64528,25693],{}," Read the JavaScript error in the message itself; it tells you what went wrong (a syntax error, an undefined variable, a failed network call, and so on). For tips on debugging JavaScript steps, see ",[659,64531,30744],{"href":30807},{"title":67,"searchDepth":68,"depth":68,"links":64533},[64534],{"id":64501,"depth":670,"text":64502},"Errors that don't fit other step categories, including JavaScript runtime errors from the Write javascript step.",{"metaTitle":64537},"Fix miscellaneous step errors in axiom.ai automations","\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Fmisc",{"title":64493,"description":64535},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Fmisc","Rtb5JkLVjtFg-jLa9B_JHF8Ihzw24OHrAqDmkTRIkWI",{"id":64543,"title":64544,"body":64545,"date":71,"description":64655,"extension":73,"meta":64656,"navigation":75,"order":68,"path":64473,"seo":64658,"stem":64659,"__hash__":64660},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Fnavigate.md","Navigate step errors",{"type":8,"value":64546,"toc":64650},[64547,64554,64558,64560,64565,64575,64582,64586,64588,64593,64601,64606,64610,64612,64627,64636],[26,64548,64549,64550,6205,64552,148],{},"The errors on this page can occur with navigate steps such as ",[192,64551,17849],{},[192,64553,18071],{},[107,64555,64557],{"id":64556},"cannot-navigate-to-blank-url","Cannot navigate to blank URL",[112,64559],{},[26,64561,64562,64564],{},[192,64563,30534],{}," Cannot navigate to blank URL.",[26,64566,64567,64079,64569,64344,64573,4360],{},[192,64568,30540],{},[659,64570,64571],{"href":17846},[192,64572,17849],{},[145,64574,4603],{},[26,64576,64577,40370,64579,64581],{},[192,64578,25693],{},[145,64580,4603],{}," on the step to a valid URL, or disable the step if it isn't needed.",[107,64583,64585],{"id":64584},"cannot-open-this-url","Cannot open this URL",[112,64587],{},[26,64589,64590,64592],{},[192,64591,30534],{}," Could not open this URL.",[26,64594,64595,64597,64598,64600],{},[192,64596,30540],{}," The URL set in the ",[192,64599,17849],{}," step isn't valid or isn't reachable from axiom.ai's runner.",[26,64602,64603,64605],{},[192,64604,25693],{}," Open the URL manually in your browser to confirm it loads. Check for typos, expired links, or sites that block traffic from cloud runners.",[107,64607,64609],{"id":64608},"tab-does-not-exist","Tab does not exist",[112,64611],{},[26,64613,64614,5210,64616,64618,64619,64622,64623,64626],{},[192,64615,30534],{},[145,64617,18071],{},": You are attempting to switch to browser tab ",[145,64620,64621],{},"{tab_number}"," but only ",[145,64624,64625],{},"{open_count}"," browser tabs are open.",[26,64628,64629,64079,64631,64635],{},[192,64630,30540],{},[659,64632,64633],{"href":35778},[192,64634,18071],{}," step is set to a tab number that doesn't exist when the step runs. For example, the step is set to switch to tab 3 but only 2 tabs are open.",[26,64637,64638,64640,64641,64643,64644,64646,64647,64649],{},[192,64639,25693],{}," Watch the automation run to see how many tabs are open at the moment the ",[192,64642,18071],{}," step fires, then update ",[145,64645,35790],{}," on the step to match. If the tab count varies between runs, set the position to ",[192,64648,35793],{}," instead of a fixed number.",{"title":67,"searchDepth":68,"depth":68,"links":64651},[64652,64653,64654],{"id":64556,"depth":670,"text":64557},{"id":64584,"depth":670,"text":64585},{"id":64608,"depth":670,"text":64609},"Errors that can occur with navigate steps including Go to page and Switch browser tab, with the cause and recommended fix for each.",{"metaTitle":64657},"Fix errors with Go to page and Switch browser tab axiom.ai steps",{"title":64544,"description":64655},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Fnavigate","ETrwhWVmTpu15t096-Hyvf_cGQTgJNHGQ41u5rlPb3g",{"id":64662,"title":64663,"body":64664,"date":71,"description":64710,"extension":73,"meta":64711,"navigation":75,"order":670,"path":64713,"seo":64714,"stem":64715,"__hash__":64716},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Fscrape.md","Scrape step errors",{"type":8,"value":64665,"toc":64707},[64666,64673,64675,64677,64685,64689,64698],[26,64667,64668,64669,6205,64671,148],{},"The errors on this page can occur with scrape steps such as ",[192,64670,32839],{},[192,64672,20136],{},[107,64674,64283],{"id":64282},[112,64676],{},[26,64678,64679,64290,64681,2344,64683,148],{},[192,64680,30534],{},[192,64682,63895],{},[192,64684,64295],{},[26,64686,64687,64303],{},[192,64688,30540],{},[186,64690,64691,64694,64696],{},[189,64692,64693],{},"The page didn't finish loading before the scrape fired.",[189,64695,64311],{},[189,64697,64314],{},[26,64699,64700,64702,64703,64706],{},[192,64701,25693],{}," Re-select the element using the selector tool inside the failing step. If the page is slow to load, increase the minimum wait time in the step's ",[659,64704,64705],{"href":63928},"configure scraper"," options.",{"title":67,"searchDepth":68,"depth":68,"links":64708},[64709],{"id":64282,"depth":670,"text":64283},"Errors that can occur with scrape steps including Get data from a URL and Get data from current page, with the cause and recommended fix.",{"metaTitle":64712},"Fix errors with axiom.ai web scraping steps","\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Fscrape",{"title":64663,"description":64710},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Fscrape","f_Dmg_705Xw1y_lHYbysilja7vFqrURqtpayz7cprhY",{"id":64718,"title":64719,"body":64720,"date":71,"description":64817,"extension":73,"meta":64818,"navigation":75,"order":2637,"path":64820,"seo":64821,"stem":64822,"__hash__":64823},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Fwebhooks-api.md","Webhook and API step errors",{"type":8,"value":64721,"toc":64812},[64722,64728,64732,64734,64744,64758,64763,64767,64769,64774,64779,64784,64788,64790,64795,64804],[26,64723,64724,64725,148],{},"The errors on this page can occur with steps that send or receive data over webhooks. For errors returned by the axiom.ai API itself, see ",[659,64726,30515],{"href":64727},"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fapi",[107,64729,64731],{"id":64730},"text-must-be-valid-json","Text must be valid JSON",[112,64733],{},[26,64735,64736,64738,64739,148],{},[192,64737,30534],{}," Text must be a valid JSON string. The error can also appear as ",[192,64740,64741,64743],{},[145,64742,64368],{}," is not valid JSON",[26,64745,64746,64748,64749,64753,64754,148],{},[192,64747,30540],{}," The payload set on a ",[659,64750,64751],{"href":1123},[192,64752,13063],{}," step isn't valid ",[659,64755,6539],{"href":64756,"rel":64757},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FLearn\u002FJavaScript\u002FObjects\u002FJSON",[1218],[26,64759,64760,64762],{},[192,64761,25693],{}," Check the payload for syntax issues such as missing quotes, trailing commas, or unescaped characters. Paste it into an online JSON validator if you're unsure.",[107,64764,64766],{"id":64765},"webhook-returned-an-error","Webhook returned an error",[112,64768],{},[26,64770,64771,64773],{},[192,64772,30534],{}," Webhook server returned an error. Please check your JSON for errors.",[26,64775,64776,64778],{},[192,64777,30540],{}," axiom.ai sent the payload, but the receiving server responded with an error. The cause is on the receiving end, not in axiom.ai.",[26,64780,64781,64783],{},[192,64782,25693],{}," Check what the receiving service expects. Common causes include payload structure mismatches, missing authentication headers, or a service outage on the receiving end.",[107,64785,64787],{"id":64786},"no-data-received-from-webhook","No data received from webhook",[112,64789],{},[26,64791,64792,64794],{},[192,64793,30534],{}," No data has been received from an external service and no test data entered for this step.",[26,64796,64797,64079,64799,64803],{},[192,64798,30540],{},[659,64800,64801],{"href":25942},[192,64802,15414],{}," step ran without any data flowing in from the trigger, and no test data is set on the step.",[26,64805,64806,64808,64809,64811],{},[192,64807,25693],{}," When testing the automation manually, toggle ",[145,64810,42293],{}," on and set a sample 2D array so the step has something to work with. When triggering from a webhook, check the upstream service is actually sending data in the format axiom.ai expects.",{"title":67,"searchDepth":68,"depth":68,"links":64813},[64814,64815,64816],{"id":64730,"depth":670,"text":64731},{"id":64765,"depth":670,"text":64766},{"id":64786,"depth":670,"text":64787},"Errors that can occur when using the Trigger webhook and Receive data from another app steps, including JSON validation issues and missing test data.",{"metaTitle":64819},"Fix errors with webhook and API steps in axiom.ai","\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Fwebhooks-api",{"title":64719,"description":64817},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors\u002Fsteps\u002Fwebhooks-api","VvHTv5pcs3DYiHLGSEET8YmcC0NQg6w0JKm1uXElUJI",{"id":64825,"title":30744,"body":64826,"date":71,"description":65066,"extension":73,"meta":65067,"navigation":75,"order":2131,"path":30743,"seo":65070,"stem":65071,"__hash__":65072},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Fhow-to-debug.md",{"type":8,"value":64827,"toc":65057},[64828,64843,64845,64849,64851,64854,64860,64864,64866,64872,64878,64882,64884,64890,64896,64900,64902,64905,64932,64936,64938,64943,64949,64963,64973,64977,64979,64987,64996,65002,65006,65008,65019,65028,65037,65045],[26,64829,64830,64831,6205,64836,64840,64841,148],{},"There are several ways to debug an automation in axiom.ai. The fastest path is to read the error message, follow its recommended action, and use the in-builder debugger. When that's not enough, the ",[659,64832,64833],{"href":50285},[192,64834,64835],{},"Display a message",[659,64837,64838],{"href":47793},[192,64839,11519],{}," steps let you inspect data during a run. For background on specific errors, see ",[659,64842,45521],{"href":45520},[32947,64844],{},[107,64846,64848],{"id":64847},"read-the-in-builder-error-messages","Read the in-builder error messages",[112,64850],{},[26,64852,64853],{},"When an automation hits an issue, errors and warnings appear inline in the Builder. The message describes what went wrong and often suggests how to fix it. Read these first; most issues can be resolved straight from the message.",[26,64855,64856],{},[1906,64857],{"alt":64858,"src":64859},"An error message displayed inline in the axiom.ai Builder","\u002Fdocs\u002Ftutorials\u002Ferror-report.jpg",[107,64861,64863],{"id":64862},"use-the-debugger","Use the debugger",[112,64865],{},[26,64867,64868,64869,64871],{},"Every error message includes a ",[192,64870,48739],{}," button. Clicking it opens the debugger, which highlights the steps with issues and suggests an action to fix each one.",[26,64873,64874],{},[1906,64875],{"alt":64876,"src":64877},"The axiom.ai debugger highlighting a step with an issue","\u002Fdocs\u002Ftutorials\u002Faxiom-debugger.jpg",[107,64879,64881],{"id":64880},"check-run-reports","Check run reports",[112,64883],{},[26,64885,64886,64887,64889],{},"If you missed the in-builder message (for example, on a scheduled or cloud run), check ",[192,64888,3166],{}," in the dashboard. Every run is logged there with the same error and warning detail.",[26,64891,64892],{},[1906,64893],{"alt":64894,"src":64895},"A run report showing errors from a previous automation run","\u002Fdocs\u002Ftutorials\u002Ferror-run-report.jpg",[107,64897,64899],{"id":64898},"watch-the-run","Watch the run",[112,64901],{},[26,64903,64904],{},"Watching the automation run is one of the most useful debugging techniques. Screen-record it if you can, then play it back to see exactly where things go wrong. While watching, look for:",[186,64906,64907,64914,64920,64926],{},[189,64908,64909,64910,64913],{},"Elements ",[192,64911,64912],{},"missing"," from the page.",[189,64915,2273,64916,64919],{},[192,64917,64918],{},"order of elements"," changing.",[189,64921,64922,64925],{},[192,64923,64924],{},"Loading"," issues.",[189,64927,64928,64931],{},[192,64929,64930],{},"Captchas"," being triggered.",[107,64933,64935],{"id":64934},"use-the-display-a-message-step","Use the Display a message step",[112,64937],{},[26,64939,2273,64940,64942],{},[192,64941,64835],{}," step opens a pop-up showing the data you pass into it. Use it like a print statement to confirm what's flowing between steps.",[26,64944,64945],{},[1906,64946],{"alt":64947,"src":64948},"The Display a message step used to confirm scrape output during a debug run","\u002Fdocs\u002Ftutorials\u002Fdisplay-message-debug.jpg",[26,64950,64951,64952,36024,64954,64956,64957,64959,64960,64962],{},"To inspect data partway through a run, open the step finder and add a ",[192,64953,64835],{},[192,64955,31794],{}," and pick the variable you want to see. For example, drop a ",[145,64958,27218],{}," token into the message after a ",[192,64961,40515],{}," step to confirm the right rows are being scraped.",[2093,64964,64965],{},[26,64966,64967,64969,64970,64972],{},[192,64968,2172],{}," Disable your ",[192,64971,64835],{}," steps before shipping the automation. They add pop-ups to every run and aren't needed in production.",[107,64974,64976],{"id":64975},"use-the-add-error-metadata-step","Use the Add error metadata step",[112,64978],{},[26,64980,2273,64981,64983,64984,64986],{},[192,64982,11519],{}," step attaches extra context to errors. Place it ",[26030,64985,30186],{}," a step that might fail, and the metadata is included in the error if that step throws.",[26,64988,64989,64990,64992,64993,64995],{},"For example, if you're passing a variable into an ",[192,64991,16065],{}," step and the step sometimes fails on bad input, add an ",[192,64994,11519],{}," step beforehand that includes the variable's contents. The error message then tells you exactly what value caused the failure.",[26,64997,64998],{},[1906,64999],{"alt":65000,"src":65001},"An Add error metadata step placed before an Enter text step in the Builder","\u002Fdocs\u002Ftutorials\u002Ferror-add-error-metadata.jpg",[107,65003,65005],{"id":65004},"use-chrome-devtools","Use Chrome DevTools",[112,65007],{},[26,65009,65010,65011,65014,65015,15415],{},"Chrome DevTools is built into Chrome. The ",[192,65012,65013],{},"Console"," tab shows warnings and errors from the page itself, plus anything you log from the ",[659,65016,65017],{"href":19048},[192,65018,19051],{},[26,65020,65021,65022,65024,65025,65027],{},"To open DevTools, right-click the page and choose ",[192,65023,45263],{},", then switch to the ",[192,65026,65013],{}," tab.",[26,65029,65030,65031,65033,65034,65036],{},"If you're debugging a ",[192,65032,19051],{}," step, use ",[145,65035,3456],{}," inside the script to see values during the run. This can also help diagnose issues with the page itself rather than the automation.",[26,65038,65039,65040,148],{},"For more on DevTools, see the ",[659,65041,65044],{"href":65042,"rel":65043},"https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fdevtools",[1218],"Chrome DevTools documentation",[2093,65046,65047],{},[26,65048,65049,65051,65052,65056],{},[192,65050,2359],{}," DevTools is only available for desktop runs. Cloud runs close the browser when they finish, so you may need to add a ",[659,65053,65054],{"href":21702},[192,65055,18065],{}," step at the end of the automation to keep the window open long enough to inspect the console.",{"title":67,"searchDepth":68,"depth":68,"links":65058},[65059,65060,65061,65062,65063,65064,65065],{"id":64847,"depth":670,"text":64848},{"id":64862,"depth":670,"text":64863},{"id":64880,"depth":670,"text":64881},{"id":64898,"depth":670,"text":64899},{"id":64934,"depth":670,"text":64935},{"id":64975,"depth":670,"text":64976},{"id":65004,"depth":670,"text":65005},"Use the in-builder error messages, debugger, run reports, and steps like Display a message and Add error metadata to find the cause of a failing automation.",{"metaTitle":65068,"video":65069},"Debug an axiom.ai automation when a run fails","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FaIa_QH9_Ycg?rel=0&amp;start=0&end=584",{"title":30744,"description":65066},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Fhow-to-debug","4mqugcz8_YyilnAH-TBzFREe6mcf3PBiLuI_6VuQAUQ",{"id":65074,"title":34069,"body":65075,"date":71,"description":65110,"extension":73,"meta":65111,"navigation":75,"order":2237,"path":42703,"seo":65113,"stem":65114,"__hash__":65115},"content\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Findex.md",{"type":8,"value":65076,"toc":65107},[65077,65088,65092,65094,65097,65100],[26,65078,65079,65080,65083,65084,65087],{},"When an automation fails or behaves unexpectedly, the pages in this section help you find out why. Use the ",[659,65081,65082],{"href":30743},"debugger and Display a message step"," to inspect what's happening during a run, and the ",[659,65085,65086],{"href":62915},"error handling guide"," to keep an automation running through expected failures.",[107,65089,65091],{"id":65090},"troubleshooting-guides","Troubleshooting guides",[112,65093],{},[26,65095,65096],{},"Start with the debugger when you need to see what's happening during a run. Move on to error handling once you understand the failure and want the automation to react to it gracefully. The common errors reference covers specific error messages, what they mean, and how to fix each one.",[2218,65098],{"path":65099,"scope":37937},"how-to-debug,error-handling,errors",[26,65101,2222,65102,2226,65104,148],{},[659,65103,2225],{"href":1887},[659,65105,2231],{"href":2229,"rel":65106},[1218],{"title":67,"searchDepth":68,"depth":68,"links":65108},[65109],{"id":65090,"depth":670,"text":65091},"Tools and patterns for debugging an axiom.ai automation, handling errors gracefully, and finding the cause when a run fails.",{"metaTitle":65112},"Debug and fix common errors in axiom.ai automations",{"title":34069,"description":65110},"docs\u002Fno-code-tool\u002Ftroubleshooting\u002Findex","rsPNvLDXVvGXKhGuDr-a6zD1l9oBxV54vKwd2ONj1XQ",{"id":65117,"title":65118,"body":65119,"date":71,"description":65318,"extension":73,"meta":65319,"navigation":75,"order":1478,"path":37799,"seo":65321,"stem":65322,"__hash__":65323},"content\u002Fdocs\u002Fsupport.md","Get support",{"type":8,"value":65120,"toc":65312},[65121,65131,65134,65138,65140,65147,65150,65179,65182,65208,65219,65223,65225,65232,65239,65246,65250,65252,65258,65269,65274,65277,65288,65297,65301,65303],[26,65122,65123,65124,55021,65127,65130],{},"Subscribers can contact us through the ",[659,65125,65126],{"href":1887},"customer support form",[659,65128,2231],{"href":2229,"rel":65129},[1218],". Ultimate and Pro-max subscribers receive priority support, we aim to respond the same working day. For all other subscribers, we aim to reply within two working days, often sooner.",[26,65132,65133],{},"Our operating hours are Monday to Friday, 9am to 5pm GMT, excluding public holidays.",[107,65135,65137],{"id":65136},"support-for-subscribers","Support for subscribers",[112,65139],{},[26,65141,65123,65142,55021,65144,148],{},[659,65143,65126],{"href":1887},[659,65145,2231],{"href":2229,"rel":65146},[1218],[26,65148,65149],{},"Response times depend on your plan:",[4589,65151,65152,65161],{},[4592,65153,65154],{},[4595,65155,65156,65158],{},[4598,65157,22754],{},[4598,65159,65160],{},"Response target",[4605,65162,65163,65171],{},[4595,65164,65165,65168],{},[4610,65166,65167],{},"Ultimate, Pro-max",[4610,65169,65170],{},"Same working day",[4595,65172,65173,65176],{},[4610,65174,65175],{},"All other paid plans",[4610,65177,65178],{},"Within two working days, often sooner",[26,65180,65181],{},"To get the fastest possible turnaround on any plan, send us as much detail as you can up front. Missing context slows the back-and-forth. We recommend including:",[1923,65183,65184,65187,65195,65198,65201,65205],{},[189,65185,65186],{},"A screen recording of the automation run.",[189,65188,65189,65190,65194],{},"The automation experiencing the issue. See ",[659,65191,65193],{"href":65192},".\u002Fsharing","sharing your automation"," for how to export it.",[189,65196,65197],{},"The target webpage exported as HTML, so we can reproduce the run against the same page snapshot.",[189,65199,65200],{},"A walk-through of what the automation is meant to do and where it's going wrong.",[189,65202,30966,65203,30969],{},[145,65204,2364],{},[189,65206,65207],{},"Notes on what you're seeing during the run versus what you expect to see.",[2093,65209,65210],{},[26,65211,65212,65214,65215,65218],{},[192,65213,2172],{}," the Chrome extension can export the automation and the target webpage from the same place. When editing an automation, click the ",[192,65216,65217],{},"Customer support"," icon in the left sidebar. A drawer opens with buttons to download both, ready to attach to your support request.",[107,65220,65222],{"id":65221},"reddit-support","Reddit support",[112,65224],{},[26,65226,65227,65228,65231],{},"Our ",[659,65229,2231],{"href":2229,"rel":65230},[1218]," is growing, and we'd love you to be part of it. We post news and documentation updates there and encourage every user to share questions, ideas, and issues. Team members are active in the community, and other users often weigh in with their own experience.",[26,65233,65234,65235,148],{},"For feedback, post in the ",[659,65236,65238],{"href":52311,"rel":65237},[1218],"feedback megathread",[26,65240,65241,65242,65245],{},"If you're looking for someone to build an automation for you, post in the community with the ",[192,65243,65244],{},"Seeking Bot Builder"," flair. Read the auto-response on those posts for important guidance before posting.",[107,65247,65249],{"id":65248},"slack-support","Slack support",[112,65251],{},[26,65253,65254,65255,65257],{},"Higher-tier subscriptions include a dedicated Slack channel between your organisation and ours. Slack works best for quick how-to questions and simple issues. For complex problems, the ",[659,65256,65126],{"href":1887}," is still the better channel, you'll get the same priority either way.",[26,65259,65260,65261,65265,65266,65268],{},"The Slack channel is for asynchronous conversation and is monitored during our ",[659,65262,65264],{"href":65263},"#get-support","operating hours",". There's no need to ",[145,65267,27928],{},"-mention team members. We'll get back to you as soon as we can.",[26,65270,65271,65272,148],{},"When you sign up for a plan that includes Slack support, you'll receive an email with the setup details. If you don't receive that email, contact us through the ",[659,65273,65126],{"href":1887},[26,65275,65276],{},"When asking for help in Slack, include:",[1923,65278,65279,65282,65284],{},[189,65280,65281],{},"Your question or a description of the issue.",[189,65283,65207],{},[189,65285,30966,65286,30969],{},[145,65287,2364],{},[2093,65289,65290],{},[26,65291,65292,65294,65295,12780],{},[192,65293,2359],{}," Slack support is only available on select plans. See ",[659,65296,465],{"href":7414},[107,65298,65300],{"id":65299},"support-for-non-subscribers","Support for non-subscribers",[112,65302],{},[26,65304,65305,65306,31265,65308,65311],{},"Non-subscribers can reach out through the ",[659,65307,65126],{"href":1887},[659,65309,2231],{"href":2229,"rel":65310},[1218],". The community is a one-stop shop for support, automation building tips, and product news. Everyone's welcome, including users who are just thinking about getting started with axiom.ai.",{"title":67,"searchDepth":68,"depth":68,"links":65313},[65314,65315,65316,65317],{"id":65136,"depth":670,"text":65137},{"id":65221,"depth":670,"text":65222},{"id":65248,"depth":670,"text":65249},{"id":65299,"depth":670,"text":65300},"Reach out for help with an axiom.ai automation through the customer support form, the Reddit community, or a dedicated Slack channel.",{"metaTitle":65320},"Get support building an axiom.ai automation",{"title":65118,"description":65318},"docs\u002Fsupport","qvEXUNaslDJspstIlbvJwEOyW3dxK_1KZpbV9DEiRYg",{"id":65325,"title":65326,"body":65327,"date":71,"description":65346,"extension":73,"meta":65347,"navigation":75,"order":71,"path":65348,"seo":65349,"stem":65350,"__hash__":65351},"content\u002Fextension-uninstalled.md","Extension uninstalled",{"type":8,"value":65328,"toc":65344},[65329,65334,65338],[115,65330],{"description":65331,"primaryText":65332,"primaryTo":336,"title":65333},"Share your feedback with us we feed it back into our ideas board form there we design and implement improvements. If you got stuck please do try our new features.","Try our Claude skill","Helps us do it better",[736,65335,65336],{"bg":394,"color":738},[1864,65337],{"description":67,"eyebrow":67,"title":67},[63,65339],{"className":65340,"headline":65341,"linkText":65342,"linkTo":336,"shape":65343},[35,747],"Our Claude Skill can help.\n","How to install it","logo",{"title":67,"searchDepth":68,"depth":68,"links":65345},[],"Sorry to see you go. Tell us why you uninstalled axiom.ai — your feedback shapes what we build next.",{},"\u002Fextension-uninstalled",{"title":65326,"description":65346},"extension-uninstalled","0bnLIX_Qi-mHKOgeQvarRIjpxfdd95nxvDTYPgwbT8E",{"id":65353,"title":65354,"body":65355,"date":71,"description":65407,"extension":73,"meta":65408,"navigation":75,"order":71,"path":122,"seo":65409,"stem":65410,"__hash__":65411},"content\u002Findex.md","browser automation for humans and AI",{"type":8,"value":65356,"toc":65405},[65357,65364,65367,65374,65381,65383,65386,65389,65392,65397,65400],[150,65358,65361],{"ctaText":153,"ctaTo":1675,"description":155,"min-vh":65359,"title":65360,"trust":158},"70","Browser automation\nfor humans & AI.\n",[65362,65363],"global-hero-animation",{":aura":15884,":grid":1548,":shapes":1548,":spotlight":1548},[597,65365],{":stats":599,"className":65366},[],[1475,65368],{":flat":1548,":items":65369,"description":65370,"eyebrow":65371,"link":1420,"linkText":65372,"title":65373,"variant":377},"[{\"image\":\"\u002Flanding\u002Fbuild-by-description-large.webp\",\"imageAlt\":\"Describe the bot you wish to build to the AI and it will make it - axiom.ai\",\"title\":\"Build with no-code.\",\"description\":\"Use our Chrome Extension to connect steps and logic from our prebuilt library to solve any problem without code.\",\"link\":\"\u002Fbuild-with-no-code\",\"linkText\":\"Explore no-code\"},{\"image\":\"\u002Flanding\u002Fcode-tool-playground.webp\",\"imageAlt\":\"run coded automations in axiom code - axiom.ai\",\"title\":\"Build with Code\",\"description\":\"Bring your own scripts, or use our library of steps through API with our flexible SDK.\",\"link\":\"\u002Fbuild-with-code\",\"linkText\":\"Explore code\",\"beta\":true},{\"image\":\"\u002Flanding\u002Fcreate-bo-vs-code-skill.webp\",\"imageAlt\":\"Create and runs browser automations in axiom using claude code\",\"title\":\"Build with Claude Code\",\"description\":\"Build and debug automations using the Claude Code agent, with deep integrations across all products.\",\"link\":\"\u002Fbuild-in-claude\",\"linkText\":\"Explore claude\"}]","Pick the path that fits how you work, whether that's a visual builder, real code, or just describing it to Claude. We recommend building by description no-code.","Build your way","Start with build by description","No-code, code, or Claude.",[364,65375],{":items":65376,"className":65377,"cols":670,"description":65378,"eyebrow":1509,"link":65379,"linkText":65380,"title":1510,"variant":377},"[{\"shape\":\"cloud-scale3\",\"title\":\"Run in our infrastructure\",\"description\":\"Battle tested with thousands of hours of successful runs. Scheduling, concurrency, proxies, bot bypassing, error reporting, run recording and more.\",\"to\":\"\u002Finfrastructure\u002Fcloud\",\"linkText\":\"Read more about cloud\"},{\"shape\":\"desktop-large\",\"title\":\"Run on your machine\",\"description\":\"Run on your computer with our desktop app in complete privacy. Schedule runs and run unlimited automations with no concurrency limits.\",\"to\":\"\u002Finfrastructure\u002Fdesktop\",\"linkText\":\"Read more about desktop\"}]",[91],"Run your automations where you want desktop or cloud.","\u002Finfrastructure","See infrastructure",[416,65382],{},[65384,65385],"jobs-to-be-done",{},[65387,65388],"developer-first",{},[835,65390],{"className":65391,"video-id":1786},[1784],[736,65393,65394],{"bg":394,"color":738},[47,65395],{"author":572,"className":65396,"quote":574},[292],[53,65398],{"className":65399},[35,747],[63,65401],{"className":65402,"headline":65403,"linkText":153,"linkTo":174,"shape":65343,"text":65404},[35,747],"Fast to build. Easy to run and scale.\nOutstanding support.\n","Free to install. Get started in minutes.",{"title":67,"searchDepth":68,"depth":68,"links":65406},[],"Build bots with no-code, code them, or describe them to Claude. axiom runs on our cloud or your machine.",{},{"title":65354,"description":65407},"index","KLLKNlGN7gyEMsrE4BTCIhf5ipymv7d_hGylEaRV8Gs",{"id":65413,"title":5345,"body":65414,"date":71,"description":5559,"extension":73,"meta":65439,"navigation":75,"order":71,"path":65440,"seo":65441,"stem":65442,"__hash__":65443},"content\u002Finfrastructure\u002F_api.md",{"type":8,"value":65415,"toc":65437},[65416,65422,65426,65431,65434],[115,65417],{"description":65418,"primaryText":65419,"primaryTo":5562,"secondaryText":65420,"secondaryTo":1675,"title":65421},"Write low-level Playwright direct to Chrome, or use our high-level library of step functions. Orchestrate code and no-code the same way.","See API docs","Get extension","APIs for every browser layer",[65423,65424],"infrastructure-three-ways",{":cards":65425,"eyebrow":67,"title":67},"[{\"num\":\"01\",\"title\":\"Chrome API.\",\"description\":\"Open a long-lived WebSocket to a real Chrome browser and drive it from Puppeteer, Playwright, or any CDP-speaking client.\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fcdp\",\"demo\":{\"type\":\"code\",\"code\":\"const browser = await puppeteer.connect({\\n  browserWSEndpoint:\\n    \\\"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=YOUR_API_KEY\\\"\\n});\\n\"}},{\"num\":\"02\",\"title\":\"Step API.\",\"description\":\"Our library of step functions removes the CDP boilerplate — high-level browser actions in Node via the axiom-api package.\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\",\"demo\":{\"type\":\"code\",\"code\":\"const ax = new AxiomApi(KEY)\\nawait ax.browserOpen()\\nawait ax.navigate(url)\\nawait ax.getText(selector)\\nawait ax.browserClose()\\n\"}},{\"num\":\"03\",\"title\":\"Orchestrate API.\",\"description\":\"Trigger any pre-built automation — code or no-code — and manage its runs over REST. Wire axiom into Zapier, Make, a backend service, or an MCP client.\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\",\"linkText\":\"See rest docs\",\"demo\":{\"type\":\"code\",\"code\":\"curl -X POST\\nhttps:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger\\n-H \\\"Content-Type: application\u002Fjson\\\"\\n-d '{\\\"key\\\":\\\"$KEY\\\", \\\"name\\\":\\\"export-orders\\\"}'\\n\"}}]",[345,65427],{":items":65428,"eyebrow":65429,"title":65430},"[{\"title\":\"One key, three layers\",\"description\":\"The Chrome API, Step API, and Orchestrate API are all reachable with a single API key.\"},{\"title\":\"Use it from any MCP client\",\"description\":\"Every layer is reachable from Claude Desktop, Claude Code, Cursor, or your own Python or TypeScript MCP server.\"},{\"title\":\"Usage, limits, and reference\",\"description\":\"See remaining cloud runtime, how runs queue at your concurrency limit, per-minute rate limits, and full endpoint reference.\"}]","Built for developers","Everything you'd want in a browser API.",[468,65432],{"className":65433},[35,747],[400,65435],{":links":753,"className":65436},[35,747],{"title":67,"searchDepth":68,"depth":68,"links":65438},[],{"metaTitle":5561},"\u002Finfrastructure\u002F_api",{"title":5345,"description":5559},"infrastructure\u002F_api","_VODtYYRlhnEp68JjltDCknQ8_d8ojMBbRjy3agIvNY",{"id":65445,"title":65446,"body":65447,"date":71,"description":1522,"extension":73,"meta":65455,"navigation":75,"order":71,"path":65456,"seo":65457,"stem":65458,"__hash__":65459},"content\u002Finfrastructure\u002F_privacy.md","Build with Claude",{"type":8,"value":65448,"toc":65453},[65449],[115,65450],{"description":65451,"primaryText":65419,"primaryTo":1675,"title":65452},"One API key. Three surfaces. REST to trigger pre-built automations, CDP to drive a real Chrome browser from your stack, and a step function library to drive hi-level actions from MCP.","Privacy.",{"title":67,"searchDepth":68,"depth":68,"links":65454},[],{"metaTitle":1460},"\u002Finfrastructure\u002F_privacy",{"title":65446,"description":1522},"infrastructure\u002F_privacy","z8m8kO2lIg-a2BnSVKF-2WnfdYIJXZelR5JDU2hO8xE",{"id":65461,"title":65462,"body":65463,"date":71,"description":65525,"extension":73,"meta":65526,"navigation":75,"order":71,"path":65527,"seo":65528,"stem":65529,"__hash__":65530},"content\u002Finfrastructure\u002Fcloud.md","Cloud Browser Infrastructure",{"type":8,"value":65464,"toc":65523},[65465,65469,65471,65477,65481,65487,65492,65497,65505,65507,65514,65519],[115,65466],{"description":65467,"primaryText":153,"primaryTo":1675,"title":65468},"Managed Chromium in the cloud, a private container per run, or locally via the desktop runner. Trigger from the No-Code Tool, API, MCP, CLI, Code Dashboard, or CDP. With built-in concurrency and queuing.","Browsers on demand,\nin the cloud.\n",[597,65470],{":stats":599},[345,65472],{":items":65473,"eyebrow":1376,"title":65474,"description":65475,"link":174,"linkText":65476},"[{\"eyebrow\":\"Step 1\",\"title\":\"Sign up and get your API key\",\"description\":\"One sign-up, two surfaces. Install the [no-code Chrome extension](\u002Fbuild-with-no-code) to build visually, or open the [code dashboard](\u002Fbuild-with-code) to grab your API key for the Chrome, Step, and Orchestrate APIs. Same account, same cloud runtime, your choice of tool.\"},{\"image\":\"\u002Flanding\u002Fcombine-steps.webp\",\"imageAlt\":\"Build a bot with no-code, code, or a Claude skill\",\"eyebrow\":\"Step 2\",\"title\":\"Build with no-code, code, or Claude\",\"description\":\"Pick the path that fits how you work. Build visually in the [no-code Chrome extension](\u002Fbuild-with-no-code), script it against our [code SDK](\u002Fbuild-with-code), or describe it to [Claude](\u002Fbuild-in-claude) and let the skill assemble the steps for you. Same cloud underneath each path, so a bot built one way runs alongside bots built the others.\"},{\"image\":\"\u002Flanding\u002Frun-bots.webp\",\"imageAlt\":\"Run, schedule, or trigger your cloud bot\",\"eyebrow\":\"Step 3\",\"title\":\"Run, schedule, or trigger\",\"description\":\"Hit run from the builder, set a schedule, or trigger from your stack. The Orchestrate API, webhooks, MCP server, and CLI all kick off cloud runs, with concurrency, queuing, and notifications built in. Watch every run in the dashboard or pipe the results into Slack, email, or another app.\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\",\"linkText\":\"See API docs\"}]","Up and running in three steps","Run your automation, no-code or code, in cloud-based browsers. From sign-up to scheduled runs in three steps, no machine of yours involved.","Get started for free",[364,65478],{":items":65479,"cols":68,"eyebrow":455,"title":65480,"variant":665,":equal-height":1548,":stagger":1548},"[{\"shape\":\"cloud-scale3\",\"title\":\"Every run in a private container\",\"description\":\"A Docker container isolates your data in the cloud in its own sandbox. Data is processed during the run, never stored. When the run is complete the container is destroyed.\"},{\"shape\":\"cloud-scale3\",\"title\":\"Encrypted in transit\",\"description\":\"Encrypted between you and the cloud, and between the cloud and the sites it visits. No plaintext, ever.\"},{\"shape\":\"cloud-scale3\",\"title\":\"Not used or shared\",\"description\":\"Your runs, inputs, outputs, page contents, and credentials are never used to train any model, sold, shared with partners, or surfaced in any product feature. It's yours. It stays yours.\"}]","Your data passes through. It doesn't stay.",[1475,65482],{":flat":1548,":items":65483,"description":65484,"eyebrow":65485,"link":5562,"linkText":65419,"title":65486,"variant":665},"[{\"shape\":\"cube\",\"title\":\"Chrome API\",\"description\":\"Open a WebSocket to a cloud browser and drive it from Puppeteer, Playwright, or any CDP client.\",\"link\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fcdp\",\"linkText\":\"See Chrome API\"},{\"shape\":\"staircase\",\"title\":\"Step API\",\"description\":\"Our library of step functions removes the CDP boilerplate. High-level browser actions in Node via the `axiom-api` package.\",\"link\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\",\"linkText\":\"See Step API\"},{\"shape\":\"integration\",\"title\":\"Orchestrate API\",\"description\":\"Trigger any pre-built automation, code or no-code, and manage its runs over REST. For Zapier, Make, or a backend service.\",\"link\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\",\"linkText\":\"See Orchestrate API\"}]","Pick the layer you want to work at. Raw browser, ready-made steps, or full automations. Same infrastructure underneath.","APIs","Three layers of API, one cloud.",[364,65488],{":items":65489,"cols":68,"eyebrow":65490,"title":65491,"variant":665},"[{\"icon\":\"radio_button_checked\",\"title\":\"Concurrency\",\"description\":\"Run up to 20 bots at once on the standard tier, with higher concurrency available on request. Limits vary by subscription.\"},{\"icon\":\"notes\",\"title\":\"Queuing\",\"description\":\"Runs triggered by API are automatically queued if you exceed your concurrency limits, then dispatched as capacity frees up.\"},{\"icon\":\"notifications\",\"title\":\"Autoscaling\",\"description\":\"When our servers get busy we autoscale to meet demand. No queueing on our end, no failed runs from saturated capacity.\"}]","Scales with you","One browser or many, on demand.",[345,65493],{":items":65494,"eyebrow":65495,"title":65496},"[{\"title\":\"Session recording\",\"description\":\"Record on error. When turned on, runs are recorded in the moments before an error is thrown, so you can replay the run and the error to fix it. You also get a detailed run report generated line by line of the code executed, making hard-to-find issues much easier to solve.\"},{\"title\":\"Error reporting\",\"description\":\"No-code only. Get detailed error reporting on each step, with instructions on how to resolve the most common failure modes.\"},{\"title\":\"Notifications\",\"description\":\"Set up notifications by email or webhook on success, fail, or error. Enrich the error message with custom data from the run for richer reporting downstream. Another no-code feature.\"}]","Holds up","Built to be resilient.",[364,65498],{":items":65499,"cols":670,"eyebrow":65500,"title":65501,"variant":377,"className":65502,"description":65503,"link":1675,"linkText":65504},"[{\"shape\":\"cloud-scale3\",\"title\":\"Use cloud when\",\"bgClass\":\"iso-grid-gray-50\",\"bullets\":[\"Full API access\",\"You need to schedule runs\",\"You trigger bots from your stack or AI\",\"Triggering bots using webhooks\",\"You don't want to keep a machine on\"]},{\"shape\":\"desktop-large\",\"title\":\"Use desktop when\",\"bgClass\":\"iso-grid-gray-50\",\"bullets\":[\"Data privacy is non-negotiable\",\"You need access to local files\",\"You're behind a VPN\",\"You want unlimited concurrency\",\"You can run inside a HIPAA-compliant network\"],\"to\":\"\u002Finfrastructure\u002Fdesktop\",\"linkText\":\"Read more about desktop\"}]","Which one?","Pick cloud for flexibility.",[91],"There's no wrong answer. You can of course use both.","Sign up for free runtime",[468,65506],{},[736,65508,65509],{"bg":394,"color":738},[57,65510],{":faqs":65511,"description":65512,"eyebrow":384,"link":1877,"linkText":1878,"title":65513},"[{\"question\":\"Can I run more than 20 bots concurrently in the cloud?\",\"answer\":\"Yes. Standard plans run up to 20 concurrent bots, and we can go higher. Get in touch with \u003Ca class=\\\"link\\\" href=\\\"\u002Fcustomer-support\\\">customer support\u003C\u002Fa> for a custom package tailored to your needs.\"},{\"question\":\"Is my data private in the cloud?\",\"answer\":\"Yes. Your bots run in their own isolated Docker container, and once a run ends the container and everything in it is destroyed.\"},{\"question\":\"Do you duplicate or store any data processed in a run?\",\"answer\":\"No. Data only exists for as long as it is being processed in the cloud container. No data from a run is duplicated, stored, or retained by us.\"},{\"question\":\"Is my data encrypted?\",\"answer\":\"Yes. Data in transit, into and out of the container, is encrypted.\"},{\"question\":\"Are there runtime limits on the length of runs?\",\"answer\":\"Yes. They vary from subscription to subscription. On the Ultimate tier a single run can last up to 12 hours.\"},{\"question\":\"Can I share my session with the cloud?\",\"answer\":\"Yes. If you enable cloud cookies, they are duplicated and stored for cloud runs. All cookies are encrypted for security.\"},{\"question\":\"Can I record my cloud runs?\",\"answer\":\"Yes. On the Ultimate tier, a rolling recording of the last two minutes of a run is stored. It is optional and not on by default. You can replay the run to watch it and spot errors, and the recording comes with an under-the-hood commentary of the run, which is very helpful for debugging.\"},{\"question\":\"Can I access run logs with the API?\",\"answer\":\"Yes. You can find out more \u003Ca class=\\\"link\\\" href=\\\"\u002Fdocs\u002Fcode\u002Frun-reports\\\">here\u003C\u002Fa>.\"}]","Common questions about privacy, encryption, runtime limits, sessions, and recordings in the cloud.","What customers ask about the cloud runner",[63,65515],{"className":65516,"headline":65517,"linkText":153,"linkTo":1675,"shape":65518,"text":625},[35,747],"Browser infrastructure, ready when you are.","cloud-scale3",[400,65520],{":links":65521,"className":65522},"[{\"eyebrow\":\"Infrastructure\",\"title\":\"Run on desktop\",\"to\":\"\u002Finfrastructure\u002Fdesktop\"},{\"eyebrow\":\"API\",\"title\":\"Chrome, Step and Orchestrate APIs\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\"}]",[35,747],{"title":67,"searchDepth":68,"depth":68,"links":65524},[],"Run managed Chromium in the cloud or locally, isolated per run. Trigger from the No-Code Tool, API, MCP, or CDP, with built-in concurrency and queuing.",{},"\u002Finfrastructure\u002Fcloud",{"title":65462,"description":65525},"infrastructure\u002Fcloud","oUmmiYYUiMBxdXWnhB1YSmUagiKi9WquXSkCNJOgIIE",{"id":65532,"title":65533,"body":65534,"date":71,"description":65592,"extension":73,"meta":65593,"navigation":75,"order":71,"path":65594,"seo":65595,"stem":65596,"__hash__":65597},"content\u002Finfrastructure\u002Fdesktop.md","Local Browser Automation on Desktop",{"type":8,"value":65535,"toc":65590},[65536,65540,65542,65548,65553,65559,65564,65570,65573,65575,65582,65586],[115,65537],{"description":65538,"primaryText":153,"primaryTo":1675,"title":65539},"Run automations on your own Chrome, with your saved logins and your local network. The data your bots process never leaves the device.","Browsers managed \non your machine.\n",[597,65541],{":stats":599},[345,65543],{":items":65544,"description":65545,"eyebrow":1376,"link":174,"linkText":65546,"title":65547},"[{\"eyebrow\":\"Step 1\",\"title\":\"Sign up to the Chrome extension\",\"description\":\"axiom is a no-code tool for automating the browser, made for non-coders and coders alike. Add it to Chrome to get started.\",\"to\":\"https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Faxiom-browser-automation\u002Fcpgamigjcbffkaiciiepndmonbfdimbb\",\"linkText\":\"Add to Chrome\"},{\"eyebrow\":\"Step 2\",\"title\":\"Download and install the desktop app\",\"description\":\"Install the desktop app and manage several installs from a single account. Test locally on your machine, then set a bot to run on a VPN with the app installed.\",\"to\":\"\u002Finstall-desktop-app\",\"linkText\":\"Install the desktop app\"},{\"image\":\"\u002Flanding\u002Fcombine-steps.webp\",\"imageAlt\":\"Build a bot with no-code in the Chrome extension\",\"eyebrow\":\"Step 3\",\"title\":\"Build with no-code\",\"description\":\"Once you are set up, build your bot. The no-code Chrome extension lets you point at elements, add steps, and run, without writing a line of code.\",\"to\":\"\u002Fbuild-with-no-code\",\"linkText\":\"Build with no-code\"},{\"image\":\"\u002Flanding\u002Frun-bots.webp\",\"imageAlt\":\"Run or schedule your bot\",\"eyebrow\":\"Step 4\",\"title\":\"Run or schedule your bot\",\"description\":\"Once you have tested it by hand, run it or set it on a schedule. Bots run concurrently, limited only by your hardware.\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\",\"linkText\":\"Scheduling docs\"}]","Run bots on your computer, a server, or a VPN, on Linux, Mac, or PC. In the privacy of your own network, fully configurable to your needs.","Get the Chrome extension","Up and running in four steps",[364,65549],{":items":65550,"cols":68,"eyebrow":455,"title":65551,"variant":665,":stagger":1548,"description":65552,":equal-height":1548},"[{\"shape\":\"desktop-large\",\"title\":\"Runs entirely on your device\",\"description\":\"Bots run inside the desktop app on your machine, using your own Chrome. Page contents, cookies, sessions, downloaded files, and run outputs never leave the device. axiom only receives runtime metadata: the user, the bot name, and when each run starts and ends. For no-code bots we also store the steps and settings that define the automation, never the data it processes.\"},{\"shape\":\"desktop-large\",\"title\":\"No data shared\",\"description\":\"Because runs happen locally, the data your bots process is never sent to us, our partners, or any product feature. We can't access it without your explicit permission and we won't ask unless you request help with a specific issue, in which case access is short-lived and scoped to what you share.\"},{\"shape\":\"desktop-large\",\"title\":\"Not used for AI training\",\"description\":\"Nothing the desktop runner touches is used to train any model. The one exception is AI steps you add yourself: those send data to the provider you pick under their terms, not ours. They're optional, never on by default, so check your provider's policy before using one.\"}]","Your data does not leave the machine.","On the desktop runner everything happens locally. The data your bots see, store, and produce stays on your device, we don't share it, and we don't use it to train AI.",[345,65554],{":items":65555,"description":65556,"eyebrow":4171,"link":47234,"linkText":65557,"title":65558},"[{\"title\":\"Run options\",\"options\":[{\"label\":\"Schedule\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fschedule\"},{\"label\":\"Concurrency\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fconcurrency\"},{\"label\":\"Set up notifications\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fnotifications\"},{\"label\":\"Store cookies\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fstore-cookies\"},{\"label\":\"Set maximum runtime\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fmax-runtime\"},{\"label\":\"Use proxies\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fproxy\"},{\"label\":\"Run headless\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fheadless\"},{\"label\":\"Configure timezone\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Ftimezone\"},{\"label\":\"Block resources\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fblock-resources\"}]},{\"title\":\"Import or download\",\"options\":[{\"label\":\"Import or Share\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fimport-export\u002Fsharing\"}]},{\"title\":\"Error handling\",\"options\":[{\"label\":\"Continue on error\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling\u002Fcontinue-on-error\"},{\"label\":\"Interact with iframes\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling\u002Fiframes\"},{\"label\":\"Disable page monitoring\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling\u002Fpage-monitoring\"}]},{\"title\":\"Chrome\",\"options\":[{\"label\":\"Set executable path\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fexecutable-path\"},{\"label\":\"Set profile\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fprofile\"},{\"label\":\"Load another extension\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fload-extension\"},{\"label\":\"Run in incognito mode\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fincognito\"},{\"label\":\"Bypass bot detection\",\"to\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fbypass-bot-detection\"}]}]","Scheduling, proxies, profiles, bot detection bypass, concurrency. The runtime settings you actually need, configured once per bot.","See settings","Fine-tune your browser runs.",[364,65560],{":items":65561,"cols":68,"eyebrow":65562,"title":65563,"variant":665,":stagger":15884},"[{\"icon\":\"notifications\",\"title\":\"Notifications\",\"description\":\"Slack, email, or webhook the moment something runs, finishes, or fails.\"},{\"icon\":\"warning\",\"title\":\"Error reporting\",\"description\":\"Error messages describing the step with the issue and how to fix it.\"},{\"icon\":\"schedule\",\"title\":\"Run history\",\"description\":\"Every run kept and indexed. Filter by status.\"}]","Observability","Run monitoring anyone can use.",[364,65565],{":items":65566,"cols":670,"eyebrow":65500,"title":65567,"variant":377,"description":65568,"className":65569,"link":1675,"linkText":65504},"[{\"shape\":\"desktop-large\",\"title\":\"Use desktop when\",\"bgClass\":\"iso-grid-gray-50\",\"bullets\":[\"Data privacy is non-negotiable\",\"You need access to local files\",\"You're behind a VPN\",\"You want unlimited concurrency\",\"You run inside a HIPAA-compliant network\"]},{\"shape\":\"cloud-scale3\",\"title\":\"Use cloud when\",\"bgClass\":\"iso-grid-gray-50\",\"bullets\":[\"Full API access\",\"You need to schedule runs\",\"You trigger bots from your stack or AI\",\"Triggering bots using webhooks\",\"You don't want to keep a machine on\"],\"to\":\"\u002Finfrastructure\u002Fcloud\",\"linkText\":\"Read more about cloud\"}]","Pick desktop for privacy.","There's no wrong answer. You can of course use both!",[91],[65571,65572],"platforms",{},[468,65574],{},[736,65576,65577],{"bg":394,"color":738},[57,65578],{":faqs":65579,"description":65580,"eyebrow":384,"link":1877,"linkText":1878,"title":65581},"[{\"question\":\"Can I schedule automations on the desktop?\",\"answer\":\"Yes. You can schedule your automations to run locally on the desktop instead of in the cloud, as often as every minute. Scheduling requires a Pro tier subscription or higher.\"},{\"question\":\"Do desktop app runs use my runtime?\",\"answer\":\"Yes. Runs on the desktop app count toward your monthly runtime, just like cloud runs. The single-run limit that caps cloud runs doesn't apply on the desktop, so a single desktop automation can run for as long as you need.\"},{\"question\":\"Can I use the desktop as an MCP server?\",\"answer\":\"Yes. The desktop app ships with an MCP server, built on the open-source MCP standard from Anthropic. You can connect it to Claude Code as a connector, then trigger runs, build automations, and access all three layers of the axiom.ai \u003Ca class=\\\"link\\\" href=\\\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\\\">API\u003C\u002Fa>. See the \u003Ca class=\\\"link\\\" href=\\\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fmcp\u002Fdesktop-app-server\\\">MCP\u003C\u002Fa> docs to get set up.\"},{\"question\":\"Is the desktop app HIPAA compliant?\",\"answer\":\"No, the desktop app is not HIPAA compliant. However, because the desktop runner processes everything locally, no data ever leaves your computer or network, so we never handle, process, or touch your customer data. That means if you run the desktop app inside your own HIPAA-compliant network, you can use axiom.ai in a HIPAA-compliant way. We don't sign Business Associate Agreements (BAAs), because no protected health information ever reaches us in the first place.\"},{\"question\":\"Can I trigger the desktop with an API?\",\"answer\":\"Not yet. You can't currently trigger the desktop app via the API. This feature is in development, so check in with \u003Ca class=\\\"link\\\" href=\\\"\u002Fcustomer-support\\\">customer support\u003C\u002Fa> for availability.\"},{\"question\":\"Can I run more than one desktop app?\",\"answer\":\"Yes. You can run more than one desktop app, but each one needs to be installed on a separate computer. They can share the same account for manual runs. If you schedule local runs on more than one machine, each install needs its own account. See \u003Ca class=\\\"link\\\" href=\\\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fadvanced-running-methods\\\">advanced running methods\u003C\u002Fa> for the full setup.\"},{\"question\":\"What data does the desktop app share?\",\"answer\":\"It shares usage data, not the data being processed in a run. This includes details like the axiom.ai user, the automation name, the run start and end times, and run reports including any errors.\"},{\"question\":\"Are there any scenarios where sensitive data could be shared?\",\"answer\":\"Yes, but only you can make that happen. If you add steps in the No-Code Tool that send data externally, for example a webhook step that posts run data to another service, or an AI step that processes your data during a run, then that data leaves the desktop. These steps are never set up by default. You have to add them yourself.\"},{\"question\":\"Can the AI assistant access customer data on the desktop app?\",\"answer\":\"No. The AI assistant is only present in the Chrome extension. It is not present during runtime on the desktop app, so it has no access to the data your automations process there.\"},{\"question\":\"Can I run code automations on the desktop app?\",\"answer\":\"No. It's a feature in development. Reach out for availability.\"}]","Common questions about no-code, code, AI, and running automations on the desktop app.","What customers ask about the desktop runner",[63,65583],{"className":65584,"headline":624,"linkText":153,"linkTo":1675,"shape":65585,"text":625},[35,747],"desktop-large",[400,65587],{":links":65588,"className":65589},"[{\"eyebrow\":\"Run remote\",\"title\":\"Cloud\",\"to\":\"\u002Finfrastructure\u002Fcloud\"},{\"eyebrow\":\"API\",\"title\":\"Chrome, Step and Orchestrate APIs\",\"to\":\"\u002Finfrastructure\u002Fapi\"}]",[35,747],{"title":67,"searchDepth":68,"depth":68,"links":65591},[],"Run unlimited browser bots on your own machine. Local scheduling, no data leaves your computer, built for privacy-sensitive and regulated teams.",{},"\u002Finfrastructure\u002Fdesktop",{"title":65533,"description":65592},"infrastructure\u002Fdesktop","KIWWOSZCD43vbtjs1M4Z-ue77WBeLO5HI3S7OK7NcJs",{"id":65599,"title":65600,"body":65601,"date":71,"description":65665,"extension":73,"meta":65666,"navigation":75,"order":71,"path":65379,"seo":65667,"stem":65668,"__hash__":65669},"content\u002Finfrastructure\u002Findex.md","Private Browser Infrastructure",{"type":8,"value":65602,"toc":65663},[65603,65608,65615,65621,65626,65632,65638,65646,65653,65659],[115,65604],{"description":65605,"primaryText":65606,"primaryTo":174,"title":65607},"The same Chromium runtime powers every bot, whether you built it visually, wrote it in Playwright, or had Claude generate it.","Create account","Private browser infrastructure for code, no-code & AI.\n",[364,65609],{":items":65610,"className":65611,"cols":670,"description":65612,"eyebrow":65613,"title":65614,"variant":377},"[{\"shape\":\"cloud-scale3\",\"title\":\"Run in our infrastructure\",\"bgClass\":\"iso-grid-gray-50\",\"description\":\"Hands-off, headless, always on. Scheduled runs, concurrent execution, proxies, and monitoring built in.\",\"bullets\":[\"Up to 20 parallel runs\",\"Trigger from API, webhook, or schedule\",\"Isolated sessions, never reused\",\"Bring your own proxies or use ours\"],\"to\":\"\u002Finfrastructure\u002Fcloud\",\"linkText\":\"Read more about cloud\"},{\"shape\":\"desktop-large\",\"title\":\"Run on your machine\",\"bgClass\":\"iso-grid-gray-50\",\"description\":\"Local, private, unlimited. Run as many bots as your hardware allows, with no data ever leaving your computer.\",\"bullets\":[\"Unlimited parallel runs\",\"Local scheduling\",\"Used in data-sensitive industries\",\"No data sent or stored externally\"],\"to\":\"\u002Finfrastructure\u002Fdesktop\",\"linkText\":\"Read more about desktop\"}]",[91],"Same automations, same builder, same step library. Pick where they run based on scale, scheduling, or how private you want your data.","Where bots run","One product, two ways to run.",[1475,65616],{":items":65617,":reverse-stagger":1548,"cols":1478,"description":65618,"eyebrow":65619,"title":65620,"variant":665},"[{\"title\":\"Chromium at scale\",\"description\":\"Run as many as you need. Unlimited on desktop, up to 20 concurrent runs on cloud. Custom packages available for higher cloud throughput.\",\"bullets\":[\"Unlimited concurrent runs on desktop\",\"Up to 20 concurrent cloud runs on Ultimate\",\"Custom enterprise packages on request\",\"Same Chromium runtime everywhere\"]},{\"title\":\"Fully configurable\",\"description\":\"Tune the browser per run. Same settings on cloud and desktop in no-code. Code parity coming soon.\",\"bullets\":[\"Schedule runs hourly, daily, or on a trigger\",\"Block resources and run headless\",\"Set profiles, store cookies, persist sessions\",\"Configure timezone\"]},{\"title\":\"Stealth built in\",\"description\":\"Anti-bot detection and countermeasures, built into every no-code run. Code support coming soon.\",\"bullets\":[\"Anti-bot detection countermeasures\",\"Set proxies\",\"Mimics user behaviour\",\"Built into no-code, no setup required\"]},{\"title\":\"Private by default\",\"description\":\"Your data is yours. Isolated on cloud, local on desktop, never used to train AI.\",\"bullets\":[\"Never used for AI training\",\"Never shared with third parties\",\"Stays in the run container unless you send it somewhere\",\"Or run desktop and keep everything local\"]}]","Production-grade browser infrastructure for every kind of bot you build.","What you're getting","Real Chromium, on demand.",[345,65622],{":items":65623,"description":65624,"eyebrow":1376,"title":65625},"[{\"eyebrow\":\"Step 1\",\"title\":\"Get api key\",\"description\":\"Create an account and get a key instantly. No card required to start.\"},{\"eyebrow\":\"Step 2\",\"title\":\"Pick no-code, code, or AI\",\"description\":\" Build visually with the Chrome extension, write a script in Puppeteer or Playwright, or describe it to Claude. Whichever path, the same runtime executes \"},{\"eyebrow\":\"Run on cloud or desktop\",\"title\":\"Run, manage, edit\",\"description\":\"Execute, schedule, trigger. Monitor live, debug failures, scale with your plan.\"}]","Same flow whether you're connecting from code, the extension, or your AI.","Three steps to your first run.",[1475,65627],{":items":65628,":reverse-stagger":15884,"cols":68,"description":65629,"eyebrow":65630,"title":65631,"variant":665},"[{\"title\":\"Chrome API\",\"description\":\"A long-lived WebSocket to a cloud browser. Drive it from Puppeteer, Playwright, or any CDP-speaking client.\",\"bullets\":[\"Connect from Puppeteer or Playwright\",\"Any CDP-compatible library works\",\"Full Chrome DevTools Protocol access\",\"Existing scripts run as-is\"],\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fcdp\",\"linkText\":\"Read Chrome API docs\"},{\"title\":\"Step API\",\"description\":\"Skip the CDP boilerplate. Our step library wraps browser actions as high-level functions in Node.\",\"bullets\":[\"High-level browser actions in Node\",\"Available via the axiom-api package\",\"Same steps as the no-code builder\",\"Mix with raw Chrome API calls\"],\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\",\"linkText\":\"Read Step API docs\"},{\"title\":\"Orchestrate API\",\"description\":\"Trigger any pre-built automation, code or no-code, and manage its runs over REST.\",\"bullets\":[\"Trigger bots from any HTTP client\",\"Manage runs, retries, schedules\",\"Works for code and no-code bots\",\"Webhook callbacks on completion\"],\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\",\"linkText\":\"Read Orchestrate API docs\"}]","Drive a raw browser, call high-level steps, or trigger a pre-built automation. Mix layers, or stick to one.","The API","Three layers, Chrome, step & Orchestrate.",[364,65633],{":items":65634,"className":65635,"cols":670,"description":65636,"eyebrow":65500,"title":65637,"variant":377,"link":1675,"linkText":65504},"[{\"shape\":\"cloud-scale3\",\"title\":\"Use cloud when\",\"bgClass\":\"iso-grid-gray-50\",\"bullets\":[\"Full API access\",\"You need to schedule runs\",\"You trigger bots from your stack or AI\",\"Triggering bots using webhooks\",\"You don't want to keep a machine on\"],\"to\":\"\u002Finfrastructure\u002Fcloud\",\"linkText\":\"Read more about cloud\"},{\"shape\":\"desktop-large\",\"title\":\"Use desktop when\",\"bgClass\":\"iso-grid-gray-50\",\"bullets\":[\"Data privacy is non-negotiable\",\"You need access to local files\",\"You're behind a VPN\",\"You want unlimited concurrency\",\"If you are Hippa compliant\"],\"to\":\"\u002Finfrastructure\u002Fdesktop\",\"linkText\":\"Read more about desktop\"}]",[91],"There's no wrong answer. You can of course use both! ","Pick by what you're doing.",[65639,65640],"infrastructure-privacy-diagram",{":footerItems":65641,"description":65642,"eyebrow":455,"link":65643,"linkText":65644,"title":65645},"[{\"icon\":\"psychology\",\"title\":\"Never used for AI training.\",\"description\":\"No matter where you run.\"},{\"icon\":\"lock\",\"title\":\"Encrypted in transit.\",\"description\":\"TLS on every connection.\"},{\"icon\":\"visibility_off\",\"title\":\"We don't read it.\",\"description\":\"Containers stay private.\"}]","Every run draws a clear boundary. Nothing crosses it unless you explicitly send it somewhere.","\u002Fprivacy-and-security","See privacy","Your data stays where you put it.",[736,65647,65648],{"bg":394,"color":738},[57,65649],{":faqs":65650,"description":65651,"eyebrow":384,"link":1877,"linkText":1878,"title":65652},"[{\"question\":\"Can I switch a bot between cloud and desktop?\",\"answer\":\"Yes. Automations built with the no-code tool can run on desktop or in the cloud, freely. Code automations calling the API currently run in the cloud only. A desktop API is on the roadmap. \u003Ca class=\\\"link\\\" href=\\\"\u002Fcontact\\\">Contact us\u003C\u002Fa> if you'd like beta access when it's ready.\"},{\"question\":\"What data does axiom see when I run on cloud?\",\"answer\":\"Any data passed to axiom by webhook or integration is encrypted in transit, on cloud or desktop. Automations themselves run in isolated containers. The data processed in those containers is private. We don't access it, record it, or share it with an AI. When a run completes, the container and everything in it are destroyed.\"},{\"question\":\"Can I run bots in the cloud from my stack?\",\"answer\":\"Yes. Both the Chrome API (drive a cloud browser from your code) and the Orchestrate API (trigger saved bots over REST) work from any stack.\"},{\"question\":\"Do you use my data for AI training?\",\"answer\":\"No. Your data is never shared with AI or used for training. However, if you add an AI step to your automation, that AI provider processes your data under their own terms. We have no control over that and we take no responsibility. AI steps are optional and never added by default. Check with your AI provider for how they handle data.\"},{\"question\":\"Can I run more than 20 bots concurrently in the cloud?\",\"answer\":\"20 is the cap on our Ultimate tier. Enterprise plans go higher, or we can build a custom plan. \u003Ca class=\\\"link\\\" href=\\\"\u002Fcontact\\\">Contact support\u003C\u002Fa> to discuss your needs.\"},{\"question\":\"Can I use my own proxy?\",\"answer\":\"Yes. In the no-code tool, set a proxy per bot in the runtime settings. In code, pass proxy details as a connection parameter when opening a session. Both residential and datacenter proxies are supported. See the \u003Ca class=\\\"link\\\" href=\\\"\u002Fdocs\u002Fproxies\\\">proxy docs\u003C\u002Fa> for the full reference.\"},{\"question\":\"Are you HIPAA compliant?\",\"answer\":\"No. axiom is not HIPAA compliant and we don't sign BAAs because we don't need to. HIPAA-regulated workflows should not run in the cloud. Use the desktop app on your own HIPAA-compliant infrastructure instead, so no healthcare data ever reaches us. Many regulated teams use axiom this way.\"}]","Common things people ask about no-code, code, AI, and running automations on our infrastructure.","What our customers ask.",[63,65654],{":shapes":65655,"LinkTo":1675,"className":65656,"headline":65657,"linkText":153,"text":65658},"[\"cloud-scale3\",\"desktop-large\"]",[35,747],"Try a cloud run, free for 2 hours.\n","Free to install. No card required. Switch between cloud and desktop whenever you like.",[400,65660],{":links":65661,"className":65662},"[{\"eyebrow\":\"Run local\",\"title\":\"Desktop\",\"to\":\"\u002Finfrastructure\u002Fdesktop\"},{\"eyebrow\":\"Run remote\",\"title\":\"Cloud\",\"to\":\"\u002Finfrastructure\u002Fcloud\"}]",[35,747],{"title":67,"searchDepth":68,"depth":68,"links":65664},[],"Browser infrastructure for code, no-code, and AI bots. The same Chromium runtime runs every automation, in the cloud or locally on your own machine.",{},{"title":65600,"description":65665},"infrastructure\u002Findex","TUk6N72Y8qXlWl5za5E07nEWJWHow0w4imQAEknOajg",{"id":65671,"title":65672,"body":65673,"date":71,"description":65677,"extension":73,"meta":65678,"navigation":75,"order":71,"path":7425,"seo":65679,"stem":65680,"__hash__":65681},"content\u002Finstall-desktop-app.md","Install the desktop runner for axiom.ai's browser automation extension",{"type":8,"value":65674,"toc":65675},[],{"title":67,"searchDepth":68,"depth":68,"links":65676},[],"Install the axiom.ai desktop app on Linux, Windows or Mac to automate your browser with no code. Build bots to scrape data, fill forms and more using your local machine.",{},{"title":65672,"description":65677},"install-desktop-app","nisFlbXGYWK_wOCt8jWwC75UB_BwTcgsZprfke2FXSI",{"id":65683,"title":65684,"body":65685,"date":71,"description":65735,"extension":73,"meta":65736,"navigation":75,"order":71,"path":1732,"seo":65737,"stem":65738,"__hash__":65739},"content\u002Fno-code-tool.md","No-code tool for making browser automations in Chrome",{"type":8,"value":65686,"toc":65733},[65687,65691,65695,65703,65706,65711,65713,65718,65724,65727,65730],[115,65688],{"description":65689,"primaryText":119,"primaryTo":174,"title":65690},"Build your automation in our visual no-code builder by combining steps that replicate web actions like clicking, typing, and extracting data. Get help from our built-in AI assistant whenever you need it, configure how it runs, then hit go.","Fully featured no-code tool for browser automation.",[1475,65692],{":items":65693,":reverse-stagger":1548,"description":1730,"eyebrow":1731,"link":1725,"linkText":1733,"title":65694,"variant":665},"[{\"image\":\"\u002Flanding\u002Fbuild-by-description-large.webp\",\"imageAlt\":\"Describe the bot you wish to build to the AI and it will make it - axiom.ai\",\"title\":\"Build by description\",\"description\":\"Tell the AI what you want and it assembles the steps for you, right in the builder.\",\"linkText\":\"See docs\"},{\"image\":\"\u002Flanding\u002Fcombine-steps.webp\",\"imageAlt\":\"Choose steps and assemble your automation - axiom.ai\",\"title\":\"The step finder\",\"description\":\"Search the step library to find the right step for whatever you want your bot to do.\",\"linkText\":\"See docs\"},{\"image\":\"\u002Flanding\u002Ftoolbar.webp\",\"imageAlt\":\"The selector tool\",\"title\":\"Step toolbar\",\"description\":\"Move, copy, duplicate, or delete steps as you build.\",\"linkText\":\"See docs\"},{\"image\":\"\u002Flanding\u002Frun-test.webp\",\"imageAlt\":\"Click run to test as you build in axiom.ai, watch the bot in the extension.\",\"title\":\"Test as you build\",\"description\":\"Run a single step or the whole bot from inside the builder.\",\"link\":\"\u002Finfrastructure\",\"linkText\":\"See docs\"},{\"image\":\"\u002Flanding\u002Fexport-import.webp\",\"imageAlt\":\"Export the automation you make in axiom.ai and share with your team\",\"title\":\"Share your bot\",\"description\":\"Export and share your automation with others.\",\"link\":\"\u002Finfrastructure\",\"linkText\":\"See docs\"},{\"image\":\"\u002Flanding\u002Frecord-run.webp\",\"imageAlt\":\"Replay recordings of your bot runs for debugging - axiom.ai\",\"title\":\"Run recordings\",\"description\":\"Record every cloud run and replay it step by step to see exactly what your bot did. Ultimate plan only.\"}]","Build in the page, not in a canvas.",[1475,65696],{":items":65697,":reverse-stagger":15884,"description":65698,"eyebrow":65699,"link":65700,"linkText":65701,"title":65702,"variant":665},"[{\"image\":\"\u002Flanding\u002Fclick-element.webp\",\"imageAlt\":\"click element step in the axiom builder - clicks a selected button or link\",\"title\":\"Interact\",\"description\":\"Click, type, scroll, navigate, hover. Drive any site like a real user.\",\"link\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\",\"linkText\":\"See interact steps\"},{\"image\":\"\u002Flanding\u002Fget-data-step.webp\",\"imageAlt\":\"Extract step pulling data from a page\",\"title\":\"Extract\",\"description\":\"Scrape elements, tables, attributes, and screenshots. Pull anything off the page.\",\"link\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fget-data\",\"linkText\":\"See extract steps\"},{\"image\":\"\u002Flanding\u002Fai-step.webp\",\"imageAlt\":\"AI step - use AI during bots runs to extract and generate data\",\"title\":\"AI\",\"description\":\"Ask AI inline. Extract with a prompt, classify content, summarize a page.\",\"link\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fintegrate-ai\",\"linkText\":\"See AI steps\"},{\"image\":\"\u002Flanding\u002Freplace-text.webp\",\"imageAlt\":\"transform data one example replace text step - change text value during run\",\"title\":\"Data\",\"description\":\"Transform, filter, merge, format. Clean scraped data before it lands anywhere.\",\"link\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fdata\u002Ftransform\",\"linkText\":\"See data steps\"},{\"image\":\"\u002Flanding\u002Fif-else-condtion.webp\",\"imageAlt\":\"Use if else logic in your browser bots\",\"title\":\"Flow\",\"description\":\"If\u002Felse, loops, retries, waits. Branch the bot on what it sees.\",\"link\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogic\",\"linkText\":\"See flow steps\"},{\"image\":\"\u002Flanding\u002Fread-google-sheet.webp\",\"imageAlt\":\"Integration step reading data from a Google Sheet - axiom.ai\",\"title\":\"Integrate\",\"description\":\"Read and write to Google Sheets, Excel, and Drive. Spreadsheets in, results out.\",\"link\":\"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\",\"linkText\":\"See integrations\"},{\"image\":\"\u002Flanding\u002Fwebhook.webp\",\"imageAlt\":\"Webhooks posting and receiving data from axiom.ai\",\"title\":\"Webhooks\",\"description\":\"Post and receive data. Trigger bots from your stack, send results anywhere.\",\"link\":\"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fwebhooks\",\"linkText\":\"See webhook steps\"},{\"image\":\"\u002Flanding\u002Fgoogle-drive-upload.webp\",\"imageAlt\":\"Files upload and download step\",\"title\":\"Files\",\"description\":\"Upload and download. Save to local disk or push to Google Drive.\",\"link\":\"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\",\"linkText\":\"See file steps\"}]","Scrape, interact, navigate, write to sheets, send webhooks, ask AI to extract or generate. A growing library of steps you drop into your bot and configure on the page.","The steps","\u002Fsteps","See steps","A step for every browser action.",[345,65704],{":items":65555,"eyebrow":4171,"link":47234,"linkText":65557,"title":65558,"description":65705},"Scheduling, proxies, profiles, bot detection bypass, concurrency. The runtime settings you actually need configured once per bot.",[328,65707],{"description":65708,"eyebrow":1671,"image":1672,"imageAlt":65709,"primaryText":1674,"primaryTo":1675,"secondaryText":876,"secondaryTo":1454,"title":65710},"The no-code tool works fine on its own. But Claude lives in the builder for the moments you want a hand, whether that's scaffolding a bot, fixing a broken selector, or wiring up a schedule. Optional, always.","AI assistant — use it or don't; the no-code tool works well without it.","AI when you want it, not when you don't",[416,65712],{},[345,65714],{":items":65715,"eyebrow":65716,"link":42707,"linkText":42709,"title":65717},"[{\"title\":\"Record runs\",\"description\":\"Record the last minute of any run before it throws an error. The feature also captures a full run log to view with a scrubber.\"},{\"title\":\"New API\",\"description\":\"Three new endpoints.\"},{\"title\":\"Delete file from Google Drive\",\"description\":\"Use a step to remove files from your Google Drive.\"}]","New","Latest in the no-code tool.",[736,65719,65720],{"bg":394,"color":738},[47,65721],{"author":65722,"quote":65723},"John Bauché","Axiom is my top choice for web scraping.",[53,65725],{"className":65726},[35,747],[63,65728],{"className":65729},[35,747],[400,65731],{":links":753,"className":65732},[35,747],{"title":67,"searchDepth":68,"depth":68,"links":65734},[],"The axiom.ai Builder features a range of no-code steps to automate browser tasks—from web scraping and AI data extraction to form filling—without writing a single line of code.",{},{"title":65684,"description":65735},"no-code-tool","8VN7omaKhPmE5HfV7hLqnj1FHXeOO0JR5A4C5RyL4O4",{"id":65741,"title":466,"body":65742,"date":71,"description":65778,"extension":73,"meta":65779,"navigation":75,"order":71,"path":7414,"seo":65780,"stem":465,"__hash__":65781},"content\u002Fpricing.md",{"type":8,"value":65743,"toc":65776},[65744,65748,65751,65754,65760,65765,65770],[11,65745],{"description":65746,"headline":65747},"Try before you subscribe — all new accounts get 2 free hours of runtime. No credit card required.","Browser automation plans.",[65749,65750],"pricing-section",{},[65752,65753],"feature-table",{},[736,65755,65756],{"bg":394,"color":738},[57,65757],{":faqs":65758,"description":65651,"eyebrow":384,"link":1877,"linkText":1878,"title":65759},"[{\"question\":\"What is the Runtime?\",\"answer\":\"Runtime is the total amount of time that your bots can run per month. The available runtime varies from tier to tier. Unused runtime does not carry over to the next month. Note: free trial runtime does not renew. Check your runtime usage in the dashboard.\"},{\"question\":\"Do you offer custom plans?\",\"answer\":\"We offer custom plans in instances where the Ultimate tier is not sufficient. We are not able to offer custom plans for lower tiers. \u003Ca href='\u002Fcustomer-support'>Contact us\u003C\u002Fa> for more details.\"},{\"question\":\"Is my data private?\",\"answer\":\"Yes! When running your automation in the cloud, any processed data is not stored. When running your automation on your local PC, this data never leaves your PC. At no point do we store run data or share it with others. We store your account details, settings and automation configuration, and run reports. Learn more about our \u003Ca href='\u002Fprivacy-policy'>privacy policy\u003C\u002Fa>.\"},{\"question\":\"Does axiom.ai have an API or integrations?\",\"answer\":\"Yes! Pro and higher tiers can make use of our \u003Ca href='\u002Fdocs\u002Fdeveloper-hub\u002Fapi'>API\u003C\u002Fa>, \u003Ca href='\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fzapier'>Zapier\u003C\u002Fa>, and \u003Ca href='\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fmake'>Make\u003C\u002Fa> integrations to manage and send data to and from their automations.\"},{\"question\":\"Do I need to know how to code?\",\"answer\":\"axiom.ai is designed to be used as a no-code automation solution. Functionality can be extended with code, however, this is optional and all features are available without needing code.\"},{\"question\":\"Does axiom.ai have an API or integrations?\",\"answer\":\"Click the Support in the top menu to navigate to our Customer Support page for more details on support available.\"},{\"question\":\"How can I check my Runtime?\",\"answer\":\"Your Runtime usage is available within the extension, hover over the percentage ring for a more detailed view within the dashboard.\"},{\"question\":\"Do failed runs count against my Runtime?\",\"answer\":\"No, only successful runs count. That means you can test a bot as much as you want until it works.\"},{\"question\":\"Can I run my automations in the cloud?\",\"answer\":\"Yes, automations can be run in the cloud, or locally using the desktop application. Automations triggered by the API or an integration will run in the cloud by default.\"},{\"question\":\"Do you offer team accounts?\",\"answer\":\"Yes, automations can be run in the cloud, or locally using the desktop application. Automations triggered by the API or an integration will run in the cloud by default.\"}]","Have a question?",[47,65761],{"author":65762,"className":65763,"quote":65764},"Shaun McArthur",[35,747],"Straightforward and easy to setup & test. Great pricing, too.",[33,65766,65768],{"className":65767},[35,747],[53,65769],{},[63,65771],{":shapes":65772,"className":65773,"headline":65774,"linkText":153,"linkTo":1675,"text":65775},"[\"starter\",\"pro\",\"pro-max\",\"ultimate\"]",[35,747],"Pick your plan.","Start free, upgrade as you grow.",{"title":67,"searchDepth":68,"depth":68,"links":65777},[],"Browser automation plans starting free with 2 hours of runtime, no card required. Pro adds scheduling; Pro Max adds parallel runs; Ultimate unlocks everything.",{},{"title":466,"description":65778},"e4svVhk1seLclsjOT0NBaygaoKpNjsg1MTnJqDUvqwM",{"id":65783,"title":65784,"body":65785,"date":71,"description":66058,"extension":73,"meta":66059,"navigation":75,"order":71,"path":31011,"seo":66060,"stem":65813,"__hash__":66061},"content\u002Fprivacy-policy.md","Privacy Policy",{"type":8,"value":65786,"toc":66049},[65787,66046],[65788,65789,65792,65829,65833,65836,65841,65844,65847,65858,65861,65864,65867,65870,65873,65876,65880,65883,65891,65894,65914,65917,65920,65923,65926,65930,65933,65936,65939,65943,65946,65949,65953,65956,65961,65974,65978,65986,65990,65998,66002,66007,66011,66019,66023,66031,66035],"one-col",{"className":65790},[90,65791],"max-w-[820px]",[1270,65793,814,65796,814,65800,814,65805],{"className":65794},[65795,1258],"my-20",[93,65797,65799],{"id":65798},"axiomai-is-built-for-privacy","axiom.ai is built for privacy",[26,65801,65804],{"className":65802},[65803],"text-lg","axiom.ai bots process data. We do not store, share or train AI's with your data. Once processed, any data used is deleted.",[1270,65806,1274,65811,1274,65815,814],{"className":65807},[1313,65808,65809,65810],"bg-bg","space-y-4","p-6",[1320,65812,65814],{"id":65813},"privacy-policy","Privacy policy",[186,65816,1309,65817,1309,65820,1309,65823,1309,65826,1274],{},[189,65818,65819],{},"We only store customer account information and configuration settings",[189,65821,65822],{},"No data is used to training AI's",[189,65824,65825],{},"We do not share or sell customer data to third parties.",[189,65827,65828],{},"All data processsed during runtime is encrypted",[21,65830,65832],{"id":65831},"our-data-policy","Our data policy",[26,65834,65835],{},"The intent of this policy is to inform the user of the axiom.ai software about the data we collect and use or otherwise process during the use of the software, and to detail our responsibilities under legislation such as GDPR. For the purposes of this information, axiom.ai AI is classified as a data processor.",[65837,65838,65840],"h4",{"id":65839},"what-data-is-processed-and-why","What data is processed and why?",[26,65842,65843],{},"For use of the software, login details connected to an email address are stored. This is required for account authentication.",[26,65845,65846],{},"For operation of the product, certain data will be stored by axiom.ai, in order for the system to access resources required for its operation. Data collected takes the following form:",[186,65848,65849,65852,65855],{},[189,65850,65851],{},"API details for particular services, in the form of API keys",[189,65853,65854],{},"The individual steps of automations created, along with configuration parameters",[189,65856,65857],{},"Personal account details",[26,65859,65860],{},"Where possible axiom.ai uses its own internal credentials to perform its functionality, but be aware that some functionality of the axiom.ai software requires this data to be stored to operate. These features can be used at your discretion and will be clearly communicated.",[26,65862,65863],{},"axiom.ai is able to make use of your existing session data in order to allow automations to work consistently. This data consists of cookies and local storage values set in the browser that is running the Chrome extension. Only required cookies and storage values are used. When using the desktop application, this session data is shared locally with the application, and does not leave your machine. When using the cloud service, this data is sent to our cloud run servers in order for your automation to run successfully. Any such data is not stored and is permanently deleted immediately after usage. The cloud service is provided for user convenience only; the desktop application is always available for download if this behaviour is not desired.",[26,65865,65866],{},"axiom.ai may collect and monitor usage statistics for the purposes of improving the software, including use in learning algorithms. This data is anonymised and not associated with any particular personally identifiable information.",[26,65868,65869],{},"axiom.ai may use these details for system-level communications, such as notifications of completed automation runs, or problems in running a particular job. These notifications are opt-in and not required for the system's operation; all such data is available on demand when logged into the software.",[26,65871,65872],{},"axiom.ai does not use stored user data to train AI or machine learning models. We also do not use any data we process as part of runs to train AI or machine learning models. This includes data from all external sources, for example Google Sheets and Google Drive.",[26,65874,65875],{},"Finally, stored data may be used from time to time in marketing operations conducted by the company. This usage is subject to explicit consent.",[65837,65877,65879],{"id":65878},"google-data","Google data",[26,65881,65882],{},"Google data is processed on an opt-in basis using APIs provided by Google. Granting consent to the axiom.ai application allows us to perform the following actions:",[186,65884,65885,65888],{},[189,65886,65887],{},"Read, write, update and delete any Google Sheet in the granted account",[189,65889,65890],{},"Read, write and delete any Google Drive file in the granted account",[26,65892,65893],{},"Access to such data is given only to allow you to use these features in automations built or configured by you, the user, when adding one or more of the following functions to an automation you are building:",[186,65895,65896,65899,65902,65905,65908,65911],{},[189,65897,65898],{},"Read data from a specified Google Sheet",[189,65900,65901],{},"Write data to a specified Google Sheet",[189,65903,65904],{},"Delete a specified Google Sheet",[189,65906,65907],{},"Create a new Google Sheet in your Google Sheets account",[189,65909,65910],{},"Upload a specified file from Google Drive to a website",[189,65912,65913],{},"Download a file from a website to your Google Drive account",[26,65915,65916],{},"The use of any of these features is optional and is not required to use the axiom.ai software.",[26,65918,65919],{},"Any data we access in your Google Sheets or Drive account is not stored on our infrastructure, and is accessed by us only in transit. Such data is encrypted by SSL during this process. Your data is not used by axiom.ai in any way, including for the training of machine learning or AI models, for marketing, or for any other purpose outside of those explicitly stated above.",[26,65921,65922],{},"No data from your Google account is transferred to or shared with any third party. During transit, the data is processed using infrastructure provided by Amazon Web Services (AWS). This data is processed in transit only, is not stored on any short or long-term storage system, and is encrypted end-to-end.",[26,65924,65925],{},"If at any time you wish to revoke axiom's access to your Google data, you can do so within the axiom.ai user interface at any time. All Google access tokens will be immediately revoked.",[65837,65927,65929],{"id":65928},"data-security","Data Security",[26,65931,65932],{},"Login data for the axiom.ai product itself is encrypted with a salted hash and stored in a secured database.",[26,65934,65935],{},"Personal data is also stored in a database. It is not accessible to other users of the product and access to this is behind an SSL-encrypted security layer.",[26,65937,65938],{},"axiom.ai continually monitors and will update this security policy according to developments in best practice or other domains.",[65837,65940,65942],{"id":65941},"data-storage","Data Storage",[26,65944,65945],{},"Data is stored only for as long as required for operation of the service. At any time this data may be voluntarily withdrawn, at which point all personal data related to a particular user or organisation will be immediately and permanently removed from the system. Withdrawing the data in this way will terminate operation of the software immediately.",[26,65947,65948],{},"Any anonymous data collected during the operation of the software will remain in the system; we are unable to remove this data because it is not associated with any identifiable account details.",[65837,65950,65952],{"id":65951},"user-rights","User Rights",[26,65954,65955],{},"axiom.ai guarantees the following user rights for all personal data stored, in accordance with GDPR regulations.",[65957,65958,65960],"h5",{"id":65959},"the-right-to-be-informed","The right to be informed",[186,65962,65963,65966],{},[189,65964,65965],{},"This document aims to lay out how data is stored by axiom.ai and for what reason.",[189,65967,65968,65969,65973],{},"Queries can be directed to at ",[659,65970,65972],{"href":65971},"mailto:privacy@axiom.pm","privacy@axiom.pm"," if any further information is required, or if you have any concerns that need addressing with this policy.",[65957,65975,65977],{"id":65976},"the-right-of-access","The right of access",[186,65979,65980,65983],{},[189,65981,65982],{},"Users have the right to access their personal information at any time.",[189,65984,65985],{},"As much information as is feasibly possible will be exposed through accessible user interface elements.",[65957,65987,65989],{"id":65988},"the-right-to-rectification","The right to rectification",[186,65991,65992,65995],{},[189,65993,65994],{},"Users have the right to alter or correct any personal information stored in the system at any time.",[189,65996,65997],{},"This functionality is available directly through the Axiom application, or can be altered by direct request.",[65957,65999,66001],{"id":66000},"the-right-to-erasure","The right to erasure",[186,66003,66004],{},[189,66005,66006],{},"Personal information can be erased on request at any time. Please see the 'Data Storage' section for further information.",[65957,66008,66010],{"id":66009},"the-right-to-restrict-processing","The right to restrict processing",[186,66012,66013,66016],{},[189,66014,66015],{},"Users have the right to restrict processing at any time. This means we can continue to store the data, but not use it for any purpose.",[189,66017,66018],{},"Please note that exercising this right will cease operation of the axiom.ai software.",[65957,66020,66022],{"id":66021},"the-right-to-data-portability","The right to data portability",[186,66024,66025,66028],{},[189,66026,66027],{},"Any personal information supplied to axiom.ai is guaranteed to be accessible and portable to other services.",[189,66029,66030],{},"We will not hide or otherwise store personal information without providing equivalent methods to access and retrieve this data.",[65957,66032,66034],{"id":66033},"the-right-to-object","The right to object",[186,66036,66037,66040,66043],{},[189,66038,66039],{},"Users have the right to object to the use of personal data, for example in marketing communications or other uses of their data.",[189,66041,66042],{},"Users have an absolute right to object to the use of their data in regards to marketing.",[189,66044,66045],{},"Note that in other cases, if there are legitimate reasons for the use of this data, objections will not necessarily result in removal or a change of behaviour.",[63,66047],{"className":66048},[35],{"title":67,"searchDepth":68,"depth":68,"links":66050},[66051],{"id":65831,"depth":68,"text":65832,"children":66052},[66053,66054,66055,66056,66057],{"id":65839,"depth":1478,"text":65840},{"id":65878,"depth":1478,"text":65879},{"id":65928,"depth":1478,"text":65929},{"id":65941,"depth":1478,"text":65942},{"id":65951,"depth":1478,"text":65952},"We don't store, share, or train AI on your data. Bots process data in your browser, then it's gone. Read the full privacy policy.",{},{"title":65784,"description":66058},"andKd1Ux8iLrRnZV8kcj2BJOA5NYg55gx7s4J0IM3qo",{"id":66063,"title":66064,"body":66065,"date":71,"description":66170,"extension":73,"meta":66171,"navigation":75,"order":71,"path":65700,"seo":66172,"stem":909,"__hash__":66173},"content\u002Fsteps.md","No-code steps for browser automation",{"type":8,"value":66066,"toc":66168},[66067,66109,66121,66151,66165],[171,66068,66069],{":features":173,"buttonPath":174,"buttonText":175,"description":177,"featurePath":178,"featurePathText":179,"featuresTitle":180,"header":181},[183,66070,66071],{"v-slot:features":67},[186,66072,66073,66077,66081,66085,66089,66093,66097,66101,66105],{},[189,66074,66075,195],{},[192,66076,194],{},[189,66078,66079,201],{},[192,66080,200],{},[189,66082,66083,207],{},[192,66084,206],{},[189,66086,66087,207],{},[192,66088,212],{},[189,66090,66091,218],{},[192,66092,217],{},[189,66094,66095,224],{},[192,66096,223],{},[189,66098,66099,230],{},[192,66100,229],{},[189,66102,66103,224],{},[192,66104,235],{},[189,66106,66107,241],{},[192,66108,240],{},[37,66110,66112],{"headline":66111},"Steps for web scraping and AI data extraction.",[26,66113,66114,66115,66118,66119,148],{},"Use the selector tool in the ",[659,66116,66117],{"href":48831},"get data from webpage"," steps to point and click on data you wish to scrape from virtually any website. Combine it with our ChatGPT step to extract unstructured data. For an example of what's possible with our no-code steps, check out this ",[659,66120,1190],{"href":40618},[1270,66122,66124,66127,66129,66131,66133,66135,66137,66139,66141,66143,66145,66147,66149],{"className":66123},[86,926],[66125,66126],"steps-category-section",{"category":17816},[66125,66128],{"category":48952},[66125,66130],{"category":49189},[66125,66132],{"category":48807},[66125,66134],{"category":223},[66125,66136],{"category":32433},[66125,66138],{"category":49565},[66125,66140],{"category":48739},[66125,66142],{"category":53531},[66125,66144],{"category":200},[66125,66146],{"category":38518},[66125,66148],{"category":1975},[66125,66150],{"category":49002},[736,66152,66155],{"bg":394,"className":66153,"color":738},[66154],"!pb-0",[37,66156,66158],{"headline":66157},"Not seen the step you need? Get in touch",[26,66159,66160,66161,66164],{},"Can't find a step that meets your needs? We're building this tool for you, so if there's a step you'd like to see added, reach out and share your idea. If it's within scope, we'll do our best to include it in a future release. Simply contact ",[659,66162,32296],{"href":66163},".\u002Fcustomer-support",". In the meantime if you are keen to learn more check out these guides and tutorials listed below.",[63,66166],{"className":66167},[35,747],{"title":67,"searchDepth":68,"depth":68,"links":66169},[],"The axiom.ai no-code builder features a range of no-code steps to automate browser tasks—from web scraping and AI data extraction to form filling—without writing a single line of code.",{},{"title":66064,"description":66170},"nb4PkwK701IlVkOwm91Ms36lHjAywNehpC9uKkrXKiM",{"id":66175,"title":66176,"body":66177,"date":71,"description":66194,"extension":73,"meta":66195,"navigation":75,"order":71,"path":66197,"seo":66198,"stem":13307,"__hash__":66199},"content\u002Fsuccess.md","You're all set",{"type":8,"value":66178,"toc":66192},[66179],[736,66180,66182],{"bg":394,"className":66181,"color":738},[66154],[66183,66184],"text-with-video",{":steps":66185,"ctaText":66186,"ctaTo":1827,"description":66187,"eyebrow":66188,"stepsEyebrow":66189,"title":66190,"videoId":66191},"[{\"title\":\"Open axiom\",\"description\":\"Open the Chrome extension on the page you want to automate.\"},{\"title\":\"Add a Go to URL step\",\"description\":\"Start with a Go to step so the bot lands on the right page every run.\"},{\"title\":\"Add the actions\",\"description\":\"Stack click, type, upload, and scrape steps to build out the task.\"},{\"title\":\"Test and run\",\"description\":\"Run it end to end, tweak anything that misbehaves, and you're done.\"}]","Open the builder","Open axiom on the page you want to automate, stack the actions the bot should take, then run it. The same flow whether you're scraping a list, filling a form, or stringing both together.","No-code","The flow","Build step by step.","RKzbfw7qna0",{"title":67,"searchDepth":68,"depth":68,"links":66193},[],"Your axiom.ai account is ready. Start building automations in the Chrome extension, write a code script in the Code Dashboard, or use the Claude skill to build with AI.",{"metaTitle":66196},"Welcome to axiom.ai","\u002Fsuccess",{"title":66176,"description":66194},"1c7msYhGjo23YkMQJ51OJdEWVzAzBFYh6q2x0ct9xWE",{"id":66201,"title":66202,"body":66203,"date":71,"description":66565,"extension":73,"meta":66566,"navigation":75,"order":71,"path":66567,"seo":66568,"stem":66213,"__hash__":66569},"content\u002Fterms-of-use.md","Terms of use",{"type":8,"value":66204,"toc":66551},[66205,66548],[65788,66206,66208,66240,66244,66247,66250,66266,66269,66272,66275,66295,66299,66307,66309,66317,66321,66352,66356,66359,66362,66368,66371,66374,66377,66380,66384,66426,66430,66441,66444,66493,66497,66527,66531],{"className":66207},[90,65791],[1270,66209,814,66211,814,66215,814,66219],{"className":66210},[65795,1258],[93,66212,66214],{"id":66213},"terms-of-use","Terms of Use",[26,66216,66218],{"className":66217},[65803],"Contact us using support@axiom.ai for any queries or concerns you may have regarding terms of use or any aspect of the Services provided.",[1270,66220,1274,66222,1274,66226,814],{"className":66221},[1313,65808,65809,65810],[1320,66223,66225],{"id":66224},"acceptable-use","Acceptable Use",[186,66227,1309,66228,1309,66231,1309,66234,1309,66237,1274],{},[189,66229,66230],{},"Only use axiom.ai for purposes that are legal in your region or operation.",[189,66232,66233],{},"Do not use any measures to bypass any license restriction applied by axiom.ai.",[189,66235,66236],{},"You will not use our Services for the purposes of spamming or distributing malware.",[189,66238,66239],{},"You will back up or otherwise secure any data or sensitive material that will be used in relation to the operation of any of the Services.",[21,66241,66243],{"id":66242},"definitions","Definitions",[26,66245,66246],{},"\"axiom.ai\" \"Axiom\" \"we\" \"us\" \"our\" refers to Axiom Ai Limited, a limited company registered in the United Kingdom (company number 11171985).",[26,66248,66249],{},"\"Services\" or \"Products\" means axiom.ai's websites, applications and browser extensions, including any online services, products, software applications, improvements, updates, patches and enhancements, together with the associated documentation (excluding any publicity or marketing materials) and any other content of axiom.ai such as videos or blog posts. In addition:",[186,66251,66252,66260,66263],{},[189,66253,66254,66255,66259],{},"\"Extension\" refers specifically to the Axiom AI Chrome Extension, either obtained from the Chrome web store at ",[659,66256,66257],{"href":66257,"rel":66258},"https:\u002F\u002Fchrome.google.com\u002Fwebstore\u002Fdetail\u002Faxiom-automations\u002Fcpgamigjcbffkaiciiepndmonbfdimbb",[1218]," or by any other means.",[189,66261,66262],{},"\"Builder\" refers specifically to the Axiom AI Builder tool that is included with the Chrome Extension",[189,66264,66265],{},"\"Application\" refers specifically to the desktop application that is installed in order to run Axiom automations on the user's own computer",[26,66267,66268],{},"\"you\" means any individual or a company or organization that has, accesses or directs the use of, an account with us, or is testing or using the Services; \"your users\" means your affiliates and employees or equivalent contractors.",[26,66270,66271],{},"\"Content\"\"Automations\" means anything developed for use with the functionality provided by the Services, for any purpose whatsoever.",[65837,66273,31280],{"id":66274},"general",[1923,66276,66277,66280,66283,66286,66289],{},[189,66278,66279],{},"To use the Services, you must be at least 16-years old or have full capacity to contract according to your country of residence. You might use the Services for yourself or your employer\u002Fsimilar contractor (which we call here the \"Entity\") and if you sign on for axiom.ai's Services on behalf of your Entity (for instance, by using your business email at registration), axiom.ai assumes you have the relevant power and capacity to do so and references to \"you\" will include both you as individual and the Entity.",[189,66281,66282],{},"Although we will take reasonable steps to notify you of material changes to the Terms of Use, axiom.ai reserves the right to change the Services and the Terms of Use from time to time without prior notice. If you continue to use the Services after any change, axiom.ai will assume that you have agreed with said change to the Services and the Terms of Use. Your only remedy for your dissatisfaction with the Services, the Terms of Use or any updates, is to stop using the Services.",[189,66284,66285],{},"You may not assign or otherwise transfer these Terms of Use or your rights and obligations under the Terms of Use, in whole or in part, without axiom.ai's written consent and any such attempt will be void. axiom.ai may transfer its rights under these Terms of Use to a third party, in which case these Terms of Use will be updated and made available on the axiom.ai website.",[189,66287,66288],{},"If you're a legal entity, you hereby grant axiom.ai a transferable, sub-licensable, royalty-free, non-exclusive, worldwide, valid for the entire duration of the rights, license to copy, host, store, assess, test, distribute, modify, publicly perform, display, prepare derivative works of, incorporate into other works and otherwise use your trademarks, service marks and logos in our marketing materials, for the purpose of promoting our Services and marketing your participation.",[189,66290,66291,66292,66294],{},"You may contact us using ",[659,66293,2364],{"href":2363}," for any queries or concerns you may have regarding this document or any aspect of the Services provided.",[65837,66296,66298],{"id":66297},"license","License",[1923,66300,66301,66304],{},[189,66302,66303],{},"axiom.ai hereby agrees to provide you the right to use the Services, under a limited, non-exclusive, non-transferable, non-sublicensable and revocable license.",[189,66305,66306],{},"You hereby give axiom.ai an unlimited, perpetual, transferable, sub-licensable, non-exclusive, worldwide and royalty free license to use, host, store, copy, distribute, assess, test, modify, publicly perform, display, create derivative works of, incorporate into other works, and otherwise use, any of your automations, content, suggestions, ideas and other feedback, without any restriction or compensation to you, for the purpose of providing our Services and managing our platforms. axiom.ai may independently acquire, license, or develop, any intellectual property rights and technology performing similar functions as the software\u002Fworkflows developed by, or for, you.",[65837,66308,272],{"id":271},[1923,66310,66311],{},[189,66312,66313,66314,66316],{},"axiom.ai is not liable, nor has any responsibility for, any Content developed using the Services, except in cases where axiom.ai has developed that Content. This includes, but is not necessarily limited to, the following cases:",[1205,66315],{},"a. Content developed by you\nb. Content developed by a third party for you, where that third party is not axiom.ai\nc. Any flaw or problem caused by Content falling under this clause is entirely and completely the responsibility of the user, i.e. you. axiom.ai will take reasonable efforts to safeguard your account from malicious usage, but any damage or distress caused by the app under operation from Content not created by axiom.ai is not supported and cannot be guaranteed to function.",[65837,66318,66320],{"id":66319},"privacy-and-security","Privacy and Security",[1923,66322,66323,66326,66340,66343,66346,66349],{},[189,66324,66325],{},"axiom.ai is GDPR compliant as a Processor of data. Your data will be used by our system solely in order to operate the Services, and any data that is used to provide said Services will be deleted immediately after usage.",[189,66327,66328,66329],{},"axiom.ai collects analytics data as part of its functionality. This data includes, but is not necessarily limited to, the following:",[186,66330,66331,66334,66337],{},[189,66332,66333],{},"Data relating to UI activity within the Extension, including tracking of clicks and page views",[189,66335,66336],{},"Data relating to activity within the Application, including details on the running of the extension (data from the output is not stored)",[189,66338,66339],{},"Data relating to account activity within the services, such as logging in and out, session data, and times that you are active on the Services",[189,66341,66342],{},"axiom.ai is not liable in any way for privacy and security issues brought about by Content provided either by you or by a third party who is not axiom.ai itself. You, the user, takes full responsibility for any operation of third-party Content, and agrees to abide by all applicable Privacy and Security agreements that may be applicable to your use of the Services.",[189,66344,66345],{},"Axiom does not store the results of any automation. However, any data entered into an automation using the Builder is stored in our databases and is accessible to developers and employees of axiom.ai. As such, it is not recommended to enter sensitive or secret data into Axiom steps. If sensitive or secret data is required for an Axiom to function, it should be connected from a source under your control.",[189,66347,66348],{},"General session data (such as cookies for the sites you are using in an automation) is synced between the Application and the browser running the Builder. In the case of automations that are running on our cloud Service, rather than using the Application, session data is synced to the server on a temporary basis, as this is required for the Service to function. It is deleted immediately after use. By using the cloud functionality of Axiom you assent to this; the Application is available if this behaviour is not desired.",[189,66350,66351],{},"Any information we have on you or your operations, confidential or otherwise, may be disclosed by us to any official or law-making body as required for our legal purposes or to protect any legal interest of axiom.ai.",[65837,66353,66355],{"id":66354},"fees-subscriptions-and-refunds","Fees, Subscriptions and Refunds",[26,66357,66358],{},"The Services are provided on a subscription basis (“Subscription”).",[26,66360,66361],{},"Subscriptions are billed in advance on a recurring basis (for example, monthly or annually), depending on the plan selected. Your Subscription will automatically renew at the end of each billing cycle unless you cancel it prior to the renewal date.",[26,66363,66364,66365,66367],{},"You may cancel your Subscription at any time through the features provided within the Services or by contacting us at ",[659,66366,2364],{"href":2363},". Cancellation will take effect at the end of the current billing period, and you will retain access to the paid features until that time.",[26,66369,66370],{},"Non-payment of fees within a 30 day period will result in the termination of the relevant Service.",[26,66372,66373],{},"axiom.ai reserves the right to change Subscription fees at any time. Any price changes will take effect at the start of the next billing cycle following notice to you. Continued use of the Services after such changes come into effect constitutes your agreement to the updated fees.",[26,66375,66376],{},"For annual Subscriptions, fees are prepaid and non-refundable. No refunds or credits will be provided for partial use, unused periods, or downgrades, except where required by applicable law.",[26,66378,66379],{},"Nothing in these Terms affects your statutory rights. Where you are a consumer, you may have a legal right to cancel within a cooling-off period, unless you have expressly requested access to the Services during that period and acknowledged that your right to cancel will be lost.",[65837,66381,66383],{"id":66382},"warranty","Warranty",[1923,66385,66386,66392,66409],{},[189,66387,66388,66391],{},[192,66389,66390],{},"No warranties:"," All Services are provided on an as-is and as-available basis. Neither axiom.ai nor any of its direct affiliates provides any kind of warranty (express, implied, statutory or otherwise) in relation to the Services, including but not necessarily limited to availability, uptime. fitness for a particular purpose, merchantability or interoperability with any other service. axiom.ai does not warrant that any Content developed by axiom.ai, its affiliates, you or any third party will run uninterrupted without error or defect. Responsibility of maintenance for Content being run by the user is the responsibility of the user of said Content. axiom.ai is not responsible for any harm or damages caused by any third party provider or content due to the operation of any of the Services. The customer bears all the risk of using any part of the Services.",[189,66393,66394,66395],{},"As regards to any Service or Content released by axiom.ai in beta, early access, released as a demo or otherwise still being developed, the following points additionally apply to them:",[186,66396,66397,66400,66403,66406],{},[189,66398,66399],{},"They may not be ready for production and therefore have defects in privacy, security or any other way",[189,66401,66402],{},"There may be defects in functionality that require patches or further updates to fix",[189,66404,66405],{},"They may not be fault-tolerant and data loss may be possible; responsibility for backing up important data rests with you the user",[189,66407,66408],{},"You will not use them for any commercial purpose or in any production situation or environment",[189,66410,66411,66412],{},"You represent and warrant at all times that:",[186,66413,66414,66417,66420,66423],{},[189,66415,66416],{},"You have all necessary right and title to enter into the Terms of Use and to perform your obligations hereunder",[189,66418,66419],{},"You and your users will use the Services in strict accordance with the Terms of Use and with all applicable legislation",[189,66421,66422],{},"You have obtained all rights, permissions and\u002For consents necessary for the lawful use of your data and the operation of the Services",[189,66424,66425],{},"No part of your data used within the Services infringes or otherwise conflicts with any third-party rights. You expressly agree that the use of the Services and Content is at your sole risk.",[65837,66427,66429],{"id":66428},"liability","Liability",[1923,66431,66432,66435,66438],{},[189,66433,66434],{},"To the maximum extent permitted by applicable law, in no event will axiom.ai Parties be liable for any SPECIAL, INDIRECT, MORAL, CONSEQUENTIAL, INCIDENTAL, PUNITIVE OR EXEMPLARY DAMAGES, THE USE OR INABILITY TO USE THE PRODUCTS, COMPUTER MALFUNCTION OR FAILURE, SERVER DOWN TIME, FAILURE OF THE PRODUCTS TO OPERATE WITH ANY OTHER PROGRAMS, LOSS OF PROFITS, REPUTATION, USE OR REVENUE, LOSS OR CORRUPTION OF DATA, OR INTERRUPTION OF BUSINESS, regardless if the axiom.ai Party was aware of the likelihood of such damages occurring, and whether such liability is based on contract, tort, negligence, strict liability, products liability or otherwise. For the avoidance of any doubt, under no circumstances may any axiom.ai Party be liable for any claims of any kind and nature that may be asserted, granted or imposed against, directly or indirectly, arising from, or in connection with, your Content, your failure to comply with the Terms of Use or use of your account.",[189,66436,66437],{},"Your exclusive remedy against any axiom.ai Party, for each and all claims, actions, proceedings and damages (individually and together), including direct damages, arising out of, or in connection with, the Terms of Use, and including where the warranty exclusions above are not valid or permitted under the applicable law, is limited up the higher of (i) one hundred (100) USD or (ii) the value of the consideration you paid for the month during in which the loss or breach occurred. These limitations and exclusions apply even if this remedy doesn't fully compensate you for any losses and even if axiom.ai knew or should have known about the possibility of the damages or the likelihood of their occurrence.",[189,66439,66440],{},"You will indemnify any axiom.ai Party, defend and hold them harmless against any losses, damages, fines and expenses (including attorneys' fees and costs) arising out of, or relating to any claims based on, (i). your, and your users use or attempted use of the Services in violation of the Terms of Use; (ii). your violation of the applicable law or rights of any third party; or (iii). your Content, including without limitation any claim of infringement or misappropriation of intellectual property or other proprietary rights.",[65837,66442,66225],{"id":66443},"acceptable-use-1",[1923,66445,66446,66449,66452,66455,66457,66460,66463,66466,66469,66472,66475,66478,66481,66484,66487,66490],{},[189,66447,66448],{},"You will only use axiom.ai for purposes that are legal in your region of operation of the Services.",[189,66450,66451],{},"You will not assume that violation of the terms of service of any third party application or service by your operation of the Services or any Content developed by any party (including axiom.ai for the purposes of demonstration) will be assignable to axiom.ai or any of its affiliates.",[189,66453,66454],{},"You will take responsibility for the operation of any Services or the use of any Content operated on your account in regards to the licenses or terms of use you have signed with other third party applications or organisations.",[189,66456,66239],{},[189,66458,66459],{},"You will not use any measures to bypass any license restriction applied by axiom.ai to you or your accounts.",[189,66461,66462],{},"Only a single account may be owned by a you at any time, unless we have provided authorisation in writing. Additional accounts created by you are subject to our approval and may be removed at our discretion.",[189,66464,66465],{},"You may take backups or other copies of Services granted to you for the purposes of disaster recovery.",[189,66467,66468],{},"You may not reverse engineer, analyse or otherwise attempt to make use of code distributed with our Services, except where a specific distribution license permits it.",[189,66470,66471],{},"You may not distribute, sell or otherwise re-assign in any way the rights and responsibilities given to you as part of these Terms of Use to any other third party.",[189,66473,66474],{},"You will not rely on axiom.ai providing any backup or recovery service for any damage or loss associated with your operation of the Services. All liability for such damages or losses lies with you.",[189,66476,66477],{},"You will allow axiom.ai to provide automatic updates and fixes to Services installed on your property for the purposes of fixing bugs, upgrading security and improving the functionality of the Services.",[189,66479,66480],{},"You will not attempt to gain access to or otherwise access any account, network, Service, Content or any other item by any means except the provision of a license to do so by axiom.ai.",[189,66482,66483],{},"You will not use the Services for the purposes of spamming, distributing malware, misleading other users, harassment, bullying, discrimination, destructive activities or any other purpose deemed individually unacceptable by us, regardless of local laws relating to these matters.",[189,66485,66486],{},"You are permitted to develop Content for other third party users, and to charge as you see fit for any service rendered. If those third party users utilise accounts provided by you, all responsibility for the terms of use remains with you and does not transfer to those third party users, unless they explicitly sign this agreement and create an account directly with us.",[189,66488,66489],{},"You will keep any passwords, login information and access to your infrastructure secure so that it cannot be co-opted by any unauthorised third party. Any loss associated with such an event is your sole responsibility.",[189,66491,66492],{},"If you suspect malicious activity on your account, or that an unauthorised user is using your account or your access to Content or Services to perform any action in violation of these Terms of Use, you undertake to contact as at any of the given contact addresses to inform us of this information so we may take appropriate action.",[65837,66494,66496],{"id":66495},"compliance","Compliance",[1923,66498,66499,66502,66505],{},[189,66500,66501],{},"You may only allow other users to access the Services for your direct business benifit, and hereby guarantee that any sub-user given access to Content or Services by you complies with the Terms of Use and all applicable policies. Upon request you will provide details of any third party who may have access to your accounts.",[189,66503,66504],{},"If you are a business, company, or organization, axiom.ai may, at its expense, verify that your use, access, installation, or deployment of the Services comply with these Terms of Use. Upon request, you will provide axiom.ai with details and use reports of all your users.",[189,66506,66507,66508,66512,66513],{},"If you suspect any abuse or a breach of any clause of these Terms of Use, you can let us know by contacting us at ",[659,66509,66511],{"href":66510},"mailto:ai@axiom.ai","ai@axiom.ai",". Please disclose any and all information you feel is necessary for the resolution of this issue, including but not necessarily limited to:",[186,66514,66515,66518,66521,66524],{},[189,66516,66517],{},"A description of the breach",[189,66519,66520],{},"Information on the person who has performed the breach",[189,66522,66523],{},"Information at which we can contact you",[189,66525,66526],{},"A statement declaring that this information, under penalty of perjury, is accurate to the best of your knowledge and ability to verify, and that the identified party is the owner of the infringing Content",[65837,66528,66530],{"id":66529},"termination","Termination",[1923,66532,66533,66536,66542,66545],{},[189,66534,66535],{},"You may stop using any Services or Content at any point you wish, without notice. Please let us know you are terminating the services using either the contact address indicated above or by using the features available within the Services provided for such a purpose. Your account will be terminated within three working days and any fees or payments cancelled.",[189,66537,66538,66539,66541],{},"axiom.ai reserves the right to terminate your account, Services and remove access to any Content that is running through any of our Services, for any of the following reasons:",[1205,66540],{},"a. A breach, or attempted breach, of any of these Terms of Use is reasonably attributable to your account\nb. Failure to pay for services after a 30-day grace period has expired\nc. Provision of Services is taken to breach any special local law or condition that may apply to you\nd. If a particular Service is discontinued or no longer being supported by us\ne. A period of inactivity not less than six months",[189,66543,66544],{},"If any termination of your accounts, Services or access to Content is to take place, we will make best efforts to notify you by your supplied contact details before this takes place and give you the option of response. Please note that the option of response does not imply that we will either reverse or suspend the decision to terminate or otherwise restrict access to any part of our Services or Content.",[189,66546,66547],{},"Once an account has been Terminated, all Content, Data and Services associated with or stored on this account will no longer be recoverable.",[63,66549],{"className":66550},[394],{"title":67,"searchDepth":68,"depth":68,"links":66552},[66553],{"id":66242,"depth":68,"text":66243,"children":66554},[66555,66556,66557,66558,66559,66560,66561,66562,66563,66564],{"id":66274,"depth":1478,"text":31280},{"id":66297,"depth":1478,"text":66298},{"id":271,"depth":1478,"text":272},{"id":66319,"depth":1478,"text":66320},{"id":66354,"depth":1478,"text":66355},{"id":66382,"depth":1478,"text":66383},{"id":66428,"depth":1478,"text":66429},{"id":66443,"depth":1478,"text":66225},{"id":66495,"depth":1478,"text":66496},{"id":66529,"depth":1478,"text":66530},"Read the axiom.ai terms of use, including acceptable use, license terms, account responsibilities, and support contact.",{},"\u002Fterms-of-use",{"title":66202,"description":66565},"OyTcCkMhyidsjrBZC37mgfyH--Oko2csjM3VZqFVz-Q",[],[],{"id":66573,"title":66574,"author":66575,"body":66576,"date":67019,"description":67020,"draft":67021,"extension":73,"meta":67022,"navigation":75,"path":43354,"seo":67035,"stem":67036,"__hash__":67037},"blog\u002Fblog\u002Fchatgpt-web-scraping.md","ChatGPT web scraping (with a bot)","Alex Barlow",{"type":8,"value":66577,"toc":66993},[66578,66581,66587,66591,66593,66596,66600,66603,66607,66610,66614,66617,66621,66624,66628,66636,66640,66648,66651,66655,66661,66665,66683,66687,66691,66698,66702,66705,66709,66716,66722,66728,66734,66741,66745,66749,66756,66760,66764,66778,66782,66786,66790,66811,66815,66821,66825,66828,66832,66835,66842,66846,66849,66853,66862,66869,66876,66883,66887,66891,66894,66897,66912,66915,66919,66925,66928,66932,66937,66941,66944,66948,66952,66970,66976,66980,66983,66987],[26,66579,66580],{},"Some people fear AI taking over 😱, while others use it to automate their jobs 🕺. How do you feel about it? If you're looking to gain skills to automate and build bots with powerful AI capabilities, you've come to the right place. We'll show you how to create a bot that utilizes ChatGPT AI to scrape data websites.",[26,66582,66583,66584],{},"If you want to dive straight in, why not start with the ",[659,66585,66586],{"href":43350},"ChatGPT web scraper template.",[107,66588,66590],{"id":66589},"why-would-you-want-to-scrape-websites-with-a-chatgpt-bot","Why would you want to scrape websites with a ChatGPT bot?",[32947,66592],{},[26,66594,66595],{},"There are lots of good no-code web scrapers like axiom.ai and Octotparse. They are great at scraping content from websites if they are always in the same format. We call that structured data. But 💁🏼 sometimes you want to scrape data when it's unstructured, when it doesn’t appear in a consistent format or place and we need the help of an AI to find it.",[107,66597,66599],{"id":66598},"what-scraping-use-case-would-you-recommend-using-a-chatgpt-bot-for","What scraping use case would you recommend using a ChatGPT bot for?",[26,66601,66602],{},"The primary use case is if you want to scrape many different websites with a single bot, looking for a defined data set. The data would appear unstructured as each website is different, and this is where an 🧠 AI scraper bot would be a useful tool. It would allow you to scrape thousands of pages for phone numbers or emails, for example. Great for lead building.",[107,66604,66606],{"id":66605},"what-exactly-is-a-chatgpt-bot-web-scraper","What exactly is a ChatGPT bot web scraper?",[26,66608,66609],{},"🧠 ➕ 🤖 A ChatGPT web scraper bot combines browser automation technology and AI ChatGPT tech. It's like a robot, but for the browser.",[107,66611,66613],{"id":66612},"how-do-you-make-a-chatgpt-scraper","How do you make a ChatGPT scraper?",[26,66615,66616],{},"With axiom.ai's no-code bot builder 🛠️\n, you can create bots for web scraping without having to code. Use a simple point and click interface to create as many ChatGPT scraper bots as you want! If you follow the steps below, you'll have a working bot doing your web scraping in no time.",[107,66618,66620],{"id":66619},"how-does-a-chatgpt-scraper-work","How does a ChatGPT scraper work?",[26,66622,66623],{},"The scraper works by looping through a list of URLs from a Google Sheet, visiting each page, and extracting the data you need, using its AI capabilities. The bot then writes the data to another Google Sheet, leaving you free to sit back and enjoy a cup of coffee!",[107,66625,66627],{"id":66626},"do-i-need-my-own-chat-gpt-api-key","Do I need my own Chat GPT API key?",[26,66629,66630,66631],{},"You probably already have one, but they are simple to get hold of if you don't. Just follow 🔐 OpenAI's ",[659,66632,66635],{"href":66633,"rel":66634},"https:\u002F\u002Fhelp.openai.com\u002Fen\u002Farticles\u002F4936850-where-do-i-find-my-secret-api-key",[1218],"instructions.",[107,66637,66639],{"id":66638},"is-it-legal-to-scrape-websites","Is it legal to scrape websites?",[26,66641,66642,66643],{},"The short answer is that there’s no law or rule banning web scraping, but that doesn’t mean that you can scrape everything. Web scraping is completely legal if you scrape data that is ",[659,66644,66647],{"href":66645,"rel":66646},"https:\u002F\u002Ftechcrunch.com\u002F2022\u002F04\u002F18\u002Fweb-scraping-legal-court\u002F?guccounter=1&guce_referrer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8&guce_referrer_sig=AQAAADgvjX28dWcoHnZCde5w5z5Ydj20MqZBJXizUmRjltRwM1LuhC73c5vSaZlpyubbXN4lsa2yzkv_uBxVLOlG_K_CXMcwpqjq9KGiWHi8KSF4L2kkj_BTvIEB7r5tnIwBzHrQ4Q4lndd19PKJlc67fc0aqY74krc41nUYPZP3J-WL",[1218],"publicly available online.",[26,66649,66650],{},"Certain types of data however are protected by international regulations, so be mindful of what you can and can’t scrape when it comes to personal data, intellectual property, or confidential data.",[107,66652,66654],{"id":66653},"lets-learn-how-to-build-a-chatgpt-scraper-bot-with-axiomai","Let’s learn how to build a ChatGPT scraper bot with axiom.ai",[26,66656,66657,66658,66660],{},"If you want to short cut the process why not try the ",[659,66659,183],{"href":43350}," or read on to learn more!",[21,66662,66664],{"id":66663},"_1-set-up-your-google-sheet","1. Set up your Google Sheet",[26,66666,66667,66668,66671,66672,66675,66676,66679,66680,148],{},"🏁 Create a new Google Sheet. You can do this in your Chrome browser by entering ",[192,66669,66670],{},"'sheet.new'"," into the address bar. Don’t forget to name your sheet something like ",[192,66673,66674],{},"'Websites to scrape’",". Add two tabs; one named ",[192,66677,66678],{},"‘URLs’"," and another named ",[192,66681,66682],{},"‘Data’",[21,66684,66686],{"id":66685},"_2-start-from-blank","2. Start from blank",[1906,66688],{"alt":66689,"src":66690},"axiom.ai getting started making a bot","\u002Fblog\u002Faxiom-first-step.jpg",[26,66692,66693,66694,66697],{},"To build your bot from scratch, click on ",[192,66695,66696],{},"'Add first step’",". This will open the step selector and you can start adding steps to your bot.",[21,66699,66701],{"id":66700},"_3-add-your-first-step-read-data-from-a-google-sheet","3. Add your first step: ‘Read data from a Google Sheet’",[26,66703,66704],{},"Use the Step Finder to search for ‘Read data from a Google Sheet’ and click on it. The step will be added to Axiom for you to configure.",[1906,66706],{"alt":66707,"src":66708},"axiom.ai configuring read data from a Google Sheet step","\u002Fblog\u002Faxiom-read-from-gs.jpg",[26,66710,66711,66712,66715],{},"In the field called ",[192,66713,66714],{},"'Spreadsheet URL'",", you can search for the Google Sheet you created by name. Once found, click on it to select.",[26,66717,58601,66718,66721],{},[192,66719,66720],{},"'Sheet name'"," click on the drop-down and select the correct tab.",[26,66723,1934,66724,66727],{},[192,66725,66726],{},"'First cell'"," field, toggle the switch and enter 'A1’. This setting tells the bot where to start reading data.",[26,66729,1934,66730,66733],{},[192,66731,66732],{},"'Last cell'"," field, click the toggle switch and enter 'A10'. You have limited the bot to read ten rows. This is fine for now, you can increase the amount later once you’ve tested it.",[26,66735,66736,66737,148],{},"If you want to ",[659,66738,66740],{"href":66739},"\u002Fguides\u002Fgoogle-sheets","learn more about Google Sheet steps, watch these videos",[21,66742,66744],{"id":66743},"_4-add-the-loop-through-data-step","4. Add the ‘Loop through data’ step",[1906,66746],{"alt":66747,"src":66748},"axiom.ai find loop step in finder","\u002Fblog\u002Faxiom-step-finder-loop.jpg",[26,66750,66751,66752,66755],{},"Next, add a new step by entering ",[192,66753,66754],{},"‘Loop through data’"," into the Step Finder, and adding it. This step will allow your bot to loop through the rows of data stored in the Google Sheet. Make sure to add the steps you want to repeat inside the loop.",[1906,66757],{"alt":66758,"src":66759},"axiom.ai configure loop step","\u002Fblog\u002Faxiom-step-loop.jpg",[21,66761,66763],{"id":66762},"_5-add-the-go-to-url-step-inside-the-loop","5. Add the ‘Go to url’ step inside the loop",[26,66765,42762,66766,66769,66770,66773,66774,66777],{},[192,66767,66768],{},"'Go to page'"," step, in the ",[192,66771,66772],{},"'URL’"," field, select ",[192,66775,66776],{},"‘Insert data’"," and select the data from your Google Sheet, so that the bot knows which data to loop through.",[1906,66779],{"alt":66780,"src":66781},"axiom.ai pass data ionto a go to url step","\u002Fblog\u002Faxiom-data-go-to-page.jpg",[21,66783,66785],{"id":66784},"_6-add-the-get-data-from-bots-current-page-step","6. Add the ‘Get data from bot's current page’ step",[1906,66787],{"alt":66788,"src":66789},"axiom.ai configure the scraper","\u002Fblog\u002Faxiom-get-data-current-page.jpg",[26,66791,66792,66793,66796,66797,66800,66801,66803,66804,66807,66808,148],{},"Because we want to scrape many different webpages, we need to use a custom selector to scrape a common element found on every page. This common element will be ",[192,66794,66795],{},"‘body’",". Select it by clicking ",[192,66798,66799],{},"‘Select’"," and in column A, selecting ‘Custom selector’ and typing in the word ",[192,66802,66795],{},". Then click on ",[192,66805,66806],{},"‘Confirm selector’"," and then ",[192,66809,66810],{},"‘Complete’",[1906,66812],{"alt":66813,"src":66814},"axiom.ai adding a custom selector","\u002Fblog\u002Fcustom-selector-choice-body.jpg",[26,66816,46797,66817,66820],{},[192,66818,66819],{},"‘Max results’"," setting to ‘1’.",[21,66822,66824],{"id":66823},"_7-add-the-extract-data-with-chatgpt-step","7. Add the ‘Extract data with ChatGPT’ step",[26,66826,66827],{},"You will need to enter your API key for this step to work, so make sure you have it to hand.",[1906,66829],{"alt":66830,"src":66831},"axiom.ai adding the ChatGPT step","\u002Fblog\u002Faxiom-chatgpt-data-extract.jpg",[26,66833,66834],{},"Then, in the Data field, set it to ‘Scrape data’.",[26,66836,66837,66838,66841],{},"Next, in the ",[192,66839,66840],{},"‘Extract values’"," field, tell the AI what data you want to extract, by entering a comma-separated list of items, for example email, address, dates, URL etc. You may want to experiment a little here.",[21,66843,66845],{"id":66844},"_8-write-data-to-a-google-sheet","8. Write data to a Google Sheet",[26,66847,66848],{},"Now we’re going to write the data that ChatGPT AI extracted, to a Google Sheet.",[1906,66850],{"alt":66851,"src":66852},"axiom.ai write data to a google sheet step","\u002Fblog\u002Faxiom-write-data-gs.jpg",[26,66854,1927,66855,66858,66859,66861],{},[192,66856,66857],{},"'Add a new step'",". In the ",[192,66860,66714],{}," field, search for the sheet you created at the beginning of this tutorial.",[26,66863,1934,66864,66773,66866,148],{},[192,66865,66720],{},[192,66867,66868],{},"'Data'",[26,66870,66871,66872,66875],{},"In the 'Data' field, select '",[1332,66873,66874],{},"chat-gpt","'.",[26,66877,66878,66879,66882],{},"Finally, in the ‘Write options’ field, click the ",[192,66880,66881],{},"‘Add to existing Data’"," option.",[21,66884,66886],{"id":66885},"_9-within-the-loop-step-add-delete-rows-from-a-google-sheet-step","9. Within the loop step, add ‘Delete rows from a Google Sheet’ step",[1906,66888],{"alt":66889,"src":66890},"axiom.ai delete rows from google sheet step","\u002Fblog\u002Faxiom-delete-rows-gs.jpg",[26,66892,66893],{},"Add the step 'Delete rows from a Google Sheet' to delete the URL just scraped. This is to prevent the same row from being scraped repeatedly. Using the Step Finder, search for and select ‘Delete rows from a Google Sheet’.",[26,66895,66896],{},"In 'Spreadsheet URL' click to add the spreadsheet.",[26,66898,66899,66900,66903,66904,66907,66908,66911],{},"Then, in  ",[192,66901,66902],{},"‘First row to delete'"," enter the number 1 and repeat this in ",[192,66905,66906],{},"'Last row to delete'",", so that both are set to ",[192,66909,66910],{},"'1'",". We only want to delete one row per loop.",[26,66913,66914],{},"Set the ‘Sheet name’ to the original spreadsheet set up.",[21,66916,66918],{"id":66917},"_10-ready-to-test","10. Ready to test",[26,66920,66921,66922,148],{},"👩‍🔬 Now you’re ready to test with the desktop app, by clicking ",[192,66923,66924],{},"‘Run’",[26,66926,66927],{},"When you’re done testing and you want to increase the size of your loop, edit the ‘Last cell’ field mentioned in step 3, and run again.",[21,66929,66931],{"id":66930},"_11-running-the-bot","11. Running the bot",[26,66933,66934,66935,148],{},"🚀🚀🚀🚀🚀 You can run this bot in the cloud and the desktop app. If you want to learn more about scheduling, ",[659,66936,40775],{"href":37768},[107,66938,66940],{"id":66939},"design-pattern-for-your-bot","Design pattern for your bot",[26,66942,66943],{},"Your assembled ChatGPT bot should resemble this image.",[1906,66945],{"alt":66946,"src":66947},"axiom.ai design pattern for a ChatGPT web scraper","\u002Fblog\u002Faxiom-chat-gpt-scraper-d-pattern.jpg",[107,66949,66951],{"id":66950},"issues-you-may-encounter-with-your-chatgpt-web-scraper","Issues you may encounter with your ChatGPT web scraper",[1923,66953,66954,66964,66967],{},[189,66955,66956,66957,66959,66960,66963],{},"The bot only scrapes 10 rows, In the ",[192,66958,49675],{}," change the ",[192,66961,66962],{},"'last cell'"," value",[189,66965,66966],{},"ChatGPT returns no data, try adjusting your extract values",[189,66968,66969],{},"No data or incorrect data being written to Google Sheets. Check the ChatGPT data has been inserted into the 'Write data to a Google Sheet' step",[26,66971,66972,66973],{},"Don't forget we offer excellent customer support. If you need help, ",[659,66974,66975],{"href":1887},"get in touch.",[107,66977,66979],{"id":66978},"conclusion","Conclusion",[26,66981,66982],{},"Congratulations 🥳👨‍🎓🥳, you've learned how to make and use a ChatGPT AI bot to extract data. With this newly acquired skill, you know how to scrape data, loop through actions, and extract data to a Google Sheet. The sky's the limit with your new AI super powers. 🦸",[107,66984,66986],{"id":66985},"what-else-can-i-automate-with-chatgpt-and-axiom","What else can I automate with ChatGPT and Axiom?",[26,66988,66989,66990],{},"If you're excited, here are some ideas for other bots: extract data from your email app (such as Gmail), generate content, and send direct messages on Instagram. We have steps to extract data with AI and to generate text with AI. Take a look at our ",[659,66991,66992],{"href":338},"templates.",{"title":67,"searchDepth":68,"depth":68,"links":66994},[66995,66996,66997,66998,66999,67000,67001,67002,67015,67016,67017,67018],{"id":66589,"depth":670,"text":66590},{"id":66598,"depth":670,"text":66599},{"id":66605,"depth":670,"text":66606},{"id":66612,"depth":670,"text":66613},{"id":66619,"depth":670,"text":66620},{"id":66626,"depth":670,"text":66627},{"id":66638,"depth":670,"text":66639},{"id":66653,"depth":670,"text":66654,"children":67003},[67004,67005,67006,67007,67008,67009,67010,67011,67012,67013,67014],{"id":66663,"depth":68,"text":66664},{"id":66685,"depth":68,"text":66686},{"id":66700,"depth":68,"text":66701},{"id":66743,"depth":68,"text":66744},{"id":66762,"depth":68,"text":66763},{"id":66784,"depth":68,"text":66785},{"id":66823,"depth":68,"text":66824},{"id":66844,"depth":68,"text":66845},{"id":66885,"depth":68,"text":66886},{"id":66917,"depth":68,"text":66918},{"id":66930,"depth":68,"text":66931},{"id":66939,"depth":670,"text":66940},{"id":66950,"depth":670,"text":66951},{"id":66978,"depth":670,"text":66979},{"id":66985,"depth":670,"text":66986},"2023-10-24","Learn how to create a bot that utilizes AI to scrape websites.",false,{"read":67023,"type":852,"tool":67024,"category":67026,"tags":67027,"location":67031,"featuredimg":67032,"landingimg":67033,"video":67034,"summary":67020},"13 min read",[67025],"No-code tool",[32616],[1861,67028,38043,67029,67030],"chatGPT","structured data","unstructured data","London","\u002Fblog\u002Fchatcpt-scraper-hero.jpg","\u002Fblog\u002Fchatcpt-scraper.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F8Llq6EYiSuo?rel=0",{"title":66574,"description":67020},"blog\u002Fchatgpt-web-scraping","y8p426fL2QwXRVsiyat7fPFWSARTndnHwdz5M9PRkao",{"id":67039,"title":67040,"bio":67041,"body":67042,"date":71,"description":148,"extension":73,"image":67048,"linkedin":67049,"meta":67050,"name":66575,"navigation":75,"order":71,"path":67051,"seo":67052,"stem":67053,"__hash__":67054},"authors\u002Fauthors\u002Falex-barlow.md","Co Founder","Alex spent 14 years automating repetitive tasks, before co-founding axiom.ai. He’s hands-on with users and enjoys learning from them. He creates intricate automation the no-code way, and empowered by generative AI, he's extending his skill set to include code. Outside of work, he loves exploring the Scottish Highlands with his daughter and making sandcastles on Firemore Beach.",{"type":8,"value":67043,"toc":67046},[67044],[26,67045,148],{},{"title":67,"searchDepth":68,"depth":68,"links":67047},[],"\u002Fauthors\u002Falex-barlow.jpeg","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falex-barlow-9b489330\u002F",{},"\u002Fauthors\u002Falex-barlow",{"title":67040,"description":148},"authors\u002Falex-barlow","mthwrlpXbshOSgAygqgpyg38ZdiM_P6DKRLDBGrqcOo",[],{"parent":67057,"items":67058},"\u002Fblog",[],{"id":66573,"title":66574,"author":66575,"body":67060,"date":67019,"description":67020,"draft":67021,"extension":73,"meta":67332,"navigation":75,"path":43354,"seo":67336,"stem":67036,"__hash__":67037},{"type":8,"value":67061,"toc":67306},[67062,67064,67068,67070,67072,67074,67076,67078,67080,67082,67084,67086,67088,67090,67092,67097,67099,67104,67106,67108,67112,67114,67124,67126,67128,67132,67134,67136,67138,67142,67146,67150,67154,67158,67160,67162,67166,67168,67170,67178,67180,67182,67184,67196,67198,67202,67204,67206,67208,67210,67214,67216,67218,67220,67226,67232,67236,67240,67242,67244,67246,67248,67256,67258,67260,67264,67266,67268,67272,67274,67276,67278,67280,67292,67296,67298,67300,67302],[26,67063,66580],{},[26,67065,66583,67066],{},[659,67067,66586],{"href":43350},[107,67069,66590],{"id":66589},[32947,67071],{},[26,67073,66595],{},[107,67075,66599],{"id":66598},[26,67077,66602],{},[107,67079,66606],{"id":66605},[26,67081,66609],{},[107,67083,66613],{"id":66612},[26,67085,66616],{},[107,67087,66620],{"id":66619},[26,67089,66623],{},[107,67091,66627],{"id":66626},[26,67093,66630,67094],{},[659,67095,66635],{"href":66633,"rel":67096},[1218],[107,67098,66639],{"id":66638},[26,67100,66642,67101],{},[659,67102,66647],{"href":66645,"rel":67103},[1218],[26,67105,66650],{},[107,67107,66654],{"id":66653},[26,67109,66657,67110,66660],{},[659,67111,183],{"href":43350},[21,67113,66664],{"id":66663},[26,67115,66667,67116,66671,67118,66675,67120,66679,67122,148],{},[192,67117,66670],{},[192,67119,66674],{},[192,67121,66678],{},[192,67123,66682],{},[21,67125,66686],{"id":66685},[1906,67127],{"alt":66689,"src":66690},[26,67129,66693,67130,66697],{},[192,67131,66696],{},[21,67133,66701],{"id":66700},[26,67135,66704],{},[1906,67137],{"alt":66707,"src":66708},[26,67139,66711,67140,66715],{},[192,67141,66714],{},[26,67143,58601,67144,66721],{},[192,67145,66720],{},[26,67147,1934,67148,66727],{},[192,67149,66726],{},[26,67151,1934,67152,66733],{},[192,67153,66732],{},[26,67155,66736,67156,148],{},[659,67157,66740],{"href":66739},[21,67159,66744],{"id":66743},[1906,67161],{"alt":66747,"src":66748},[26,67163,66751,67164,66755],{},[192,67165,66754],{},[1906,67167],{"alt":66758,"src":66759},[21,67169,66763],{"id":66762},[26,67171,42762,67172,66769,67174,66773,67176,66777],{},[192,67173,66768],{},[192,67175,66772],{},[192,67177,66776],{},[1906,67179],{"alt":66780,"src":66781},[21,67181,66785],{"id":66784},[1906,67183],{"alt":66788,"src":66789},[26,67185,66792,67186,66796,67188,66800,67190,66803,67192,66807,67194,148],{},[192,67187,66795],{},[192,67189,66799],{},[192,67191,66795],{},[192,67193,66806],{},[192,67195,66810],{},[1906,67197],{"alt":66813,"src":66814},[26,67199,46797,67200,66820],{},[192,67201,66819],{},[21,67203,66824],{"id":66823},[26,67205,66827],{},[1906,67207],{"alt":66830,"src":66831},[26,67209,66834],{},[26,67211,66837,67212,66841],{},[192,67213,66840],{},[21,67215,66845],{"id":66844},[26,67217,66848],{},[1906,67219],{"alt":66851,"src":66852},[26,67221,1927,67222,66858,67224,66861],{},[192,67223,66857],{},[192,67225,66714],{},[26,67227,1934,67228,66773,67230,148],{},[192,67229,66720],{},[192,67231,66868],{},[26,67233,66871,67234,66875],{},[1332,67235,66874],{},[26,67237,66878,67238,66882],{},[192,67239,66881],{},[21,67241,66886],{"id":66885},[1906,67243],{"alt":66889,"src":66890},[26,67245,66893],{},[26,67247,66896],{},[26,67249,66899,67250,66903,67252,66907,67254,66911],{},[192,67251,66902],{},[192,67253,66906],{},[192,67255,66910],{},[26,67257,66914],{},[21,67259,66918],{"id":66917},[26,67261,66921,67262,148],{},[192,67263,66924],{},[26,67265,66927],{},[21,67267,66931],{"id":66930},[26,67269,66934,67270,148],{},[659,67271,40775],{"href":37768},[107,67273,66940],{"id":66939},[26,67275,66943],{},[1906,67277],{"alt":66946,"src":66947},[107,67279,66951],{"id":66950},[1923,67281,67282,67288,67290],{},[189,67283,66956,67284,66959,67286,66963],{},[192,67285,49675],{},[192,67287,66962],{},[189,67289,66966],{},[189,67291,66969],{},[26,67293,66972,67294],{},[659,67295,66975],{"href":1887},[107,67297,66979],{"id":66978},[26,67299,66982],{},[107,67301,66986],{"id":66985},[26,67303,66989,67304],{},[659,67305,66992],{"href":338},{"title":67,"searchDepth":68,"depth":68,"links":67307},[67308,67309,67310,67311,67312,67313,67314,67315,67328,67329,67330,67331],{"id":66589,"depth":670,"text":66590},{"id":66598,"depth":670,"text":66599},{"id":66605,"depth":670,"text":66606},{"id":66612,"depth":670,"text":66613},{"id":66619,"depth":670,"text":66620},{"id":66626,"depth":670,"text":66627},{"id":66638,"depth":670,"text":66639},{"id":66653,"depth":670,"text":66654,"children":67316},[67317,67318,67319,67320,67321,67322,67323,67324,67325,67326,67327],{"id":66663,"depth":68,"text":66664},{"id":66685,"depth":68,"text":66686},{"id":66700,"depth":68,"text":66701},{"id":66743,"depth":68,"text":66744},{"id":66762,"depth":68,"text":66763},{"id":66784,"depth":68,"text":66785},{"id":66823,"depth":68,"text":66824},{"id":66844,"depth":68,"text":66845},{"id":66885,"depth":68,"text":66886},{"id":66917,"depth":68,"text":66918},{"id":66930,"depth":68,"text":66931},{"id":66939,"depth":670,"text":66940},{"id":66950,"depth":670,"text":66951},{"id":66978,"depth":670,"text":66979},{"id":66985,"depth":670,"text":66986},{"read":67023,"type":852,"tool":67333,"category":67334,"tags":67335,"location":67031,"featuredimg":67032,"landingimg":67033,"video":67034,"summary":67020},[67025],[32616],[1861,67028,38043,67029,67030],{"title":66574,"description":67020},1781541558932]