[{"data":1,"prerenderedAt":80046},["ShallowReactive",2],{"search-dialog-corpus":3,"search-dialog-default-links":25152,"pinned-blogs":26220,"content-doc-\u002Fblog-fetch":26221,"blog-filters":26255,"blog-posts":46201,"pinned-card-author-\u002Fblog\u002F5-problems-webscrapers":80029},[4,528,838,1063,1324,1539,1762,2232,3365,4028,4919,5133,5831,6146,6570,7033,7316,7534,7661,7881,8115,8322,8749,8950,9276,9811,10107,10223,10505,10674,10809,11181,11539,11830,12126,12695,12765,12887,13154,13419,13668,13872,14370,14517,14691,14780,15077,15374,15958,16273,16559,16578,18292,18485,18772,19089,19384,19696,19971,20238,20343,20549,20826,21220,22507,22884,23116,23377,23569,23586,23869,24387,24404,24687,24871],{"id":5,"title":6,"body":7,"date":504,"description":505,"extension":506,"meta":507,"navigation":522,"order":523,"path":524,"seo":525,"stem":526,"__hash__":527},"guides\u002Fguides\u002Fai-proofreading.md","Build an AI Proofreading Assistant for any Website",{"type":8,"value":9,"toc":493},"minimark",[10,13,17,20,25,45,49,60,66,69,73,76,307,311,314,318,327,331,334,481],[11,12],"hr",{},[14,15,16],"p",{},"This template is designed to create an AI assistant that proofreads your website. The assistant retrieves website links from a Google Sheet, opens the link in a Chrome browser, and scrapes the data. Afterwards, it checks for any typos and writes the response back into the Google Sheet alongside the webpage URL. This template requires a ChatGPT account with API key.",[18,19],"hero-media",{},[21,22,24],"h2",{"id":23},"get-started-create-your-google-sheet","Get started: create your Google Sheet",[14,26,27,28,32,33,36,37,40,41,44],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering the shortcut ",[29,30,31],"strong",{},"\"sheet.new\""," into the address bar, assuming you already have an account. Name your sheet something like ",[29,34,35],{},"\"ChatGPT AI Proofreader\""," and set up a tab called ",[29,38,39],{},"\"Links\"",". Add another tab called ",[29,42,43],{},"\"Data\"",".",[21,46,48],{"id":47},"install-the-ai-proofreading-template","Install the AI Proofreading template",[14,50,51,52,55,56,59],{},"To install this AI Proofreading template, click ",[29,53,54],{},"\"Install template\"",". If you’re a new user, you’ll have to click ",[29,57,58],{},"\"Install Chrome extension\""," and create a free axiom.ai account before you can edit the template.",[14,61,62,63,44],{},"Once installed, click ",[29,64,65],{},"\"Start\"",[14,67,68],{},"axiom.ai will guide you through the steps you need to configure in the app.",[21,70,72],{"id":71},"configure-your-ai-proofreading-assistant-in-7-easy-steps","Configure your AI Proofreading Assistant in 7 easy steps",[14,74,75],{},"Please note in step 2.2, you need to select a single block of content with the selector tool.",[77,78,79],"guide",{},[80,81,82,107],"ul",{},[83,84,85,88,89,93],"li",{},[29,86,87],{},"1.0"," ",[90,91,92],"code",{},"Read data from a Google Sheet",[80,94,95,101],{},[83,96,97,100],{},[90,98,99],{},"Spreadsheet",": Search for the Google Sheet you created. Once found, click to select.",[83,102,103,106],{},[90,104,105],{},"Sheet name",": Choose the sheet tab called 'Amazon product links'.",[83,108,109,88,112,115],{},[29,110,111],{},"2.0",[90,113,114],{},"Loop through data",[80,116,117,141,166,209,237,274],{},[83,118,119,88,122,125],{},[29,120,121],{},"2.1",[90,123,124],{},"Go to page",[80,126,127],{},[83,128,129,132,133,136,137,140],{},[90,130,131],{},"Enter URL",": Click ",[90,134,135],{},"Insert Data",", select ",[90,138,139],{},"google-sheet-data",", and select the column with the links in.",[83,142,143,88,146,149],{},[29,144,145],{},"2.2",[90,147,148],{},"Get data from bot's current page",[80,150,151,157],{},[83,152,153,156],{},[90,154,155],{},"Select",": Point and click to select the data you wish to scrape. Make a single selection and choose an element that wraps around all the content.",[83,158,159,162,163,44],{},[90,160,161],{},"Max Results",": Set to ",[90,164,165],{},"1",[83,167,168,88,171,174],{},[29,169,170],{},"2.3",[90,172,173],{},"Generate text with ChatGPT",[80,175,176,182,200],{},[83,177,178,181],{},[90,179,180],{},"ChatGPT API key",": Enter your API key.",[83,183,184,187,188,191,192,195,196,199],{},[90,185,186],{},"Prompt",": Insert the text ",[90,189,190],{},"\"Check this text for spelling mistakes and grammar, return in bullet list compatible with spreadsheet cell -\""," then click ",[90,193,194],{},"Insert data"," followed by ",[90,197,198],{},"[scrape-data]"," to add the scraped data to check.",[83,201,202,205,206,44],{},[90,203,204],{},"Extract values",": Insert the values you want to extract, separated by a comma — for example: ",[90,207,208],{},"name, email, job title",[83,210,211,88,214,217],{},[29,212,213],{},"2.4",[90,215,216],{},"Append or Merge Data",[80,218,219,229],{},[83,220,221,224,225,228],{},[90,222,223],{},"Data A",": Insert ",[90,226,227],{},"[google-sheet-data]"," and select the column containing the URL.",[83,230,231,224,234,44],{},[90,232,233],{},"Data B",[90,235,236],{},"[chatgpt-output]",[83,238,239,88,242,245],{},[29,240,241],{},"2.5",[90,243,244],{},"Write Data to a Google Sheet",[80,246,247,251,256,265],{},[83,248,249,100],{},[90,250,99],{},[83,252,253,255],{},[90,254,105],{},": Choose the tab you created.",[83,257,258,261,262,44],{},[90,259,260],{},"DATA",": Select ",[90,263,264],{},"[appended-data]",[83,266,267,270,271,44],{},[90,268,269],{},"Clear data before writing | Add to existing data",": Set this option to ",[90,272,273],{},"\"Add to existing\"",[83,275,276,88,279,282],{},[29,277,278],{},"2.6",[90,280,281],{},"Delete rows from a Google Sheet",[80,283,284,288,293,300],{},[83,285,286,100],{},[90,287,99],{},[83,289,290,292],{},[90,291,105],{},": Choose the tab you created for links.",[83,294,295,162,298,44],{},[90,296,297],{},"First row",[90,299,165],{},[83,301,302,162,305,44],{},[90,303,304],{},"Last row",[90,306,165],{},[21,308,310],{"id":309},"testing-and-running-your-ai-proofreader","Testing and running your AI proofreader",[14,312,313],{},"We suggest running a test first, stopping the bot after a few loops, and reviewing the data.",[21,315,317],{"id":316},"customize-your-template","Customize your template",[14,319,320,321,326],{},"Like all Axiom ",[322,323,325],"a",{"href":324},"\u002Fguides","templates",", you can use our no-code bot builder to customize any bot according to your requirements.",[21,328,330],{"id":329},"troubleshooting","Troubleshooting",[14,332,333],{},"We recommend you watch the video to troubleshoot.",[77,335,336],{},[80,337,338,359,370,386,404,415,434,455,469],{},[83,339,340,343,346,347,350,351,354,355,358],{},[29,341,342],{},"Want to set an amount of loops?",[344,345],"br",{},"\nIn ",[90,348,349],{},"Step 1.0",", set a ",[90,352,353],{},"Last Cell"," — something like ",[90,356,357],{},"AE50"," will scrape 50 rows.",[83,360,361,364,346,366,369],{},[29,362,363],{},"Selectors fail to find content?",[344,365],{},[90,367,368],{},"Step 2.2 – Get data from bot's current page",", select a single block of content with the selector tool.",[83,371,372,375,377,378,382,383,44],{},[29,373,374],{},"Want to select all content on any website?",[344,376],{},"\nIn the same step, use a ",[322,379,381],{"href":380},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fcustom-css-selectors","custom selector"," — try ",[90,384,385],{},"body",[83,387,388,391,393,394,397,398,401,402,44],{},[29,389,390],{},"Slow running scrape?",[344,392],{},"\nIn the same step, toggle ",[90,395,396],{},"Configure scraper",", then set ",[90,399,400],{},"No. of retry..."," to ",[90,403,165],{},[83,405,406,409,346,411,414],{},[29,407,408],{},"ChatGPT step not working?",[344,410],{},[90,412,413],{},"Step 2.3 – Generate text with ChatGPT",", make sure you’ve entered your ChatGPT API key.",[83,416,417,420,422,423,425,426,428,431,433],{},[29,418,419],{},"Want better results from ChatGPT?",[344,421],{},"\nIn the same step, set the ",[90,424,186],{}," to something like:",[344,427],{},[90,429,430],{},"\"Check this text for spelling mistakes and grammar, return in bullet list compatible with spreadsheet cell - [scrape-data]\".",[344,432],{},"\nTweak the wording to fine-tune results.",[83,435,436,439,346,441,444,445,447,448,450,451,447,453,44],{},[29,437,438],{},"Wrong data written to sheet?",[344,440],{},[90,442,443],{},"Step 2.5 – Write Data to a Google Sheet",", check that ",[90,446,223],{}," is ",[90,449,227],{}," and ",[90,452,233],{},[90,454,236],{},[83,456,457,460,462,463,466,467,44],{},[29,458,459],{},"No data written?",[344,461],{},"\nIn the same step, check that ",[90,464,465],{},"Data"," is set to ",[90,468,264],{},[83,470,471,474,476,477,480],{},[29,472,473],{},"Keeps overwriting data?",[344,475],{},"\nMake sure ",[90,478,479],{},"Add to existing"," is selected in the same step.",[14,482,483,484,488,489],{},"We offer excellent customer support. If you need help, ",[322,485,487],{"href":486},"\u002Fcustomer-support","get in touch."," You could also read this full guide on how to do ",[322,490,492],{"href":491},"\u002Fblog\u002Fchatgpt-web-scraping","ChatGPT web scraping.",{"title":494,"searchDepth":495,"depth":495,"links":496},"",3,[497,499,500,501,502,503],{"id":23,"depth":498,"text":24},2,{"id":47,"depth":498,"text":48},{"id":71,"depth":498,"text":72},{"id":309,"depth":498,"text":310},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"2023-04-04","Learn how to test, run, and customize your AI proofreader using a no-code bot. Includes troubleshooting tips, ChatGPT setup, and data export to Google Sheets.","md",{"logoFile":508,"read":509,"level":510,"video":511,"templateId":512,"type":513,"format":514,"intent_type":515,"intent":516,"tags":517,"platfrom":520},"\u002Ftemplates\u002Fchat-gpt-logo.png","5 minutes","Easy","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FWhq1hgwYxcY",56,"no-code","template","pattern","Generate or transform content using AI",[518,519],"ai","scraping",[521],"ChatGPT",true,null,"\u002Fguides\u002Fai-proofreading",{"title":6,"description":505},"guides\u002Fai-proofreading","4pDvas5NqHibFUtuqv8Ow70UgUxrUGHugw1LHQ1ei1Y",{"id":529,"title":530,"body":531,"date":523,"description":825,"extension":506,"meta":826,"navigation":522,"order":523,"path":834,"seo":835,"stem":836,"__hash__":837},"guides\u002Fguides\u002Fapple-shortcuts.md","How to use Apple Shortcuts to trigger an axiom.ai automation",{"type":8,"value":532,"toc":814},[533,535,538,541,543,547,549,552,582,586,588,591,596,634,638,643,645,648,676,680,682,685,706,709,713,715,718,742,746,748,751,754,773,777,779,786,793,797,799,802,804,810],[11,534],{},[14,536,537],{},"Users often inspire the best ideas, and we love to explore them. When someone asked if they could trigger a bot on their Mac using Apple Shortcuts, we thought, \"why not?\" We found not only can you do this, but you can also add a button to the macOS Dock for quick access. If you're a coder, you can even trigger a bot from the command line. Plus, you can trigger the bot from your iPhone, iPad, Mac or Apple Watch, making automation even more flexible.",[14,539,540],{},"This guide assumes you already have an automation set up, want to create a trigger using Apple Shortcuts, and have a an axiom.ai subscription that supports webhooks.",[18,542],{},[21,544,546],{"id":545},"getting-started","Getting started",[11,548],{},[14,550,551],{},"To get started, you will need the following from the axiom.ai Chrome extension:",[77,553,554],{},[555,556,557,567,573],"ol",{},[83,558,559,562,563,44],{},[29,560,561],{},"API key",": The API key is found on the ",[322,564,566],{"href":565},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fkeys","dashboard",[83,568,569,572],{},[29,570,571],{},"Automation name",": Get the name of the automation you wish to trigger.",[83,574,575,578,579,44],{},[29,576,577],{},"Endpoint",": The current endpoint is ",[90,580,581],{},"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger",[21,583,585],{"id":584},"trigger-an-axiomai-automation-with-apple-shortcuts","Trigger an axiom.ai automation with Apple Shortcuts",[11,587],{},[14,589,590],{},"Open the Apple Shortcuts application on your iPhone, iPad, or Mac.",[592,593],"img",{"src":594,"alt":595},"\u002Fdocs\u002Fguides\u002Fapple-shortcuts-get-contents.jpg","open apple Shortcuts in apple mac app folder",[77,597,598],{},[555,599,600,606,616,628],{},[83,601,602,605],{},[29,603,604],{},"Create shortcut",": Tap the \"+\" icon to create a new Shortcut.",[83,607,608,611,612,615],{},[29,609,610],{},"Add step",": Add a ",[29,613,614],{},"get contents from URL"," action, set the URL to the axiom.ai endpoint from above.",[83,617,618,621,622,401,625,44],{},[29,619,620],{},"Configure",": Change the ",[29,623,624],{},"method",[29,626,627],{},"POST",[83,629,630,633],{},[29,631,632],{},"Request body",": Add two key\u002Fvalue pairs. The first item will have a key called \"key\" and a value of your API key, the second will be called \"name\" and will be the automation name.",[592,635],{"src":636,"alt":637},"\u002Fdocs\u002Fguides\u002Fapple-shortcuts-get-contents-config-2.jpg","using Google App Script API request to trigger axiom.ai bot run",[639,640,642],"h3",{"id":641},"set-up-the-apple-shortcut-to-open-the-browser","Set up the Apple Shortcut to open the browser",[11,644],{},[14,646,647],{},"Optionally, you can set your automation to automatically open the URL from the cloud run on your device. Add the following actions to your Apple Shortcut.",[77,649,650],{},[555,651,652,664,670],{},[83,653,654,611,657,660,661,663],{},[29,655,656],{},"Get dictionary value",[29,658,659],{},"get dictionary value"," action below the ",[29,662,614],{}," action. This action converts the JSON response into a dictionary so you can work with its contents.",[83,665,666,669],{},[29,667,668],{},"Get value for key",": In the \"key\" field, type \"OPEN LINK IN BROWSER\" (case sensitive).",[83,671,672,675],{},[29,673,674],{},"Open URLs",": Set the value to \"dictionary value\".",[639,677,679],{"id":678},"trigger-a-bot-run-from-your-mac-dock","Trigger a bot run from your Mac dock",[11,681],{},[14,683,684],{},"Your Apple Shortcut can be added to your macOS dock, allowing you easy access to your triggers with a single click.",[77,686,687],{},[555,688,689,696,699],{},[83,690,691,692,695],{},"Open the ",[29,693,694],{},"\"Shortcuts app\""," on your Mac.",[83,697,698],{},"Right-click (or Control-click) on the shortcut you want to add to the Dock.",[83,700,701,702,705],{},"Select ",[29,703,704],{},"\"Add to Dock\""," from the context menu.",[592,707],{"src":708,"alt":637},"\u002Fdocs\u002Fguides\u002Fmac-dock.jpg",[639,710,712],{"id":711},"trigger-a-bot-run-from-the-command-line","Trigger a bot run from the command line",[11,714],{},[14,716,717],{},"Apple developers have made it possible to trigger Apple Shortcuts from the command line. Open the Terminal and type the following command:",[719,720,724],"pre",{"className":721,"code":722,"language":723,"meta":494,"style":494},"language-bash shiki shiki-themes github-light-default github-dark-default","shortcuts run \"My bot's name\"\n","bash",[90,725,726],{"__ignoreMap":494},[727,728,731,735,739],"span",{"class":729,"line":730},"line",1,[727,732,734],{"class":733},"sTDnQ","shortcuts",[727,736,738],{"class":737},"sSVrQ"," run",[727,740,741],{"class":737}," \"My bot's name\"\n",[639,743,745],{"id":744},"trigger-bot-runs-with-siri","Trigger bot runs with Siri",[11,747],{},[14,749,750],{},"You can trigger your Shortcuts using Siri, which means you can run your bot tasks in the axiom.ai cloud using voice commands.",[14,752,753],{},"The following prompt will allow you to run your Shortcut, which will trigger your axiom.ai automation:",[719,755,759],{"className":756,"code":757,"language":758,"meta":494,"style":494},"language-js shiki shiki-themes github-light-default github-dark-default","\"Hi Siri, run shortcut\" then \"Name of shortcut\"\n","js",[90,760,761],{"__ignoreMap":494},[727,762,763,766,770],{"class":729,"line":730},[727,764,765],{"class":737},"\"Hi Siri, run shortcut\"",[727,767,769],{"class":768},"s4rv2"," then ",[727,771,772],{"class":737},"\"Name of shortcut\"\n",[21,774,776],{"id":775},"testing-your-workflow","Testing your workflow",[11,778],{},[14,780,781,782,785],{},"Test the shortcut by tapping ",[29,783,784],{},"run",". Apple Shortcuts will display any error messages and you should follow these for more information.",[14,787,788,789,44],{},"If your automation is triggered successfully but the automation has run into an error, you will find these in your ",[322,790,792],{"href":791},"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Fhow-to-debug#run-reports","run reports",[21,794,796],{"id":795},"wrapping-up","Wrapping up",[11,798],{},[14,800,801],{},"Apple Shortcuts allows for you to create powerful shortcuts that can be powered up with axiom.ai. From triggering your automations based on your device configuration, to being able to trigger your automations from your Apple Watch, Apple Shortcuts has you covered. We'd love to hear what you use Apple Shortcuts for with your automations!",[11,803],{},[14,805,806],{},[807,808,809],"em",{},"Information valid as of 29th October 2024, tested on iOS18, iPadOS18, macOS15.",[811,812,813],"style",{},"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}",{"title":494,"searchDepth":495,"depth":495,"links":815},[816,817,823,824],{"id":545,"depth":498,"text":546},{"id":584,"depth":498,"text":585,"children":818},[819,820,821,822],{"id":641,"depth":495,"text":642},{"id":678,"depth":495,"text":679},{"id":711,"depth":495,"text":712},{"id":744,"depth":495,"text":745},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"Learn how to set up an Apple shortcut that can trigger a bot from your dock or command line for faster automation. This guide covers creating a shortcut, configuring it to work with desktop apps, and using the command line to run the bot, streamlining your workflow with ease.",{"type":513,"format":77,"intent_type":515,"intent":827,"tags":828,"platfrom":831,"video":833},"Move data between apps",[829,830],"api","trigger",[832],"Mac","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FwE3PZCeivAI?rel=0&amp;","\u002Fguides\u002Fapple-shortcuts",{"title":530,"description":825},"guides\u002Fapple-shortcuts","jucW4uOTjSAvYiU8YOf-98E6nDmLA_9J5sMRpkz-0KA",{"id":839,"title":840,"body":841,"date":1043,"description":1044,"extension":506,"meta":1045,"navigation":522,"order":523,"path":1059,"seo":1060,"stem":1061,"__hash__":1062},"guides\u002Fguides\u002Fautomate-facebook-messages.md","How to automate messages on Facebook",{"type":8,"value":842,"toc":1035},[843,845,848,850,854,861,865,874,877,879,883,984,988,995,997,1005,1007,1012,1031],[11,844],{},[14,846,847],{},"The Facebook Messenger bot sends direct messages (DMs) in Chrome, sourced from a Google Sheet. It cycles through profile links in the sheet, opens them in Chrome, clicks on the message button, types a message, and presses return to send. After sending a message, the bot deletes the row and proceeds to the next profile.",[18,849],{},[21,851,853],{"id":852},"get-started-set-up-your-google-sheet","Get started: Set up your Google Sheet",[14,855,856,857,860],{},"Create a new Google Sheet. You can do this in your Chrome browser by typing 'sheet.new' into the address bar, assuming you have a Google account. Name your sheet something like ",[29,858,859],{},"\"Facebook Messenger bot\"",".. Set up a tab with profile links to message.",[21,862,864],{"id":863},"install-the-facebook-messenger-bot","Install the Facebook Messenger bot",[14,866,867,868,870,871,873],{},"To install this Facebook Messenger bot, click ",[29,869,54],{},".. If you’re a new user, you’ll have to click ",[29,872,58],{},"., then create a free axiom.ai account to edit the template.",[14,875,876],{},"Once installed, click 'Start'.",[14,878,68],{},[21,880,882],{"id":881},"configure-your-facebook-messenger-bot-in-four-easy-steps","Configure your Facebook Messenger bot in four easy steps",[77,884,885,981],{},[80,886,887,904],{},[83,888,889,88,891,893],{},[29,890,349],{},[90,892,92],{},[80,894,895,899],{},[83,896,897,100],{},[90,898,99],{},[83,900,901,903],{},[90,902,105],{},": Choose the tab with the Facebook profile links.",[83,905,906,88,909,911],{},[29,907,908],{},"Step 2.0",[90,910,114],{},[80,912,913,931,939,955,963],{},[83,914,915,88,918,921],{},[29,916,917],{},"Step 2.1",[90,919,920],{},"Go to page: Profile page",[80,922,923],{},[83,924,925,927,928,930],{},[90,926,131],{},": Click 'Insert data', choose ",[90,929,139],{},", and select the column with Facebook profile links.",[83,932,933,88,936],{},[29,934,935],{},"Step 2.2",[90,937,938],{},"Click Element: Message^",[83,940,941,88,944,947],{},[29,942,943],{},"Step 2.3",[90,945,946],{},"Enter Text: Message",[80,948,949],{},[83,950,951,954],{},[90,952,953],{},"Text",": Input the message to be sent.",[83,956,957,88,960],{},[29,958,959],{},"Step 2.4",[90,961,962],{},"Press Key(s): Send message^",[83,964,965,88,968,970],{},[29,966,967],{},"Step 2.5",[90,969,281],{},[80,971,972,976],{},[83,973,974,100],{},[90,975,99],{},[83,977,978,980],{},[90,979,105],{},": Choose the tab with Facebook links.",[14,982,983],{},"^ Preconfigured",[21,985,987],{"id":986},"run-your-facebook-messenger-bot","Run your Facebook Messenger bot",[14,989,990,991,44],{},"To test this Facebook Messenger bot, disable step 2.2 to prevent messages being sent.\nIf you wish to schedule the bot ",[322,992,994],{"href":993},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogin","add steps to login",[21,996,317],{"id":316},[14,998,320,999,1001,1002,44],{},[322,1000,325],{"href":324},", you can use our no-code bot builder to customize any bot according to your requirements. For example Step 2.3 you could personalise the message by passing in a name from the Google Sheet, simply click ",[29,1003,1004],{},"\"Insert data\"",[21,1006,330],{"id":329},[14,1008,1009,1010,44],{},"We recommend you watch the video to troubleshoot. If you wish to schedule the bot you will need to share the Cookie in settings or ",[322,1011,994],{"href":993},[77,1013,1014],{},[80,1015,1016,1025],{},[83,1017,1018,1021,1022,1024],{},[29,1019,1020],{},"Message button not clicked?"," Click ",[90,1023,155],{}," and reselect the button.",[83,1026,1027,1030],{},[29,1028,1029],{},"Message not being sent?"," Try re-recording the Return key action.",[14,1032,483,1033],{},[322,1034,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":1036},[1037,1038,1039,1040,1041,1042],{"id":852,"depth":498,"text":853},{"id":863,"depth":498,"text":864},{"id":881,"depth":498,"text":882},{"id":986,"depth":498,"text":987},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"2022-04-07","This guide shows how to automate sending Facebook Messenger messages using a Google Sheet and axiom.ai’s no-code bot.",{"pinned":522,"read":1046,"level":510,"video":1047,"templateId":1048,"type":513,"format":514,"intent_type":1049,"intent":1050,"tags":1051,"platfrom":1057},"3 minutes","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FIIQyYGVcjUY",55,"usecase","Interact with pages",[1052,1053,1054,1055,1056],"social-media","dm","messaging","data entry","google sheets",[1058],"Facebook","\u002Fguides\u002Fautomate-facebook-messages",{"title":840,"description":1044},"guides\u002Fautomate-facebook-messages","PJEF8Dvc_FkQ8r4wZTPTx18uh9Gv20EB_r1u8pl85a0",{"id":1064,"title":1065,"body":1066,"date":1043,"description":1312,"extension":506,"meta":1313,"navigation":522,"order":523,"path":1320,"seo":1321,"stem":1322,"__hash__":1323},"guides\u002Fguides\u002Fautomate-facebook-posts.md","How to automate posting to Facebook with a bot",{"type":8,"value":1067,"toc":1304},[1068,1070,1077,1079,1081,1089,1093,1099,1103,1105,1109,1216,1220,1231,1233,1237,1239,1243,1295],[11,1069],{},[14,1071,1072,1073,1076],{},"This Facebook automation template uses a bot to post content from a Google Sheet to Facebook without requiring an API. The bot retrieves data from the Sheet, opens Facebook in Chrome, clicks on ",[29,1074,1075],{},"\"What's on your mind?\""," then inputs the data into the Facebook post web form, emulating your actions. After clicking post the bot removes the processed row from the Sheet.",[18,1078],{},[21,1080,853],{"id":852},[14,1082,27,1083,1085,1086,44],{},[29,1084,31],{},", assuming you already have an account. Name your sheet something like ",[29,1087,1088],{},"\"Facebook posts\"",[21,1090,1092],{"id":1091},"install-the-facebook-post-bot","Install the Facebook post bot",[14,1094,1095,1096,1098],{},"To install this FB bot, click ",[29,1097,54],{},". If you’re a new user, you’ll have to click 'Install Chrome extension' and create a free axiom.ai account before you can edit the template.",[14,1100,62,1101,44],{},[29,1102,65],{},[14,1104,68],{},[21,1106,1108],{"id":1107},"configure-your-facebook-post-bot-in-four-easy-steps","Configure your Facebook post bot in four easy steps",[77,1110,1111],{},[80,1112,1113,1131],{},[83,1114,1115,88,1117,1119],{},[29,1116,87],{},[90,1118,92],{},[80,1120,1121,1126],{},[83,1122,1123,1125],{},[90,1124,99],{},": Search for the Google Sheet you created. Once found, click to select",[83,1127,1128,1130],{},[90,1129,105],{},": Choose the tab with the posts in it",[83,1132,1133,88,1135,1137],{},[29,1134,111],{},[90,1136,114],{},[80,1138,1139,1146,1153,1169,1176,1192,1199],{},[83,1140,1141,88,1143],{},[29,1142,121],{},[90,1144,1145],{},"Go to page: facebook.com^",[83,1147,1148,88,1150],{},[29,1149,145],{},[90,1151,1152],{},"Click element: What's on your mind?^",[83,1154,1155,88,1157,1160],{},[29,1156,170],{},[90,1158,1159],{},"Enter text: Post message",[80,1161,1162],{},[83,1163,1164,1166,1167],{},[90,1165,953],{},": Click 'Insert data', select ",[90,1168,227],{},[83,1170,1171,88,1173],{},[29,1172,213],{},[90,1174,1175],{},"Click element: Picture icon button^",[83,1177,1178,88,1180,1183],{},[29,1179,241],{},[90,1181,1182],{},"Upload a file: Grey upload field",[80,1184,1185],{},[83,1186,1187,1166,1190],{},[90,1188,1189],{},"File Path",[90,1191,227],{},[83,1193,1194,88,1196],{},[29,1195,278],{},[90,1197,1198],{},"Click element: Post^",[83,1200,1201,88,1204,1206],{},[29,1202,1203],{},"2.7",[90,1205,281],{},[80,1207,1208,1212],{},[83,1209,1210,1125],{},[90,1211,99],{},[83,1213,1214,1130],{},[90,1215,105],{},[21,1217,1219],{"id":1218},"run-your-facebook-post-bot","Run your Facebook post bot",[14,1221,1222,1223,1225,1226,1230],{},"To test the Facebook bot, you should first disable step 2.6 or delete the test post on Facebook. It's necessary to run the bot while being logged into Facebook, as this will allow the sharing of cookies and enable Axiom to open Facebook in a logged-in state.  If you wish to schedule the bot, ",[322,1224,994],{"href":993},". The upload file step means this bot only runs on the desktop app. To run in the cloud simply replace the 'Upload files' step with the ",[322,1227,1229],{"href":1228},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fupload-file-google-drive","'Upload from Google drive'"," step.",[21,1232,317],{"id":316},[14,1234,320,1235,326],{},[322,1236,325],{"href":324},[21,1238,330],{"id":329},[14,1240,1009,1241,44],{},[322,1242,994],{"href":993},[77,1244,1245],{},[80,1246,1247,1259,1269,1275,1285],{},[83,1248,1249,1252,1253,1255,1256,44],{},[29,1250,1251],{},"'What's on your mind?' button not found?","\nReselect the button. It's using the ",[322,1254,381],{"href":380}," setting ",[90,1257,1258],{},"'element text'",[83,1260,1261,1264,1265,1268],{},[29,1262,1263],{},"Text not entering?","\nReselect the ",[90,1266,1267],{},"'What's on your mind?'"," text input field.",[83,1270,1271,1274],{},[29,1272,1273],{},"Image icon not found?","\nReselect the picture icon element.",[83,1276,1277,1280,1281,1284],{},[29,1278,1279],{},"Upload field not found?","\nReselect the grey ",[29,1282,1283],{},"\"Add photos\u002Fvideos\""," upload area.",[83,1286,1287,1290,1294],{},[29,1288,1289],{},"File not uploading?",[322,1291,1293],{"href":1292},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwait","Add a wait step"," after the upload, especially for large files.",[14,1296,483,1297,1299,1300],{},[322,1298,487],{"href":486},"\nTo learn more, read this full in-depth guide on automating ",[322,1301,1303],{"href":1302},"\u002Fblog\u002Fhow-to-automate-facebook-posts","posting to facebook.",{"title":494,"searchDepth":495,"depth":495,"links":1305},[1306,1307,1308,1309,1310,1311],{"id":852,"depth":498,"text":853},{"id":1091,"depth":498,"text":1092},{"id":1107,"depth":498,"text":1108},{"id":1218,"depth":498,"text":1219},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"This guide explains how to automate posting to Facebook using a no-code bot from axiom.ai. Learn how to post from a Google Sheet without using the API.",{"pinned":522,"read":1314,"level":510,"video":1315,"templateId":1316,"type":513,"format":514,"intent_type":1049,"intent":1050,"tags":1317,"platfrom":1319},"4 minutes","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fn4OPAr1eiQ8",30,[1052,1318,1056],"posting",[1058],"\u002Fguides\u002Fautomate-facebook-posts",{"title":1065,"description":1312},"guides\u002Fautomate-facebook-posts","HavdTDWEWX014xj_KAX-d4MMh-HVaCNQ0hfrqYU1_O4",{"id":1325,"title":1326,"body":1327,"date":1043,"description":1525,"extension":506,"meta":1526,"navigation":522,"order":523,"path":1535,"seo":1536,"stem":1537,"__hash__":1538},"guides\u002Fguides\u002Fautomate-gmail-inbox-clean.md","How to clean up your overflowing Gmail Inbox",{"type":8,"value":1328,"toc":1518},[1329,1331,1334,1336,1340,1343,1345,1348,1352,1381,1385,1388,1390,1394,1398,1400,1508],[11,1330],{},[14,1332,1333],{},"This Gmail inbox cleaner template uses search terms to locate and delete emails. It inputs terms into 'Search in mail', submits, selects all emails, clicks 'Select all conversations that match this search' for bulk deletion, or just deletes emails directly if the option is not available.",[18,1335],{},[21,1337,1339],{"id":1338},"get-started-install-the-gmail-inbox-cleaner","Get started: install the Gmail inbox cleaner",[14,1341,1342],{},"To install this Gmail inbox cleaner, click 'Install template'. If you’re a new user, you’ll have to click 'Install Chrome extension' and create a free axiom.ai account before you can edit the template.",[14,1344,876],{},[14,1346,1347],{},"axiom.ai will guide you through the single step you need to configure in the app.",[21,1349,1351],{"id":1350},"configure-your-gmail-inbox-cleaner-in-60-seconds","Configure your Gmail inbox cleaner in 60 seconds",[77,1353,1354],{},[80,1355,1356,1372],{},[83,1357,1358,88,1360,1363,1364],{},[29,1359,349],{},[90,1361,1362],{},"Enter custom data:"," Add terms to search by",[80,1365,1366],{},[83,1367,1368,1371],{},[90,1369,1370],{},"Custom data",": Enter emails or search terms, one per line.",[83,1373,1374,1377],{},[29,1375,1376],{},"Step 2.0 – 3.8",[80,1378,1379],{},[83,1380,983],{},[21,1382,1384],{"id":1383},"run-your-gmail-inbox-cleaner","Run your Gmail inbox cleaner",[14,1386,1387],{},"For safety, first run a test using non-critical email addresses to search and remove.",[21,1389,317],{"id":316},[14,1391,320,1392,326],{},[322,1393,325],{"href":324},[21,1395,1397],{"id":1396},"trouibleshooting","Trouibleshooting",[14,1399,333],{},[77,1401,1402],{},[80,1403,1404,1415,1429,1440,1451,1462,1472,1486,1497],{},[83,1405,1406,1409,346,1411,1414],{},[29,1407,1408],{},"Loops once?",[344,1410],{},[90,1412,1413],{},"Step 1.0 – Enter custom data",", check for blank spaces in the input field.",[83,1416,1417,1420,346,1422,1425,1426,44],{},[29,1418,1419],{},"Wrong URL?",[344,1421],{},[90,1423,1424],{},"Step 2.0 – Go to page",", make sure the URL is set to ",[90,1427,1428],{},"https:\u002F\u002Fmail.google.com\u002Fmail\u002Fu\u002F0\u002F#inbox",[83,1430,1431,1434,346,1436,1439],{},[29,1432,1433],{},"Search not working?",[344,1435],{},[90,1437,1438],{},"Step 3.1 – Enter text",", reselect the \"Search in mail\" input field.",[83,1441,1442,1445,346,1447,1450],{},[29,1443,1444],{},"Select All not clicked?",[344,1446],{},[90,1448,1449],{},"Step 3.3 – Click element",", reselect the \"Select All\" tick box.",[83,1452,1453,1456,346,1458,1461],{},[29,1454,1455],{},"Link not clicked?",[344,1457],{},[90,1459,1460],{},"Step 3.4 – Get data from bot's current page",", reselect \"Select all conversations that match this search\".",[83,1463,1464,1467,1469,1470,44],{},[29,1465,1466],{},"Scraper retrying too long?",[344,1468],{},"\nIn the same step, change \"Number of attempts when results not found\" to ",[90,1471,165],{},[83,1473,1474,1477,346,1479,1482,1483,1485],{},[29,1475,1476],{},"Condition not working?",[344,1478],{},[90,1480,1481],{},"Step 3.5 – If condition",", make sure ",[90,1484,198],{}," is set.",[83,1487,1488,1491,346,1493,1496],{},[29,1489,1490],{},"Delete not clicked?",[344,1492],{},[90,1494,1495],{},"Step 3.7 – Click element",", reselect the \"Delete\" button.",[83,1498,1499,1502,346,1504,1507],{},[29,1500,1501],{},"Bot behaves randomly?",[344,1503],{},[90,1505,1506],{},"Step 3.8 – Wait",", increase the wait time.",[14,1509,483,1510,1512,1513,1517],{},[322,1511,487],{"href":486},"\nIf you are keen to learn more about browser automation, why not create an ",[322,1514,1516],{"href":1515},"\u002Fblog\u002Fhow-to-send-email-blast","email blast"," using Gmail?",{"title":494,"searchDepth":495,"depth":495,"links":1519},[1520,1521,1522,1523,1524],{"id":1338,"depth":498,"text":1339},{"id":1350,"depth":498,"text":1351},{"id":1383,"depth":498,"text":1384},{"id":316,"depth":498,"text":317},{"id":1396,"depth":498,"text":1397},"This guide shows how to automatically delete emails in Gmail using axiom.ai’s no-code inbox cleaner. Learn to search, select, and bulk delete emails step by step.",{"read":1527,"level":510,"video":1528,"templateId":1529,"type":513,"format":514,"intent_type":1049,"intent":1530,"tags":1531,"platfrom":1533},"2 minutes","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F3a0IKP3i_EY",13,"Send and manage emails",[1532],"email",[1534],"Gmail","\u002Fguides\u002Fautomate-gmail-inbox-clean",{"title":1326,"description":1525},"guides\u002Fautomate-gmail-inbox-clean","AtpQC69ZlgqlmCEiT92loTF1hKrp3y9V5FsxJxVx3Zk",{"id":1540,"title":1541,"body":1542,"date":1748,"description":1749,"extension":506,"meta":1750,"navigation":522,"order":523,"path":1758,"seo":1759,"stem":1760,"__hash__":1761},"guides\u002Fguides\u002Fautomate-screenshots.md","How to automate screenshots",{"type":8,"value":1543,"toc":1740},[1544,1546,1549,1551,1553,1558,1562,1569,1573,1575,1579,1682,1686,1689,1691,1700,1702,1704,1736],[11,1545],{},[14,1547,1548],{},"This AI bot template captures screenshots of webpages, operating by reading links from a Google Sheet, loading each page in Chrome, and taking a screenshot, followed by link deletion after processing. The screenshot is downloaded to your desktop.",[18,1550],{},[21,1552,24],{"id":23},[14,1554,27,1555,1557],{},[29,1556,31],{},", assuming you already have an account. Name your sheet something like 'Automate screenshots’ and set up a tab called 'Website links'.",[21,1559,1561],{"id":1560},"install-the-screenshot-bot","Install the Screenshot bot",[14,1563,1564,1565,55,1567,59],{},"To install this Screenshot bot click ",[29,1566,54],{},[29,1568,58],{},[14,1570,62,1571,44],{},[29,1572,65],{},[14,1574,68],{},[21,1576,1578],{"id":1577},"configure-your-screenshot-bot-in-minutes","Configure your Screenshot bot in minutes",[77,1580,1581],{},[80,1582,1583,1600],{},[83,1584,1585,88,1587,1589],{},[29,1586,87],{},[90,1588,92],{},[80,1590,1591,1595],{},[83,1592,1593,100],{},[90,1594,99],{},[83,1596,1597,1599],{},[90,1598,105],{},": Choose the sheet tab called 'Website links'.",[83,1601,1602,88,1604,1606],{},[29,1603,111],{},[90,1605,114],{},[80,1607,1608,1624,1656],{},[83,1609,1610,88,1612,1614],{},[29,1611,121],{},[90,1613,124],{},[80,1615,1616],{},[83,1617,1618,1620,1621,1623],{},[90,1619,131],{},": Click 'Insert Data', select ",[90,1622,139],{},", and choose the column with the links in it.",[83,1625,1626,88,1628,1631],{},[29,1627,145],{},[90,1629,1630],{},"Save screenshot locally",[80,1632,1633,1639,1645,1651],{},[83,1634,1635,1638],{},[90,1636,1637],{},"Folder",": Set a folder to download to.",[83,1640,1641,1644],{},[90,1642,1643],{},"File name",": Optional.",[83,1646,1647,1650],{},[90,1648,1649],{},"File type",": Select file types JPEG or PNG.",[83,1652,1653,1644],{},[90,1654,1655],{},"Overwrite existing file",[83,1657,1658,88,1660,1662],{},[29,1659,170],{},[90,1661,281],{},[80,1663,1664,1668,1673,1678],{},[83,1665,1666,100],{},[90,1667,99],{},[83,1669,1670,1672],{},[90,1671,105],{},": Choose the tab you created for website links.",[83,1674,1675,1677],{},[90,1676,297],{},": Set to 1.",[83,1679,1680,1677],{},[90,1681,304],{},[21,1683,1685],{"id":1684},"run-your-screenshot-bot","Run your Screenshot bot",[14,1687,1688],{},"We suggest running a test first, stopping the bot after a few loops, and reviewing the screenshots.",[21,1690,317],{"id":316},[14,1692,320,1693,1695,1696,1230],{},[322,1694,325],{"href":324},", you can use our no-code bot builder to customize any bot according to your requirements.\nIf you wish to download files whilst running in the cloud replace step 2.2 with the ",[322,1697,1699],{"href":1698},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-files-to-google-drive","Download to Google Drive",[21,1701,330],{"id":329},[14,1703,333],{},[77,1705,1706],{},[80,1707,1708,1725],{},[83,1709,1710,1713,346,1715,1717,1718,1720,1721,1724],{},[29,1711,1712],{},"Want to set a specific number of loops?",[344,1714],{},[90,1716,349],{},", set the ",[90,1719,353],{}," to something like ",[90,1722,1723],{},"AE100"," to scrape 100 rows.",[83,1726,1727,1730,346,1732,1735],{},[29,1728,1729],{},"Files not saving?",[344,1731],{},[90,1733,1734],{},"Step 2.2 – Save screenshot locally",", check folder permissions on your computer.",[14,1737,483,1738],{},[322,1739,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":1741},[1742,1743,1744,1745,1746,1747],{"id":23,"depth":498,"text":24},{"id":1560,"depth":498,"text":1561},{"id":1577,"depth":498,"text":1578},{"id":1684,"depth":498,"text":1685},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"2022-01-30","This guide explains how to automate webpage screenshots using axiom.ai’s no-code bot. Capture pages from a Google Sheet and save screenshots to your desktop.",{"logoFile":1751,"read":1046,"video":1752,"templateId":1753,"type":513,"format":514,"intent_type":1754,"intent":1050,"tags":1755,"platfrom":1756},"\u002Ftemplates\u002Faxiom-template-icon.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FBJB-siW113A",48,"workflow",[519,1056],[1757],"Any","\u002Fguides\u002Fautomate-screenshots",{"title":1541,"description":1749},"guides\u002Fautomate-screenshots","poZFHQiU-KBQxIrYiJy9tvAaZMjswtpUw7sTeZpi1-M",{"id":1763,"title":1764,"body":1765,"date":523,"description":2224,"extension":506,"meta":2225,"navigation":522,"order":523,"path":2228,"seo":2229,"stem":2230,"__hash__":2231},"guides\u002Fguides\u002Fautomator.md","How to use Apple Automator to trigger an axiom.ai automation",{"type":8,"value":1766,"toc":2218},[1767,1769,1772,1774,1777,1800,1804,1807,1818,1843,1846,2193,2195,2198,2205,2207,2210,2215],[11,1768],{},[14,1770,1771],{},"Automator is a macOS application that allows users to create custom workflows, tasks, and scripts to automate repetitive actions and streamline processes without needing extensive programming knowledge. This comes pre-installed on all macOS systems.",[21,1773,546],{"id":545},[14,1775,1776],{},"To get started, you will need thing from the axiom.ai Chrome extension:",[77,1778,1779],{},[555,1780,1781,1788,1793],{},[83,1782,1783,1785,1786,44],{},[29,1784,561],{}," - The API key is found on the ",[322,1787,566],{"href":565},[83,1789,1790,1792],{},[29,1791,571],{}," - Get the name of the automation you wish to trigger.",[83,1794,1795,1797,1798,44],{},[29,1796,577],{}," - The current endpoint is ",[90,1799,581],{},[21,1801,1803],{"id":1802},"trigger-an-axiomai-automation-using-automator","Trigger an axiom.ai automation using Automator",[14,1805,1806],{},"To get started, create your Automator workflow as you normally would, when you're ready to trigger your automation, continue this guide.",[14,1808,1809,1810,1813,1814,1817],{},"Using the data from above, we will construct multiple variables called ",[90,1811,1812],{},"webhookURL",", to store the URL of the axiom.ai API, and ",[90,1815,1816],{},"jsonData"," to construct the payload that is to be sent to the automation. There are numerous modifications that will be needed:",[77,1819,1820],{},[80,1821,1822,1828,1834],{},[83,1823,1824,1827],{},[90,1825,1826],{},"\u003CYOUR_KEY>"," - This should be replaced with your API key.",[83,1829,1830,1833],{},[90,1831,1832],{},"\u003CAUTOMATION_NAME>"," - This should be replaced with your automation name.",[83,1835,1836,1839,1840,1842],{},[90,1837,1838],{},"data"," - The contents inside of the ",[90,1841,1838],{}," key should be replaced with your own data, if you wish to send data to your automation. This should be an array of arrays, as is in the example.",[14,1844,1845],{},"When ready, add a \"Run AppleScript\" component to your workflow to add thing script into your workflow and trigger your automation:",[719,1847,1851],{"className":1848,"code":1849,"language":1850,"meta":494,"style":494},"language-sh shiki shiki-themes github-light-default github-dark-default","on run\n    -- The endpoint from above\n    set webhookURL to \"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger\"\n\n    -- This is the payload that is being sent to the axiom.ai API. All quotation marks inside the curly brackets will need to be escaped.\n    set jsonData to \"{ \\\"key\\\": \\\"\u003CYOUR_KEY>\\\", \\\"name\\\": \\\"\u003CAUTOMATION_NAME>\\\", \\\"data\\\": [[\\\"Item 1\\\", \\\"Item 2\\\"]] }\"\n    \n    try\n        -- Send the POST request using cURL\n        set response to do shell script \"curl -X POST \" & quoted form of webhookURL & \" -H 'Content-Type: application\u002Fjson' -d \" & quoted form of jsonData\n        return \"Webhook successful: \" & response\n    on error errorMsg\n        return \"Webhook failed: \" & errMsg\n    end try\nend run\n","sh",[90,1852,1853,1861,1878,1893,1899,1971,2050,2056,2062,2085,2138,2152,2164,2176,2185],{"__ignoreMap":494},[727,1854,1855,1858],{"class":729,"line":730},[727,1856,1857],{"class":733},"on",[727,1859,1860],{"class":737}," run\n",[727,1862,1863,1866,1869,1872,1875],{"class":729,"line":498},[727,1864,1865],{"class":733},"    --",[727,1867,1868],{"class":737}," The",[727,1870,1871],{"class":737}," endpoint",[727,1873,1874],{"class":737}," from",[727,1876,1877],{"class":737}," above\n",[727,1879,1880,1884,1887,1890],{"class":729,"line":495},[727,1881,1883],{"class":1882},"sHrmB","    set",[727,1885,1886],{"class":737}," webhookURL",[727,1888,1889],{"class":737}," to",[727,1891,1892],{"class":737}," \"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger\"\n",[727,1894,1896],{"class":729,"line":1895},4,[727,1897,1898],{"emptyLinePlaceholder":522},"\n",[727,1900,1902,1904,1907,1910,1913,1916,1919,1921,1924,1927,1929,1931,1934,1937,1940,1943,1946,1949,1951,1954,1957,1960,1963,1965,1968],{"class":729,"line":1901},5,[727,1903,1865],{"class":733},[727,1905,1906],{"class":737}," This",[727,1908,1909],{"class":737}," is",[727,1911,1912],{"class":737}," the",[727,1914,1915],{"class":737}," payload",[727,1917,1918],{"class":737}," that",[727,1920,1909],{"class":737},[727,1922,1923],{"class":737}," being",[727,1925,1926],{"class":737}," sent",[727,1928,1889],{"class":737},[727,1930,1912],{"class":737},[727,1932,1933],{"class":737}," axiom.ai",[727,1935,1936],{"class":737}," API.",[727,1938,1939],{"class":737}," All",[727,1941,1942],{"class":737}," quotation",[727,1944,1945],{"class":737}," marks",[727,1947,1948],{"class":737}," inside",[727,1950,1912],{"class":737},[727,1952,1953],{"class":737}," curly",[727,1955,1956],{"class":737}," brackets",[727,1958,1959],{"class":737}," will",[727,1961,1962],{"class":737}," need",[727,1964,1889],{"class":737},[727,1966,1967],{"class":737}," be",[727,1969,1970],{"class":737}," escaped.\n",[727,1972,1974,1976,1979,1981,1984,1988,1991,1993,1996,1998,2000,2002,2005,2007,2010,2012,2014,2016,2018,2020,2022,2024,2026,2028,2031,2033,2036,2038,2040,2042,2045,2047],{"class":729,"line":1973},6,[727,1975,1883],{"class":1882},[727,1977,1978],{"class":737}," jsonData",[727,1980,1889],{"class":737},[727,1982,1983],{"class":737}," \"{ ",[727,1985,1987],{"class":1986},"sjeE4","\\\"",[727,1989,1990],{"class":737},"key",[727,1992,1987],{"class":1986},[727,1994,1995],{"class":737},": ",[727,1997,1987],{"class":1986},[727,1999,1826],{"class":737},[727,2001,1987],{"class":1986},[727,2003,2004],{"class":737},", ",[727,2006,1987],{"class":1986},[727,2008,2009],{"class":737},"name",[727,2011,1987],{"class":1986},[727,2013,1995],{"class":737},[727,2015,1987],{"class":1986},[727,2017,1832],{"class":737},[727,2019,1987],{"class":1986},[727,2021,2004],{"class":737},[727,2023,1987],{"class":1986},[727,2025,1838],{"class":737},[727,2027,1987],{"class":1986},[727,2029,2030],{"class":737},": [[",[727,2032,1987],{"class":1986},[727,2034,2035],{"class":737},"Item 1",[727,2037,1987],{"class":1986},[727,2039,2004],{"class":737},[727,2041,1987],{"class":1986},[727,2043,2044],{"class":737},"Item 2",[727,2046,1987],{"class":1986},[727,2048,2049],{"class":737},"]] }\"\n",[727,2051,2053],{"class":729,"line":2052},7,[727,2054,2055],{"class":768},"    \n",[727,2057,2059],{"class":729,"line":2058},8,[727,2060,2061],{"class":733},"    try\n",[727,2063,2065,2068,2071,2073,2076,2079,2082],{"class":729,"line":2064},9,[727,2066,2067],{"class":733},"        --",[727,2069,2070],{"class":737}," Send",[727,2072,1912],{"class":737},[727,2074,2075],{"class":737}," POST",[727,2077,2078],{"class":737}," request",[727,2080,2081],{"class":737}," using",[727,2083,2084],{"class":737}," cURL\n",[727,2086,2088,2091,2094,2096,2099,2102,2105,2108,2111,2114,2117,2120,2122,2124,2127,2129,2131,2133,2135],{"class":729,"line":2087},10,[727,2089,2090],{"class":1882},"        set",[727,2092,2093],{"class":737}," response",[727,2095,1889],{"class":737},[727,2097,2098],{"class":737}," do",[727,2100,2101],{"class":737}," shell",[727,2103,2104],{"class":737}," script",[727,2106,2107],{"class":737}," \"curl -X POST \"",[727,2109,2110],{"class":768}," & ",[727,2112,2113],{"class":733},"quoted",[727,2115,2116],{"class":737}," form",[727,2118,2119],{"class":737}," of",[727,2121,1886],{"class":737},[727,2123,2110],{"class":768},[727,2125,2126],{"class":733},"\" -H 'Content-Type: application\u002Fjson' -d \"",[727,2128,2110],{"class":768},[727,2130,2113],{"class":733},[727,2132,2116],{"class":737},[727,2134,2119],{"class":737},[727,2136,2137],{"class":737}," jsonData\n",[727,2139,2141,2144,2147,2149],{"class":729,"line":2140},11,[727,2142,2143],{"class":1986},"        return",[727,2145,2146],{"class":737}," \"Webhook successful: \"",[727,2148,2110],{"class":768},[727,2150,2151],{"class":733},"response\n",[727,2153,2155,2158,2161],{"class":729,"line":2154},12,[727,2156,2157],{"class":733},"    on",[727,2159,2160],{"class":737}," error",[727,2162,2163],{"class":737}," errorMsg\n",[727,2165,2166,2168,2171,2173],{"class":729,"line":1529},[727,2167,2143],{"class":1986},[727,2169,2170],{"class":737}," \"Webhook failed: \"",[727,2172,2110],{"class":768},[727,2174,2175],{"class":733},"errMsg\n",[727,2177,2179,2182],{"class":729,"line":2178},14,[727,2180,2181],{"class":1986},"    end",[727,2183,2184],{"class":768}," try\n",[727,2186,2188,2191],{"class":729,"line":2187},15,[727,2189,2190],{"class":1986},"end",[727,2192,1860],{"class":768},[21,2194,776],{"id":775},[14,2196,2197],{},"In order to test your workflow, click \"Run\", or run the script on its own. Any errors that are being produced within Automator will appear within the \"Run Applescript\" component of your workflow. Follow the instructions within the component for more information on how to proceed.",[14,2199,2200,2201,44],{},"For more information on errors related to the axiom.ai API, see ",[322,2202,2204],{"href":2203},"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferrors","Common Errors",[21,2206,796],{"id":795},[14,2208,2209],{},"Automator provides a great method of being able to run your axiom.ai automations. It offers the ability to access various pieces of information from the system itself, which can be beneficial when it comes to monitoring system configuration, such as memory. Your automations can easily be used as a middle-man to set up notifications for system monitoring, especially if the system is being used in server configuration.",[14,2211,2212],{},[807,2213,2214],{},"Information accurate as of January 2025, changes to either platform may render these instructions non-functional.",[811,2216,2217],{},"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 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);}",{"title":494,"searchDepth":495,"depth":495,"links":2219},[2220,2221,2222,2223],{"id":545,"depth":498,"text":546},{"id":1802,"depth":498,"text":1803},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"This guide explains how to trigger an axiom.ai automation using Apple Automator. Learn to set up a workflow with AppleScript and send data using the Axiom webhook.",{"type":513,"format":77,"intent_type":515,"intent":827,"tags":2226,"platfrom":2227},[829,830],[832],"\u002Fguides\u002Fautomator",{"title":1764,"description":2224},"guides\u002Fautomator","K_I1mqpJ2vYezZL06hRST2ypKqjLgTp_XVcwqftlYA0",{"id":2233,"title":2234,"body":2235,"date":523,"description":3357,"extension":506,"meta":3358,"navigation":522,"order":523,"path":3361,"seo":3362,"stem":3363,"__hash__":3364},"guides\u002Fguides\u002Fbaserow.md","How to post data to Baserow using an axiom.ai automation",{"type":8,"value":2236,"toc":3346},[2237,2239,2248,2250,2253,2256,2277,2281,2284,2288,2291,2303,2306,2362,2365,2653,2672,2688,2697,2701,2704,2707,2772,2775,2977,2992,2996,2998,3001,3046,3048,3256,3279,3282,3295,3297,3304,3307,3317,3319,3327,3330,3343],[11,2238],{},[14,2240,2241,2247],{},[322,2242,2246],{"href":2243,"rel":2244},"https:\u002F\u002Fbaserow.io",[2245],"nofollow","Baserow"," offers an alternative to spreadsheets and allows for data management at scale with cloud or self-hosted options. Combined with axiom.ai, there are many opportunities to power up your workflows and store your processed data.",[21,2249,546],{"id":545},[14,2251,2252],{},"For this guide, we will assume that you have an automation set up within axiom.ai, have a Baserow account and a database already set up.",[14,2254,2255],{},"To send data to Baserow from your automation, you'll need the following information from your database:",[77,2257,2258],{},[555,2259,2260,2271],{},[83,2261,2262,2265,2266,2270],{},[29,2263,2264],{},"Table ID"," - You'll find this in the URL - navigate to your table, and grab the second last number. For example, ",[322,2267,2268],{"href":2268,"rel":2269},"https:\u002F\u002Fbaserow.io\u002Fdatabase\u002Fxxxxxx\u002Ftable\u002F",[2245],"\u003CTABLE_ID>\u002Fxxxxxx.",[83,2272,2273,2276],{},[29,2274,2275],{},"Database Token"," - A database token will need to be generated, navigate to My Settings → Database tokens → Create token → give it a name and click \"create token\". Set the permissions depending on what you are looking to do via your automation.",[21,2278,2280],{"id":2279},"automating-baserow-using-an-axiomai-automation","Automating Baserow using an axiom.ai automation",[14,2282,2283],{},"There are many functions of Baserow that can be used within your automation to send data to Baserow, or fetch data from Baserow.",[639,2285,2287],{"id":2286},"sending-data-to-baserow","Sending data to Baserow",[14,2289,2290],{},"Create your automation as you normally would - when you're ready to send your data onto Baserow, continue this guide.",[14,2292,2293,2294,2297,2298,2302],{},"If the data that you are looking to send contains multiple rows of data, first add a ",[322,2295,114],{"href":2296},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Floop"," step to your automation, setting the data to the data token that contains the data that you wish to send to Baserow. Inside of the \"Loop through data\" step, add a ",[322,2299,2301],{"href":2300},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-javascript","Write Javascript"," step. If you only have a single row of data, you can skip adding the \"Loop through data\" step.",[14,2304,2305],{},"First, we will establish some variables to hold important information that your script will need, replacing the text within the \u003C > with your data:",[719,2307,2309],{"className":756,"code":2308,"language":758,"meta":494,"style":494},"const table_id = \"\u003CTABLE_ID>\";\nconst baserow_url = `https:\u002F\u002Fapi.baserow.io\u002Fapi\u002Fdatabase\u002Frows\u002Ftable\u002F${table_id}\u002F?user_field_names=true`;\nconst database_token = \"\u003CDATABASE_TOKEN>\";\n",[90,2310,2311,2328,2348],{"__ignoreMap":494},[727,2312,2313,2316,2319,2322,2325],{"class":729,"line":730},[727,2314,2315],{"class":1986},"const",[727,2317,2318],{"class":1882}," table_id",[727,2320,2321],{"class":1986}," =",[727,2323,2324],{"class":737}," \"\u003CTABLE_ID>\"",[727,2326,2327],{"class":768},";\n",[727,2329,2330,2332,2335,2337,2340,2343,2346],{"class":729,"line":498},[727,2331,2315],{"class":1986},[727,2333,2334],{"class":1882}," baserow_url",[727,2336,2321],{"class":1986},[727,2338,2339],{"class":737}," `https:\u002F\u002Fapi.baserow.io\u002Fapi\u002Fdatabase\u002Frows\u002Ftable\u002F${",[727,2341,2342],{"class":768},"table_id",[727,2344,2345],{"class":737},"}\u002F?user_field_names=true`",[727,2347,2327],{"class":768},[727,2349,2350,2352,2355,2357,2360],{"class":729,"line":495},[727,2351,2315],{"class":1986},[727,2353,2354],{"class":1882}," database_token",[727,2356,2321],{"class":1986},[727,2358,2359],{"class":737}," \"\u003CDATABASE_TOKEN>\"",[727,2361,2327],{"class":768},[14,2363,2364],{},"Next, we will want to create a function that handles sending the data to Baserow, and then call this function. This should be contained within the same \"Write Javascript\" step as the code above.",[719,2366,2368],{"className":756,"code":2367,"language":758,"meta":494,"style":494},"const sendToBaserow = async () => {\n    try {\n        const response = await fetch(baserow_url, {\n            method: 'POST',\n            headers: {\n                \"Authorization\": `Token ${database_token}`,\n                \"Content-Type\": \"application\u002Fx-www-form-urlencoded\"\n            },\n            body: new URLSearchParams({\n                \"Name\": \"[google-sheet-data?*&0]\",\n                \"Homepage\": \"[google-sheet-data?*&1]\"\n            })\n        });\n      \n        if (!response.ok) {\n            console.error(\"Something went wrong with response\", response);\n            return;\n        }\n      \n        const result = await response.json();\n        console.log(result);\n    } catch (error) {\n        console.error(\"Something went wrong\", error);\n    }\n}\n\nsendToBaserow();\n",[90,2369,2370,2392,2399,2417,2428,2433,2451,2461,2466,2480,2492,2502,2507,2512,2517,2531,2549,2557,2563,2568,2589,2601,2613,2628,2634,2640,2645],{"__ignoreMap":494},[727,2371,2372,2374,2378,2380,2383,2386,2389],{"class":729,"line":730},[727,2373,2315],{"class":1986},[727,2375,2377],{"class":2376},"sbjLL"," sendToBaserow",[727,2379,2321],{"class":1986},[727,2381,2382],{"class":1986}," async",[727,2384,2385],{"class":768}," () ",[727,2387,2388],{"class":1986},"=>",[727,2390,2391],{"class":768}," {\n",[727,2393,2394,2397],{"class":729,"line":498},[727,2395,2396],{"class":1986},"    try",[727,2398,2391],{"class":768},[727,2400,2401,2404,2406,2408,2411,2414],{"class":729,"line":495},[727,2402,2403],{"class":1986},"        const",[727,2405,2093],{"class":1882},[727,2407,2321],{"class":1986},[727,2409,2410],{"class":1986}," await",[727,2412,2413],{"class":2376}," fetch",[727,2415,2416],{"class":768},"(baserow_url, {\n",[727,2418,2419,2422,2425],{"class":729,"line":1895},[727,2420,2421],{"class":768},"            method: ",[727,2423,2424],{"class":737},"'POST'",[727,2426,2427],{"class":768},",\n",[727,2429,2430],{"class":729,"line":1901},[727,2431,2432],{"class":768},"            headers: {\n",[727,2434,2435,2438,2440,2443,2446,2449],{"class":729,"line":1973},[727,2436,2437],{"class":737},"                \"Authorization\"",[727,2439,1995],{"class":768},[727,2441,2442],{"class":737},"`Token ${",[727,2444,2445],{"class":768},"database_token",[727,2447,2448],{"class":737},"}`",[727,2450,2427],{"class":768},[727,2452,2453,2456,2458],{"class":729,"line":2052},[727,2454,2455],{"class":737},"                \"Content-Type\"",[727,2457,1995],{"class":768},[727,2459,2460],{"class":737},"\"application\u002Fx-www-form-urlencoded\"\n",[727,2462,2463],{"class":729,"line":2058},[727,2464,2465],{"class":768},"            },\n",[727,2467,2468,2471,2474,2477],{"class":729,"line":2064},[727,2469,2470],{"class":768},"            body: ",[727,2472,2473],{"class":1986},"new",[727,2475,2476],{"class":2376}," URLSearchParams",[727,2478,2479],{"class":768},"({\n",[727,2481,2482,2485,2487,2490],{"class":729,"line":2087},[727,2483,2484],{"class":737},"                \"Name\"",[727,2486,1995],{"class":768},[727,2488,2489],{"class":737},"\"[google-sheet-data?*&0]\"",[727,2491,2427],{"class":768},[727,2493,2494,2497,2499],{"class":729,"line":2140},[727,2495,2496],{"class":737},"                \"Homepage\"",[727,2498,1995],{"class":768},[727,2500,2501],{"class":737},"\"[google-sheet-data?*&1]\"\n",[727,2503,2504],{"class":729,"line":2154},[727,2505,2506],{"class":768},"            })\n",[727,2508,2509],{"class":729,"line":1529},[727,2510,2511],{"class":768},"        });\n",[727,2513,2514],{"class":729,"line":2178},[727,2515,2516],{"class":768},"      \n",[727,2518,2519,2522,2525,2528],{"class":729,"line":2187},[727,2520,2521],{"class":1986},"        if",[727,2523,2524],{"class":768}," (",[727,2526,2527],{"class":1986},"!",[727,2529,2530],{"class":768},"response.ok) {\n",[727,2532,2534,2537,2540,2543,2546],{"class":729,"line":2533},16,[727,2535,2536],{"class":768},"            console.",[727,2538,2539],{"class":2376},"error",[727,2541,2542],{"class":768},"(",[727,2544,2545],{"class":737},"\"Something went wrong with response\"",[727,2547,2548],{"class":768},", response);\n",[727,2550,2552,2555],{"class":729,"line":2551},17,[727,2553,2554],{"class":1986},"            return",[727,2556,2327],{"class":768},[727,2558,2560],{"class":729,"line":2559},18,[727,2561,2562],{"class":768},"        }\n",[727,2564,2566],{"class":729,"line":2565},19,[727,2567,2516],{"class":768},[727,2569,2571,2573,2576,2578,2580,2583,2586],{"class":729,"line":2570},20,[727,2572,2403],{"class":1986},[727,2574,2575],{"class":1882}," result",[727,2577,2321],{"class":1986},[727,2579,2410],{"class":1986},[727,2581,2582],{"class":768}," response.",[727,2584,2585],{"class":2376},"json",[727,2587,2588],{"class":768},"();\n",[727,2590,2592,2595,2598],{"class":729,"line":2591},21,[727,2593,2594],{"class":768},"        console.",[727,2596,2597],{"class":2376},"log",[727,2599,2600],{"class":768},"(result);\n",[727,2602,2604,2607,2610],{"class":729,"line":2603},22,[727,2605,2606],{"class":768},"    } ",[727,2608,2609],{"class":1986},"catch",[727,2611,2612],{"class":768}," (error) {\n",[727,2614,2616,2618,2620,2622,2625],{"class":729,"line":2615},23,[727,2617,2594],{"class":768},[727,2619,2539],{"class":2376},[727,2621,2542],{"class":768},[727,2623,2624],{"class":737},"\"Something went wrong\"",[727,2626,2627],{"class":768},", error);\n",[727,2629,2631],{"class":729,"line":2630},24,[727,2632,2633],{"class":768},"    }\n",[727,2635,2637],{"class":729,"line":2636},25,[727,2638,2639],{"class":768},"}\n",[727,2641,2643],{"class":729,"line":2642},26,[727,2644,1898],{"emptyLinePlaceholder":522},[727,2646,2648,2651],{"class":729,"line":2647},27,[727,2649,2650],{"class":2376},"sendToBaserow",[727,2652,2588],{"class":768},[14,2654,2655,2656,2659,2660,2663,2664,2667,2668,2671],{},"Most of the code above will not need to be modified, however, you will need to update the code inside of the ",[90,2657,2658],{},"body: new URLSearchParams({})"," code with the fields and data that you wish to send. The first item in the key-value pair, ",[90,2661,2662],{},"Name",", for example, needs to be the name of a ",[807,2665,2666],{},"single"," column. The second item will be the data that you are sending to Baserow - remember, you can use the ",[322,2669,194],{"href":2670},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fpass"," option to insert data tokens from throughout your automation.",[14,2673,2674,2675,2679,2680,2683,2684,2687],{},"By default, when you create a row using this method this will trigger webhooks - if you are following the guide on ",[322,2676,2678],{"href":2677},"#triggering-an-axiomai-automation-using-baserow","Triggering an axiom.ai automation using Baserow"," you may wish to keep this in mind. This can be disabled by adding ",[90,2681,2682],{},"&send_webhook_events=false"," to the end of the ",[90,2685,2686],{},"baserow_url"," variable in the code.",[14,2689,2690],{},[807,2691,2692,2693,2696],{},"Please note, Baserow's API has a rate limit of 20 requests per second as of time of writing - to respect this, it's recommended to add additional ",[322,2694,2695],{"href":1292},"Wait"," steps inside your \"Loop through data\" step.",[639,2698,2700],{"id":2699},"retrieving-a-single-row-from-baserow","Retrieving a single row from Baserow",[14,2702,2703],{},"Create your automation as you normally would - when you're ready to retrieve your data from Baserow, continue this guide.",[14,2705,2706],{},"To get a single row from your Baserow database, you'll need to perform a request to their API. To access a single row, you will need the ID of the row. This can be found in the UI. First, we will establish some variables to hold important information that your script will need, replacing the text within the \u003C > with your data:",[719,2708,2710],{"className":756,"code":2709,"language":758,"meta":494,"style":494},"const table_id = \"\u003CTABLE_ID>\";\nconst row_id = \"\u003CTABLE_ROW>\";\nconst database_token = \"\u003CDATABASE_TOKEN>\";\nconst baserow_url = `https:\u002F\u002Fapi.baserow.io\u002Fapi\u002Fdatabase\u002Frows\u002Ftable\u002F${table_id}\u002F${row_id}\u002F?user_field_names=true`;\n",[90,2711,2712,2724,2738,2750],{"__ignoreMap":494},[727,2713,2714,2716,2718,2720,2722],{"class":729,"line":730},[727,2715,2315],{"class":1986},[727,2717,2318],{"class":1882},[727,2719,2321],{"class":1986},[727,2721,2324],{"class":737},[727,2723,2327],{"class":768},[727,2725,2726,2728,2731,2733,2736],{"class":729,"line":498},[727,2727,2315],{"class":1986},[727,2729,2730],{"class":1882}," row_id",[727,2732,2321],{"class":1986},[727,2734,2735],{"class":737}," \"\u003CTABLE_ROW>\"",[727,2737,2327],{"class":768},[727,2739,2740,2742,2744,2746,2748],{"class":729,"line":495},[727,2741,2315],{"class":1986},[727,2743,2354],{"class":1882},[727,2745,2321],{"class":1986},[727,2747,2359],{"class":737},[727,2749,2327],{"class":768},[727,2751,2752,2754,2756,2758,2760,2762,2765,2768,2770],{"class":729,"line":1895},[727,2753,2315],{"class":1986},[727,2755,2334],{"class":1882},[727,2757,2321],{"class":1986},[727,2759,2339],{"class":737},[727,2761,2342],{"class":768},[727,2763,2764],{"class":737},"}\u002F${",[727,2766,2767],{"class":768},"row_id",[727,2769,2345],{"class":737},[727,2771,2327],{"class":768},[14,2773,2774],{},"Next, we will want to create a function that handles retrieving the data from Baserow, and then call this function. This should be contained within the same \"Write Javascript\" step as the code above.",[719,2776,2778],{"className":756,"code":2777,"language":758,"meta":494,"style":494},"const retrieveRow = async () => {\n    try {\n        const response = await fetch(baserow_url, {\n            method: 'GET',\n            headers: {\n                \"Authorization\": `Token ${database_token}`,\n                \"Content-Type\": \"application\u002Fx-www-form-urlencoded\"\n            }\n        });\n      \n        if (!response.ok) {\n            console.error(\"Something went wrong\", response); \n        }\n      \n        const result = await response.json();\n\n        \u002F\u002F Return the results in a format that your automation is expecting.\n        return [Object.values(result)];\n    } catch (error) {\n        console.error(\"Something went wrong\", error); \n    }\n}\n\nreturn retrieveRow();\n",[90,2779,2780,2797,2803,2817,2826,2830,2844,2852,2857,2861,2865,2875,2888,2892,2896,2912,2916,2922,2935,2943,2956,2960,2964,2968],{"__ignoreMap":494},[727,2781,2782,2784,2787,2789,2791,2793,2795],{"class":729,"line":730},[727,2783,2315],{"class":1986},[727,2785,2786],{"class":2376}," retrieveRow",[727,2788,2321],{"class":1986},[727,2790,2382],{"class":1986},[727,2792,2385],{"class":768},[727,2794,2388],{"class":1986},[727,2796,2391],{"class":768},[727,2798,2799,2801],{"class":729,"line":498},[727,2800,2396],{"class":1986},[727,2802,2391],{"class":768},[727,2804,2805,2807,2809,2811,2813,2815],{"class":729,"line":495},[727,2806,2403],{"class":1986},[727,2808,2093],{"class":1882},[727,2810,2321],{"class":1986},[727,2812,2410],{"class":1986},[727,2814,2413],{"class":2376},[727,2816,2416],{"class":768},[727,2818,2819,2821,2824],{"class":729,"line":1895},[727,2820,2421],{"class":768},[727,2822,2823],{"class":737},"'GET'",[727,2825,2427],{"class":768},[727,2827,2828],{"class":729,"line":1901},[727,2829,2432],{"class":768},[727,2831,2832,2834,2836,2838,2840,2842],{"class":729,"line":1973},[727,2833,2437],{"class":737},[727,2835,1995],{"class":768},[727,2837,2442],{"class":737},[727,2839,2445],{"class":768},[727,2841,2448],{"class":737},[727,2843,2427],{"class":768},[727,2845,2846,2848,2850],{"class":729,"line":2052},[727,2847,2455],{"class":737},[727,2849,1995],{"class":768},[727,2851,2460],{"class":737},[727,2853,2854],{"class":729,"line":2058},[727,2855,2856],{"class":768},"            }\n",[727,2858,2859],{"class":729,"line":2064},[727,2860,2511],{"class":768},[727,2862,2863],{"class":729,"line":2087},[727,2864,2516],{"class":768},[727,2866,2867,2869,2871,2873],{"class":729,"line":2140},[727,2868,2521],{"class":1986},[727,2870,2524],{"class":768},[727,2872,2527],{"class":1986},[727,2874,2530],{"class":768},[727,2876,2877,2879,2881,2883,2885],{"class":729,"line":2154},[727,2878,2536],{"class":768},[727,2880,2539],{"class":2376},[727,2882,2542],{"class":768},[727,2884,2624],{"class":737},[727,2886,2887],{"class":768},", response); \n",[727,2889,2890],{"class":729,"line":1529},[727,2891,2562],{"class":768},[727,2893,2894],{"class":729,"line":2178},[727,2895,2516],{"class":768},[727,2897,2898,2900,2902,2904,2906,2908,2910],{"class":729,"line":2187},[727,2899,2403],{"class":1986},[727,2901,2575],{"class":1882},[727,2903,2321],{"class":1986},[727,2905,2410],{"class":1986},[727,2907,2582],{"class":768},[727,2909,2585],{"class":2376},[727,2911,2588],{"class":768},[727,2913,2914],{"class":729,"line":2533},[727,2915,1898],{"emptyLinePlaceholder":522},[727,2917,2918],{"class":729,"line":2551},[727,2919,2921],{"class":2920},"sU953","        \u002F\u002F Return the results in a format that your automation is expecting.\n",[727,2923,2924,2926,2929,2932],{"class":729,"line":2559},[727,2925,2143],{"class":1986},[727,2927,2928],{"class":768}," [Object.",[727,2930,2931],{"class":2376},"values",[727,2933,2934],{"class":768},"(result)];\n",[727,2936,2937,2939,2941],{"class":729,"line":2565},[727,2938,2606],{"class":768},[727,2940,2609],{"class":1986},[727,2942,2612],{"class":768},[727,2944,2945,2947,2949,2951,2953],{"class":729,"line":2570},[727,2946,2594],{"class":768},[727,2948,2539],{"class":2376},[727,2950,2542],{"class":768},[727,2952,2624],{"class":737},[727,2954,2955],{"class":768},", error); \n",[727,2957,2958],{"class":729,"line":2591},[727,2959,2633],{"class":768},[727,2961,2962],{"class":729,"line":2603},[727,2963,2639],{"class":768},[727,2965,2966],{"class":729,"line":2615},[727,2967,1898],{"emptyLinePlaceholder":522},[727,2969,2970,2973,2975],{"class":729,"line":2630},[727,2971,2972],{"class":1986},"return",[727,2974,2786],{"class":2376},[727,2976,2588],{"class":768},[14,2978,2979,2980,2983,2984],{},"Your row data will then be contained within the ",[90,2981,2982],{},"code-data"," data token within your automation. ",[807,2985,2986,2987,2991],{},"Note: this data will contain additional data such as the Row ID, it's recommended you review the data using a ",[322,2988,2990],{"href":2989},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdisplay-a-message","Display a message"," step before use.",[639,2993,2995],{"id":2994},"retrieving-multiple-rows-from-baserow","Retrieving multiple rows from Baserow",[14,2997,2703],{},[14,2999,3000],{},"In order to retrieve multiple rows, we'll need to add some code to your automation. First, we will establish some variables to hold important information that your script will need, replacing the text within the \u003C > with your data:",[719,3002,3004],{"className":756,"code":3003,"language":758,"meta":494,"style":494},"const table_id = \"\u003CTABLE_ID>\";\nconst database_token = \"\u003CDATABASE_TOKEN>\";\nconst baserow_url = `https:\u002F\u002Fapi.baserow.io\u002Fapi\u002Fdatabase\u002Frows\u002Ftable\u002F${table_id}\u002F?user_field_names=true`;\n",[90,3005,3006,3018,3030],{"__ignoreMap":494},[727,3007,3008,3010,3012,3014,3016],{"class":729,"line":730},[727,3009,2315],{"class":1986},[727,3011,2318],{"class":1882},[727,3013,2321],{"class":1986},[727,3015,2324],{"class":737},[727,3017,2327],{"class":768},[727,3019,3020,3022,3024,3026,3028],{"class":729,"line":498},[727,3021,2315],{"class":1986},[727,3023,2354],{"class":1882},[727,3025,2321],{"class":1986},[727,3027,2359],{"class":737},[727,3029,2327],{"class":768},[727,3031,3032,3034,3036,3038,3040,3042,3044],{"class":729,"line":495},[727,3033,2315],{"class":1986},[727,3035,2334],{"class":1882},[727,3037,2321],{"class":1986},[727,3039,2339],{"class":737},[727,3041,2342],{"class":768},[727,3043,2345],{"class":737},[727,3045,2327],{"class":768},[14,3047,2774],{},[719,3049,3051],{"className":756,"code":3050,"language":758,"meta":494,"style":494},"const retrieveRow = async () => {\n    try {\n        const response = await fetch(baserow_url, {\n            method: 'GET',\n            headers: {\n                \"Authorization\": `Token ${database_token}`,\n                \"Content-Type\": \"application\u002Fx-www-form-urlencoded\"\n            }\n        });\n      \n        if (!response.ok) {\n            console.error(\"Something went wrong\", response); \n        }\n      \n        const result = await response.json();\n        \n        \u002F\u002F Return the results in a format that your automation is expecting.\n        return result.results.map(row => Object.values(row));\n    } catch (error) {\n        console.error(\"Something went wrong\", error); \n    }\n}\n\nreturn retrieveRow();\n",[90,3052,3053,3069,3075,3089,3097,3101,3115,3123,3127,3131,3135,3145,3157,3161,3165,3181,3186,3190,3216,3224,3236,3240,3244,3248],{"__ignoreMap":494},[727,3054,3055,3057,3059,3061,3063,3065,3067],{"class":729,"line":730},[727,3056,2315],{"class":1986},[727,3058,2786],{"class":2376},[727,3060,2321],{"class":1986},[727,3062,2382],{"class":1986},[727,3064,2385],{"class":768},[727,3066,2388],{"class":1986},[727,3068,2391],{"class":768},[727,3070,3071,3073],{"class":729,"line":498},[727,3072,2396],{"class":1986},[727,3074,2391],{"class":768},[727,3076,3077,3079,3081,3083,3085,3087],{"class":729,"line":495},[727,3078,2403],{"class":1986},[727,3080,2093],{"class":1882},[727,3082,2321],{"class":1986},[727,3084,2410],{"class":1986},[727,3086,2413],{"class":2376},[727,3088,2416],{"class":768},[727,3090,3091,3093,3095],{"class":729,"line":1895},[727,3092,2421],{"class":768},[727,3094,2823],{"class":737},[727,3096,2427],{"class":768},[727,3098,3099],{"class":729,"line":1901},[727,3100,2432],{"class":768},[727,3102,3103,3105,3107,3109,3111,3113],{"class":729,"line":1973},[727,3104,2437],{"class":737},[727,3106,1995],{"class":768},[727,3108,2442],{"class":737},[727,3110,2445],{"class":768},[727,3112,2448],{"class":737},[727,3114,2427],{"class":768},[727,3116,3117,3119,3121],{"class":729,"line":2052},[727,3118,2455],{"class":737},[727,3120,1995],{"class":768},[727,3122,2460],{"class":737},[727,3124,3125],{"class":729,"line":2058},[727,3126,2856],{"class":768},[727,3128,3129],{"class":729,"line":2064},[727,3130,2511],{"class":768},[727,3132,3133],{"class":729,"line":2087},[727,3134,2516],{"class":768},[727,3136,3137,3139,3141,3143],{"class":729,"line":2140},[727,3138,2521],{"class":1986},[727,3140,2524],{"class":768},[727,3142,2527],{"class":1986},[727,3144,2530],{"class":768},[727,3146,3147,3149,3151,3153,3155],{"class":729,"line":2154},[727,3148,2536],{"class":768},[727,3150,2539],{"class":2376},[727,3152,2542],{"class":768},[727,3154,2624],{"class":737},[727,3156,2887],{"class":768},[727,3158,3159],{"class":729,"line":1529},[727,3160,2562],{"class":768},[727,3162,3163],{"class":729,"line":2178},[727,3164,2516],{"class":768},[727,3166,3167,3169,3171,3173,3175,3177,3179],{"class":729,"line":2187},[727,3168,2403],{"class":1986},[727,3170,2575],{"class":1882},[727,3172,2321],{"class":1986},[727,3174,2410],{"class":1986},[727,3176,2582],{"class":768},[727,3178,2585],{"class":2376},[727,3180,2588],{"class":768},[727,3182,3183],{"class":729,"line":2533},[727,3184,3185],{"class":768},"        \n",[727,3187,3188],{"class":729,"line":2551},[727,3189,2921],{"class":2920},[727,3191,3192,3194,3197,3200,3202,3205,3208,3211,3213],{"class":729,"line":2559},[727,3193,2143],{"class":1986},[727,3195,3196],{"class":768}," result.results.",[727,3198,3199],{"class":2376},"map",[727,3201,2542],{"class":768},[727,3203,3204],{"class":733},"row",[727,3206,3207],{"class":1986}," =>",[727,3209,3210],{"class":768}," Object.",[727,3212,2931],{"class":2376},[727,3214,3215],{"class":768},"(row));\n",[727,3217,3218,3220,3222],{"class":729,"line":2565},[727,3219,2606],{"class":768},[727,3221,2609],{"class":1986},[727,3223,2612],{"class":768},[727,3225,3226,3228,3230,3232,3234],{"class":729,"line":2570},[727,3227,2594],{"class":768},[727,3229,2539],{"class":2376},[727,3231,2542],{"class":768},[727,3233,2624],{"class":737},[727,3235,2955],{"class":768},[727,3237,3238],{"class":729,"line":2591},[727,3239,2633],{"class":768},[727,3241,3242],{"class":729,"line":2603},[727,3243,2639],{"class":768},[727,3245,3246],{"class":729,"line":2615},[727,3247,1898],{"emptyLinePlaceholder":522},[727,3249,3250,3252,3254],{"class":729,"line":2630},[727,3251,2972],{"class":1986},[727,3253,2786],{"class":2376},[727,3255,2588],{"class":768},[14,3257,3258,3259,2004,3262,2004,3265,450,3268,3271,3272,3275,3276,3278],{},"There are various different parameters that can be provided to Baserow to customise the data that you are retrieving, such as ",[90,3260,3261],{},"page",[90,3263,3264],{},"size",[90,3266,3267],{},"search",[90,3269,3270],{},"order_by",". We recommend reviewing their API documentation for more details: ",[90,3273,3274],{},"https:\u002F\u002Fbaserow.io\u002Fapi-docs\u002Fdatabase\u002F\u003CTABLE_ID>",". All rows of data will be contained within the ",[90,3277,2982],{}," data token within your automation to use in later steps.",[21,3280,2678],{"id":3281},"triggering-an-axiomai-automation-using-baserow",[14,3283,3284,3285,3289,3290,3294],{},"Baserow allows for webhooks to be triggered when an event occurs within your database table. This can be useful for notifying third-party applications of changes. Unfortunately, as axiom.ai requires specific details within the payload of a webhook request it is not currently possible to trigger your automations directly, but it may be possible to do so using a third party tool such as ",[322,3286,3288],{"href":3287},".\u002Fzapier","Zapier"," or ",[322,3291,3293],{"href":3292},".\u002Fpost-data-to-make","Make"," as a service layer between axiom.ai and Baserow.",[21,3296,776],{"id":775},[14,3298,3299,3300,1230],{},"To test adding data to Baserow, click \"Run\" within the Builder - open up your Baserow dashboard and open the table to view any changes. To test retrieving data from Baserow, add an output for your data, for example, a ",[322,3301,3303],{"href":3302},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-data-to-a-google-sheet-step","Write data to a Google Sheet",[14,3305,3306],{},"To test triggering an axiom.ai automation from an event, perform the event that you have set up within your automation - for example, by inserting or updating data within your database.",[14,3308,3309,3310,450,3314,44],{},"For further advice on debugging your automations, see ",[322,3311,3313],{"href":3312},"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Fhow-to-debug","How to debug",[322,3315,3316],{"href":2203},"Common errors",[21,3318,796],{"id":795},[14,3320,3321,3322],{},"Combining Baserow and axiom.ai automations allows you to have a data store that is scalable to store your data - from scraping data, to keeping track of a list of contacts, the possibilities are only limited by your own imagination. We are excited to see what you build with this guide - let us know over in our ",[322,3323,3326],{"href":3324,"rel":3325},"https:\u002F\u002Fwww.reddit.com\u002Fr\u002Faxiom_ai",[2245],"community",[14,3328,3329],{},"Information correct as of 15th January 2025, changes to either platforms may require updates",[14,3331,3332],{},[807,3333,3334,3337,3338,3342],{},[3335,3336,165],"sup",{}," Triggering your automations via webhook requires a paid subscription, see ",[322,3339,3341],{"href":3340},"\u002Fpricing","pricing"," for more details.",[811,3344,3345],{},"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 .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":494,"searchDepth":495,"depth":495,"links":3347},[3348,3349,3354,3355,3356],{"id":545,"depth":498,"text":546},{"id":2279,"depth":498,"text":2280,"children":3350},[3351,3352,3353],{"id":2286,"depth":495,"text":2287},{"id":2699,"depth":495,"text":2700},{"id":2994,"depth":495,"text":2995},{"id":3281,"depth":498,"text":2678},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"Learn how to automatically post to your Baserow account using an axiom.ai automation",{"type":90,"format":77,"intent_type":515,"intent":827,"tags":3359,"platfrom":3360},[829,830],[2246],"\u002Fguides\u002Fbaserow",{"title":2234,"description":3357},"guides\u002Fbaserow","-Fz_8RMg6DKzQOpXEctBkNifMNzq0v1CSC6yXsY-xR8",{"id":3366,"title":3367,"body":3368,"date":523,"description":4020,"extension":506,"meta":4021,"navigation":522,"order":523,"path":3398,"seo":4025,"stem":4026,"__hash__":4027},"guides\u002Fguides\u002Fblack-box.md","How to scrape Amazon product data from Black Box into a Google Sheet",{"type":8,"value":3369,"toc":4012},[3370,3372,3380,3386,3389,3400,3403,3406,3426,3430,3445,3456,3828,3831,3837,3841,3855,3859,3861,3884,3888,3901,3941,3948,3954,3956,3969,3982,3998],[11,3371],{},[14,3373,3374,3375,3379],{},"Black Box, a tool from ",[322,3376,3378],{"href":3377},"\u002Fautomate\u002Fhelium10-login","Helium10",", is a product research tool designed for Amazon sellers. It helps users find profitable products by filtering through millions of listings based on criteria like demand, competition, and sales volume.",[592,3381],{"src":3382,"className":3383,"alt":3385},"\u002Fdocs\u002Fguides\u002Fblack-box-screen-shot.webp",[3384],"mb-3","Atuomate data entry into the Black box search field.",[14,3387,3388],{},"In this guide, you'll learn how to use a bot to load the Black Box homepage, automate the input of search criteria, and click \"Search.\" The bot will then scrape the results and extract them into a Google Sheet.",[14,3390,3391,3392,3289,3396,44],{},"For this guide, we'll focus on Simple Search Mode, but the same principles apply to automating an Advanced Search. Check out our other Helium 10 guides if you're interested in automating ",[322,3393,3395],{"href":3394},"\u002Fguides\u002Fcerebro","Cerebro",[322,3397,3399],{"href":3398},"\u002Fguides\u002Fblack-box","BlackBox",[21,3401,3402],{"id":545},"Getting Started",[14,3404,3405],{},"To begin, create a Google Sheet and add two tabs for search criteria and another to store the extracted data.",[555,3407,3408,3414,3420],{},[83,3409,3410,3413],{},[29,3411,3412],{},"Create a new Google Sheet:"," If you're logged into Google, type sheet.new in your browser to quickly create a new sheet.",[83,3415,3416,3419],{},[29,3417,3418],{},"Set up tab one:"," Enter your criteria into the first tab.",[83,3421,3422,3425],{},[29,3423,3424],{},"Set up tab two:"," Name the second tab \"Products\" and leave it blank.",[21,3427,3429],{"id":3428},"how-to-automate-extracting-product-data-from-black-box","How to automate extracting product data from Black Box",[14,3431,3432,3433,3436,3437,3440,3441,3444],{},"To start building your bot, open ",[29,3434,3435],{},"axiom.ai"," and click ",[29,3438,3439],{},"\"New automation\""," to use the no-code bot builder. Then, click ",[29,3442,3443],{},"\"Add first step\""," and follow the guide.",[14,3446,3447,3448,3451,3452],{},"Download the ",[322,3449,514],{"href":3450,"download":522},"\u002Fdocs\u002Fguides\u002Ftemplates\u002Faxiom_black_box.json"," we created for this scraper. Click to learn how to ",[322,3453,3455],{"href":3454},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fimport-export\u002Fsharing","upload it.",[77,3457,3458],{},[80,3459,3460,3478,3756,3795],{},[83,3461,3462,88,3464,3466],{},[29,3463,87],{},[90,3465,92],{},[80,3467,3468,3473],{},[83,3469,3470,3472],{},[90,3471,99],{},": Search for and add the Google Sheet you created.",[83,3474,3475,3477],{},[90,3476,105],{},": Choose the tab containing the search criteria.",[83,3479,3480,88,3482,3484,3496],{},[29,3481,111],{},[90,3483,114],{},[80,3485,3486],{},[83,3487,3488,132,3490,3492,3493,3495],{},[90,3489,114],{},[90,3491,135],{}," and select ",[90,3494,139],{},". The loop step will now iterate through the search criteria in the Google Sheet.",[80,3497,3498,3518,3555,3581,3607,3633,3660],{},[83,3499,3500,88,3502,3504],{},[29,3501,121],{},[90,3503,124],{},[80,3505,3506],{},[83,3507,3508,3510,3511,44],{},[90,3509,131],{},": The URL will look something like this: ",[29,3512,3513,3514,3513],{},"\"",[322,3515,3516],{"href":3516,"rel":3517},"https:\u002F\u002Fmembers.helium10.com\u002Fblack-box\u002Fproducts?accountId=xxxxxxx",[2245],[83,3519,3520,88,3522,3525],{},[29,3521,145],{},[90,3523,3524],{},"Select list",[80,3526,3527,3538],{},[83,3528,3529,132,3531,3533,3534,3537],{},[90,3530,155],{},[90,3532,155],{},", then select the ",[90,3535,3536],{},"Market place"," dropdown.",[83,3539,3540,3542,3543,3545,3546,3549,3550,3554],{},[90,3541,953],{},": In the text field, click ",[90,3544,135],{}," and choose the Google Sheet data. In the data preview, select column ",[90,3547,3548],{},"A"," with the marketplace value.\n",[592,3551],{"src":3552,"alt":3553},"\u002Fdocs\u002Fguides\u002Fseelector-tool-black-box.webp","axiom.ai select data to insert into select list in Black Box","  \n",[83,3556,3557,88,3559,3561],{},[29,3558,170],{},[90,3560,3524],{},[80,3562,3563,3572],{},[83,3564,3565,132,3567,3533,3569,3537],{},[90,3566,155],{},[90,3568,155],{},[90,3570,3571],{},"Category",[83,3573,3574,3542,3576,3545,3578,3580],{},[90,3575,953],{},[90,3577,135],{},[90,3579,3548],{}," with the category value.",[83,3582,3583,88,3585,3587],{},[29,3584,213],{},[90,3586,3524],{},[80,3588,3589,3598],{},[83,3590,3591,132,3593,3533,3595,3537],{},[90,3592,155],{},[90,3594,155],{},[90,3596,3597],{},"Improvement range",[83,3599,3600,3542,3602,3545,3604,3606],{},[90,3601,953],{},[90,3603,135],{},[90,3605,3548],{}," with the improvement range value.",[83,3608,3609,88,3611,3613],{},[29,3610,241],{},[90,3612,3524],{},[80,3614,3615,3624],{},[83,3616,3617,132,3619,3533,3621,3537],{},[90,3618,155],{},[90,3620,155],{},[90,3622,3623],{},"Price range",[83,3625,3626,3542,3628,3545,3630,3632],{},[90,3627,953],{},[90,3629,135],{},[90,3631,3548],{}," with the price range value.",[83,3634,3635,88,3637,3640],{},[29,3636,278],{},[90,3638,3639],{},"Click element",[80,3641,3642],{},[83,3643,3644,132,3646,3648,3649,3652,3653,3656,3657,44],{},[90,3645,155],{},[90,3647,155],{},", then click on ",[90,3650,3651],{},"Custom"," and tick ",[90,3654,3655],{},"Use element text",". Finally, click ",[90,3658,3659],{},"Complete",[83,3661,3662,88,3664,3666],{},[29,3663,1203],{},[90,3665,148],{},[80,3667,3668,3675,3693,3704,3711,3736,3742,3749],{},[83,3669,3670,132,3672,3674],{},[90,3671,155],{},[90,3673,155],{}," to open the multi-selector tool.",[83,3676,3677,3678,3680,3681,3684,3685,3688,3689,3554],{},"In column ",[90,3679,3548],{},", click the arrow, then click ",[90,3682,3683],{},"Select link",". On the Black Box page, click the image in the ",[90,3686,3687],{},"Product"," column, then repeat in the row below.\n",[592,3690],{"src":3691,"alt":3692},"\u002Fdocs\u002Fguides\u002Fselect-data-black-box.webp","axiom.ai selecting data to scrape from Black Box",[83,3694,3695,3696,3699,3700,3703],{},"Press ",[90,3697,3698],{},"Shift + N"," to add a new column. On the page, select the ",[90,3701,3702],{},"Product title"," in one row, then repeat in the next.",[83,3705,3706,3707,3710],{},"Add another column. On the page, select the ",[90,3708,3709],{},"BSR",", selecting the number in one row, then repeat in the next.",[83,3712,3713,3714,3717,3718,3720,3721,3724,3725,3728,3729,3731,3732,3554],{},"To extract the ",[90,3715,3716],{},"Price",", press ",[90,3719,3698],{}," to add a new column. Then, in the new column, click the arrow and select ",[90,3722,3723],{},"Custom Selector",", insert ",[90,3726,3727],{},"[data-testid=\"table-cell-price\"]",", then press ",[90,3730,3659],{},".\n",[592,3733],{"src":3734,"alt":3735},"\u002Fdocs\u002Fguides\u002Fcustom-selector-black-box.webp","axiom.ai using a custom selector",[83,3737,3738,3739,3703],{},"Add one more column. On the page, select the ",[90,3740,3741],{},"Brand",[83,3743,3744,3745,3748],{},"Select the ",[90,3746,3747],{},"Next"," button for pagination using the right arrow key.",[83,3750,3751,3752,3755],{},"Set a maximum number of results you wish to scrape. I chose ",[90,3753,3754],{},"100"," when making this bot.",[83,3757,3758,88,3761,3763],{},[29,3759,3760],{},"3.0",[90,3762,3303],{},[80,3764,3765,3770,3776,3786],{},[83,3766,3767,3769],{},[90,3768,99],{},": Select your Google Sheet.",[83,3771,3772,3775],{},[90,3773,3774],{},"Sheet Name",": Choose the tab where you want to write the Amazon product data.",[83,3777,3778,132,3780,3782,3783,44],{},[90,3779,465],{},[90,3781,135],{}," and choose ",[90,3784,3785],{},"scraped-data-",[83,3787,3788,261,3791,3794],{},[90,3789,3790],{},"Write Options",[90,3792,3793],{},"Add to Existing Data"," to append new data without deleting existing data.",[83,3796,3797,88,3800,3802],{},[29,3798,3799],{},"4.0",[90,3801,281],{},[80,3803,3804,3808,3812,3820],{},[83,3805,3806,3769],{},[90,3807,99],{},[83,3809,3810,3477],{},[90,3811,3774],{},[83,3813,3814,3817,3818,44],{},[90,3815,3816],{},"First Row to Delete",": Leave this set to ",[90,3819,165],{},[83,3821,3822,162,3825,44],{},[90,3823,3824],{},"Last Row to Delete",[90,3826,3827],{},"10",[14,3829,3830],{},"The Black Box automation, when completed, should resemble the diagram below.",[592,3832],{"src":3833,"className":3834,"alt":3836},"\u002Fdocs\u002Fguides\u002Fblack-box-axiom-ai-steps.webp",[3835],"mt-4","axiom.ai design pattern for building a bot to automate data extraction from helium10 tool black box",[21,3838,3840],{"id":3839},"testing-your-black-box-automation","Testing your Black Box automation",[14,3842,3843,3844,3847,3848,3851,3852,3854],{},"Once you have saved your ",[29,3845,3846],{},"Helium 10 Black Box"," automation, click ",[29,3849,3850],{},"\"Run\""," within the ",[29,3853,3435],{}," extension to start extracting Amazon product data.",[592,3856],{"src":3857,"alt":3858},"\u002Fdocs\u002Fguides\u002Fdata-google-sheet-black-box.WebP","axiom.ai data scraped into a Google Sheet",[21,3860,330],{"id":329},[77,3862,3863],{},[80,3864,3865,3873],{},[83,3866,3867,3870,3872],{},[29,3868,3869],{},"Elements not found?",[344,3871],{},"\nIf elements are not being clicked, try reselecting them. Changing marketplaces can affect selectors.",[83,3874,3875,3878,346,3880,3883],{},[29,3876,3877],{},"Keyword data not loading in time?",[344,3879],{},[90,3881,3882],{},"Step 8",", adjust the wait time. The Cerebro tool can sometimes be slow to load data.",[21,3885,3887],{"id":3886},"try-out-the-template","Try out the template",[14,3889,3890,3891,3893,3894,3897,3898,3900],{},"While creating this guide and testing ",[29,3892,3435],{}," on ",[29,3895,3896],{},"Helium 10",", we also built a ",[29,3899,514],{},". If you choose to use the template, you will need to do the following:",[77,3902,3903],{},[555,3904,3905,3914,3924,3933],{},[83,3906,3907,3910,3911,44],{},[29,3908,3909],{},"Step 1:"," Add your own ",[29,3912,3913],{},"Google Sheet",[83,3915,3916,3919,3920,3923],{},[29,3917,3918],{},"Step 2.1:"," Add the ",[29,3921,3922],{},"URL"," to the Black Box page while logged in.",[83,3925,3926,3929,3930,3932],{},[29,3927,3928],{},"Step 2.7:"," Select the ",[29,3931,1838],{}," you wish to scrape.",[83,3934,3935,3938,3939,44],{},[29,3936,3937],{},"Steps 2.8 and 2.9:"," Add your ",[29,3940,3913],{},[14,3942,3943,3944,3947],{},"Please note that this template is a ",[29,3945,3946],{},"starting point",", and you may need to customize it.",[14,3949,3950,3951,44],{},"Click to download the ",[322,3952,3953],{"href":3450,"download":522},"Black Box template",[21,3955,796],{"id":795},[14,3957,3958,3959,3962,3963,3965,3966,3968],{},"Extracting product data from ",[29,3960,3961],{},"Black Box"," is straightforward. You can simply point and select the data you want to extract. Some fields, like ",[29,3964,3716],{},", may require a ",[29,3967,381],{},", but it’s easy to set up.",[14,3970,3971,3972,3975,3976,3979,3980,3932],{},"You can fully customize this ",[29,3973,3974],{},"automation"," by adding the ",[29,3977,3978],{},"search criteria"," you want and selecting the ",[29,3981,1838],{},[14,3983,3984,3985,3988,3989,3991,3992,44],{},"The same methods also apply to ",[29,3986,3987],{},"Advanced Search Mode",". If you need help automating ",[29,3990,3896],{},", reach out to ",[29,3993,3994],{},[322,3995,3997],{"href":3996},"mailto:support@axiom.ai","support@axiom.ai",[14,3999,4000],{},[807,4001,4002,4003,4006,4007,3289,4009,4011],{},"Testing was completed on ",[29,4004,4005],{},"January 29, 2025",". Features in ",[29,4008,3896],{},[29,4010,3435],{}," may change over time, and updates may be needed.",{"title":494,"searchDepth":495,"depth":495,"links":4013},[4014,4015,4016,4017,4018,4019],{"id":545,"depth":498,"text":3402},{"id":3428,"depth":498,"text":3429},{"id":3839,"depth":498,"text":3840},{"id":329,"depth":498,"text":330},{"id":3886,"depth":498,"text":3887},{"id":795,"depth":498,"text":796},"Learn how to use axiom.ai to automate the extraction of product listings from Black Box, a Helium 10 tool. You will automate data entry by inputting criteria into the search fields, trigger the search automatically, and write the extracted data into a Google Sheet.",{"pinned":522,"type":513,"format":77,"intent_type":1049,"intent":4022,"tags":4023,"platfrom":4024},"Extract data from websites",[519,1056],[3378],{"title":3367,"description":4020},"guides\u002Fblack-box","AU_jBQq4FGoewRk0pdEfMaJX5Ns7uG8_lA0nhZAhrjE",{"id":4029,"title":4030,"body":4031,"date":523,"description":4910,"extension":506,"meta":4911,"navigation":522,"order":523,"path":4915,"seo":4916,"stem":4917,"__hash__":4918},"guides\u002Fguides\u002Fbluesky.md","How to post to Bluesky using an axiom.ai automation",{"type":8,"value":4032,"toc":4899},[4033,4035,4038,4041,4043,4052,4068,4074,4078,4090,4094,4104,4128,4145,4269,4272,4276,4284,4332,4339,4350,4470,4473,4497,4501,4514,4534,4538,4541,4880,4882,4889,4891,4896],[11,4034],{},[14,4036,4037],{},"Automating the creation of new posts to Bluesky can offer your brand an opportunity to get their voice out into a new environment quickly. This allows you to build automations that can use data to create your posts. Combine this with bots that scrape data from websites, or read data from Google Sheets and you have a powerful automation. Even better? Combine it with a schedule.",[14,4039,4040],{},"We recommend having a bit of experience with JavaScript before attempting this guide - our support team will be unable to assist with issues related to this code, or any modifications of it.",[21,4042,546],{"id":545},[14,4044,4045,4046,4051],{},"A Bluesky account is required to post on Bluesky, head to ",[322,4047,4050],{"href":4048,"rel":4049},"https:\u002F\u002Fbsky.app",[2245],"bsky.app"," to get started.",[77,4053,4054],{},[555,4055,4056,4062],{},[83,4057,4058,4061],{},[29,4059,4060],{},"Username"," - Your username can be found on your Bluesky profile.",[83,4063,4064,4067],{},[29,4065,4066],{},"App password"," - To generate an app password head into Bluesky → Settings → Privacy and security → App passwords → \"Add App Password\". Store this for later - you won't be able to access it again.",[14,4069,4070,4071,44],{},"To learn more about managing login credentials within your automations, see ",[322,4072,4073],{"href":993},"Logins",[21,4075,4077],{"id":4076},"creating-a-new-bluesky-post-using-an-axiomai-automation","Creating a new Bluesky post using an axiom.ai automation",[14,4079,4080,4081,4084,4085,4089],{},"To get started, create your automation as normal. Once you are ready to create your Bluesky post, continue with this guide. We'll show you how to use your automation data to create dynamic content. All of the code below is part of a single script which has been broken down to make it easier to follow and understand, these parts should all be combined into a single script within a single ",[322,4082,4083],{"href":2300},"Write JavaScript"," step, see ",[322,4086,4088],{"href":4087},"#full-script","full script"," for the whole script.",[639,4091,4093],{"id":4092},"step-1-creating-an-authorisation-session","Step 1: Creating an authorisation session",[14,4095,4096,4097,450,4100,4103],{},"Authorising your account is the first step to automating posting on Bluesky. To do this, you will need your ",[90,4098,4099],{},"username",[90,4101,4102],{},"app password"," to get started. To begin, create an object containing your credentials:",[719,4105,4107],{"className":756,"code":4106,"language":758,"meta":494,"style":494},"const authorisationData = {\n    \"identifier\": \"\u003CUSERNAME>.bsky.social\",\n    \"password\": \"\u003CAPP_PASSWORD>\"\n}\n",[90,4108,4109,4114,4119,4124],{"__ignoreMap":494},[727,4110,4111],{"class":729,"line":730},[727,4112,4113],{},"const authorisationData = {\n",[727,4115,4116],{"class":729,"line":498},[727,4117,4118],{},"    \"identifier\": \"\u003CUSERNAME>.bsky.social\",\n",[727,4120,4121],{"class":729,"line":495},[727,4122,4123],{},"    \"password\": \"\u003CAPP_PASSWORD>\"\n",[727,4125,4126],{"class":729,"line":1895},[727,4127,2639],{},[14,4129,4130,4131,4133,4134,450,4137,4140,4141,4144],{},"Now that you have this, we can create a method to send a ",[90,4132,627],{}," request to Bluesky to authorise your account. We'll also be creating the ",[90,4135,4136],{},"accessJwt",[90,4138,4139],{},"did"," variables to hold the two pieces of data we need from the response. We will be sending this request to the ",[90,4142,4143],{},"https:\u002F\u002Fbsky.social\u002Fxrpc\u002Fcom.atproto.server.createSession"," endpoint.",[719,4146,4148],{"className":756,"code":4147,"language":758,"meta":494,"style":494},"var accessJwt;\nvar did;\n\nconst authorise = async () => {\n    try {\n        \u002F\u002F Create a POST request and send along your credentials from the `authorisationData` variable\n        const response = await fetch(\"https:\u002F\u002Fbsky.social\u002Fxrpc\u002Fcom.atproto.server.createSession\", {\n            method: \"POST,\n            headers: { \"Content-Type\": \"application\u002Fjson\" },\n            body: JSON.stringify(authorisationData)\n        })\n\n        \u002F\u002F Something went wrong with the request, double check your credentials and the URL used above\n        if (!response.ok) throw new Error(`Something went wrong: ${response.status}`);\n\n        \u002F\u002F Parse the response\n        const result = await response.json();\n\n        \u002F\u002F Access the information in the `results` variable for later use\n        accessJwt = result.accessJwt;\n        did = result.did;\n    } catch (error) {\n        throw error;\n    }\n}\n",[90,4149,4150,4155,4160,4164,4169,4174,4179,4184,4189,4194,4199,4204,4208,4213,4218,4222,4227,4232,4236,4241,4246,4251,4256,4261,4265],{"__ignoreMap":494},[727,4151,4152],{"class":729,"line":730},[727,4153,4154],{},"var accessJwt;\n",[727,4156,4157],{"class":729,"line":498},[727,4158,4159],{},"var did;\n",[727,4161,4162],{"class":729,"line":495},[727,4163,1898],{"emptyLinePlaceholder":522},[727,4165,4166],{"class":729,"line":1895},[727,4167,4168],{},"const authorise = async () => {\n",[727,4170,4171],{"class":729,"line":1901},[727,4172,4173],{},"    try {\n",[727,4175,4176],{"class":729,"line":1973},[727,4177,4178],{},"        \u002F\u002F Create a POST request and send along your credentials from the `authorisationData` variable\n",[727,4180,4181],{"class":729,"line":2052},[727,4182,4183],{},"        const response = await fetch(\"https:\u002F\u002Fbsky.social\u002Fxrpc\u002Fcom.atproto.server.createSession\", {\n",[727,4185,4186],{"class":729,"line":2058},[727,4187,4188],{},"            method: \"POST,\n",[727,4190,4191],{"class":729,"line":2064},[727,4192,4193],{},"            headers: { \"Content-Type\": \"application\u002Fjson\" },\n",[727,4195,4196],{"class":729,"line":2087},[727,4197,4198],{},"            body: JSON.stringify(authorisationData)\n",[727,4200,4201],{"class":729,"line":2140},[727,4202,4203],{},"        })\n",[727,4205,4206],{"class":729,"line":2154},[727,4207,1898],{"emptyLinePlaceholder":522},[727,4209,4210],{"class":729,"line":1529},[727,4211,4212],{},"        \u002F\u002F Something went wrong with the request, double check your credentials and the URL used above\n",[727,4214,4215],{"class":729,"line":2178},[727,4216,4217],{},"        if (!response.ok) throw new Error(`Something went wrong: ${response.status}`);\n",[727,4219,4220],{"class":729,"line":2187},[727,4221,1898],{"emptyLinePlaceholder":522},[727,4223,4224],{"class":729,"line":2533},[727,4225,4226],{},"        \u002F\u002F Parse the response\n",[727,4228,4229],{"class":729,"line":2551},[727,4230,4231],{},"        const result = await response.json();\n",[727,4233,4234],{"class":729,"line":2559},[727,4235,1898],{"emptyLinePlaceholder":522},[727,4237,4238],{"class":729,"line":2565},[727,4239,4240],{},"        \u002F\u002F Access the information in the `results` variable for later use\n",[727,4242,4243],{"class":729,"line":2570},[727,4244,4245],{},"        accessJwt = result.accessJwt;\n",[727,4247,4248],{"class":729,"line":2591},[727,4249,4250],{},"        did = result.did;\n",[727,4252,4253],{"class":729,"line":2603},[727,4254,4255],{},"    } catch (error) {\n",[727,4257,4258],{"class":729,"line":2615},[727,4259,4260],{},"        throw error;\n",[727,4262,4263],{"class":729,"line":2630},[727,4264,2633],{},[727,4266,4267],{"class":729,"line":2636},[727,4268,2639],{},[14,4270,4271],{},"If all goes well, you'll now be authorised to continue with your script and create new posts on Bluesky.",[639,4273,4275],{"id":4274},"step-2-create-a-new-post","Step 2: Create a new post",[14,4277,4278,4279,450,4281,4283],{},"To create a new post, ensure that you have completed the step above - without completing this step you will not be authorised to post to your Bluesky account. To create a new post, we first need to construct the body of the request that is to be sent to their API. This will use the data that you stored in the ",[90,4280,4136],{},[90,4282,4139],{}," variables previously.",[719,4285,4287],{"className":756,"code":4286,"language":758,"meta":494,"style":494},"const data = {\n    \"repo\": did,\n    \"collection\": \"app.bsky.feed.post\",\n    \"record\": {\n        \"$type\": \"app.bsky.feed.post\",\n        \"text\": \"[custom-data]\",\n        \"createdAt\": `${new Date().toISOString()}`\n    }\n}\n",[90,4288,4289,4294,4299,4304,4309,4314,4319,4324,4328],{"__ignoreMap":494},[727,4290,4291],{"class":729,"line":730},[727,4292,4293],{},"const data = {\n",[727,4295,4296],{"class":729,"line":498},[727,4297,4298],{},"    \"repo\": did,\n",[727,4300,4301],{"class":729,"line":495},[727,4302,4303],{},"    \"collection\": \"app.bsky.feed.post\",\n",[727,4305,4306],{"class":729,"line":1895},[727,4307,4308],{},"    \"record\": {\n",[727,4310,4311],{"class":729,"line":1901},[727,4312,4313],{},"        \"$type\": \"app.bsky.feed.post\",\n",[727,4315,4316],{"class":729,"line":1973},[727,4317,4318],{},"        \"text\": \"[custom-data]\",\n",[727,4320,4321],{"class":729,"line":2052},[727,4322,4323],{},"        \"createdAt\": `${new Date().toISOString()}`\n",[727,4325,4326],{"class":729,"line":2058},[727,4327,2633],{},[727,4329,4330],{"class":729,"line":2064},[727,4331,2639],{},[14,4333,4334,4335,4338],{},"You'll notice in the line ",[90,4336,4337],{},"\"text\": \"[custom-data]\""," we used an axiom.ai data token - use the \"Insert data\" option to insert data from your automation into your \"text\" field to create dynamic posts that make use of your automation data.",[14,4340,4341,4342,4345,4346,4349],{},"Next, we will want to create the post itself. We will be using the ",[90,4343,4344],{},"https:\u002F\u002Fbsky.social\u002Fxrpc\u002Fcom.atproto.repo.createRecord"," endpoint. We'll also be creating a variable called ",[90,4347,4348],{},"status"," to store the status of the response.",[719,4351,4353],{"className":756,"code":4352,"language":758,"meta":494,"style":494},"var status;\n\nconst createPost = async () => {\n    \u002F\u002F Throw an error if there is no access token\n    if (!accessJwt) throw new Error(\"Access token missing\");\n\n    try {\n        \u002F\u002F Create a POST request, using the `accessJwt` variable for authorisation, and the `createPostObject()` function to create your data\n        const response = await fetch(\"https:\u002F\u002Fbsky.social\u002Fxrpc\u002Fcom.atproto.repo.createRecord\", {\n            method: \"POST\",\n            headers: {\n                \"Content-Type\": \"application\u002Fjson\",\n                \"Authorization\": `Bearer ${accessJwt}`\n            },\n            body: JSON.stringify(data)\n        })\n\n        \u002F\u002F Parse the response\n        const result = await response.json();\n\n        \u002F\u002F Access the information in the `results` variable for later use\n        status = result.validationStatus;\n    } catch (error) {\n        throw error;\n    }\n}\n",[90,4354,4355,4360,4364,4369,4374,4379,4383,4387,4392,4397,4402,4406,4411,4416,4420,4425,4429,4433,4437,4441,4445,4449,4454,4458,4462,4466],{"__ignoreMap":494},[727,4356,4357],{"class":729,"line":730},[727,4358,4359],{},"var status;\n",[727,4361,4362],{"class":729,"line":498},[727,4363,1898],{"emptyLinePlaceholder":522},[727,4365,4366],{"class":729,"line":495},[727,4367,4368],{},"const createPost = async () => {\n",[727,4370,4371],{"class":729,"line":1895},[727,4372,4373],{},"    \u002F\u002F Throw an error if there is no access token\n",[727,4375,4376],{"class":729,"line":1901},[727,4377,4378],{},"    if (!accessJwt) throw new Error(\"Access token missing\");\n",[727,4380,4381],{"class":729,"line":1973},[727,4382,1898],{"emptyLinePlaceholder":522},[727,4384,4385],{"class":729,"line":2052},[727,4386,4173],{},[727,4388,4389],{"class":729,"line":2058},[727,4390,4391],{},"        \u002F\u002F Create a POST request, using the `accessJwt` variable for authorisation, and the `createPostObject()` function to create your data\n",[727,4393,4394],{"class":729,"line":2064},[727,4395,4396],{},"        const response = await fetch(\"https:\u002F\u002Fbsky.social\u002Fxrpc\u002Fcom.atproto.repo.createRecord\", {\n",[727,4398,4399],{"class":729,"line":2087},[727,4400,4401],{},"            method: \"POST\",\n",[727,4403,4404],{"class":729,"line":2140},[727,4405,2432],{},[727,4407,4408],{"class":729,"line":2154},[727,4409,4410],{},"                \"Content-Type\": \"application\u002Fjson\",\n",[727,4412,4413],{"class":729,"line":1529},[727,4414,4415],{},"                \"Authorization\": `Bearer ${accessJwt}`\n",[727,4417,4418],{"class":729,"line":2178},[727,4419,2465],{},[727,4421,4422],{"class":729,"line":2187},[727,4423,4424],{},"            body: JSON.stringify(data)\n",[727,4426,4427],{"class":729,"line":2533},[727,4428,4203],{},[727,4430,4431],{"class":729,"line":2551},[727,4432,1898],{"emptyLinePlaceholder":522},[727,4434,4435],{"class":729,"line":2559},[727,4436,4226],{},[727,4438,4439],{"class":729,"line":2565},[727,4440,4231],{},[727,4442,4443],{"class":729,"line":2570},[727,4444,1898],{"emptyLinePlaceholder":522},[727,4446,4447],{"class":729,"line":2591},[727,4448,4240],{},[727,4450,4451],{"class":729,"line":2603},[727,4452,4453],{},"        status = result.validationStatus;\n",[727,4455,4456],{"class":729,"line":2615},[727,4457,4255],{},[727,4459,4460],{"class":729,"line":2630},[727,4461,4260],{},[727,4463,4464],{"class":729,"line":2636},[727,4465,2633],{},[727,4467,4468],{"class":729,"line":2642},[727,4469,2639],{},[14,4471,4472],{},"Finally, we are going to want to call these functions and return a response to be handled in step 3.",[719,4474,4476],{"className":756,"code":4475,"language":758,"meta":494,"style":494},"await authorise();\nawait createPost();\n\nreturn status;\n",[90,4477,4478,4483,4488,4492],{"__ignoreMap":494},[727,4479,4480],{"class":729,"line":730},[727,4481,4482],{},"await authorise();\n",[727,4484,4485],{"class":729,"line":498},[727,4486,4487],{},"await createPost();\n",[727,4489,4490],{"class":729,"line":495},[727,4491,1898],{"emptyLinePlaceholder":522},[727,4493,4494],{"class":729,"line":1895},[727,4495,4496],{},"return status;\n",[639,4498,4500],{"id":4499},"step-3-handling-the-response","Step 3: Handling the response",[14,4502,4503,4504,4506,4507,4510,4511,4513],{},"Now that your post has been posted, we can make use of your data. If all has gone well, the ",[90,4505,4348],{}," variable that has been returned will contain a string ",[90,4508,4509],{},"valid",". This will be stored in the ",[90,4512,2982],{}," data token that is output from the 'Write Javascript' step. You can use this in various steps to make a dynamic automation, such as:",[80,4515,4516,4522,4528],{},[83,4517,4518,1230],{},[322,4519,4521],{"href":4520},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fif-else-condition","If\u002Felse",[83,4523,4524,1230],{},[322,4525,4527],{"href":4526},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcontinue-if-condition-met","Continue only if a condition is met",[83,4529,4530,1230],{},[322,4531,4533],{"href":4532},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fconditionall-jump-step","Conditionally jump to another step",[639,4535,4537],{"id":4536},"full-script","Full script",[14,4539,4540],{},"As previously mentioned, this script should be contained inside a single \"Write Javascript\" step. Find the full script below:",[719,4542,4544],{"className":756,"code":4543,"language":758,"meta":494,"style":494},"const authorisationData = {\n    \"identifier\": \"\u003CUSERNAME>\",\n    \"password\": \"\u003CAPP_PASSWORD>\"\n}\n\nvar accessJwt;\nvar did;\n\nconst authorise = async () => {\n    try {\n        \u002F\u002F Create a POST request and send along your credentials from the `authorisationData` variable\n        const response = await fetch(\"https:\u002F\u002Fbsky.social\u002Fxrpc\u002Fcom.atproto.server.createSession\", {\n            method: \"POST,\n            headers: { \"Content-Type\": \"application\u002Fjson\" },\n            body: JSON.stringify(authorisationData)\n        })\n\n        \u002F\u002F Something went wrong with the request, double check your credentials and the URL used above\n        if (!response.ok) throw new Error(`Something went wrong: ${response.status}`);\n\n        \u002F\u002F Parse the response\n        const result = await response.json();\n\n        \u002F\u002F Access the information in the `results` variable for later use\n        accessJwt = result.accessJwt;\n        did = result.did;\n    } catch (error) {\n        throw error;\n    }\n}\n\nconst data = {\n    \"repo\": did,\n    \"collection\": \"app.bsky.feed.post\",\n    \"record\": {\n    \"$type\": \"app.bsky.feed.post\",\n    \"text\": \"[custom-data]\",\n    \"createdAt\": `${new Date().toISOString()}`\n    }\n}\n\nvar status;\n\nconst createPost = async () => {\n    \u002F\u002F Throw an error if there is no access token\n    if (!accessJwt) throw new Error(\"Access token missing\");\n\n    try {\n        \u002F\u002F Create a POST request, using the `accessJwt` variable for authorisation, and the `createPostObject()` function to create your data\n        const response = await fetch(\"https:\u002F\u002Fbsky.social\u002Fxrpc\u002Fcom.atproto.repo.createRecord\", {\n            method: \"POST\",\n            headers: {\n                \"Content-Type\": \"application\u002Fjson\",\n                \"Authorization\": `Bearer ${accessJwt}`\n            },\n            body: JSON.stringify(data)\n        })\n\n        \u002F\u002F Parse the response\n        const result = await response.json();\n\n        \u002F\u002F Access the information in the `results` variable for later use\n        status = result.validationStatus;\n    } catch (error) {\n        throw new Error(`Something wrong wrong: ${error}`)\n    }\n}\n\nawait authorise();\nawait createPost();\n\nreturn status;\n",[90,4545,4546,4550,4555,4559,4563,4567,4571,4575,4579,4583,4587,4591,4595,4599,4603,4607,4611,4615,4619,4623,4627,4631,4635,4639,4643,4647,4651,4655,4660,4665,4669,4674,4679,4684,4689,4694,4700,4706,4712,4717,4722,4727,4732,4737,4742,4747,4752,4757,4761,4766,4771,4776,4781,4786,4791,4795,4799,4804,4809,4814,4819,4824,4829,4834,4839,4845,4850,4855,4860,4865,4870,4875],{"__ignoreMap":494},[727,4547,4548],{"class":729,"line":730},[727,4549,4113],{},[727,4551,4552],{"class":729,"line":498},[727,4553,4554],{},"    \"identifier\": \"\u003CUSERNAME>\",\n",[727,4556,4557],{"class":729,"line":495},[727,4558,4123],{},[727,4560,4561],{"class":729,"line":1895},[727,4562,2639],{},[727,4564,4565],{"class":729,"line":1901},[727,4566,1898],{"emptyLinePlaceholder":522},[727,4568,4569],{"class":729,"line":1973},[727,4570,4154],{},[727,4572,4573],{"class":729,"line":2052},[727,4574,4159],{},[727,4576,4577],{"class":729,"line":2058},[727,4578,1898],{"emptyLinePlaceholder":522},[727,4580,4581],{"class":729,"line":2064},[727,4582,4168],{},[727,4584,4585],{"class":729,"line":2087},[727,4586,4173],{},[727,4588,4589],{"class":729,"line":2140},[727,4590,4178],{},[727,4592,4593],{"class":729,"line":2154},[727,4594,4183],{},[727,4596,4597],{"class":729,"line":1529},[727,4598,4188],{},[727,4600,4601],{"class":729,"line":2178},[727,4602,4193],{},[727,4604,4605],{"class":729,"line":2187},[727,4606,4198],{},[727,4608,4609],{"class":729,"line":2533},[727,4610,4203],{},[727,4612,4613],{"class":729,"line":2551},[727,4614,1898],{"emptyLinePlaceholder":522},[727,4616,4617],{"class":729,"line":2559},[727,4618,4212],{},[727,4620,4621],{"class":729,"line":2565},[727,4622,4217],{},[727,4624,4625],{"class":729,"line":2570},[727,4626,1898],{"emptyLinePlaceholder":522},[727,4628,4629],{"class":729,"line":2591},[727,4630,4226],{},[727,4632,4633],{"class":729,"line":2603},[727,4634,4231],{},[727,4636,4637],{"class":729,"line":2615},[727,4638,1898],{"emptyLinePlaceholder":522},[727,4640,4641],{"class":729,"line":2630},[727,4642,4240],{},[727,4644,4645],{"class":729,"line":2636},[727,4646,4245],{},[727,4648,4649],{"class":729,"line":2642},[727,4650,4250],{},[727,4652,4653],{"class":729,"line":2647},[727,4654,4255],{},[727,4656,4658],{"class":729,"line":4657},28,[727,4659,4260],{},[727,4661,4663],{"class":729,"line":4662},29,[727,4664,2633],{},[727,4666,4667],{"class":729,"line":1316},[727,4668,2639],{},[727,4670,4672],{"class":729,"line":4671},31,[727,4673,1898],{"emptyLinePlaceholder":522},[727,4675,4677],{"class":729,"line":4676},32,[727,4678,4293],{},[727,4680,4682],{"class":729,"line":4681},33,[727,4683,4298],{},[727,4685,4687],{"class":729,"line":4686},34,[727,4688,4303],{},[727,4690,4692],{"class":729,"line":4691},35,[727,4693,4308],{},[727,4695,4697],{"class":729,"line":4696},36,[727,4698,4699],{},"    \"$type\": \"app.bsky.feed.post\",\n",[727,4701,4703],{"class":729,"line":4702},37,[727,4704,4705],{},"    \"text\": \"[custom-data]\",\n",[727,4707,4709],{"class":729,"line":4708},38,[727,4710,4711],{},"    \"createdAt\": `${new Date().toISOString()}`\n",[727,4713,4715],{"class":729,"line":4714},39,[727,4716,2633],{},[727,4718,4720],{"class":729,"line":4719},40,[727,4721,2639],{},[727,4723,4725],{"class":729,"line":4724},41,[727,4726,1898],{"emptyLinePlaceholder":522},[727,4728,4730],{"class":729,"line":4729},42,[727,4731,4359],{},[727,4733,4735],{"class":729,"line":4734},43,[727,4736,1898],{"emptyLinePlaceholder":522},[727,4738,4740],{"class":729,"line":4739},44,[727,4741,4368],{},[727,4743,4745],{"class":729,"line":4744},45,[727,4746,4373],{},[727,4748,4750],{"class":729,"line":4749},46,[727,4751,4378],{},[727,4753,4755],{"class":729,"line":4754},47,[727,4756,1898],{"emptyLinePlaceholder":522},[727,4758,4759],{"class":729,"line":1753},[727,4760,4173],{},[727,4762,4764],{"class":729,"line":4763},49,[727,4765,4391],{},[727,4767,4769],{"class":729,"line":4768},50,[727,4770,4396],{},[727,4772,4774],{"class":729,"line":4773},51,[727,4775,4401],{},[727,4777,4779],{"class":729,"line":4778},52,[727,4780,2432],{},[727,4782,4784],{"class":729,"line":4783},53,[727,4785,4410],{},[727,4787,4789],{"class":729,"line":4788},54,[727,4790,4415],{},[727,4792,4793],{"class":729,"line":1048},[727,4794,2465],{},[727,4796,4797],{"class":729,"line":512},[727,4798,4424],{},[727,4800,4802],{"class":729,"line":4801},57,[727,4803,4203],{},[727,4805,4807],{"class":729,"line":4806},58,[727,4808,1898],{"emptyLinePlaceholder":522},[727,4810,4812],{"class":729,"line":4811},59,[727,4813,4226],{},[727,4815,4817],{"class":729,"line":4816},60,[727,4818,4231],{},[727,4820,4822],{"class":729,"line":4821},61,[727,4823,1898],{"emptyLinePlaceholder":522},[727,4825,4827],{"class":729,"line":4826},62,[727,4828,4240],{},[727,4830,4832],{"class":729,"line":4831},63,[727,4833,4453],{},[727,4835,4837],{"class":729,"line":4836},64,[727,4838,4255],{},[727,4840,4842],{"class":729,"line":4841},65,[727,4843,4844],{},"        throw new Error(`Something wrong wrong: ${error}`)\n",[727,4846,4848],{"class":729,"line":4847},66,[727,4849,2633],{},[727,4851,4853],{"class":729,"line":4852},67,[727,4854,2639],{},[727,4856,4858],{"class":729,"line":4857},68,[727,4859,1898],{"emptyLinePlaceholder":522},[727,4861,4863],{"class":729,"line":4862},69,[727,4864,4482],{},[727,4866,4868],{"class":729,"line":4867},70,[727,4869,4487],{},[727,4871,4873],{"class":729,"line":4872},71,[727,4874,1898],{"emptyLinePlaceholder":522},[727,4876,4878],{"class":729,"line":4877},72,[727,4879,4496],{},[21,4881,776],{"id":775},[14,4883,4884,4885,4888],{},"Once you have the script in place, hit \"Run\". If there are any errors, follow the instructions or see ",[322,4886,4887],{"href":2203},"common errors"," for more details. If successful, you will see your post appear on Bluesky - congrats!",[21,4890,796],{"id":795},[14,4892,4893,4894,44],{},"As Bluesky continues to grow in popularity, we are likely to see more and more brands move over to the social network site. Automating posting to this site has been made easy due to the protocols that they offer and when combined with axiom.ai allows you to create an automated posting bot that can do most of the heavy lifting. You can also combine this bot with a bot that posts to Facebook, X and LinkedIn using our ",[322,4895,325],{"href":324},[811,4897,4898],{},"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":494,"searchDepth":495,"depth":495,"links":4900},[4901,4902,4908,4909],{"id":545,"depth":498,"text":546},{"id":4076,"depth":498,"text":4077,"children":4903},[4904,4905,4906,4907],{"id":4092,"depth":495,"text":4093},{"id":4274,"depth":495,"text":4275},{"id":4499,"depth":495,"text":4500},{"id":4536,"depth":495,"text":4537},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"This guide explains how to automate posting to Bluesky using an axiom.ai automation with JavaScript. Learn to authorize, create posts, and handle API responses.",{"type":90,"format":77,"intent_type":1049,"intent":1050,"tags":4912,"platfrom":4913},[1052,1318],[4914],"Bluesky","\u002Fguides\u002Fbluesky",{"title":4030,"description":4910},"guides\u002Fbluesky","uSOGo6o9AUiUB0USc9agE-krmAXL848Y7oQsur_UCcI",{"id":4920,"title":4921,"body":4922,"date":523,"description":5124,"extension":506,"meta":5125,"navigation":522,"order":523,"path":5129,"seo":5130,"stem":5131,"__hash__":5132},"guides\u002Fguides\u002Fcapture-network-requests.md","How to capture network requests from a page",{"type":8,"value":4923,"toc":5118},[4924,4926,4929,4931,4934,4938,4955,5068,5085,5093,5095,5107,5109,5115],[11,4925],{},[14,4927,4928],{},"Capturing network requests from a page can be very helpful in understanding the functionality of a page, and what resources that they are loading. This can be done using your automation and some simple code.",[21,4930,546],{"id":545},[14,4932,4933],{},"To get started, create a new automation.",[21,4935,4937],{"id":4936},"capturing-network-requests","Capturing network requests",[14,4939,4940,4941,4944,4945,4947,4948,4951,4952,4954],{},"As the first step in your automation, add a ",[322,4942,124],{"href":4943},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fgo-to-page"," step. Then, add a ",[322,4946,2301],{"href":2300}," step to your automation. The following will return an array of arrays that contains the ",[90,4949,4950],{},"entryType"," and the ",[90,4953,2009],{}," of the entries.",[719,4956,4958],{"className":756,"code":4957,"language":758,"meta":494,"style":494},"var resources = [];\n\n\u002F\u002F Grab the resources\nconst entries = window.performance.getEntriesByType(\"resource\");\n\n\u002F\u002F Loop through the PerformanceEntry objects that were returned, add these to the `resources` array.\nentries.forEach((entry) => {\n    resources.push([entry.entryType, entry.name]);\n})\n\n\u002F\u002F Return the data\nreturn resources;\n",[90,4959,4960,4974,4978,4983,5006,5010,5015,5036,5047,5052,5056,5061],{"__ignoreMap":494},[727,4961,4962,4965,4968,4971],{"class":729,"line":730},[727,4963,4964],{"class":1986},"var",[727,4966,4967],{"class":768}," resources ",[727,4969,4970],{"class":1986},"=",[727,4972,4973],{"class":768}," [];\n",[727,4975,4976],{"class":729,"line":498},[727,4977,1898],{"emptyLinePlaceholder":522},[727,4979,4980],{"class":729,"line":495},[727,4981,4982],{"class":2920},"\u002F\u002F Grab the resources\n",[727,4984,4985,4987,4990,4992,4995,4998,5000,5003],{"class":729,"line":1895},[727,4986,2315],{"class":1986},[727,4988,4989],{"class":1882}," entries",[727,4991,2321],{"class":1986},[727,4993,4994],{"class":768}," window.performance.",[727,4996,4997],{"class":2376},"getEntriesByType",[727,4999,2542],{"class":768},[727,5001,5002],{"class":737},"\"resource\"",[727,5004,5005],{"class":768},");\n",[727,5007,5008],{"class":729,"line":1901},[727,5009,1898],{"emptyLinePlaceholder":522},[727,5011,5012],{"class":729,"line":1973},[727,5013,5014],{"class":2920},"\u002F\u002F Loop through the PerformanceEntry objects that were returned, add these to the `resources` array.\n",[727,5016,5017,5020,5023,5026,5029,5032,5034],{"class":729,"line":2052},[727,5018,5019],{"class":768},"entries.",[727,5021,5022],{"class":2376},"forEach",[727,5024,5025],{"class":768},"((",[727,5027,5028],{"class":733},"entry",[727,5030,5031],{"class":768},") ",[727,5033,2388],{"class":1986},[727,5035,2391],{"class":768},[727,5037,5038,5041,5044],{"class":729,"line":2058},[727,5039,5040],{"class":768},"    resources.",[727,5042,5043],{"class":2376},"push",[727,5045,5046],{"class":768},"([entry.entryType, entry.name]);\n",[727,5048,5049],{"class":729,"line":2064},[727,5050,5051],{"class":768},"})\n",[727,5053,5054],{"class":729,"line":2087},[727,5055,1898],{"emptyLinePlaceholder":522},[727,5057,5058],{"class":729,"line":2140},[727,5059,5060],{"class":2920},"\u002F\u002F Return the data\n",[727,5062,5063,5065],{"class":729,"line":2154},[727,5064,2972],{"class":1986},[727,5066,5067],{"class":768}," resources;\n",[14,5069,5070,5071,5074,5075,5080,5081,44],{},"The ",[90,5072,5073],{},"window.performance.getEntriesByType(\"resource\")"," will return an array of ",[322,5076,5079],{"href":5077,"rel":5078},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FPerformanceEntry",[2245],"PerformanceEntry"," objects that can be used to access the resources. Check out the developer documentation for more information on the information that can be accessed using this function: ",[322,5082,5084],{"href":5077,"rel":5083},[2245],"developer.mozilla.org",[14,5086,5087,5088,5090,5091,1230],{},"You'll find the data retrieved in the ",[90,5089,2982],{}," data token. This can be used in later steps of your automation, for example, written to a Google Sheet using the ",[322,5092,3303],{"href":3302},[21,5094,776],{"id":775},[14,5096,5097,5098,5100,5101,5103,5104,5106],{},"To test, ensure that you have a URL set within the \"Go to page\" step. Next, you can use the ",[322,5099,2990],{"href":2989}," step, or the ",[322,5102,3303],{"href":3302}," step to output the ",[90,5105,2982],{}," data token that should contain the data regarding the network requests that have been captured.",[21,5108,796],{"id":795},[14,5110,5111,5112,44],{},"These are numerous reasons why you may wish to capture network requests on a third-party website, including integration testing, security testing, or even learning and development opportunities. axiom.ai gives you the ability to do this with ease using just two steps. We are excited to see what you do with this - let us know over in our ",[322,5113,3326],{"href":3324,"rel":5114},[2245],[811,5116,5117],{},"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 .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}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":494,"searchDepth":495,"depth":495,"links":5119},[5120,5121,5122,5123],{"id":545,"depth":498,"text":546},{"id":4936,"depth":498,"text":4937},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"Learn how to capture network requests from a page using an axiom.ai automation",{"type":90,"format":77,"intent_type":515,"intent":4022,"tags":5126,"platfrom":5128},[5127],"network",[1757],"\u002Fguides\u002Fcapture-network-requests",{"title":4921,"description":5124},"guides\u002Fcapture-network-requests","JsO_-iPRJHagJQUyy7vbL4Te9w9V9n4dCxm6lj_4xOY",{"id":5134,"title":5135,"body":5136,"date":523,"description":5824,"extension":506,"meta":5825,"navigation":522,"order":523,"path":3394,"seo":5828,"stem":5829,"__hash__":5830},"guides\u002Fguides\u002Fcerebro.md","How to download ASIN data from Cerebro into a Google Sheet",{"type":8,"value":5137,"toc":5815},[5138,5140,5152,5157,5168,5171,5180,5182,5184,5194,5226,5230,5232,5235,5242,5633,5636,5641,5645,5647,5659,5665,5691,5695,5697,5705,5757,5761,5766,5768,5770,5792,5802,5804],[11,5139],{},[14,5141,5142,5143,5147,5148,5151],{},"Cerebro is a tool from ",[29,5144,5145],{},[322,5146,3378],{"href":3377}," that allows Amazon sellers to conduct ",[29,5149,5150],{},"reverse ASIN lookups",". It helps identify keywords for which a competitor's product is ranking, providing insights into keyword volume. Extracting keywords is tedious, but a bot can automate it for you, ensuring you get the most out of your Helium10 subscription.",[592,5153],{"src":5154,"className":5155,"alt":5156},"\u002Fdocs\u002Fguides\u002Fcerebro-search-field.webp",[3384],"Atuomate data entry into the Cerebro search field.",[14,5158,5159,5160,5163,5164,5167],{},"In this guide, you'll learn how to use a bot to load the ",[29,5161,5162],{},"Cerebro homepage",", enter 10 ASINs into the search field, and click ",[29,5165,5166],{},"\"Get Keywords.\""," The bot will then scroll the page, click \"Export,\" and download the CSV file. After that, it will import the CSV and write the data to a Google Sheet. Once the bot completes its first loop, it will delete the processed ASINs and repeat the loop with a new set of ASINs.",[14,5169,5170],{},"We also chose to export the data rather than scrape it directly from the page because exporting is significantly faster than scraping page by page if we want all the data.",[14,5172,5173,5174,3289,5176,44],{},"Check out our other Helium10 guides if you're interested in automating ",[322,5175,3961],{"href":3398},[322,5177,5179],{"href":5178},"\u002Fguides\u002FMagnet","Magnet",[21,5181,546],{"id":545},[11,5183],{},[14,5185,5186,5187,5189,5190,5193],{},"To begin, create a ",[29,5188,3913],{}," and add two tabs: one for ",[29,5191,5192],{},"ASINs"," and another for storing extracted data.",[77,5195,5196],{},[555,5197,5198,5207,5217],{},[83,5199,5200,5202,5203,5206],{},[29,5201,3412],{}," If you're logged into Google, type ",[90,5204,5205],{},"sheet.new"," in your browser to quickly create a new sheet.",[83,5208,5209,3938,5211,5214,5215,44],{},[29,5210,3418],{},[29,5212,5213],{},"ASIN numbers"," into the first tab, column ",[29,5216,3548],{},[83,5218,5219,5221,5222,5225],{},[29,5220,3424],{}," Name the second tab ",[29,5223,5224],{},"\"ASIN data\""," and leave it blank.",[21,5227,5229],{"id":5228},"how-to-automate-extracting-the-asin-data","How to automate extracting the ASIN data",[11,5231],{},[14,5233,5234],{},"To start building your bot, open axiom.ai and click \"New Automation\" to launch the no-code bot builder. Then, click \"Add First Step\" and follow the guide.",[14,5236,3447,5237,3451,5240],{},[322,5238,514],{"href":5239,"download":522},"\u002Fdocs\u002Fguides\u002Ftemplates\u002Faxiom_helium10_cerebro.json",[322,5241,3455],{"href":3454},[77,5243,5244],{},[80,5245,5246,5272,5291,5308,5339,5362,5395,5429,5447,5467,5505,5522,5548,5582,5612],{},[83,5247,5248,88,5250,5252],{},[29,5249,87],{},[90,5251,92],{},[80,5253,5254,5258,5263],{},[83,5255,5256,3472],{},[90,5257,99],{},[83,5259,5260,5262],{},[90,5261,105],{},": Choose the tab containing the ASINs.",[83,5264,5265,5268,5269,5271],{},[90,5266,5267],{},"Last cell",": Enter ",[90,5270,3827],{},", the maximum number of ASINs we can search per loop.",[83,5273,5274,88,5276,5278],{},[29,5275,111],{},[90,5277,124],{},[80,5279,5280],{},[83,5281,5282,3510,5284,3731,5287,3554],{},[90,5283,131],{},[90,5285,5286],{},"\"members.helium10.com\u002Fcerebro\u002Famazon\u002Fview\u002Fxxxxxxxx?accountId=xxxxxxx\"",[592,5288],{"src":5289,"alt":5290},"\u002Fdocs\u002Fguides\u002Fgoto-page-cerebro.webp","axiom.ai using the go-to page step to load the Cerebro tool",[83,5292,5293,88,5295,5297],{},[29,5294,3760],{},[90,5296,114],{},[80,5298,5299],{},[83,5300,5301,132,5303,3492,5305,5307],{},[90,5302,114],{},[90,5304,135],{},[90,5306,139],{},". The loop step will now iterate through the ASINs in the Google Sheet.",[83,5309,5310,88,5312,5315],{},[29,5311,3799],{},[90,5313,5314],{},"Enter text",[80,5316,5317,5326],{},[83,5318,5319,132,5321,3492,5323,5325],{},[90,5320,953],{},[90,5322,135],{},[90,5324,139],{}," to pass the ASIN numbers from the sheet.",[83,5327,5328,5331,5332,5334,5335,3554],{},[90,5329,5330],{},"Select column",": Choose column ",[90,5333,3548],{}," in the preview.\n",[592,5336],{"src":5337,"alt":5338},"\u002Fdocs\u002Fguides\u002Fcerebro-enter-text-axiom-ai.webp","axiom.ai using the enter text step to enter ASINs in the Cerebro search field",[83,5340,5341,88,5344,5347],{},[29,5342,5343],{},"5.0",[90,5345,5346],{},"Press key(s)",[80,5348,5349],{},[83,5350,5351,5354,5355,5358,5359,44],{},[90,5352,5353],{},"Key",": Press ",[90,5356,5357],{},"Record",", then ",[90,5360,5361],{},"Tab",[83,5363,5364,88,5367,5369],{},[29,5365,5366],{},"6.0",[90,5368,3639],{},[80,5370,5371,5382],{},[83,5372,5373,132,5375,5377,5378,5381],{},[90,5374,155],{},[90,5376,155],{},", then click on the ",[90,5379,5380],{},"Get Keywords"," button.",[83,5383,5384,5386,5387,5389,5390,3656,5393,44],{},[90,5385,3651],{},": In the selector tool, click ",[90,5388,3651],{},", then tick ",[90,5391,5392],{},"Use element text instead of HTML",[90,5394,3659],{},[83,5396,5397,88,5400,5402],{},[29,5398,5399],{},"7.0",[90,5401,3639],{},[80,5403,5404,5419],{},[83,5405,5406,132,5408,3648,5410,5412,5413,3289,5416,44],{},[90,5407,155],{},[90,5409,155],{},[90,5411,3651],{}," and insert ",[90,5414,5415],{},"[data-testid=\"runnewsearch\"]",[90,5417,5418],{},"[data-testid=\"loadfromhistory\"]",[83,5420,5421,5424,5425,3554],{},[90,5422,5423],{},"Optional Click",": Tick this option, as the pop-up does not always appear.\n",[592,5426],{"src":5427,"alt":5428},"\u002Fdocs\u002Fguides\u002Fcerebro-dialog-history.webp","axiom.ai interacting with dialog in Cerebro during bot run",[83,5430,5431,88,5434,5436],{},[29,5432,5433],{},"8.0",[90,5435,2695],{},[80,5437,5438],{},[83,5439,5440,224,5443,5446],{},[90,5441,5442],{},"Wait time",[90,5444,5445],{},"7000"," to make the bot wait 7 seconds. You may need to experiment with wait time.",[83,5448,5449,88,5452,5454],{},[29,5450,5451],{},"9.0",[90,5453,3639],{},[80,5455,5456],{},[83,5457,5458,132,5460,3648,5462,5412,5464,44],{},[90,5459,155],{},[90,5461,155],{},[90,5463,3651],{},[90,5465,5466],{},"#cerebro-amazon-single-com_wrapper button[data-testid=\"exportdata\"]",[83,5468,5469,88,5472,5475],{},[29,5470,5471],{},"10.0",[90,5473,5474],{},"Download file",[80,5476,5477,5495,5500],{},[83,5478,5479,132,5481,5483,5484,3652,5486,5488,5489,5492,5493,44],{},[90,5480,155],{},[90,5482,155],{},", then click ",[90,5485,3651],{},[90,5487,5392],{},". Insert ",[90,5490,5491],{},"\"...as a CSV file.\""," Then click ",[90,5494,3659],{},[83,5496,5497,5499],{},[90,5498,1637],{},": Set a folder path to download into.",[83,5501,5502,5504],{},[90,5503,1643],{},": Enter a name to save the file as.",[83,5506,5507,88,5510,5512],{},[29,5508,5509],{},"11.0",[90,5511,2695],{},[80,5513,5514],{},[83,5515,5516,224,5518,5521],{},[90,5517,5442],{},[90,5519,5520],{},"4000"," to make the bot wait 4 seconds. You may need to experiment with wait time.",[83,5523,5524,88,5527,5530],{},[29,5525,5526],{},"12.0",[90,5528,5529],{},"Import CSV File",[80,5531,5532],{},[83,5533,5534,5537,5538,3492,5540,5543,5544,3554],{},[90,5535,5536],{},"Import CSV",": Insert the folder path, then click ",[90,5539,135],{},[90,5541,5542],{},"File-download-data"," to add the file name to the path.\n",[592,5545],{"src":5546,"alt":5547},"\u002Fdocs\u002Fguides\u002Faxiom-ai-set-file-path-import-csv.webp","axiom.ai setting file path to import CSV",[83,5549,5550,88,5553,5555],{},[29,5551,5552],{},"13.0",[90,5554,3303],{},[80,5556,5557,5561,5566,5575],{},[83,5558,5559,3769],{},[90,5560,99],{},[83,5562,5563,5565],{},[90,5564,3774],{},": Choose the tab where you want to write the ASIN data.",[83,5567,5568,132,5570,3782,5572,44],{},[90,5569,465],{},[90,5571,135],{},[90,5573,5574],{},"Imported-csv",[83,5576,5577,261,5579,5581],{},[90,5578,3790],{},[90,5580,3793],{}," to append new data without deleting the existing data.",[83,5583,5584,88,5587,5589],{},[29,5585,5586],{},"14.0",[90,5588,281],{},[80,5590,5591,5595,5600,5606],{},[83,5592,5593,3769],{},[90,5594,99],{},[83,5596,5597,5599],{},[90,5598,3774],{},": Choose the tab containing the ASIN numbers.",[83,5601,5602,3817,5604,44],{},[90,5603,3816],{},[90,5605,165],{},[83,5607,5608,162,5610,44],{},[90,5609,3824],{},[90,5611,3827],{},[83,5613,5614,88,5617,5620],{},[29,5615,5616],{},"15.0",[90,5618,5619],{},"Jump to another step",[80,5621,5622,5627],{},[83,5623,5624,3769],{},[90,5625,5626],{},"Jump to step",[83,5628,5629,5632],{},[90,5630,5631],{},"Maximum cycles",": Set the maximum number of times the bot should repeat the process.",[14,5634,5635],{},"The Cerebro automation, when completed, should resemble the diagram below.",[592,5637],{"src":5638,"className":5639,"alt":5640},"\u002Fdocs\u002Fguides\u002Fhelium10-cerebro-axiom-bot-design-pattern.webp",[3835],"axiom.ai design pattern for building a bot to automate dat extraction from helium10 tool Cerebro",[21,5642,5644],{"id":5643},"testing-your-cerebro-automation","Testing your Cerebro automation",[11,5646],{},[14,5648,3843,5649,3847,5651,3851,5653,5655,5656,44],{},[29,5650,3378],{},[29,5652,3850],{},[29,5654,3435],{}," extension to start extracting ",[29,5657,5658],{},"ASIN data",[639,5660,5662],{"id":5661},"issues-you-may-encounter",[29,5663,5664],{},"Issues you may encounter:",[555,5666,5667,5677],{},[83,5668,5669,5672,5673,5676],{},[29,5670,5671],{},"Click elements not found:"," If elements are not being clicked, you may need to reselect them. Changing ",[29,5674,5675],{},"marketplaces"," can sometimes affect selectors.",[83,5678,5679,88,5682,5684,5685,5688,5689,44],{},[29,5680,5681],{},"Keyword data not loading in time:",[29,5683,3395],{}," can sometimes be slow to load data. You may need to adjust the ",[29,5686,5687],{},"wait time"," in ",[29,5690,3882],{},[21,5692,5694],{"id":5693},"try-the-cerebro-template","Try the Cerebro template",[11,5696],{},[14,5698,3890,5699,3893,5701,3897,5703,3900],{},[29,5700,3435],{},[29,5702,3378],{},[29,5704,514],{},[555,5706,5707,5713,5725,5736,5750],{},[83,5708,5709,3910,5711,44],{},[29,5710,3909],{},[29,5712,3913],{},[83,5714,5715,5718,5719,5721,5722,44],{},[29,5716,5717],{},"Step 2:"," Insert the ",[29,5720,3922],{}," to the ",[29,5723,5724],{},"Cerebro landing page",[83,5726,5727,5718,5730,450,5733,44],{},[29,5728,5729],{},"Step 8:",[29,5731,5732],{},"download path",[29,5734,5735],{},"file name",[83,5737,5738,5741,5742,5745,5746,5749],{},[29,5739,5740],{},"Step 10:"," Set the ",[29,5743,5744],{},"import path",", including the ",[29,5747,5748],{},"download file token"," (contains the file name).",[83,5751,5752,3910,5755,44],{},[29,5753,5754],{},"Steps 11 and 12:",[29,5756,3913],{},[14,5758,3943,5759,3947],{},[29,5760,3946],{},[14,5762,3950,5763],{},[322,5764,5765],{"href":5239,"download":522},"Cerebro template.",[21,5767,796],{"id":795},[11,5769],{},[14,5771,5772,5773,5775,5776,5779,5780,5783,5784,5787,5788,5791],{},"Extracting data in ",[29,5774,3395],{}," isn’t always straightforward, but it's possible with automation. For example, ",[29,5777,5778],{},"changing marketplaces"," can affect the ",[29,5781,5782],{},"CSS selectors"," used to click on elements. I also found that, due to the ",[29,5785,5786],{},"large quantity of data",", it's ",[29,5789,5790],{},"faster to download the CSV and import it into a Google Sheet"," rather than scrape the data page by page.",[14,5793,5794,5795,3991,5797,5801],{},"If you need help automating ",[29,5796,3378],{},[29,5798,5799],{},[322,5800,3997],{"href":3996},", and we’ll help you create an automation.",[11,5803],{},[14,5805,5806],{},[807,5807,4002,5808,4006,5811,3289,5813,4011],{},[29,5809,5810],{},"January 22, 2025",[29,5812,3378],{},[29,5814,3435],{},{"title":494,"searchDepth":495,"depth":495,"links":5816},[5817,5818,5819,5822,5823],{"id":545,"depth":498,"text":546},{"id":5228,"depth":498,"text":5229},{"id":5643,"depth":498,"text":5644,"children":5820},[5821],{"id":5661,"depth":495,"text":5664},{"id":5693,"depth":498,"text":5694},{"id":795,"depth":498,"text":796},"Learn how to use axiom.ai to automate the input of ASINs into Cerebro, a Helium10 tool, then click \"Get Keywords.\" Once the keyword search is complete, axiom.ai will download a CSV of the data, and upload it into a Google Sheet.",{"type":513,"format":77,"intent_type":1049,"intent":4022,"tags":5826,"platfrom":5827},[519,1056],[3378],{"title":5135,"description":5824},"guides\u002Fcerebro","NvIDdezwXPTDtWE5l0WI_FfqwLVMWwvEpV3u3KJbqVg",{"id":5832,"title":5833,"body":5834,"date":504,"description":6137,"extension":506,"meta":6138,"navigation":522,"order":523,"path":6142,"seo":6143,"stem":6144,"__hash__":6145},"guides\u002Fguides\u002Fchatgpt-web-scraper.md","How to scrape data with ChatGPT from any website",{"type":8,"value":5835,"toc":6129},[5836,5838,5841,5843,5845,5858,5862,5872,5877,5879,5883,5890,6042,6046,6048,6050,6054,6056,6058],[11,5837],{},[14,5839,5840],{},"This template builds a web scraper that loops through links stored in a Google Sheet, opening each page in a browser. It then scrapes the page using code and passes the data to ChatGPT to extract the specific values defined by the user. After each loop, the scraper deletes a row in the Google Sheet, preparing it to process the next. A ChatGPT API key is required.",[18,5842],{},[21,5844,24],{"id":23},[14,5846,27,5847,1085,5849,5852,5853,40,5856,44],{},[29,5848,5205],{},[29,5850,5851],{},"ChatGPT Scrape","' and set up a tab called ",[29,5854,5855],{},"Links",[29,5857,465],{},[21,5859,5861],{"id":5860},"install-the-chatgpt-template","Install the ChatGPT template",[14,5863,5864,5865,5868,5869,59],{},"To install this ChatGPT template click ",[29,5866,5867],{},"Install template",". If you're a new user, you'll have to click ",[29,5870,5871],{},"Install Chrome extension",[14,5873,62,5874,44],{},[29,5875,5876],{},"start",[14,5878,68],{},[21,5880,5882],{"id":5881},"configure-your-chatgpt-scraper-in-five-easy-steps","Configure your ChatGPT scraper in Five easy steps",[14,5884,5885,5886,5889],{},"Please note in ",[90,5887,5888],{},"step 2.2 Get data from bot's current page"," you need to select a single block of content with the selector tool.",[77,5891,5892],{},[80,5893,5894,5914],{},[83,5895,5896,88,5898,5900],{},[29,5897,87],{},[90,5899,92],{},[80,5901,5902,5906],{},[83,5903,5904,100],{},[90,5905,99],{},[83,5907,5908,5910,5911,44],{},[90,5909,105],{},": Choose the sheet tab called ",[90,5912,5913],{},"\"Amazon product links\"",[83,5915,5916,88,5918,5920],{},[29,5917,111],{},[90,5919,114],{},[80,5921,5922,5937,5956,5984,6014],{},[83,5923,5924,88,5926,5928],{},[29,5925,121],{},[90,5927,124],{},[80,5929,5930],{},[83,5931,5932,1620,5934,5936],{},[90,5933,131],{},[90,5935,139],{},", and choose the column with the links.",[83,5938,5939,88,5941,5943],{},[29,5940,145],{},[90,5942,148],{},[80,5944,5945,5950],{},[83,5946,5947,5949],{},[90,5948,155],{},": Point and click to select the data you wish to scrape using a single selector.",[83,5951,5952,162,5954,44],{},[90,5953,161],{},[90,5955,165],{},[83,5957,5958,88,5960,5963],{},[29,5959,170],{},[90,5961,5962],{},"Extract data with ChatGPT",[80,5964,5965,5969,5976],{},[83,5966,5967,181],{},[90,5968,180],{},[83,5970,5971,224,5973,44],{},[90,5972,465],{},[90,5974,5975],{},"scrape-data",[83,5977,5978,5980,5981,5983],{},[90,5979,204],{},": Enter values to extract (e.g. ",[90,5982,208],{},").",[83,5985,5986,88,5988,5990],{},[29,5987,213],{},[90,5989,3303],{},[80,5991,5992,5996,6000,6007],{},[83,5993,5994,100],{},[90,5995,99],{},[83,5997,5998,255],{},[90,5999,105],{},[83,6001,6002,261,6004,44],{},[90,6003,260],{},[90,6005,6006],{},"chatgpt-data",[83,6008,6009,162,6011,44],{},[90,6010,269],{},[90,6012,6013],{},"\"Add to existing data\"",[83,6015,6016,88,6018,6020],{},[29,6017,241],{},[90,6019,281],{},[80,6021,6022,6026,6030,6036],{},[83,6023,6024,1125],{},[90,6025,99],{},[83,6027,6028,292],{},[90,6029,105],{},[83,6031,6032,162,6034,44],{},[90,6033,297],{},[90,6035,165],{},[83,6037,6038,162,6040,44],{},[90,6039,304],{},[90,6041,165],{},[21,6043,6045],{"id":6044},"testing-and-running-your-chatgpt-web-scraper","Testing and running your ChatGPT web scraper",[14,6047,313],{},[21,6049,317],{"id":316},[14,6051,320,6052,326],{},[322,6053,325],{"href":324},[21,6055,330],{"id":329},[14,6057,333],{},[77,6059,6060],{},[80,6061,6062,6078,6088,6103,6118],{},[83,6063,6064,6067,6069,6070,6072,6073,6075,6076,358],{},[29,6065,6066],{},"Want to set a number of loops?",[344,6068],{},"\nSet a ",[90,6071,353],{}," in the ",[90,6074,92],{}," step — for example, ",[90,6077,357],{},[83,6079,6080,6083,346,6085,6087],{},[29,6081,6082],{},"Not scraping content correctly?",[344,6084],{},[90,6086,148],{},", select a single block of content using the selector tool.",[83,6089,6090,6093,6095,6096,6098,6099,6072,6101,1230],{},[29,6091,6092],{},"Want to scrape the whole page?",[344,6094],{},"\nUse a ",[322,6097,381],{"href":380}," like ",[90,6100,385],{},[90,6102,148],{},[83,6104,6105,6108,6110,6111,397,6113,401,6115,6117],{},[29,6106,6107],{},"Scrape running slowly?",[344,6109],{},"\nToggle ",[90,6112,396],{},[90,6114,400],{},[90,6116,165],{}," in the same step.",[83,6119,6120,6123,476,6125,466,6127],{},[29,6121,6122],{},"Data not showing up in ChatGPT?",[344,6124],{},[90,6126,465],{},[90,6128,5975],{},{"title":494,"searchDepth":495,"depth":495,"links":6130},[6131,6132,6133,6134,6135,6136],{"id":23,"depth":498,"text":24},{"id":5860,"depth":498,"text":5861},{"id":5881,"depth":498,"text":5882},{"id":6044,"depth":498,"text":6045},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"This guide shows how to scrape website content and extract data using ChatGPT and axiom.ai. Learn to loop through links, extract values, and write results to a Google Sheet.",{"pinned":522,"read":1046,"level":510,"video":6139,"templateId":4778,"type":513,"format":514,"intent_type":1754,"intent":516,"tags":6140,"platfrom":6141},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F8Llq6EYiSuo",[519,1056],[521],"\u002Fguides\u002Fchatgpt-web-scraper",{"title":5833,"description":6137},"guides\u002Fchatgpt-web-scraper","YpEhc1e5YckB0bBSPLiATp8_oI0B1PtAh1Fb0D6gJn0",{"id":6147,"title":6148,"body":6149,"date":523,"description":6560,"extension":506,"meta":6561,"navigation":522,"order":523,"path":6566,"seo":6567,"stem":6568,"__hash__":6569},"guides\u002Fguides\u002Fcheck-for-login.md","How to automate checking if a site requires a login",{"type":8,"value":6150,"toc":6550},[6151,6153,6164,6166,6172,6176,6184,6203,6207,6217,6221,6224,6238,6257,6261,6271,6305,6327,6358,6362,6366,6373,6380,6384,6391,6459,6462,6527,6529,6532,6542],[11,6152],{},[14,6154,6155,6156,6159,6160,6163],{},"To automate tasks that depend on the state of a web page, such as whether a user is logged in or logged out, you can implement a simple check for a unique text value like ",[29,6157,6158],{},"\"Log in.\""," By using an ",[29,6161,6162],{},"\"If \u002F Else condition\""," step, your automation can dynamically decide the next actions: logging in by entering credentials and clicking the login button if the text is found, or continuing with subsequent steps if it is not. This adaptable approach ensures your automation handles different page states seamlessly, improving reliability and efficiency.",[18,6165],{},[14,6167,6168,6169,6171],{},"This guide will teach you the basic steps you need to run your bot on a site that requires you to login. Login methods may vary, and wording may vary on your site. For tips on how to manage logins within your automation, see our ",[322,6170,4073],{"href":993}," guide. For this example, we are going to store credentials within Google Sheets.",[21,6173,6175],{"id":6174},"creating-your-automation","Creating your automation",[14,6177,6178,6179,6183],{},"Create a new automation by clicking \"New automation\", and then use the ",[322,6180,6182],{"href":6181},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder","Step Finder"," to add steps. There are various stages to the automation that we are going to review, let's see them in plain English first:",[77,6185,6186],{},[555,6187,6188,6191,6194,6197,6200],{},[83,6189,6190],{},"Navigate to the page.",[83,6192,6193],{},"Check if the page is a login page.",[83,6195,6196],{},"Enter your email.",[83,6198,6199],{},"Enter your password.",[83,6201,6202],{},"Click \"login\".",[639,6204,6206],{"id":6205},"navigate-to-the-site","Navigate to the site",[14,6208,6209,6210,6212,6213,6216],{},"Use the ",[322,6211,124],{"href":4943}," step to navigate to the site that you wish to automate - this does not have to be the ",[29,6214,6215],{},"\"login\""," page as sites will often redirect to it if a login is required.",[639,6218,6220],{"id":6219},"check-if-the-page-is-a-login-page","Check if the page is a login page",[14,6222,6223],{},"There are a couple of methods of determining if the page that the bot is currently on is a login page or not. These methods both assume that you have previously encountered the login page for the site that you are automating and that you are familiar with it's structure.",[14,6225,5070,6226,6230,6231,3289,6234,6237],{},[322,6227,6229],{"href":6228},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcurrent-url","Get current bot URL"," step can be used to retrieve the current URL of the bot - this can be helpful in situations where the login page includes words like ",[29,6232,6233],{},"login\"",[29,6235,6236],{},"sign-in\"",", for example.",[14,6239,5070,6240,6243,6244,6247,6248,6252,6253,6256],{},[322,6241,148],{"href":6242},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fget-data-from-website"," step can be used to scrape the page - this can be used to scrape any elements on the login page, such as a title with ",[29,6245,6246],{},"\"Login\""," in it's contents. We recommend encapsulating this with a ",[322,6249,6251],{"href":6250},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Ftry-catch","Try \u002F Catch"," step as this will produce an error if the bot does not need to log into the site, and the ",[29,6254,6255],{},"\"Try \u002F Catch\""," step can catch this error.",[639,6258,6260],{"id":6259},"checking-the-returned-output","Checking the returned output",[14,6262,5070,6263,6265,6266,6270],{},[322,6264,6229],{"href":6228}," step will return the current URL of the bot, you will need to use an ",[322,6267,6269],{"href":6268},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fif-condtion","If condition is true, run steps"," step to check this value. Add the step and configure as described below:",[77,6272,6273],{},[80,6274,6275,6290],{},[83,6276,6277,88,6279,6282],{},[29,6278,87],{},[90,6280,6281],{},"Data to check",[80,6283,6284],{},[83,6285,6286,6289],{},[90,6287,6288],{},"[current-url]",": Select this as the value to evaluate.",[83,6291,6292,88,6294,6297],{},[29,6293,111],{},[90,6295,6296],{},"Condition to check",[80,6298,6299],{},[83,6300,6301,6304],{},[90,6302,6303],{},"Login",": Enter the text value you want to match.",[14,6306,6307,6308,6310,6311,6313,6314,6317,6318,6320,6321,6323,6324,6326],{},"If you have set up the ",[322,6309,148],{"href":6242}," step inside a ",[29,6312,6255],{}," step, you will need to insert any further steps related to the login into the ",[29,6315,6316],{},"\"try\""," portion of this step. You will need to use an ",[322,6319,6269],{"href":6268}," step to check this the value returned from the step against the value that you are looking for. Add the step inside the ",[29,6322,6316],{}," portion of the ",[29,6325,6255],{}," step, under the \"Get data from bot's current page\" step and configure as described below:",[77,6328,6329],{},[80,6330,6331,6343],{},[83,6332,6333,88,6335,6337],{},[29,6334,87],{},[90,6336,6281],{},[80,6338,6339],{},[83,6340,6341,6289],{},[90,6342,198],{},[83,6344,6345,88,6347,6349],{},[29,6346,111],{},[90,6348,6296],{},[80,6350,6351],{},[83,6352,6353,6355,6356,44],{},[90,6354,6303],{},": Enter the text value to check for, for example ",[29,6357,6246],{},[592,6359],{"src":6360,"alt":6361},"\u002Fdocs\u002Fguides\u002Fif-condition-login.jpg","axiom.ai - if condition check for value",[639,6363,6365],{"id":6364},"entering-credentials","Entering credentials",[14,6367,6368,6369,6372],{},"Next, inside of the ",[29,6370,6371],{},"\"If condition is true, run steps\""," step, add two \"Enter text\" steps. The first should be configured to enter your email\u002Fusername and the second should be configured to enter your password. If you are reading these credentials in from a third-party, such as Google Sheets, use the \"Insert data\" option to input your data tokens containing these credentials.",[14,6374,6375,6376,6379],{},"Finally, use a ",[322,6377,3639],{"href":6378},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclick-element"," step to click the \"login\" button on the site to complete the login.",[639,6381,6383],{"id":6382},"final-automation-structure","Final automation structure",[14,6385,6386,6387,6390],{},"If you used the ",[29,6388,6389],{},"\"Get bot's current URL\""," step, your automation should look similar to the structure below:",[77,6392,6393],{},[80,6394,6395,6402,6410,6451],{},[83,6396,6397,88,6399,6401],{},[29,6398,87],{},[90,6400,124],{},": Navigate to the login page.",[83,6403,6404,88,6406,6409],{},[29,6405,111],{},[90,6407,6408],{},"Get bot's current URL",": Store the current page URL.",[83,6411,6412,88,6414,6416,6417],{},[29,6413,3760],{},[90,6415,6269],{},": Run the following steps only if the condition matches.\n",[80,6418,6419,6431,6442],{},[83,6420,6421,88,6424,1995,6427,6430],{},[29,6422,6423],{},"3.1",[90,6425,6426],{},"Enter Text",[90,6428,6429],{},"Email"," type your email address.",[83,6432,6433,88,6436,1995,6438,6441],{},[29,6434,6435],{},"3.2",[90,6437,6426],{},[90,6439,6440],{},"Password"," type your password.",[83,6443,6444,88,6447,6450],{},[29,6445,6446],{},"3.3",[90,6448,6449],{},"Click Element",": Click the login button.",[83,6452,6453,88,6455,6458],{},[29,6454,3799],{},[90,6456,6457],{},"Continue flow",": Add any other steps here.",[14,6460,6461],{},"If you used the \"Get data from bot's current page\" step, your automation should look similar to the structure below:",[77,6463,6464],{},[80,6465,6466,6472,6519],{},[83,6467,6468,88,6470,6401],{},[29,6469,87],{},[90,6471,124],{},[83,6473,6474,88,6476,6478,6479],{},[29,6475,111],{},[90,6477,6251],{},": Run steps that may fail.\n",[80,6480,6481,6488],{},[83,6482,6483,88,6485,6487],{},[29,6484,121],{},[90,6486,148],{},": Select login text.",[83,6489,6490,88,6492,3731,6495],{},[29,6491,145],{},[90,6493,6494],{},"Catch",[80,6496,6497,6505,6513],{},[83,6498,6499,88,6501,1995,6503,6430],{},[29,6500,170],{},[90,6502,6426],{},[90,6504,6429],{},[83,6506,6507,88,6509,1995,6511,6441],{},[29,6508,213],{},[90,6510,6426],{},[90,6512,6440],{},[83,6514,6515,88,6517,6450],{},[29,6516,241],{},[90,6518,6449],{},[83,6520,6521,88,6523,6526],{},[29,6522,3760],{},[90,6524,6525],{},"Other steps",": Continue the flow as needed.",[21,6528,796],{"id":795},[14,6530,6531],{},"The method that you choose to use will depend on how the site that you are looking to automate handles logins - some sites will have a specific subdomain that they use, some will have a simple page, and some may even have a popup that you will need to take into consideration when building your automations.",[14,6533,6534,6535,6537,6538,3342],{},"We would also recommend reviewing our documentation on managing ",[322,6536,4073],{"href":993}," for further tips and tricks to use, including using your pre-existing login session in the cloud, see ",[322,6539,6541],{"href":6540},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fstore-cookies","Learn how to store cookies",[14,6543,6544,6545,6549],{},"Some login activity may prompt the site to display a CAPTCHA challenge to continue, see our ",[322,6546,6548],{"href":6547},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002F2captcha","2Captcha"," integration for more details on navigating sites with CAPTCHA enabled.",{"title":494,"searchDepth":495,"depth":495,"links":6551},[6552,6559],{"id":6174,"depth":498,"text":6175,"children":6553},[6554,6555,6556,6557,6558],{"id":6205,"depth":495,"text":6206},{"id":6219,"depth":495,"text":6220},{"id":6259,"depth":495,"text":6260},{"id":6364,"depth":495,"text":6365},{"id":6382,"depth":495,"text":6383},{"id":795,"depth":498,"text":796},"This guide shows how to check if a website requires login using axiom.ai. Learn to detect login pages and conditionally enter credentials using no-code steps.",{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":1050,"tags":6562,"platfrom":6564,"video":6565},[6563],"login",[1757],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FKZPOE8xisTM?rel=0&amp;","\u002Fguides\u002Fcheck-for-login",{"title":6148,"description":6560},"guides\u002Fcheck-for-login","Gp6bLGA8kKmhLnzh3lnrE73kiWexfahe6cH6I2s-xKQ",{"id":6571,"title":6572,"body":6573,"date":523,"description":7023,"extension":506,"meta":7024,"navigation":522,"order":523,"path":7029,"seo":7030,"stem":7031,"__hash__":7032},"guides\u002Fguides\u002Fcurl.md","How to use cURL to trigger an axiom.ai automation",{"type":8,"value":6574,"toc":7014},[6575,6577,6580,6582,6584,6586,6604,6608,6610,6618,6690,6693,6722,6726,6728,6732,6734,6741,6953,6961,6963,6965,6972,6993,6999,7004,7006,7008,7011],[11,6576],{},[14,6578,6579],{},"Learn how to get started with cURL to trigger your axiom.ai automations. This can be useful for triggering your automations from the command line on Windows, macOS or Linux.",[21,6581,546],{"id":545},[11,6583],{},[14,6585,551],{},[555,6587,6588,6594,6598],{},[83,6589,6590,1785,6592,44],{},[29,6591,561],{},[322,6593,566],{"href":565},[83,6595,6596,1792],{},[29,6597,571],{},[83,6599,6600,1797,6602,44],{},[29,6601,577],{},[90,6603,581],{},[21,6605,6607],{"id":6606},"trigger-an-axiomai-automation-using-curl","Trigger an axiom.ai automation using cURL",[11,6609],{},[14,6611,6612,6613,6617],{},"Open your command line to get started, and use the following command to trigger your automation. You'll need the information from the ",[322,6614,6616],{"href":6615},"#getting-started","getting started"," section of this guide.",[719,6619,6621],{"className":1848,"code":6620,"language":1850,"meta":494,"style":494},"curl -X POST https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger -H \"Content-Type: application\u002Fjson\" -d \"{\\\"key\\\": \\\"\u003CAPI_KEY>\\\", \\\"name\\\": \\\"\u003CAUTOMATION_NAME>\\\", \\\"data\\\": []\"}\"\n",[90,6622,6623],{"__ignoreMap":494},[727,6624,6625,6628,6631,6633,6636,6639,6642,6645,6648,6650,6652,6654,6656,6658,6661,6663,6665,6667,6669,6671,6673,6675,6677,6679,6681,6683,6685,6687],{"class":729,"line":730},[727,6626,6627],{"class":733},"curl",[727,6629,6630],{"class":1882}," -X",[727,6632,2075],{"class":737},[727,6634,6635],{"class":737}," https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger",[727,6637,6638],{"class":1882}," -H",[727,6640,6641],{"class":737}," \"Content-Type: application\u002Fjson\"",[727,6643,6644],{"class":1882}," -d",[727,6646,6647],{"class":737}," \"{",[727,6649,1987],{"class":1986},[727,6651,1990],{"class":737},[727,6653,1987],{"class":1986},[727,6655,1995],{"class":737},[727,6657,1987],{"class":1986},[727,6659,6660],{"class":737},"\u003CAPI_KEY>",[727,6662,1987],{"class":1986},[727,6664,2004],{"class":737},[727,6666,1987],{"class":1986},[727,6668,2009],{"class":737},[727,6670,1987],{"class":1986},[727,6672,1995],{"class":737},[727,6674,1987],{"class":1986},[727,6676,1832],{"class":737},[727,6678,1987],{"class":1986},[727,6680,2004],{"class":737},[727,6682,1987],{"class":1986},[727,6684,1838],{"class":737},[727,6686,1987],{"class":1986},[727,6688,6689],{"class":737},": []\"}\"\n",[14,6691,6692],{},"Let's break down this command:",[80,6694,6695,6700,6706,6712],{},[83,6696,6697,6699],{},[90,6698,6627],{}," - the application we are triggering.",[83,6701,6702,6705],{},[90,6703,6704],{},"-X POST"," - the HTTP method to use.",[83,6707,6708,6711],{},[90,6709,6710],{},"-h \"Content-Type: application\u002Fjson\""," - the headers to pass along with the request.",[83,6713,6714,6717,6718,44],{},[90,6715,6716],{},"-d \"{\\\"key\\\": \\\"\u003CAPI_KEY>\\\", \\\"name\\\": \\\"\u003CAUTOMATION_NAME>\\\", \\\"data\\\": []\"}"," - the data to send in the request, formatted as per our ",[322,6719,6721],{"href":6720},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frequests","trigger guide",[21,6723,6725],{"id":6724},"examples","Examples",[11,6727],{},[639,6729,6731],{"id":6730},"reporting-system-available-memory","Reporting system available memory",[11,6733],{},[14,6735,6736,6737,6740],{},"Determining the memory available on the computer your automations are running can be useful to use when running multiple instances of Axiom, here's an example using a ",[90,6738,6739],{},".bat"," file.",[719,6742,6746],{"className":6743,"code":6744,"language":6745,"meta":494,"style":494},"language-shell shiki shiki-themes github-light-default github-dark-default","@echo off\n\nrem Get the free memory value\nfor \u002Ff \"tokens=2 delims=:\" %%f in ('systeminfo ^| findstr \u002FC:\"Available Physical Memory\"') do set freememory=%%f\n\nrem Remove any commas or extra spaces\nset freememory=%freememory:,=%\nset freememory=%freememory: =%\n\nrem Send free memory to the webhook using curl\ncurl -X POST \"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger\" -H \"Content-Type: application\u002Fjson\" -d \"{\\\"key\\\": \\\"\u003CAPI_KEY>\\\", \\\"name\\\": \\\"\u003CAUTOMATION_NAME>\\\", \\\"data\\\":  [[\\\"%freememory%\\\"]]}\"\n\npause\n\n","shell",[90,6747,6748,6756,6760,6779,6804,6808,6830,6838,6848,6852,6874,6944,6948],{"__ignoreMap":494},[727,6749,6750,6753],{"class":729,"line":730},[727,6751,6752],{"class":733},"@echo",[727,6754,6755],{"class":737}," off\n",[727,6757,6758],{"class":729,"line":498},[727,6759,1898],{"emptyLinePlaceholder":522},[727,6761,6762,6765,6768,6770,6773,6776],{"class":729,"line":495},[727,6763,6764],{"class":733},"rem",[727,6766,6767],{"class":737}," Get",[727,6769,1912],{"class":737},[727,6771,6772],{"class":737}," free",[727,6774,6775],{"class":737}," memory",[727,6777,6778],{"class":737}," value\n",[727,6780,6781,6784,6787,6790,6793,6796,6798,6801],{"class":729,"line":1895},[727,6782,6783],{"class":1986},"for",[727,6785,6786],{"class":768}," \u002Ff ",[727,6788,6789],{"class":737},"\"tokens=2 delims=:\"",[727,6791,6792],{"class":768}," %%f in (",[727,6794,6795],{"class":733},"'systeminfo ^| findstr \u002FC:\"Available Physical Memory\"'",[727,6797,5031],{"class":768},[727,6799,6800],{"class":1986},"do",[727,6802,6803],{"class":768}," set freememory=%%f\n",[727,6805,6806],{"class":729,"line":1901},[727,6807,1898],{"emptyLinePlaceholder":522},[727,6809,6810,6812,6815,6818,6821,6824,6827],{"class":729,"line":1973},[727,6811,6764],{"class":733},[727,6813,6814],{"class":737}," Remove",[727,6816,6817],{"class":737}," any",[727,6819,6820],{"class":737}," commas",[727,6822,6823],{"class":737}," or",[727,6825,6826],{"class":737}," extra",[727,6828,6829],{"class":737}," spaces\n",[727,6831,6832,6835],{"class":729,"line":2052},[727,6833,6834],{"class":1882},"set",[727,6836,6837],{"class":737}," freememory=%freememory:,=%\n",[727,6839,6840,6842,6845],{"class":729,"line":2058},[727,6841,6834],{"class":1882},[727,6843,6844],{"class":737}," freememory=%freememory:",[727,6846,6847],{"class":737}," =%\n",[727,6849,6850],{"class":729,"line":2064},[727,6851,1898],{"emptyLinePlaceholder":522},[727,6853,6854,6856,6858,6860,6862,6864,6866,6869,6871],{"class":729,"line":2087},[727,6855,6764],{"class":733},[727,6857,2070],{"class":737},[727,6859,6772],{"class":737},[727,6861,6775],{"class":737},[727,6863,1889],{"class":737},[727,6865,1912],{"class":737},[727,6867,6868],{"class":737}," webhook",[727,6870,2081],{"class":737},[727,6872,6873],{"class":737}," curl\n",[727,6875,6876,6878,6880,6882,6885,6887,6889,6891,6893,6895,6897,6899,6901,6903,6905,6907,6909,6911,6913,6915,6917,6919,6921,6923,6925,6927,6929,6931,6934,6936,6939,6941],{"class":729,"line":2140},[727,6877,6627],{"class":733},[727,6879,6630],{"class":1882},[727,6881,2075],{"class":737},[727,6883,6884],{"class":737}," \"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger\"",[727,6886,6638],{"class":1882},[727,6888,6641],{"class":737},[727,6890,6644],{"class":1882},[727,6892,6647],{"class":737},[727,6894,1987],{"class":1986},[727,6896,1990],{"class":737},[727,6898,1987],{"class":1986},[727,6900,1995],{"class":737},[727,6902,1987],{"class":1986},[727,6904,6660],{"class":737},[727,6906,1987],{"class":1986},[727,6908,2004],{"class":737},[727,6910,1987],{"class":1986},[727,6912,2009],{"class":737},[727,6914,1987],{"class":1986},[727,6916,1995],{"class":737},[727,6918,1987],{"class":1986},[727,6920,1832],{"class":737},[727,6922,1987],{"class":1986},[727,6924,2004],{"class":737},[727,6926,1987],{"class":1986},[727,6928,1838],{"class":737},[727,6930,1987],{"class":1986},[727,6932,6933],{"class":737},":  [[",[727,6935,1987],{"class":1986},[727,6937,6938],{"class":737},"%freememory%",[727,6940,1987],{"class":1986},[727,6942,6943],{"class":737},"]]}\"\n",[727,6945,6946],{"class":729,"line":2154},[727,6947,1898],{"emptyLinePlaceholder":522},[727,6949,6950],{"class":729,"line":1529},[727,6951,6952],{"class":733},"pause\n",[14,6954,6955,6956,6960],{},"You'll need to add a ",[322,6957,6959],{"href":6958},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Freceive-data-from-another-app","receive data from another app"," step into your axiom.ai automation to be able to use the data within your automation.",[21,6962,776],{"id":775},[11,6964],{},[14,6966,6967,6968,6971],{},"To test your workflow, hit ",[90,6969,6970],{},"ENTER"," on your command. If successful, you will receive a link to open the automation run in your browser, for example",[719,6973,6975],{"className":1848,"code":6974,"language":1850,"meta":494,"style":494},"{\"OPEN LINK IN BROWSER\":\"https:\\\u002F\\\u002Fvnc.axiom.ai\\\u002Fvnc_lite.html?host=c-0027-v4-proxy.axiom.ai&port=443&autoconnect=true&password=xxxxxxxx&scale=local\"}\n",[90,6976,6977],{"__ignoreMap":494},[727,6978,6979,6982,6985,6988,6991],{"class":729,"line":730},[727,6980,6981],{"class":768},"{",[727,6983,6984],{"class":733},"\"OPEN LINK IN BROWSER\"",[727,6986,6987],{"class":1882},":",[727,6989,6990],{"class":733},"\"https:\\\u002F\\\u002Fvnc.axiom.ai\\\u002Fvnc_lite.html?host=c-0027-v4-proxy.axiom.ai&port=443&autoconnect=true&password=xxxxxxxx&scale=local\"",[727,6992,2639],{"class":733},[14,6994,6995,6996,6998],{},"If there are errors returned, follow the error to determine if there is an issue with the command. If the automation has errors, you can find there in the ",[322,6997,792],{"href":791}," of your account.",[14,7000,7001],{},[807,7002,7003],{},"Note: the correct format of the data, and the escaping of the quotation marks in your command are important, you may experience errors if you miss these steps.",[21,7005,796],{"id":795},[11,7007],{},[14,7009,7010],{},"cURL commands can be a good way of triggering your automations, they can be included in batch files to include them in a much larger workflow.",[811,7012,7013],{},"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}",{"title":494,"searchDepth":495,"depth":495,"links":7015},[7016,7017,7018,7021,7022],{"id":545,"depth":498,"text":546},{"id":6606,"depth":498,"text":6607},{"id":6724,"depth":498,"text":6725,"children":7019},[7020],{"id":6730,"depth":495,"text":6731},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"Learn how to use cURL to trigger your automation. This allows for your automations to be triggered using the command line.",{"type":90,"format":77,"intent_type":515,"intent":827,"tags":7025,"platfrom":7028},[6627,7026,7027,6745],"endpoint","http",[1757],"\u002Fguides\u002Fcurl",{"title":6572,"description":7023},"guides\u002Fcurl","JUl0WeNAtxxDrIUiK-rsprpK9HT3u3nOOGuvQRJOePQ",{"id":7034,"title":7035,"body":7036,"date":523,"description":7306,"extension":506,"meta":7307,"navigation":522,"order":523,"path":7312,"seo":7313,"stem":7314,"__hash__":7315},"guides\u002Fguides\u002Fdata-input.md","How to automate data input from a Google sheet into a webform",{"type":8,"value":7037,"toc":7296},[7038,7040,7047,7054,7082,7086,7088,7091,7130,7134,7136,7151,7155,7157,7160,7195,7198,7202,7205,7215,7219,7221,7224,7237,7241,7243,7246,7259,7263,7265,7271,7273,7275],[11,7039],{},[14,7041,7042,7043,7046],{},"This guide shows you how to start creating a simple bot to input data into any web form. It's a great ",[322,7044,3946],{"href":7045},"\u002Fdocs\u002Ftutorials\u002Fwebforms"," for learning how to automate form filling using bots and a Google Sheet. After adding the initial steps, simply use the [builder](\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder and customise the bot to your use case.",[14,7048,7049,7050,7053],{},"We also have a ",[322,7051,1055],{"href":7052},"\u002Fguides\u002Fdata-input-from-google-sheet"," template to get you started fast.",[555,7055,7056,7061,7066,7071,7077],{},[83,7057,7058],{},[322,7059,92],{"href":7060},".\u002Fdata-input#add-a-read-data-from-google-sheets-step",[83,7062,7063],{},[322,7064,124],{"href":7065},".\u002Fdata-input#add-a-go-to-page-step-to-load-the-web-form",[83,7067,7068],{},[322,7069,5314],{"href":7070},".\u002Fdata-input#add-an-enter-text-step-to-input-data",[83,7072,7073],{},[322,7074,7076],{"href":7075},".\u002Fdata-input#continue-adding-your-steps-as-needed","Add steps here",[83,7078,7079],{},[322,7080,3639],{"href":7081},".data-input#add-a-click-element-to-click-the-submit-button",[21,7083,7085],{"id":7084},"prepare-your-google-sheet","Prepare your Google Sheet",[11,7087],{},[14,7089,7090],{},"Create a Google sheet with some test data to run your automation with.",[7092,7093,7094,7107],"table",{},[7095,7096,7097],"thead",{},[7098,7099,7100,7104],"tr",{},[7101,7102,7103],"th",{},"Col A",[7101,7105,7106],{},"Col B",[7108,7109,7110,7118,7124],"tbody",{},[7098,7111,7112,7115],{},[7113,7114,2662],"td",{},[7113,7116,7117],{},"Surname",[7098,7119,7120,7122],{},[7113,7121,2662],{},[7113,7123,7117],{},[7098,7125,7126,7128],{},[7113,7127,2662],{},[7113,7129,7117],{},[21,7131,7133],{"id":7132},"start-from-blank-adding-the-following-steps","Start from blank, adding the following steps",[11,7135],{},[14,7137,7138,7139,7142,7143,7146,7147,7150],{},"In the axiom.ai Chrome extension dashboard, click ",[29,7140,7141],{},"\"New Automation\""," and then select \"",[29,7144,7145],{},"Add first step\"."," Use the ",[322,7148,7149],{"href":6181},"step finder"," to add the steps outlined below.",[21,7152,7154],{"id":7153},"add-a-read-data-from-a-google-sheet-step","Add a ‘Read data from a Google Sheet’ step",[11,7156],{},[14,7158,7159],{},"First we want to our test data from the Google Sheet.",[77,7161,7162],{},[555,7163,7164,7173,7178,7187],{},[83,7165,7166,7168,7169,7172],{},[29,7167,99],{}," - Search for the Google Sheet you created in the ",[29,7170,7171],{},"\"Spreadsheet","\" field. Once found, click to select.",[83,7174,7175,7177],{},[29,7176,105],{}," - Choose a sheet tab or leave blank to use the first tab.",[83,7179,7180,7183,7184,44],{},[29,7181,7182],{},"First cell"," - Start from a specified column and row, for example, ",[29,7185,7186],{},"\"A1\"",[83,7188,7189,7191,7192,44],{},[29,7190,5267],{}," - End at a specified column and row, for example, ",[29,7193,7194],{},"\"AB1\"",[14,7196,7197],{},"::tip Tip\n💡 To read a single row of data set a First and Last cell. This can be useful when you want to run a quick test run.\n::",[21,7199,7201],{"id":7200},"add-a-go-to-page-step-to-load-the-web-form","Add a ‘Go to page’ step to load the web form",[14,7203,7204],{},"Next we instruct the bot to load our webform in Chrome.",[77,7206,7207],{},[555,7208,7209],{},[83,7210,7211,7214],{},[29,7212,7213],{},"Enter URL -"," Insert the url to your webform.",[21,7216,7218],{"id":7217},"add-an-enter-text-step-to-input-data","Add an ‘Enter text’ step to input data",[11,7220],{},[14,7222,7223],{},"Next, we use an ‘Enter text’ step to input our data into a field.",[77,7225,7226],{},[555,7227,7228],{},[83,7229,7230,1021,7233,7236],{},[29,7231,7232],{},"Text -",[29,7234,7235],{},"‘Insert data’"," select ‘google-sheet-data’ to pass the message from the Sheet. Select column ‘A’ in the preview.",[21,7238,7240],{"id":7239},"add-a-click-element-to-click-the-submit-button","Add a ‘Click element’ to click the submit button",[11,7242],{},[14,7244,7245],{},"Our next step is to set up the click action for the form's 'submit' button.",[77,7247,7248],{},[555,7249,7250],{},[83,7251,7252,7254,7255,7258],{},[29,7253,155],{}," - Click ",[29,7256,7257],{},"\"Select\""," highlight the ‘submit’ button click on it and press complete.",[21,7260,7262],{"id":7261},"continue-adding-your-steps-as-needed","Continue adding your steps as needed",[11,7264],{},[14,7266,7267,7268,7270],{},"Now just use the ",[322,7269,7149],{"href":6181}," to continue adding steps and complete your data entry bot.",[21,7272,796],{"id":795},[11,7274],{},[14,7276,7277,7278,7281,7282,7286,7287,7291,7292,7295],{},"Data can be easily ",[322,7279,7280],{"href":2670},"passed into steps"," and input into form elements by adding the \"Enter text\" step. A \"Click element\" step can be used to submit the form. However, these steps alone will most likely not be enough to complete data entry into most forms. To do so, use the step finder to add additional steps to build out your automation. You will find that axiom.ai comes with ",[322,7283,7285],{"href":7284},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps","steps"," to automate many different ",[322,7288,7290],{"href":7289},"\u002Fdocs\u002Ftutorials\u002Fbrowser-actions","web actions"," performed when ",[322,7293,7294],{"href":7045},"filling in forms",", such as selecting lists, date pickers, and key presses.",{"title":494,"searchDepth":495,"depth":495,"links":7297},[7298,7299,7300,7301,7302,7303,7304,7305],{"id":7084,"depth":498,"text":7085},{"id":7132,"depth":498,"text":7133},{"id":7153,"depth":498,"text":7154},{"id":7200,"depth":498,"text":7201},{"id":7217,"depth":498,"text":7218},{"id":7239,"depth":498,"text":7240},{"id":7261,"depth":498,"text":7262},{"id":795,"depth":498,"text":796},"Learn how to create a simple bot that inputs data into a webform from a Google sheet in the browser.",{"type":513,"format":514,"intent_type":1754,"intent":7308,"tags":7309,"platfrom":7310},"Fill forms and input data",[1055,1056],[7311],"Google","\u002Fguides\u002Fdata-input",{"title":7035,"description":7306},"guides\u002Fdata-input","ccJqSmW5pioPvMgEw6MDy-tswupTYzNkIfRhrBoWSfA",{"id":7317,"title":7318,"body":7319,"date":1043,"description":7525,"extension":506,"meta":7526,"navigation":522,"order":523,"path":7052,"seo":7531,"stem":7532,"__hash__":7533},"guides\u002Fguides\u002Fdata-input-from-google-sheet.md","How to automate data entry from a google sheet",{"type":8,"value":7320,"toc":7517},[7321,7323,7326,7328,7330,7333,7337,7340,7342,7344,7348,7355,7466,7470,7473,7475,7480,7482,7484,7509],[11,7322],{},[14,7324,7325],{},"This data entry bot template automates data input through a web browser, bypassing the need for an API. The bot extracts data from a Google Sheet, launches Chrome, and mimics human actions by entering the data into a web form, followed by clicking the submit button. After each iteration, the processed row is removed from the Google Sheet.",[18,7327],{},[21,7329,853],{"id":852},[14,7331,7332],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering the shortcut 'sheet.new', assuming you already have an account. Name your sheet something like 'Data entry bot’ and set up a tab called 'Data'.",[21,7334,7336],{"id":7335},"install-the-data-entry-bot","Install the data entry bot",[14,7338,7339],{},"To install this data entry bot click 'Install template'. If you’re a new user, you’ll have to click 'Install Chrome extension' and create a free axiom.ai account before you can edit the template.",[14,7341,876],{},[14,7343,68],{},[21,7345,7347],{"id":7346},"configure-your-data-entry-bot-in-just-a-few-steps","Configure your data entry bot in just a few steps",[14,7349,7350,7351,7354],{},"We've provided a set of example steps within Step 2.0 - Loop through data. You can further customize this bot by adding additional ",[322,7352,7285],{"href":7353},"\u002Fsteps"," within this loop to suit your specific needs.",[77,7356,7357],{},[80,7358,7359,7376],{},[83,7360,7361,88,7363,7365],{},[29,7362,87],{},[90,7364,92],{},[80,7366,7367,7371],{},[83,7368,7369,100],{},[90,7370,99],{},[83,7372,7373,7375],{},[90,7374,105],{},": Choose the sheet tab with the data to be input.",[83,7377,7378,88,7380,7382],{},[29,7379,111],{},[90,7381,114],{},[80,7383,7384,7405,7425,7438],{},[83,7385,7386,88,7388,7390],{},[29,7387,121],{},[90,7389,5314],{},[80,7391,7392,7397],{},[83,7393,7394,7396],{},[90,7395,155],{},": An input field to enter data into.",[83,7398,7399,132,7401,136,7403,44],{},[90,7400,953],{},[90,7402,135],{},[90,7404,227],{},[83,7406,7407,88,7409,7411],{},[29,7408,145],{},[90,7410,5314],{},[80,7412,7413,7417],{},[83,7414,7415,7396],{},[90,7416,155],{},[83,7418,7419,132,7421,136,7423,44],{},[90,7420,953],{},[90,7422,135],{},[90,7424,227],{},[83,7426,7427,88,7429,7431],{},[29,7428,170],{},[90,7430,3639],{},[80,7432,7433],{},[83,7434,7435,7437],{},[90,7436,155],{},": The submit form button.",[83,7439,7440,88,7442,7444],{},[29,7441,213],{},[90,7443,281],{},[80,7445,7446,7450,7454,7460],{},[83,7447,7448,100],{},[90,7449,99],{},[83,7451,7452,292],{},[90,7453,105],{},[83,7455,7456,162,7458,44],{},[90,7457,297],{},[90,7459,165],{},[83,7461,7462,162,7464,44],{},[90,7463,304],{},[90,7465,165],{},[21,7467,7469],{"id":7468},"run-your-data-entry-bot","Run your data entry bot",[14,7471,7472],{},"We suggest running a test first; watch the bot as it inputs data into the form, then stop the bot after a few loops.",[21,7474,317],{"id":316},[14,7476,7477,7478,326],{},"Like all axiom.ai ",[322,7479,325],{"href":324},[21,7481,330],{"id":329},[14,7483,333],{},[77,7485,7486],{},[80,7487,7488,7499],{},[83,7489,7490,7493,7495,7496,44],{},[29,7491,7492],{},"Element not found?",[344,7494],{},"\nTry reselecting or using ",[322,7497,7498],{"href":380},"custom selectors",[83,7500,7501,7504,7505,7508],{},[29,7502,7503],{},"Data entered into the wrong input?","\nAdd ",[322,7506,7507],{"href":1292},"wait steps"," between inputs.",[14,7510,483,7511,1299,7513],{},[322,7512,487],{"href":486},[322,7514,7516],{"href":7515},"\u002Fblog\u002Fhow-to-automate-data-entry","data entry from a google sheet.",{"title":494,"searchDepth":495,"depth":495,"links":7518},[7519,7520,7521,7522,7523,7524],{"id":852,"depth":498,"text":853},{"id":7335,"depth":498,"text":7336},{"id":7346,"depth":498,"text":7347},{"id":7468,"depth":498,"text":7469},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"This guide shows how to automate data entry from a Google Sheet using axiom.ai. Learn to fill web forms, submit data, and remove rows after each run.",{"pinned":522,"application":1757,"read":7527,"level":510,"video":7528,"templateId":4734,"type":513,"format":514,"intent_type":1754,"intent":7308,"tags":7529,"platfrom":7530},"6 minutes","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fdl1BVUWix1Q",[1055,1056],[7311],{"title":7318,"description":7525},"guides\u002Fdata-input-from-google-sheet","09AgODg7eakLV1yuO5mi9YekCMNHvHwvG-zuiMX2tPU",{"id":7535,"title":7536,"body":7537,"date":523,"description":7652,"extension":506,"meta":7653,"navigation":522,"order":523,"path":7657,"seo":7658,"stem":7659,"__hash__":7660},"guides\u002Fguides\u002Fdate-input.md","How to automate date inputs with the Date and time step",{"type":8,"value":7538,"toc":7647},[7539,7541,7544,7548,7550,7557,7578,7581,7585,7587,7594,7621,7628,7632,7634],[11,7540],{},[14,7542,7543],{},"Getting a date and using this within your automation can be helpful when form filling, or when keeping track of when your automation has run.",[21,7545,7547],{"id":7546},"getting-a-date-and-time","Getting a date and time",[11,7549],{},[14,7551,5070,7552,7556],{},[322,7553,7555],{"href":7554},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdate-time","Date and time"," step can be used to get a date. This has various options to get a timestamp, such as:",[77,7558,7559],{},[80,7560,7561,7567,7572],{},[83,7562,7563,7566],{},[29,7564,7565],{},"Current"," - the current date and time.",[83,7568,7569,7571],{},[29,7570,3651],{}," - various options for the date to return a date relative to the current date, such as in the past or future.",[83,7573,7574,7577],{},[29,7575,7576],{},"Reformat existing"," - reformat a date and time passed into the step, useful when using a date from a Google Sheet.",[14,7579,7580],{},"The \"Date and time\" step generates a timestamp for the exact moment the step is executed in the automation. This timestamp reflects when the \"Date and time\" step runs, not when it is referenced elsewhere. Typically, this difference is just a few milliseconds, though it may increase for larger automations. If consistency across steps is crucial, run the \"Date and time\" step immediately before the step using its output.",[21,7582,7584],{"id":7583},"using-the-timestamp","Using the timestamp",[11,7586],{},[14,7588,7589,7590,7593],{},"The \"Date and time\" step will return a ",[90,7591,7592],{},"date-and-time"," data token. This can be used in other steps using the \"Insert data\" option within steps that have inputs. Some steps that this can be used in:",[80,7595,7596,7602,7608,7614],{},[83,7597,7598,7601],{},[322,7599,5314],{"href":7600},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fenter-text"," step - to input into forms.",[83,7603,7604,7607],{},[322,7605,7606],{"href":3302},"Write to a Google Sheet"," step - to write to your Google Sheet, to keep track of when the data was created, for example.",[83,7609,7610,7613],{},[322,7611,5474],{"href":7612},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-file-step"," step - to add the date into your file or folder name.",[83,7615,7616,7620],{},[322,7617,7619],{"href":7618},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsend-an-email","Send an email"," - to add the date into your email body.",[14,7622,7623,7624,1230],{},"For automating a date picker, see the ",[322,7625,7627],{"href":7626},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdate-picker","Date picker",[21,7629,7631],{"id":7630},"see-also","See also",[11,7633],{},[80,7635,7636,7641],{},[83,7637,7638],{},[322,7639,7640],{"href":2670},"Passing data between steps",[83,7642,7643],{},[322,7644,7646],{"href":7645},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript#get-the-date-and-time-with-javascript","Getting the date and time with JavaScript",{"title":494,"searchDepth":495,"depth":495,"links":7648},[7649,7650,7651],{"id":7546,"depth":498,"text":7547},{"id":7583,"depth":498,"text":7584},{"id":7630,"depth":498,"text":7631},"Learn how to automatically retrieve the date and time, and use this within your automations for form filling, and data output.",{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":7308,"tags":7654,"platfrom":7656},[7655,7290],"date picker",[7311],"\u002Fguides\u002Fdate-input",{"title":7536,"description":7652},"guides\u002Fdate-input","P3CRi-E4MenQh4EM2RhB0DZb9Tthr_VPrkDewC5QsHw",{"id":7662,"title":7663,"body":7664,"date":523,"description":7872,"extension":506,"meta":7873,"navigation":522,"order":523,"path":7877,"seo":7878,"stem":7879,"__hash__":7880},"guides\u002Fguides\u002Fdiscord.md","How to automate posting to Discord using an axiom.ai automation",{"type":8,"value":7665,"toc":7866},[7666,7668,7671,7674,7676,7678,7681,7703,7711,7715,7717,7727,7730,7780,7783,7808,7818,7822,7824,7826,7836,7838,7840,7847,7856,7858,7863],[11,7667],{},[14,7669,7670],{},"Discord is a popular communication platform that allows for real-time interactions. It's often used amongst friends to join in activities such as gaming, but can also be used as a resource hub to provide updates and customer services to users of a specific service. You can easily use your axiom.ai automations to post new content to your Discord servers.",[14,7672,7673],{},"Note, webhooks are only available within channels inside of Discord servers.",[21,7675,546],{"id":545},[11,7677],{},[14,7679,7680],{},"To send data to Discord, you'll need the following:",[77,7682,7683],{},[555,7684,7685,7691,7697],{},[83,7686,7687,7690],{},[29,7688,7689],{},"Server"," - You'll need to have a server set up.",[83,7692,7693,7696],{},[29,7694,7695],{},"Channel"," - You'll need to have a channel set up.",[83,7698,7699,7702],{},[29,7700,7701],{},"A webhook URL"," - In the sidebar, hit the 'cog' beside the channel name, then head into \"Integrations\", then \"Webhooks\", click \"Create Webhook\", open the newly created webhook and click \"Copy Webhook URL\". Save this for later use.",[14,7704,7705,7706,44],{},"If you have any issues obtaining the webhook URL from Discord, contact ",[322,7707,7710],{"href":7708,"rel":7709},"https:\u002F\u002Fsupport.discord.com\u002Fhc\u002Fen-us",[2245],"Discord support",[21,7712,7714],{"id":7713},"post-a-discord-message-with-an-axiomai-automation","Post a Discord message with an axiom.ai automation",[11,7716],{},[14,7718,7719,7720,7723,7724,7726],{},"To send a message to a channel within your Discord server, you'll need to use the ",[322,7721,7722],{"href":494},"Trigger webhook"," step. You'll need the webhook URL from Discord detailed in the ",[322,7725,6616],{"href":6615}," section.",[14,7728,7729],{},"The payload that Discord is expecting can be found below and can be modified to your requirements:",[719,7731,7734],{"className":7732,"code":7733,"language":2585,"meta":494,"style":494},"language-json shiki shiki-themes github-light-default github-dark-default","{\n    \"content\": \"\u003CYOUR_MESSAGE>\",\n    \"username\": \"Axiom bot\",\n    \"avatar_url\": \"\u003CURL>\"\n}\n",[90,7735,7736,7741,7754,7766,7776],{"__ignoreMap":494},[727,7737,7738],{"class":729,"line":730},[727,7739,7740],{"class":768},"{\n",[727,7742,7743,7747,7749,7752],{"class":729,"line":498},[727,7744,7746],{"class":7745},"sjgCt","    \"content\"",[727,7748,1995],{"class":768},[727,7750,7751],{"class":737},"\"\u003CYOUR_MESSAGE>\"",[727,7753,2427],{"class":768},[727,7755,7756,7759,7761,7764],{"class":729,"line":495},[727,7757,7758],{"class":7745},"    \"username\"",[727,7760,1995],{"class":768},[727,7762,7763],{"class":737},"\"Axiom bot\"",[727,7765,2427],{"class":768},[727,7767,7768,7771,7773],{"class":729,"line":1895},[727,7769,7770],{"class":7745},"    \"avatar_url\"",[727,7772,1995],{"class":768},[727,7774,7775],{"class":737},"\"\u003CURL>\"\n",[727,7777,7778],{"class":729,"line":1901},[727,7779,2639],{"class":768},[14,7781,7782],{},"Let's break down each part of that payload:",[77,7784,7785],{},[80,7786,7787,7797,7802],{},[83,7788,7789,7792,7793,7796],{},[29,7790,7791],{},"content"," - this is your message contents that will be posted to the channel. You can insert text manually, or use the \"Insert data\" option to insert a data token. Learn more with our ",[322,7794,7795],{"href":2670},"passing data between steps"," tutorial.",[83,7798,7799,7801],{},[29,7800,4099],{}," - this is optional, give a name to the bot posting your message.",[83,7803,7804,7807],{},[29,7805,7806],{},"avatar_url"," - this is optional, display an avatar for the bot posting your message.",[14,7809,7810,7811,7813,7814,7817],{},"Hit \"Save\" once you are happy with your automation. Below you will find an example of this in action, we've omitted the ",[90,7812,7806],{}," in this instance and used the ",[90,7815,7816],{},"[custom-data]"," data token to pass a custom message into the webhook.",[592,7819],{"src":7820,"alt":7821},"\u002Fdocs\u002Fguides\u002Fdiscord-trigger-webhook.png","use the trigger webhook step to trigger a Discord webhook",[21,7823,776],{"id":775},[11,7825],{},[14,7827,7828,7829,7832,7833,7835],{},"Once you have your automation saved, click \"Run\" within the axiom.ai extension to get started. If successful, you should see a message appear in your Discord channel within a few seconds. If this is not successful, review any errors that appear in the builder, or within your ",[322,7830,7831],{"href":791},"Run reports",". See ",[322,7834,4887],{"href":2203}," for details on common errors and how to resolve them.",[21,7837,796],{"id":795},[11,7839],{},[14,7841,7842,7843,7846],{},"Powering up your teams messaging using Discord and axiom.ai can be help to keep your content fresh - from automating posting using content that has been stored in a Google Sheet, to content that was automatically generated using our ",[322,7844,173],{"href":7845},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fgenerate-text-with-chatgpt"," step, the possibilities are endless.",[14,7848,7849,7850,7855],{},"As with all API based tools, it's worth noting the ",[322,7851,7854],{"href":7852,"rel":7853},"https:\u002F\u002Fdiscord.com\u002Fdeveloper-hub\u002Fdocs\u002Ftopics\u002Frate-limits",[2245],"rate limits"," that Discord applies to their webhooks - if you are having issues with messages not posting correctly, this is often the first culprit.",[11,7857],{},[14,7859,7860],{},[807,7861,7862],{},"Testing was completed on 26 Nov 2024, features in Discord or axiom.ai may change from time to time and updates may need to be made.",[811,7864,7865],{},"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":494,"searchDepth":495,"depth":495,"links":7867},[7868,7869,7870,7871],{"id":545,"depth":498,"text":546},{"id":7713,"depth":498,"text":7714},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"This guide explains how to post messages to Discord using axiom.ai. Learn to use webhooks, send custom content, and automate updates to your server channels.",{"type":513,"format":77,"intent_type":1049,"intent":1050,"tags":7874,"platfrom":7875},[1052,1318],[7876],"Discord","\u002Fguides\u002Fdiscord",{"title":7663,"description":7872},"guides\u002Fdiscord","DtVJ7jyF0A0EMXMCgfnhUTXRejRG8Hijh7IPFbqO9fg",{"id":7882,"title":7883,"body":7884,"date":523,"description":8107,"extension":506,"meta":8108,"navigation":522,"order":523,"path":8111,"seo":8112,"stem":8113,"__hash__":8114},"guides\u002Fguides\u002Fentering-text-into-search-field.md","How to automate entering text into search and clicking the result",{"type":8,"value":7885,"toc":8101},[7886,7888,7891,7897,7899,7902,7941,7943,7951,8083,8085,8088,8090],[11,7887],{},[14,7889,7890],{},"This guide shows you how to start creating a bot to input text into a search field from a Google Sheet, click return to submit the search then click on the result. After adding the initial steps, simply use the [builder](\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder to customise the bot to your use case.",[14,7892,7893,7894,7896],{},"We also have a great ",[322,7895,1055],{"href":7052}," template to get you started.",[21,7898,7085],{"id":7084},[14,7900,7901],{},"Create a Google sheet with some test text to run your automation with.",[7092,7903,7904,7912],{},[7095,7905,7906],{},[7098,7907,7908,7910],{},[7101,7909,7103],{},[7101,7911,7106],{},[7108,7913,7914,7924,7931],{},[7098,7915,7916,7922],{},[7113,7917,7918],{},[322,7919,7921],{"href":7920},"mailto:alex@testemail.com","alex@testemail.com",[7113,7923,7117],{},[7098,7925,7926,7929],{},[7113,7927,7928],{},"claretestemail.com",[7113,7930,7117],{},[7098,7932,7933,7939],{},[7113,7934,7935],{},[322,7936,7938],{"href":7937},"mailto:sam@testemail.com","sam@testemail.com",[7113,7940,7117],{},[21,7942,7133],{"id":7132},[14,7944,7138,7945,7142,7947,7146,7949,7150],{},[29,7946,7141],{},[29,7948,7145],{},[322,7950,7149],{"href":6181},[77,7952,7953],{},[80,7954,7955,7976],{},[83,7956,7957,88,7959,7961],{},[29,7958,87],{},[90,7960,92],{},[80,7962,7963,7971],{},[83,7964,7965,7967,7968,7970],{},[90,7966,99],{},": Search for the Google Sheet you created in the ",[90,7969,99],{}," field. Once found, click to select.",[83,7972,7973,7975],{},[90,7974,105],{},": Choose a sheet tab or leave blank to use the first tab.",[83,7977,7978,88,7980,7982,7992],{},[29,7979,111],{},[90,7981,114],{},[80,7983,7984],{},[83,7985,7986,132,7988,136,7990,44],{},[90,7987,114],{},[90,7989,194],{},[90,7991,139],{},[80,7993,7994,8007,8036,8054,8071],{},[83,7995,7996,88,7998,8000],{},[29,7997,121],{},[90,7999,124],{},[80,8001,8002],{},[83,8003,8004,8006],{},[90,8005,131],{},": Insert the URL of the website.",[83,8008,8009,88,8011,8013],{},[29,8010,145],{},[90,8012,5314],{},[80,8014,8015,8024],{},[83,8016,8017,132,8019,8021,8022,44],{},[90,8018,155],{},[90,8020,155],{},", highlight the search field and click to select, finally press ",[90,8023,3659],{},[83,8025,8026,132,8028,136,8030,8032,8033,8035],{},[90,8027,953],{},[90,8029,194],{},[90,8031,139],{}," to pass the search term from the sheet. Select column ",[90,8034,3548],{}," in the preview.",[83,8037,8038,88,8040,8042],{},[29,8039,170],{},[90,8041,5346],{},[80,8043,8044],{},[83,8045,8046,5354,8048,5483,8050,8053],{},[90,8047,5353],{},[90,8049,5357],{},[90,8051,8052],{},"Return",", to submit the search.",[83,8055,8056,88,8058,8060],{},[29,8057,213],{},[90,8059,3639],{},[80,8061,8062],{},[83,8063,8064,132,8066,8068,8069,44],{},[90,8065,155],{},[90,8067,155],{},", highlight the search result, and press ",[90,8070,3659],{},[83,8072,8073,88,8075,8078],{},[29,8074,241],{},[90,8076,8077],{},"Delete row from Google Sheet",[80,8079,8080],{},[83,8081,8082],{},"Automatically removes the processed row to avoid duplicate scrapes in the next loop.",[21,8084,7262],{"id":7261},[14,8086,8087],{},"Now just use the step finder to continue adding steps and complete your search bot as required.",[21,8089,796],{"id":795},[14,8091,8092,8093,8097,8098,8100],{},"You can quickly scaffold a bot to ",[322,8094,8096],{"href":8095},"\u002Fdocs\u002Ftutorials\u002Fdata","enter data"," into a search field and click the first result. This can be done with just a few steps. It is then possible to add additional ",[322,8099,7285],{"href":6181}," to fully customize the bot to the use case",{"title":494,"searchDepth":495,"depth":495,"links":8102},[8103,8104,8105,8106],{"id":7084,"depth":498,"text":7085},{"id":7132,"depth":498,"text":7133},{"id":7261,"depth":498,"text":7262},{"id":795,"depth":498,"text":796},"This guide shows how to automate typing search terms from a Google Sheet into a website and clicking the result using axiom.ai’s No-code tool.",{"pinned":522,"type":513,"format":515,"intent_type":1049,"intent":7308,"tags":8109,"platfrom":8110},[1055],[1757],"\u002Fguides\u002Fentering-text-into-search-field",{"title":7883,"description":8107},"guides\u002Fentering-text-into-search-field","Hv9XgIb5ijdiaflcb9rW80QrUg7Dajvk-hculcMuJ6c",{"id":8116,"title":8117,"body":8118,"date":523,"description":8124,"extension":506,"meta":8312,"navigation":522,"order":523,"path":8318,"seo":8319,"stem":8320,"__hash__":8321},"guides\u002Fguides\u002Ferror-reporting-via-webhook.md","How to set up custom error reporting with webhooks and enriched context",{"type":8,"value":8119,"toc":8304},[8120,8122,8125,8128,8132,8136,8139,8200,8203,8207,8210,8213,8220,8259,8262,8266,8269,8276,8280,8283,8287,8290,8293,8296,8299,8301],[11,8121],{},[14,8123,8124],{},"When running automations in the cloud, it’s important to understand errors clearly so you can fix them quickly. Standard error messages work well for simple failures, but they lack the detail needed when data is transformed, filtered, or combined across multiple steps.",[14,8126,8127],{},"In these cases, having more context about what happened to the data during a run makes debugging far easier. You can create custom error messages and enrich them with data from your automation using just a few clicks. Let’s dive in.",[21,8129,8131],{"id":8130},"how-to-set-up-webhook-or-email-notifications","How to set up webhook or email notifications",[592,8133],{"src":8134,"alt":8135},"\u002Fguides\u002Fnotificaiton-on-error.webp","Axiom.ai configure notifications",[14,8137,8138],{},"To configure notifications for your automation:",[77,8140,8141],{},[555,8142,8143,8149,8159,8176,8190],{},[83,8144,8145,8146,44],{},"Inside the automation editor, click ",[90,8147,8148],{},"**Settings**",[83,8150,8151,8152,8155,8156,44],{},"Under ",[90,8153,8154],{},"**Run options**",", click ",[90,8157,8158],{},"**Notifications**",[83,8160,701,8161,8164,8165],{},[90,8162,8163],{},"**When to notify**",", for example:\n",[80,8166,8167,8170,8173],{},[83,8168,8169],{},"On error",[83,8171,8172],{},"On success",[83,8174,8175],{},"On warnings",[83,8177,8178,8179,8182,8183],{},"Choose ",[90,8180,8181],{},"**How to notify**",":\n",[80,8184,8185,8188],{},[83,8186,8187],{},"Webhook",[83,8189,6429],{},[83,8191,8192,8193,8196,8197,44],{},"Enter the ",[90,8194,8195],{},"**webhook URL**"," or one or more ",[90,8198,8199],{},"**email addresses**",[14,8201,8202],{},"By default, notifications include the run status and basic error logs. While useful, this information is often too limited when debugging more complex automations.",[21,8204,8206],{"id":8205},"how-to-enrich-your-error-message-with-data","How to enrich your error message with data",[592,8208],{"src":8209,"alt":8135},"\u002Fguides\u002Fcustom-error-message.webp",[14,8211,8212],{},"You can enrich error messages by attaching contextual data from your automation.",[14,8214,8215,8216,8219],{},"Using the step finder, search for and add the ",[29,8217,8218],{},"Add error metadata"," step. Place this step immediately after the step you want to monitor.",[77,8221,8222],{},[555,8223,8224,8231,8241,8256],{},[83,8225,8226,8227,8230],{},"Insert the ",[90,8228,8229],{},"**Add error metadata**"," step into your automation.",[83,8232,8233,8234,8237,8238,44],{},"In the ",[90,8235,8236],{},"**Message**"," field, click ",[90,8239,8240],{},"**Insert data**",[83,8242,8243,8244,8246,8247],{},"Select tokens from any step that appears before the ",[90,8245,8229],{}," step.\n",[80,8248,8249],{},[83,8250,8251,8252,8255],{},"For example, if you are manipulating scraped data with a ",[90,8253,8254],{},"**Split**"," step, you can include the output from that step.",[83,8257,8258],{},"Combine tokens and text to construct a clear, descriptive error message that explains what data was being processed at the time.",[14,8260,8261],{},"Any error that occurs after this step will automatically include the enriched message, making it much easier to understand what went wrong during the run.",[21,8263,8265],{"id":8264},"how-to-handle-runtime-errors-with-different-actions","How to handle runtime errors with different actions",[14,8267,8268],{},"In some cases, you may want your automation to take a different set of actions when an error occurs instead of failing completely.",[14,8270,8271,8272,8275],{},"This can be done using the ",[29,8273,8274],{},"Try catch"," step. Any steps placed inside the catch block will only run if the bot fails. This lets you define an alternative sequence of steps that only execute when an error occurs, instead of stopping the automation.",[21,8277,8279],{"id":8278},"how-to-ignore-errors-completely","How to ignore errors completely",[14,8281,8282],{},"If you want your automation to continue running even when certain steps fail, you can configure steps to ignore errors. This is useful when errors are expected or non critical and should not stop the entire run.",[21,8284,8286],{"id":8285},"major-update-session-recording-and-breakpoints","Major update: session recording and breakpoints",[14,8288,8289],{},"We’re working on a major update to axiom.ai that introduces session recording and breakpoints.",[14,8291,8292],{},"Run reports will include visual and text based playback of your automation. The text playback will provide a detailed commentary of what is happening in the browser at each stage of the run.",[14,8294,8295],{},"After testing this feature internally, it’s clear this is a big step forward for debugging and understanding automation behaviour. It will be useful not only for users, but also for customer support when helping diagnose issues.",[14,8297,8298],{},"Session recording will be available on higher tier plans and will be optional. For privacy, sensitive data will be automatically blurred in recordings.",[21,8300,796],{"id":795},[14,8302,8303],{},"Custom error reporting gives you far more visibility into what your automation is doing and why it failed. By combining notifications with enriched error metadata, you can diagnose issues faster and build more resilient automations.",{"title":494,"searchDepth":495,"depth":495,"links":8305},[8306,8307,8308,8309,8310,8311],{"id":8130,"depth":498,"text":8131},{"id":8205,"depth":498,"text":8206},{"id":8264,"depth":498,"text":8265},{"id":8278,"depth":498,"text":8279},{"id":8285,"depth":498,"text":8286},{"id":795,"depth":498,"text":796},{"metaTitle":8313,"type":513,"format":77,"intent_type":515,"intent":8314,"tags":8315,"platfrom":8317},"Learn how to create custom error notifications in axiom.ai using webhooks or email, and enrich error messages with automation data for faster debugging.","Generate reports and summaries",[8316],"error handling",[1757],"\u002Fguides\u002Ferror-reporting-via-webhook",{"title":8117,"description":8124},"guides\u002Ferror-reporting-via-webhook","JgQEpKk5x1YtfjjHwavxPvo9sQcmgXpwfsShaEIaSTg",{"id":8323,"title":8324,"body":8325,"date":523,"description":8741,"extension":506,"meta":8742,"navigation":522,"order":523,"path":8745,"seo":8746,"stem":8747,"__hash__":8748},"guides\u002Fguides\u002Fextract-emails.md","How to extract emails from a webpage",{"type":8,"value":8326,"toc":8733},[8327,8329,8332,8334,8337,8341,8344,8373,8376,8408,8412,8415,8522,8525,8620,8623,8711,8713,8719,8722,8724,8730],[11,8328],{},[14,8330,8331],{},"Extracting a list of email addresses can be useful when attempting to retrieve contact details from multiple websites. Not all websites will have email addresses present within the page as the trend to move to contact forms continues to grow, but the details below will help you get started.",[21,8333,546],{"id":545},[14,8335,8336],{},"To get started, create an a new automation within axiom.ai.",[21,8338,8340],{"id":8339},"extracting-email-addresses","Extracting email addresses",[14,8342,8343],{},"In order to extract email addresses from a single page, follow the steps below:",[77,8345,8346],{},[555,8347,8348,8356,8363],{},[83,8349,8350,8351,8355],{},"Add a ",[322,8352,8353],{"href":4943},[90,8354,124],{}," step to your automation, input the website that you would like to extract email addresses from.",[83,8357,8350,8358,8362],{},[322,8359,8360],{"href":2300},[90,8361,2301],{}," step, include the code below to extract the email addresses. Select the variant that works for your needs.",[83,8364,8350,8365,8369,8370,8372],{},[322,8366,8367],{"href":3302},[90,8368,7606],{}," step and write the ",[90,8371,2982],{}," data token to your Google Sheet.",[14,8374,8375],{},"To use this method to extract email addresses from multiple pages, follow the steps below:",[77,8377,8378],{},[555,8379,8380,8395,8405],{},[83,8381,8350,8382,8387,8388,8394],{},[322,8383,8385],{"href":8384},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-data-from-a-google-sheet-step",[90,8386,92],{}," step, this sheet should contain a list of URLs to visit. See ",[322,8389,8391],{"href":8390},".\u002Fextract-links-into-google-sheet",[90,8392,8393],{},"How to extract links and write to a Google Sheet"," for more details on how to do this.",[83,8396,8350,8397,8401,8402,8404],{},[322,8398,8399],{"href":2296},[90,8400,114],{}," step, use the ",[90,8403,139],{}," token to loop through the list of URLs.",[83,8406,8407],{},"Inside the loop, add the steps from the section above.",[639,8409,8411],{"id":8410},"scripts","Scripts",[14,8413,8414],{},"Retrieve all email addresses:",[719,8416,8418],{"className":756,"code":8417,"language":758,"meta":494,"style":494},"function getEmails() {\n    var pageHTML = document.body.innerHTML;\n    pageHTMLStr = pageHTML.toString();\n\n    emailAddresses = pageHTMLStr.match(\u002F([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\\.[a-zA-Z0-9._-]+)\u002Fgi);\n    return [emailAddresses];\n}\n",[90,8419,8420,8431,8444,8459,8463,8510,8518],{"__ignoreMap":494},[727,8421,8422,8425,8428],{"class":729,"line":730},[727,8423,8424],{"class":1986},"function",[727,8426,8427],{"class":2376}," getEmails",[727,8429,8430],{"class":768},"() {\n",[727,8432,8433,8436,8439,8441],{"class":729,"line":498},[727,8434,8435],{"class":1986},"    var",[727,8437,8438],{"class":768}," pageHTML ",[727,8440,4970],{"class":1986},[727,8442,8443],{"class":768}," document.body.innerHTML;\n",[727,8445,8446,8449,8451,8454,8457],{"class":729,"line":495},[727,8447,8448],{"class":768},"    pageHTMLStr ",[727,8450,4970],{"class":1986},[727,8452,8453],{"class":768}," pageHTML.",[727,8455,8456],{"class":2376},"toString",[727,8458,2588],{"class":768},[727,8460,8461],{"class":729,"line":1895},[727,8462,1898],{"emptyLinePlaceholder":522},[727,8464,8465,8468,8470,8473,8476,8478,8481,8484,8487,8490,8492,8494,8498,8500,8502,8505,8508],{"class":729,"line":1901},[727,8466,8467],{"class":768},"    emailAddresses ",[727,8469,4970],{"class":1986},[727,8471,8472],{"class":768}," pageHTMLStr.",[727,8474,8475],{"class":2376},"match",[727,8477,2542],{"class":768},[727,8479,8480],{"class":737},"\u002F(",[727,8482,8483],{"class":1882},"[a-zA-Z0-9._-]",[727,8485,8486],{"class":1986},"+",[727,8488,8489],{"class":737},"@",[727,8491,8483],{"class":1882},[727,8493,8486],{"class":1986},[727,8495,8497],{"class":8496},"sa8KN","\\.",[727,8499,8483],{"class":1882},[727,8501,8486],{"class":1986},[727,8503,8504],{"class":737},")\u002F",[727,8506,8507],{"class":1986},"gi",[727,8509,5005],{"class":768},[727,8511,8512,8515],{"class":729,"line":1973},[727,8513,8514],{"class":1986},"    return",[727,8516,8517],{"class":768}," [emailAddresses];\n",[727,8519,8520],{"class":729,"line":2052},[727,8521,2639],{"class":768},[14,8523,8524],{},"Retrieve all email addresses, remove duplicates:",[719,8526,8528],{"className":756,"code":8527,"language":758,"meta":494,"style":494},"function getEmails() {\n    var pageHTML = document.body.innerHTML;\n    pageHTMLStr = pageHTML.toString();\n\n    emailAddresses = pageHTMLStr.match(\u002F([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\\.[a-zA-Z0-9._-]+)\u002Fgi);\n    return [[...new Set(emailAddresses)]];\n}\n",[90,8529,8530,8538,8548,8560,8564,8600,8616],{"__ignoreMap":494},[727,8531,8532,8534,8536],{"class":729,"line":730},[727,8533,8424],{"class":1986},[727,8535,8427],{"class":2376},[727,8537,8430],{"class":768},[727,8539,8540,8542,8544,8546],{"class":729,"line":498},[727,8541,8435],{"class":1986},[727,8543,8438],{"class":768},[727,8545,4970],{"class":1986},[727,8547,8443],{"class":768},[727,8549,8550,8552,8554,8556,8558],{"class":729,"line":495},[727,8551,8448],{"class":768},[727,8553,4970],{"class":1986},[727,8555,8453],{"class":768},[727,8557,8456],{"class":2376},[727,8559,2588],{"class":768},[727,8561,8562],{"class":729,"line":1895},[727,8563,1898],{"emptyLinePlaceholder":522},[727,8565,8566,8568,8570,8572,8574,8576,8578,8580,8582,8584,8586,8588,8590,8592,8594,8596,8598],{"class":729,"line":1901},[727,8567,8467],{"class":768},[727,8569,4970],{"class":1986},[727,8571,8472],{"class":768},[727,8573,8475],{"class":2376},[727,8575,2542],{"class":768},[727,8577,8480],{"class":737},[727,8579,8483],{"class":1882},[727,8581,8486],{"class":1986},[727,8583,8489],{"class":737},[727,8585,8483],{"class":1882},[727,8587,8486],{"class":1986},[727,8589,8497],{"class":8496},[727,8591,8483],{"class":1882},[727,8593,8486],{"class":1986},[727,8595,8504],{"class":737},[727,8597,8507],{"class":1986},[727,8599,5005],{"class":768},[727,8601,8602,8604,8607,8610,8613],{"class":729,"line":1973},[727,8603,8514],{"class":1986},[727,8605,8606],{"class":768}," [[",[727,8608,8609],{"class":1986},"...new",[727,8611,8612],{"class":2376}," Set",[727,8614,8615],{"class":768},"(emailAddresses)]];\n",[727,8617,8618],{"class":729,"line":2052},[727,8619,2639],{"class":768},[14,8621,8622],{},"Retrieve all email addresses that match a domain:",[719,8624,8626],{"className":756,"code":8625,"language":758,"meta":494,"style":494},"function getEmails() {\n    var pageHTML = document.body.innerHTML;\n    pageHTMLStr = pageHTML.toString();\n\n    \u002F\u002F Replace \"example.com\" with your domain\n    emailAddresses = pageHTMLStr.match(\u002F([a-zA-Z0-9._-]+@example.com)\u002Fgi);\n    return [emailAddresses]; \u002F\u002F or return [[...new Set(emailAddresses)]];\n}\n",[90,8627,8628,8636,8646,8658,8662,8667,8697,8707],{"__ignoreMap":494},[727,8629,8630,8632,8634],{"class":729,"line":730},[727,8631,8424],{"class":1986},[727,8633,8427],{"class":2376},[727,8635,8430],{"class":768},[727,8637,8638,8640,8642,8644],{"class":729,"line":498},[727,8639,8435],{"class":1986},[727,8641,8438],{"class":768},[727,8643,4970],{"class":1986},[727,8645,8443],{"class":768},[727,8647,8648,8650,8652,8654,8656],{"class":729,"line":495},[727,8649,8448],{"class":768},[727,8651,4970],{"class":1986},[727,8653,8453],{"class":768},[727,8655,8456],{"class":2376},[727,8657,2588],{"class":768},[727,8659,8660],{"class":729,"line":1895},[727,8661,1898],{"emptyLinePlaceholder":522},[727,8663,8664],{"class":729,"line":1901},[727,8665,8666],{"class":2920},"    \u002F\u002F Replace \"example.com\" with your domain\n",[727,8668,8669,8671,8673,8675,8677,8679,8681,8683,8685,8688,8690,8693,8695],{"class":729,"line":1973},[727,8670,8467],{"class":768},[727,8672,4970],{"class":1986},[727,8674,8472],{"class":768},[727,8676,8475],{"class":2376},[727,8678,2542],{"class":768},[727,8680,8480],{"class":737},[727,8682,8483],{"class":1882},[727,8684,8486],{"class":1986},[727,8686,8687],{"class":737},"@example",[727,8689,44],{"class":1882},[727,8691,8692],{"class":737},"com)\u002F",[727,8694,8507],{"class":1986},[727,8696,5005],{"class":768},[727,8698,8699,8701,8704],{"class":729,"line":2052},[727,8700,8514],{"class":1986},[727,8702,8703],{"class":768}," [emailAddresses]; ",[727,8705,8706],{"class":2920},"\u002F\u002F or return [[...new Set(emailAddresses)]];\n",[727,8708,8709],{"class":729,"line":2058},[727,8710,2639],{"class":768},[21,8712,776],{"id":775},[14,8714,8715,8716,8718],{},"Click \"Run\" on your automation, observe the builder for any errors (see ",[322,8717,2204],{"href":2203}," for more details) and your Google Sheet for changes.",[14,8720,8721],{},"Alternatively, if you are a developer, this code can be copied into the Chrome Devtools console for testing outside of your automation.",[21,8723,796],{"id":795},[14,8725,8726,8727,44],{},"Extracting email addresses from a page can be helpful from a marketing perspective, but should be used sparingly to avoid spamming potential customers. We are excited to see what you do with this - let us know over in our ",[322,8728,3326],{"href":3324,"rel":8729},[2245],[811,8731,8732],{},"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 .sa8KN, html code.shiki .sa8KN{--shiki-default:#116329;--shiki-default-font-weight:bold;--shiki-dark:#7EE787;--shiki-dark-font-weight:bold}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":494,"searchDepth":495,"depth":495,"links":8734},[8735,8736,8739,8740],{"id":545,"depth":498,"text":546},{"id":8339,"depth":498,"text":8340,"children":8737},[8738],{"id":8410,"depth":495,"text":8411},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"This guide explains how to extract email addresses from a webpage using axiom.ai and JavaScript. Learn to scrape emails, remove duplicates, and save results to Google Sheets.",{"type":513,"format":77,"intent_type":1754,"intent":4022,"tags":8743,"platfrom":8744},[519,1532],[1757],"\u002Fguides\u002Fextract-emails",{"title":8324,"description":8741},"guides\u002Fextract-emails","CLejNzPKS-oq-H37YFGLBZ31meHspwQYM6zdMsycnq0",{"id":8750,"title":8751,"body":8752,"date":523,"description":8942,"extension":506,"meta":8943,"navigation":522,"order":523,"path":8946,"seo":8947,"stem":8948,"__hash__":8949},"guides\u002Fguides\u002Fgithub.md","How to automate Github using an axiom.ai automation",{"type":8,"value":8753,"toc":8935},[8754,8756,8764,8767,8769,8772,8796,8803,8807,8813,8829,8832,8879,8890,8897,8903,8905,8914,8916,8923,8930],[11,8755],{},[14,8757,8758,8763],{},[322,8759,8762],{"href":8760,"rel":8761},"https:\u002F\u002Fgithub.com",[2245],"Github"," is a cloud-based platform for version control and collaboration, built around Git. It allows developers to store, manage, and track changes to their code, collaborate with others, and automate workflows. Key features include repositories, pull requests, issues, actions (CI\u002FCD), and security tools. It’s widely used for open-source and private projects.",[14,8765,8766],{},"Github offers many features around the use of their API and webhooks, for this guide, we will be concentrating on webhooks.",[21,8768,546],{"id":545},[14,8770,8771],{},"To get started you will need to have the following prepared:",[77,8773,8774],{},[80,8775,8776,8779,8782,8785,8790],{},[83,8777,8778],{},"A Github account",[83,8780,8781],{},"A Github repository",[83,8783,8784],{},"An axiom.ai account",[83,8786,8787,8788],{},"An axiom.ai subscription",[3335,8789,165],{},[83,8791,8792,8793],{},"Your axiom.ai API - ",[322,8794,8795],{"href":565},"API Documentation",[14,8797,8798],{},[807,8799,8800,8802],{},[3335,8801,165],{}," Subscription is required to use the \"Receive data from another app\" step",[21,8804,8806],{"id":8805},"triggering-an-automated-based-on-github-repository-event","Triggering an automated based on Github repository event",[14,8808,8809,8810,8812],{},"Github offers the ability to send a webhook when an event occurs within a repository. This defaults to ",[90,8811,5043],{}," events, but you can configure this to notify you of all events, or specific events. To create a new webhook, follow the steps below:",[77,8814,8815],{},[555,8816,8817,8820,8823,8826],{},[83,8818,8819],{},"Open your repository.",[83,8821,8822],{},"Navigate to \"Settings\".",[83,8824,8825],{},"Navigate to \"Webhooks\".",[83,8827,8828],{},"Click \"Add webhook\".",[14,8830,8831],{},"To configure your new webhook, use the following settings:",[77,8833,8834],{},[80,8835,8836,8849,8860,8871],{},[83,8837,8838,8841,8843,8844,8846],{},[29,8839,8840],{},"1. Payload URL",[344,8842],{},"\nSet to the axiom.ai endpoint. This will include your automation name and API key:",[344,8845],{},[90,8847,8848],{},"https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger?key=\u003CKEY>&name=\u003CNAME>",[83,8850,8851,8854,8856,8857,44],{},[29,8852,8853],{},"2. Content type",[344,8855],{},"\nSet to ",[90,8858,8859],{},"application\u002Fjson",[83,8861,8862,8865,8867,8868,44],{},[29,8863,8864],{},"3. Events",[344,8866],{},"\nConfigure the webhook events based on your needs. If your repo has high activity, consider axiom.ai's ",[322,8869,7854],{"href":8870},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fusage-and-limits\u002Frate-limits",[83,8872,8873,8876,8878],{},[29,8874,8875],{},"4. Save your work",[344,8877],{},"\nMake sure to save the webhook configuration before exiting.",[14,8880,8881,8884,8885,44],{},[3335,8882,8883],{},"2"," The automation name should be encoded, for example \"Hello world\" → \"Hello+world\". Learn more at ",[322,8886,8889],{"href":8887,"rel":8888},"https:\u002F\u002Fwww.w3schools.com\u002Ftags\u002Fref_urlencode.ASP",[2245],"w3schools",[14,8891,8892,8893,8896],{},"Once the webhook has been set up, you'll need to add a ",[322,8894,8895],{"href":6958},"Receive data from another app"," step to allow the automation to be triggered by the webhook. The data passed to this step from the webhook will be accessible within your automation.",[8898,8899,8900],"blockquote",{},[14,8901,8902],{},"💡 Grabbing a sample of the payload would allow you to create 'test data' within this step",[21,8904,776],{"id":775},[14,8906,8907,8908,8910,8911,8913],{},"To test your workflow, trigger an event on your repository - for example, creating a commit to the repository. Open up your axiom.ai extension and view the ",[322,8909,7831],{"href":791}," to ensure that the automation has run. Review any errors and make changes as required. If you experience issues, see ",[322,8912,4887],{"href":2203}," for common resolutions.",[639,8915,796],{"id":795},[14,8917,8918,8919,8922],{},"Getting notifications of events from your Github repository can be helpful for your team to keep track of changes to the repository. Triggering your automations based on these events can allow you to trigger more complex workflows. See our ",[322,8920,8921],{"href":324},"guides"," for more interesting services that you could integrate into your automation, such as using Slack or Discord for notifications, or using Airtable, Supabase, or Tadabase, to create a logging system for your repository events.",[14,8924,8925,8926],{},"We'd love to hear about what you do with this, let us know over in our ",[322,8927,3326],{"href":8928,"rel":8929},"https:\u002F\u002Freddit.com\u002Fr\u002Faxiom_ai",[2245],[14,8931,8932],{},[807,8933,8934],{},"Testing was completed on 24 February 25, features in Discord or axiom.ai may change from time to time and updates may need to be made.",{"title":494,"searchDepth":495,"depth":495,"links":8936},[8937,8938,8939],{"id":545,"depth":498,"text":546},{"id":8805,"depth":498,"text":8806},{"id":775,"depth":498,"text":776,"children":8940},[8941],{"id":795,"depth":495,"text":796},"This guide shows how to trigger axiom.ai automations using GitHub webhooks. Learn to connect repository events to workflows with the “Receive data from another app” step.",{"type":513,"format":77,"intent_type":515,"intent":827,"tags":8944,"platfrom":8945},[829,830],[8762],"\u002Fguides\u002Fgithub",{"title":8751,"description":8942},"guides\u002Fgithub","otmZ9YmlUwp_zhRhrrqg7uv_DzZuKSQsbMjST5ePl0k",{"id":8951,"title":8952,"body":8953,"date":1043,"description":9266,"extension":506,"meta":9267,"navigation":522,"order":523,"path":9272,"seo":9273,"stem":9274,"__hash__":9275},"guides\u002Fguides\u002Fgmail-mail-merge.md","How to mail merge with Gmail using google sheets",{"type":8,"value":8954,"toc":9258},[8955,8957,8964,8966,8968,8975,8979,8986,8990,8992,8996,9128,9132,9137,9139,9144,9146,9151,9250],[11,8956],{},[14,8958,8959,8960,8963],{},"This Gmail bulk sender  automation template uses a bot to send emails in bulk from a Google Sheet through Gmail. The bot retrieves data from the Sheet, opens Gmail in Chrome, fills in the ",[29,8961,8962],{},"\"Compose\""," form with email, subject, and body, and clicks send. After sending, it deletes the processed row and repeats the process with subsequent rows.",[18,8965],{},[21,8967,853],{"id":852},[14,8969,8970,8971,8974],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering the shortcut 'sheet.new\"**, assuming you already have an account. Name your sheet something like ",[29,8972,8973],{},"\"Gmail Mailer\"",". Add some content to test with email addresses, name, subject, body etc",[21,8976,8978],{"id":8977},"install-the-gmail-bulk-sender-bot","Install the Gmail bulk sender bot",[14,8980,8981,8982,55,8984,59],{},"To install this Gmail bot click ",[29,8983,54],{},[29,8985,58],{},[14,8987,62,8988,44],{},[29,8989,65],{},[14,8991,68],{},[21,8993,8995],{"id":8994},"configure-your-gmail-bulk-sender-bot","Configure your Gmail bulk sender bot",[77,8997,8998,9126],{},[80,8999,9000,9017,9025],{},[83,9001,9002,88,9004,9006],{},[29,9003,349],{},[90,9005,92],{},[80,9007,9008,9012],{},[83,9009,9010,100],{},[90,9011,99],{},[83,9013,9014,9016],{},[90,9015,105],{},": Choose the tab with the email information in it.",[83,9018,9019,88,9021,9024],{},[29,9020,908],{},[90,9022,9023],{},"Go to page: mail.google.com\u002Fmail\u002Fu\u002F0\u002F#inbox","^",[83,9026,9027,88,9030,9032],{},[29,9028,9029],{},"Step 3.0",[90,9031,114],{},[80,9033,9034,9042,9058,9066,9082,9087,9103,9108],{},[83,9035,9036,88,9039,9024],{},[29,9037,9038],{},"Step 3.1",[90,9040,9041],{},"Wait: For compose to open",[83,9043,9044,88,9047,9050],{},[29,9045,9046],{},"Step 3.2",[90,9048,9049],{},"Enter text: Email",[80,9051,9052],{},[83,9053,9054,1166,9056,44],{},[90,9055,953],{},[90,9057,227],{},[83,9059,9060,88,9063,9024],{},[29,9061,9062],{},"Step 3.3",[90,9064,9065],{},"Press key(s): Tab to Subject",[83,9067,9068,88,9071,9074],{},[29,9069,9070],{},"Step 3.4",[90,9072,9073],{},"Enter text: Subject",[80,9075,9076],{},[83,9077,9078,1166,9080,44],{},[90,9079,953],{},[90,9081,227],{},[83,9083,9084,9024],{},[29,9085,9086],{},"Step 3.5 – 3.6",[83,9088,9089,88,9092,9095],{},[29,9090,9091],{},"Step 3.7",[90,9093,9094],{},"Enter text: Body",[80,9096,9097],{},[83,9098,9099,1166,9101,44],{},[90,9100,953],{},[90,9102,227],{},[83,9104,9105,9024],{},[29,9106,9107],{},"Step 3.8 – 3.11",[83,9109,9110,88,9113,9115],{},[29,9111,9112],{},"Step 3.12",[90,9114,281],{},[80,9116,9117,9121],{},[83,9118,9119,100],{},[90,9120,99],{},[83,9122,9123,9125],{},[90,9124,105],{},": Choose the tab with the emails in it.",[14,9127,983],{},[21,9129,9131],{"id":9130},"run-your-gmail-bulk-sender-bot","Run your Gmail bulk sender bot",[14,9133,9134,9135,44],{},"To test the Gmail bot, open Gmail and run the bot using the Desktop app. Monitor its operation to ensure it is configured and functioning correctly. If you wish to schedule the bot ",[322,9136,994],{"href":993},[21,9138,317],{"id":316},[14,9140,320,9141,9143],{},[322,9142,325],{"href":324},", you can use our no-code bot builder to customize any bot according to your requirements",[21,9145,330],{"id":329},[14,9147,9148,9149,44],{},"We recommend you watch the video to troubleshoot. If you wish to schedule, the bot you will need to share the Cookie in settings or ",[322,9150,994],{"href":993},[77,9152,9153],{},[80,9154,9155,9166,9183,9199,9214,9225,9236],{},[83,9156,9157,9160,346,9162,9165],{},[29,9158,9159],{},"Email not added?",[344,9161],{},[90,9163,9164],{},"Step 3.2 – Enter text: Email",", check the cursor location. By default, it should be in the Email input field.",[83,9167,9168,9171,346,9173,9176,9177,9179,9180,9182],{},[29,9169,9170],{},"Tab not working?",[344,9172],{},[90,9174,9175],{},"Step 3.3 – Press Key(s): Tab to Subject",", make sure the step includes pressing ",[90,9178,8052],{}," to submit the email address, followed by ",[90,9181,5361],{}," to move to the Subject field.",[83,9184,9185,9188,346,9190,9193,9194,9196,9197,44],{},[29,9186,9187],{},"Subject text not added?",[344,9189],{},[90,9191,9192],{},"Step 3.4 – Enter text: Subject",", confirm that you clicked ",[90,9195,194],{}," and selected ",[90,9198,227],{},[83,9200,9201,9204,346,9206,9209,9210,9213],{},[29,9202,9203],{},"Body entered into subject?",[344,9205],{},[90,9207,9208],{},"Step 3.7 – Enter text: Body",", check ",[90,9211,9212],{},"Step 3.6"," to ensure the cursor is correctly placed before the body text is entered.",[83,9215,9216,9219,346,9221,9224],{},[29,9217,9218],{},"Send key not clicked?",[344,9220],{},[90,9222,9223],{},"Step 3.9 – Press Key(s): Click send",", re-record the keystroke sequence and test again.",[83,9226,9227,9230,346,9232,9235],{},[29,9228,9229],{},"Bot out of sync?",[344,9231],{},[90,9233,9234],{},"Step 3.10 – Wait: For email to send",", try extending the wait time to give Gmail more time to process.",[83,9237,9238,9241,346,9243,9246,9247,9249],{},[29,9239,9240],{},"Compose button not found or visible?",[344,9242],{},[90,9244,9245],{},"Step 3.11 – Click element: Open new Compose window",", reselect the compose button.",[344,9248],{},"\nIf it's not visible, check that the Gmail sidebar is toggled open.",[14,9251,483,9252,9254,9255],{},[322,9253,487],{"href":486},"\nTo learn more read this full in-depth guide on how to send an ",[322,9256,9257],{"href":1515},"email blast using  Gmail.",{"title":494,"searchDepth":495,"depth":495,"links":9259},[9260,9261,9262,9263,9264,9265],{"id":852,"depth":498,"text":853},{"id":8977,"depth":498,"text":8978},{"id":8994,"depth":498,"text":8995},{"id":9130,"depth":498,"text":9131},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"This guide shows how to mail merge with Gmail using Google Sheets and axiom.ai. Automate sending bulk emails by filling out the compose form and submitting each message.",{"pinned":522,"read":1527,"level":510,"video":9268,"templateId":2187,"type":513,"format":514,"intent_type":1049,"intent":1530,"tags":9269,"platfrom":9271},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fr8W-S0Oc6QI",[1532,9270],"mail merge",[1534],"\u002Fguides\u002Fgmail-mail-merge",{"title":8952,"description":9266},"guides\u002Fgmail-mail-merge","LwpEB2Du4j0QYMkZbvIGJahErvkOgW3zPs0JMQZM9RQ",{"id":9277,"title":9278,"body":9279,"date":523,"description":9802,"extension":506,"meta":9803,"navigation":522,"order":523,"path":9807,"seo":9808,"stem":9809,"__hash__":9810},"guides\u002Fguides\u002Fgoogle-apps-script.md","How to use Google Apps Script to trigger an automation",{"type":8,"value":9280,"toc":9792},[9281,9283,9294,9296,9298,9300,9320,9322,9326,9328,9331,9335,9337,9340,9371,9374,9378,9380,9383,9415,9717,9721,9725,9727,9730,9750,9753,9755,9757,9760,9778,9782,9784,9786,9789],[11,9282],{},[14,9284,9285,9286,9288,9289,9293],{},"To send a POST request to your automation using Google Apps Script, follow the steps below. First, ensure that you have the API endpoint and the necessary ",[322,9287,561],{"href":565},". This guide walks you through a basic example of how you can structure your Google Apps Script to send a POST request, fetching all the data from an active Google Sheet. We also have a no-code integration with ",[322,9290,9292],{"href":9291},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fgoogle-sheets","Google Sheets"," that can be used to fetch, write, and edit Google Sheets data.",[21,9295,546],{"id":545},[11,9297],{},[14,9299,551],{},[77,9301,9302],{},[555,9303,9304,9310,9314],{},[83,9305,9306,562,9308,44],{},[29,9307,561],{},[322,9309,566],{"href":565},[83,9311,9312,572],{},[29,9313,571],{},[83,9315,9316,578,9318,44],{},[29,9317,577],{},[90,9319,581],{},[18,9321],{},[21,9323,9325],{"id":9324},"trigger-an-axiomai-automation-using-google-app-scripts","Trigger an axiom.ai automation using Google App Scripts",[11,9327],{},[14,9329,9330],{},"Learn how to get started with triggering your axiom.ai automation with a Google App Script.",[639,9332,9334],{"id":9333},"set-your-axiomai-automation","Set your axiom.ai automation",[11,9336],{},[14,9338,9339],{},"In this basic example, we will trigger the automation from a Google Apps Script, passing the data into our automation from the active Google Sheet. The automation will then open up Google Search and pass the data into the search field. Replicate the design pattern below in the [builder](\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder.",[77,9341,9342],{},[555,9343,9344,9350,9357],{},[83,9345,9346],{},[29,9347,9348],{},[90,9349,8895],{},[83,9351,9352,9356],{},[29,9353,9354],{},[90,9355,124],{},": Insert the Google search URL",[83,9358,9359,9363,9364,3492,9367,9370],{},[29,9360,9361],{},[90,9362,5314],{},": Select the search field, then click ",[29,9365,9366],{},"insert data",[29,9368,9369],{},"webhook-data"," to pass data from the sheet, select column 'A' in the data preview.",[592,9372],{"src":9373,"alt":637},"\u002Fdocs\u002Fguides\u002Ftrigger-axiom-from-app-script.jpg",[639,9375,9377],{"id":9376},"create-an-api-call-using-google-apps-script","Create an API call using Google Apps Script",[11,9379],{},[14,9381,9382],{},"First, create a new Google Sheet by entering 'Sheet.new' into a blank browser tab.",[77,9384,9385],{},[555,9386,9387,9393,9400,9403,9409],{},[83,9388,9389,9392],{},[29,9390,9391],{},"Create a new Google Sheet",", add some text into column A.",[83,9394,9395,9396,9399],{},"Click on ",[29,9397,9398],{},"Extensions > Apps Script"," to open the Apps Script window.",[83,9401,9402],{},"Copy the code example from this page into the Apps Script window.",[83,9404,9405,9406,44],{},"Insert your API key in the input noted with ",[29,9407,9408],{},"\"insert key here\"",[83,9410,9411,9412,44],{},"Insert the name of the automation you wish to trigger where the text says ",[29,9413,9414],{},"\"insert automation name here\"",[719,9416,9418],{"className":756,"code":9417,"language":758,"meta":494,"style":494},"function sendDataToAxiomAi() {\n  var url = 'https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger'; \u002F\u002F Replace with your axiom.ai endpoint\n  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();\n  var dataRange = sheet.getDataRange(); \u002F\u002F Get all the data in the sheet\n  var dataValues = dataRange.getValues(); \u002F\u002F Get the values as a 2D array\n\n  \u002F\u002F Create the payload, passing the 2D array directly\n  var payload = {\n    \"key\": \"Insert key here\",\n    \"name\": \"Insert automation name here\",\n    \"data\": dataValues \u002F\u002F Sending the entire sheet data as an array of arrays\n  };\n  \n  var options = {\n    'method': 'post',\n    'contentType': 'application\u002Fjson',\n    'payload': JSON.stringify(payload)\n  };\n  \n  try {\n    var response = UrlFetchApp.fetch(url, options);\n    Logger.log(response.getContentText());\n  } catch (error) {\n    Logger.log('Error: ' + error.toString());\n  }\n}\n",[90,9419,9420,9429,9448,9471,9492,9512,9516,9521,9532,9544,9556,9567,9572,9576,9587,9599,9611,9629,9633,9637,9644,9662,9678,9687,9708,9713],{"__ignoreMap":494},[727,9421,9422,9424,9427],{"class":729,"line":730},[727,9423,8424],{"class":1986},[727,9425,9426],{"class":2376}," sendDataToAxiomAi",[727,9428,8430],{"class":768},[727,9430,9431,9434,9437,9439,9442,9445],{"class":729,"line":498},[727,9432,9433],{"class":1986},"  var",[727,9435,9436],{"class":768}," url ",[727,9438,4970],{"class":1986},[727,9440,9441],{"class":737}," 'https:\u002F\u002Flar.axiom.ai\u002Fapi\u002Fv3\u002Ftrigger'",[727,9443,9444],{"class":768},"; ",[727,9446,9447],{"class":2920},"\u002F\u002F Replace with your axiom.ai endpoint\n",[727,9449,9450,9452,9455,9457,9460,9463,9466,9469],{"class":729,"line":495},[727,9451,9433],{"class":1986},[727,9453,9454],{"class":768}," sheet ",[727,9456,4970],{"class":1986},[727,9458,9459],{"class":768}," SpreadsheetApp.",[727,9461,9462],{"class":2376},"getActiveSpreadsheet",[727,9464,9465],{"class":768},"().",[727,9467,9468],{"class":2376},"getActiveSheet",[727,9470,2588],{"class":768},[727,9472,9473,9475,9478,9480,9483,9486,9489],{"class":729,"line":1895},[727,9474,9433],{"class":1986},[727,9476,9477],{"class":768}," dataRange ",[727,9479,4970],{"class":1986},[727,9481,9482],{"class":768}," sheet.",[727,9484,9485],{"class":2376},"getDataRange",[727,9487,9488],{"class":768},"(); ",[727,9490,9491],{"class":2920},"\u002F\u002F Get all the data in the sheet\n",[727,9493,9494,9496,9499,9501,9504,9507,9509],{"class":729,"line":1901},[727,9495,9433],{"class":1986},[727,9497,9498],{"class":768}," dataValues ",[727,9500,4970],{"class":1986},[727,9502,9503],{"class":768}," dataRange.",[727,9505,9506],{"class":2376},"getValues",[727,9508,9488],{"class":768},[727,9510,9511],{"class":2920},"\u002F\u002F Get the values as a 2D array\n",[727,9513,9514],{"class":729,"line":1973},[727,9515,1898],{"emptyLinePlaceholder":522},[727,9517,9518],{"class":729,"line":2052},[727,9519,9520],{"class":2920},"  \u002F\u002F Create the payload, passing the 2D array directly\n",[727,9522,9523,9525,9528,9530],{"class":729,"line":2058},[727,9524,9433],{"class":1986},[727,9526,9527],{"class":768}," payload ",[727,9529,4970],{"class":1986},[727,9531,2391],{"class":768},[727,9533,9534,9537,9539,9542],{"class":729,"line":2064},[727,9535,9536],{"class":737},"    \"key\"",[727,9538,1995],{"class":768},[727,9540,9541],{"class":737},"\"Insert key here\"",[727,9543,2427],{"class":768},[727,9545,9546,9549,9551,9554],{"class":729,"line":2087},[727,9547,9548],{"class":737},"    \"name\"",[727,9550,1995],{"class":768},[727,9552,9553],{"class":737},"\"Insert automation name here\"",[727,9555,2427],{"class":768},[727,9557,9558,9561,9564],{"class":729,"line":2140},[727,9559,9560],{"class":737},"    \"data\"",[727,9562,9563],{"class":768},": dataValues ",[727,9565,9566],{"class":2920},"\u002F\u002F Sending the entire sheet data as an array of arrays\n",[727,9568,9569],{"class":729,"line":2154},[727,9570,9571],{"class":768},"  };\n",[727,9573,9574],{"class":729,"line":1529},[727,9575,3554],{"class":768},[727,9577,9578,9580,9583,9585],{"class":729,"line":2178},[727,9579,9433],{"class":1986},[727,9581,9582],{"class":768}," options ",[727,9584,4970],{"class":1986},[727,9586,2391],{"class":768},[727,9588,9589,9592,9594,9597],{"class":729,"line":2187},[727,9590,9591],{"class":737},"    'method'",[727,9593,1995],{"class":768},[727,9595,9596],{"class":737},"'post'",[727,9598,2427],{"class":768},[727,9600,9601,9604,9606,9609],{"class":729,"line":2533},[727,9602,9603],{"class":737},"    'contentType'",[727,9605,1995],{"class":768},[727,9607,9608],{"class":737},"'application\u002Fjson'",[727,9610,2427],{"class":768},[727,9612,9613,9616,9618,9621,9623,9626],{"class":729,"line":2551},[727,9614,9615],{"class":737},"    'payload'",[727,9617,1995],{"class":768},[727,9619,9620],{"class":1882},"JSON",[727,9622,44],{"class":768},[727,9624,9625],{"class":2376},"stringify",[727,9627,9628],{"class":768},"(payload)\n",[727,9630,9631],{"class":729,"line":2559},[727,9632,9571],{"class":768},[727,9634,9635],{"class":729,"line":2565},[727,9636,3554],{"class":768},[727,9638,9639,9642],{"class":729,"line":2570},[727,9640,9641],{"class":1986},"  try",[727,9643,2391],{"class":768},[727,9645,9646,9648,9651,9653,9656,9659],{"class":729,"line":2591},[727,9647,8435],{"class":1986},[727,9649,9650],{"class":768}," response ",[727,9652,4970],{"class":1986},[727,9654,9655],{"class":768}," UrlFetchApp.",[727,9657,9658],{"class":2376},"fetch",[727,9660,9661],{"class":768},"(url, options);\n",[727,9663,9664,9667,9669,9672,9675],{"class":729,"line":2603},[727,9665,9666],{"class":768},"    Logger.",[727,9668,2597],{"class":2376},[727,9670,9671],{"class":768},"(response.",[727,9673,9674],{"class":2376},"getContentText",[727,9676,9677],{"class":768},"());\n",[727,9679,9680,9683,9685],{"class":729,"line":2615},[727,9681,9682],{"class":768},"  } ",[727,9684,2609],{"class":1986},[727,9686,2612],{"class":768},[727,9688,9689,9691,9693,9695,9698,9701,9704,9706],{"class":729,"line":2630},[727,9690,9666],{"class":768},[727,9692,2597],{"class":2376},[727,9694,2542],{"class":768},[727,9696,9697],{"class":737},"'Error: '",[727,9699,9700],{"class":1986}," +",[727,9702,9703],{"class":768}," error.",[727,9705,8456],{"class":2376},[727,9707,9677],{"class":768},[727,9709,9710],{"class":729,"line":2636},[727,9711,9712],{"class":768},"  }\n",[727,9714,9715],{"class":729,"line":2642},[727,9716,2639],{"class":768},[592,9718],{"src":9719,"alt":9720},"\u002Fdocs\u002Fguides\u002Fgoogle-app-script-trigger-bot.jpg","Google App Script trigger axiom.ai bot run with API call",[639,9722,9724],{"id":9723},"trigger-based-on-edits-to-your-sheet","Trigger based on edits to your sheet",[11,9726],{},[14,9728,9729],{},"Google Apps Script offers event-driven triggers that can be set up to end data to your axiom.ai automation.",[77,9731,9732],{},[555,9733,9734,9737,9740,9747],{},[83,9735,9736],{},"Click \"Triggers\" in the Google Apps Script sidebar.",[83,9738,9739],{},"Click \"Add Trigger\" to create a new trigger.",[83,9741,9742,9743,9746],{},"Set the function to run to ",[90,9744,9745],{},"sendDataToAxiomAi"," and the event type to \"On edit\".",[83,9748,9749],{},"Click \"Save\".",[14,9751,9752],{},"This will send all the sheet data when a cell is changed - you may wish to add additional filters to your code to filter based on specific criteria.",[21,9754,776],{"id":775},[11,9756],{},[14,9758,9759],{},"In Google Apps Script, click save and run your automation. If the API POST call works, axiom.ai will return a link you can access to view the run. If not, follow the error messages and fix any issues.",[77,9761,9762],{},[555,9763,9764,9771],{},[83,9765,9766,9767,9770],{},"Click the ",[29,9768,9769],{},"'disc'"," icon to save your API call script.",[83,9772,9773,9774,9777],{},"Click on the ",[29,9775,9776],{},"'play'"," icon to start your script.",[592,9779],{"src":9780,"alt":9781},"\u002Fdocs\u002Fguides\u002Fapi-call-returns-link.jpg","axiom.ai returns run status to Google Apps Script API call",[21,9783,796],{"id":795},[11,9785],{},[14,9787,9788],{},"Using axiom.ai, it's simple to trigger automations and pass data into your bots. In this example, we learned how to use Google Apps Script, but the same principles can be applied to using any webhook or web API to start your bot runs.",[811,9790,9791],{},"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 .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}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":494,"searchDepth":495,"depth":495,"links":9793},[9794,9795,9800,9801],{"id":545,"depth":498,"text":546},{"id":9324,"depth":498,"text":9325,"children":9796},[9797,9798,9799],{"id":9333,"depth":495,"text":9334},{"id":9376,"depth":495,"text":9377},{"id":9723,"depth":495,"text":9724},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"This guide shows how to trigger axiom.ai automations using Google Apps Script. Learn to send POST requests from Google Sheets and pass data into your bot.",{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":827,"tags":9804,"platfrom":9805,"video":9806},[829,830],[7311],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FvTvXYe4niJE?rel=0&amp;","\u002Fguides\u002Fgoogle-apps-script",{"title":9278,"description":9802},"guides\u002Fgoogle-apps-script","uzxKnbORaXPdj7RKK875IB59u4f7EeRQoOP6FEzyRaE",{"id":9812,"title":9813,"body":9814,"date":1043,"description":10096,"extension":506,"meta":10097,"navigation":522,"order":523,"path":10103,"seo":10104,"stem":10105,"__hash__":10106},"guides\u002Fguides\u002Fgoogle-sheets-tweeter.md","How to automate posting on X (formerly twitter) using Google Sheets",{"type":8,"value":9815,"toc":10088},[9816,9818,9825,9827,9829,9840,9844,9857,9862,9864,9868,9998,10002,10005,10007,10011,10013,10015,10077,10081],[11,9817],{},[14,9819,9820,9821,9824],{},"This Twitter(x) posting template automates posts on the platform by emulating human interaction, entering your posts directly into the website on the compose page. The bot reads post details from a Google Sheet, opens Twitter (X) on the compose page for each row, and simulates typing the tweet, uploading an image, and clicking ",[29,9822,9823],{},"\"post\"",". It then deletes the processed post from the sheet, preparing for the next entry.",[18,9826],{},[21,9828,24],{"id":23},[14,9830,27,9831,1085,9833,36,9836,9839],{},[29,9832,31],{},[29,9834,9835],{},"\"X post\"",[29,9837,9838],{},"\"Post\"",". Add some post data.",[21,9841,9843],{"id":9842},"install-the-twitterx-posting-bot","Install the Twitter(x) posting bot",[14,9845,9846,9847,9850,9851,55,9854,59],{},"To install this ",[29,9848,9849],{},"\"Twitter(x)\""," posting bot click ",[29,9852,9853],{},"\"Install template'\"",[29,9855,9856],{},"\"Install Chrome extension'\"",[14,9858,62,9859,44],{},[29,9860,9861],{},"\"Start'\"",[14,9863,68],{},[21,9865,9867],{"id":9866},"configure-your-twitterx-posting-bot-in-minutes","Configure your Twitter(x) posting bot in minutes",[77,9869,9870],{},[80,9871,9872,9891],{},[83,9873,9874,88,9876,9878],{},[29,9875,349],{},[90,9877,92],{},[80,9879,9880,9884],{},[83,9881,9882,100],{},[90,9883,99],{},[83,9885,9886,5910,9888,44],{},[90,9887,105],{},[90,9889,9890],{},"'Post'",[83,9892,9893,88,9895,9897],{},[29,9894,908],{},[90,9896,114],{},[80,9898,9899,9910,9933,9956,9969],{},[83,9900,9901,88,9903,9906],{},[29,9902,917],{},[90,9904,9905],{},"Go to page: Twitter (X) Compose URL",[80,9907,9908],{},[83,9909,983],{},[83,9911,9912,88,9914,9917],{},[29,9913,935],{},[90,9915,9916],{},"Enter text: Tweet",[80,9918,9919,9924],{},[83,9920,9921,9923],{},[90,9922,155],{},": ^ Preconfigured",[83,9925,9926,132,9928,136,9930,9932],{},[90,9927,953],{},[90,9929,135],{},[90,9931,227],{},", and choose the column with the post content.",[83,9934,9935,88,9937,9940],{},[29,9936,943],{},[90,9938,9939],{},"Upload a file: Image",[80,9941,9942,9947],{},[83,9943,9944,9923],{},[90,9945,9946],{},"File Input Field",[83,9948,9949,132,9951,136,9953,9955],{},[90,9950,1189],{},[90,9952,135],{},[90,9954,227],{},", and choose the column with the image path.",[83,9957,9958,88,9960,9963],{},[29,9959,959],{},[90,9961,9962],{},"Click element: Post",[80,9964,9965],{},[83,9966,9967,9923],{},[90,9968,155],{},[83,9970,9971,88,9973,9975],{},[29,9972,967],{},[90,9974,281],{},[80,9976,9977,9981,9986,9992],{},[83,9978,9979,100],{},[90,9980,99],{},[83,9982,9983,9985],{},[90,9984,105],{},": Choose the tab you created for posts.",[83,9987,9988,162,9990,44],{},[90,9989,297],{},[90,9991,165],{},[83,9993,9994,162,9996,44],{},[90,9995,304],{},[90,9997,165],{},[21,9999,10001],{"id":10000},"run-your-twitterx-posting-automation","Run your Twitter(x) posting automation",[14,10003,10004],{},"We suggest running a test first, disable Step 2.4 to prevent the bot sending a post.",[21,10006,317],{"id":316},[14,10008,320,10009,326],{},[322,10010,325],{"href":324},[21,10012,330],{"id":329},[14,10014,333],{},[77,10016,10017],{},[80,10018,10019,10033,10044,10055,10066],{},[83,10020,10021,10024,346,10026,10029,10030,44],{},[29,10022,10023],{},"Loads incorrect page?",[344,10025],{},[90,10027,10028],{},"Step 2.1 – Go to page: Twitter (X) Compose URL",", check the URL is set to ",[90,10031,10032],{},"https:\u002F\u002Ftwitter.com\u002Fcompose\u002Ftweet",[83,10034,10035,10038,346,10040,10043],{},[29,10036,10037],{},"No message input?",[344,10039],{},[90,10041,10042],{},"Step 2.2 – Enter text: Tweet",", reselect the input field in the post form.",[83,10045,10046,10049,346,10051,10054],{},[29,10047,10048],{},"File does not upload?",[344,10050],{},[90,10052,10053],{},"Step 2.3 – Upload a file: Image",", check your computer folder permissions.",[83,10056,10057,10060,346,10062,10065],{},[29,10058,10059],{},"Post button not clicked?",[344,10061],{},[90,10063,10064],{},"Step 2.4 – Click element: Post",", reselect the post button.",[83,10067,10068,10071,346,10073,10076],{},[29,10069,10070],{},"Row not removed?",[344,10072],{},[90,10074,10075],{},"Step 2.5 – Delete rows from a Google Sheet",", make sure the correct sheet and row range are selected.",[14,10078,483,10079],{},[322,10080,487],{"href":486},[14,10082,10083,10084],{},"Read this if you would like to learn more about ",[322,10085,10087],{"href":10086},"\u002Fblog\u002Fhow-to-automate-social-media-posts","posting to Social media with a bot.",{"title":494,"searchDepth":495,"depth":495,"links":10089},[10090,10091,10092,10093,10094,10095],{"id":23,"depth":498,"text":24},{"id":9842,"depth":498,"text":9843},{"id":9866,"depth":498,"text":9867},{"id":10000,"depth":498,"text":10001},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"This guide shows how to automate posting on X (Twitter) using Google Sheets and axiom.ai. Learn to schedule tweets, upload images, and remove sent posts from your sheet.",{"read":1314,"level":510,"video":10098,"templateId":2551,"type":513,"format":514,"intent_type":1049,"intent":1050,"tags":10099,"platfrom":10100},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FY_378SXta-c",[1052,1318,1056],[10101,10102],"X","Twitter","\u002Fguides\u002Fgoogle-sheets-tweeter",{"title":9813,"description":10096},"guides\u002Fgoogle-sheets-tweeter","WT7t7Xxt9SeiAFLHV1Km31x4PsGfGZ_Lw1hPXp-t4SY",{"id":10108,"title":10109,"body":10110,"date":523,"description":10214,"extension":506,"meta":10215,"navigation":522,"order":523,"path":10219,"seo":10220,"stem":10221,"__hash__":10222},"guides\u002Fguides\u002Fhandling-dialogs.md","How to automate dialogs",{"type":8,"value":10111,"toc":10210},[10112,10114,10117,10121,10123,10130,10176,10180,10182,10185,10192,10197,10207],[11,10113],{},[14,10115,10116],{},"Dialogs tend to appear on websites when they wish to grab your attention, these often appear randomly or based on criteria that has been set by the page for marketing reasons.",[21,10118,10120],{"id":10119},"standard-alerts","Standard alerts",[11,10122],{},[14,10124,10125,10126,10129],{},"By default, axiom.ai will automatically dismiss most dialogs that are created using the standard ",[90,10127,10128],{},"alert()"," method. This was designed to prevent your automation from getting unexpectedly stuck when a dialog appears. This feature makes use of the following puppeteer script:",[719,10131,10133],{"className":756,"code":10132,"language":758,"meta":494,"style":494},"page.on('dialog', async dialog => {\n    await dialog.dismiss();\n})\n",[90,10134,10135,10159,10172],{"__ignoreMap":494},[727,10136,10137,10140,10142,10144,10147,10149,10152,10155,10157],{"class":729,"line":730},[727,10138,10139],{"class":768},"page.",[727,10141,1857],{"class":2376},[727,10143,2542],{"class":768},[727,10145,10146],{"class":737},"'dialog'",[727,10148,2004],{"class":768},[727,10150,10151],{"class":1986},"async",[727,10153,10154],{"class":733}," dialog",[727,10156,3207],{"class":1986},[727,10158,2391],{"class":768},[727,10160,10161,10164,10167,10170],{"class":729,"line":498},[727,10162,10163],{"class":1986},"    await",[727,10165,10166],{"class":768}," dialog.",[727,10168,10169],{"class":2376},"dismiss",[727,10171,2588],{"class":768},[727,10173,10174],{"class":729,"line":495},[727,10175,5051],{"class":768},[21,10177,10179],{"id":10178},"non-standard-dialogs","Non-standard dialogs",[11,10181],{},[14,10183,10184],{},"Non-standard dialogs are not handled automatically - as the code that is used to build and manage these dialogs depends on the developers of the website, this means that the method of dismissing these can be a bit more involved.",[14,10186,10187,10188,44],{},"To get started, you'll first need to identify the CSS selector of the 'accept' or 'dismiss' button on the dialog. This can be tricky as you'll need to ensure that you can get the dialog to appear. To learn more about finding the best selector, see our blog on the ",[322,10189,10191],{"href":10190},"\u002Fblog\u002Fbest-custom-css-selectors-for-web-scraping","Best Custom CSS Selectors for Web Scraping",[8898,10193,10194],{},[14,10195,10196],{},"💡 If you're struggling to get the dialog to appear, try opening the page in incognito mode. This ensures that any dialogs that may have it's 'dismiss' state stored in memory.",[14,10198,10199,10200,10202,10203,10206],{},"Once you have this selector, this can be added into a ",[322,10201,3639],{"href":6378}," step. This should be configured with the 'Optional click' option enabled, and the selector used within the step. You can learn more about using custom selectors in steps in the ",[322,10204,10205],{"href":380},"Custom CSS selectors"," documentation. This step should be added in the location where you most likely expect the dialog to display.",[811,10208,10209],{},"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);}",{"title":494,"searchDepth":495,"depth":495,"links":10211},[10212,10213],{"id":10119,"depth":498,"text":10120},{"id":10178,"depth":498,"text":10179},"This guide explains how to handle standard and custom dialogs in axiom.ai automations. Learn to dismiss alerts and use optional click steps with custom CSS selectors.",{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":1050,"tags":10216,"platfrom":10218},[7290,10217],"dialog",[1757],"\u002Fguides\u002Fhandling-dialogs",{"title":10109,"description":10214},"guides\u002Fhandling-dialogs","EVyhLP8WY1ToJsS23dKu8ILnzLlNcLVZnsCdqsSLuio",{"id":10224,"title":10225,"body":10226,"date":10494,"description":10495,"extension":506,"meta":10496,"navigation":522,"order":523,"path":10501,"seo":10502,"stem":10503,"__hash__":10504},"guides\u002Fguides\u002Fhow-to-automate-apollo-crm.md","How to automate Apollo.io CRM",{"type":8,"value":10227,"toc":10486},[10228,10230,10244,10246,10250,10253,10257,10264,10268,10270,10274,10332,10336,10343,10347,10351,10353,10357,10482],[11,10229],{},[14,10231,10232,10233,10236,10237,10240,10241,10243],{},"This Apollo.io bot automates the process of adding prospects from a search to your saved lists. The bot works by opening Apollo.io on the search page. It then selects all the people on the page (25), clicks ",[29,10234,10235],{},"\"Save\"",", and then clicks ",[29,10238,10239],{},"\"Add to Lists.\""," Finally, the bot enters the name of the list and clicks  ",[29,10242,10235],{}," again. You can configure the bot to loop through as many pages as you want, adding more and more prospects to your lists.",[18,10245],{},[21,10247,10249],{"id":10248},"get-started-set-up-you-apolloio-search-page","Get started: Set up you Apollo.io search page",[14,10251,10252],{},"Before you run your bot, log into Apollo.io and set up the search from which you wish to add contacts. Once you have added your search filters, copy the page URL. This URL stores the search filters, making them ready to use in your Axiom.",[21,10254,10256],{"id":10255},"install-the-apolloio-bot","Install the Apollo.io bot",[14,10258,10259,10260,55,10262,59],{},"To install this Apollo.io bot click ",[29,10261,54],{},[29,10263,58],{},[14,10265,62,10266,44],{},[29,10267,65],{},[14,10269,68],{},[21,10271,10273],{"id":10272},"configure-your-apolloio-bot-in-three-easy-steps","Configure your Apollo.io bot in three easy steps",[77,10275,10276,10330],{},[80,10277,10278,10292,10298,10311,10316],{},[83,10279,10280,88,10282,10285],{},[29,10281,349],{},[90,10283,10284],{},"Go to page: Search",[80,10286,10287],{},[83,10288,10289,10291],{},[90,10290,131],{},": Insert Apollo.io search URL.",[83,10293,10294,10297],{},[29,10295,10296],{},"2.0 – 4.0"," ^",[83,10299,10300,88,10302,10304],{},[29,10301,5343],{},[90,10303,3524],{},[80,10305,10306],{},[83,10307,10308,10310],{},[90,10309,953],{},": Add the list name.",[83,10312,10313,10297],{},[29,10314,10315],{},"6.0 – 7.0",[83,10317,10318,88,10320,10323],{},[29,10319,5451],{},[90,10321,10322],{},"Jump to another step: Repeat",[80,10324,10325],{},[83,10326,10327,10329],{},[90,10328,5631],{},": Set the number of loops you wish to make.",[14,10331,983],{},[21,10333,10335],{"id":10334},"run-your-apolloio-bot","Run your Apollo.io bot",[14,10337,10338,10339,10342],{},"To test this bot, we recommend limiting the loops to a maximum of 3. This can be done in Step 9.0, ",[29,10340,10341],{},"\"Maximum Cycles.\""," Please note that Apollo.io does throttle the number of prospects you can add in one session. We recommend shorter runs spread out over time, then gradually increase until the threshold is reached.",[21,10344,10346],{"id":10345},"customize-your-apolloio-template","Customize your Apollo.io template",[14,10348,320,10349,326],{},[322,10350,325],{"href":324},[21,10352,330],{"id":329},[14,10354,1009,10355,44],{},[322,10356,994],{"href":993},[77,10358,10359],{},[80,10360,10361,10371,10389,10405,10418,10432,10447,10458,10469],{},[83,10362,10363,10366,10368,10369,1230],{},[29,10364,10365],{},"Not loading a filtered search?",[344,10367],{},"\nMake sure filters are set in Apollo, then copy the full search URL into the ",[90,10370,124],{},[83,10372,10373,10376,346,10378,10381,10382,10385,10386],{},[29,10374,10375],{},"Not selecting people?",[344,10377],{},[90,10379,10380],{},"Step 2.0 – Click element",", try reselecting the button using the custom selector ",[90,10383,10384],{},".finder-select-multiple-entities-button",". ",[322,10387,10388],{"href":380},"See how",[83,10390,10391,10394,346,10396,10399,10400,10404],{},[29,10392,10393],{},"Not clicking \"Select this page\"?",[344,10395],{},[90,10397,10398],{},"Step 3.0 – Click element",", use the ",[322,10401,10403],{"href":10402},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fsingle","'Element text'"," option to target the exact \"Select this page\" button.",[83,10406,10407,10410,346,10412,10415,10416,44],{},[29,10408,10409],{},"Save button not working?",[344,10411],{},[90,10413,10414],{},"Step 4.0 – Click element",", reselect the \"Save\" button when people are selected, or try using ",[322,10417,10403],{"href":10402},[83,10419,10420,10423,346,10425,10428,10429,44],{},[29,10421,10422],{},"Select list not opening?",[344,10424],{},[90,10426,10427],{},"Step 5.0 – Select list",", try reselecting the dropdown using this custom selector: ",[90,10430,10431],{},"div[role=\"dialog\"] .zp-select-indicators",[83,10433,10434,10437,346,10439,10442,10443,10446],{},[29,10435,10436],{},"Not saving to list?",[344,10438],{},[90,10440,10441],{},"Step 6.0 – Press key(s)",", re-record the ",[90,10444,10445],{},"Enter"," keystroke.",[83,10448,10449,10452,346,10454,10457],{},[29,10450,10451],{},"Bot skips before saving is complete?",[344,10453],{},[90,10455,10456],{},"Step 7.0 – Wait",", increase the wait time to allow saving to finish.",[83,10459,10460,10463,346,10465,10468],{},[29,10461,10462],{},"Next button not working?",[344,10464],{},[90,10466,10467],{},"Step 8.0 – Click element",", reselect the \"Next\" button at the bottom of the table.",[83,10470,10471,10474,346,10476,10479,10480,44],{},[29,10472,10473],{},"Jumping to wrong step?",[344,10475],{},[90,10477,10478],{},"Step 9.0 – Jump to another step",", check that it jumps to ",[90,10481,908],{},[14,10483,483,10484],{},[322,10485,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":10487},[10488,10489,10490,10491,10492,10493],{"id":10248,"depth":498,"text":10249},{"id":10255,"depth":498,"text":10256},{"id":10272,"depth":498,"text":10273},{"id":10334,"depth":498,"text":10335},{"id":10345,"depth":498,"text":10346},{"id":329,"depth":498,"text":330},"2023-01-19","This guide explains how to automate adding prospects to Apollo.io lists using axiom.ai. Learn to configure search filters, loop through pages, and save contacts to a list.",{"read":1527,"level":510,"video":10497,"templateId":4744,"type":513,"format":514,"intent_type":1049,"intent":827,"tags":10498,"platfrom":10499},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fu5t_Eq9IKBI",[1055],[10500],"Apollo","\u002Fguides\u002Fhow-to-automate-apollo-crm",{"title":10225,"description":10495},"guides\u002Fhow-to-automate-apollo-crm","rJD2Z0amhNdWU17YHKZjG_tbbJTX5a5GerytGQkYH08",{"id":10506,"title":10507,"body":10508,"date":10661,"description":10662,"extension":506,"meta":10663,"navigation":522,"order":523,"path":10670,"seo":10671,"stem":10672,"__hash__":10673},"guides\u002Fguides\u002Fhow-to-automate-file-downloads.md","How to automate file downloads",{"type":8,"value":10509,"toc":10654},[10510,10512,10515,10517,10521,10524,10526,10528,10532,10580,10584,10587,10589,10602,10604,10606,10645],[11,10511],{},[14,10513,10514],{},"This bot template automates file downloads from different types of webpages such as listings, paginated, scrolling, and feed pages. It mimics human clicking in Chrome to save files to a local drive.",[18,10516],{},[21,10518,10520],{"id":10519},"install-the-file-download-bot","Install the File download bot",[14,10522,10523],{},"To install this File download bot click 'Install template'.  If you’re a new user, you’ll have to click 'Install Chrome extension' and create a free axiom.ai account before you can edit the template.",[14,10525,876],{},[14,10527,68],{},[21,10529,10531],{"id":10530},"configure-your-file-download-bot-in-a-minute","Configure your File download bot in a minute",[77,10533,10534],{},[80,10535,10536,10553],{},[83,10537,10538,88,10540,10542],{},[29,10539,349],{},[90,10541,124],{},[80,10543,10544],{},[83,10545,10546,132,10548,136,10550,10552],{},[90,10547,131],{},[90,10549,135],{},[90,10551,139],{},", and choose the column containing the links.",[83,10554,10555,88,10557,10560],{},[29,10556,908],{},[90,10558,10559],{},"Download files",[80,10561,10562,10567,10571,10575],{},[83,10563,10564,10566],{},[90,10565,155],{},": Point and click to select the files you wish to download.",[83,10568,10569,1638],{},[90,10570,1637],{},[83,10572,10573,1644],{},[90,10574,1643],{},[83,10576,10577,1644],{},[90,10578,10579],{},"Force download",[21,10581,10583],{"id":10582},"run-your-file-download-bot","Run your File download bot",[14,10585,10586],{},"We suggest running a test first, stopping the bot after a few downloads and checking the files.",[21,10588,317],{"id":316},[14,10590,320,10591,10593,10594,10597,10598,44],{},[322,10592,325],{"href":324},", you can use our no-code bot builder to customize any bot according to your requirements. We have other download file steps you can use that work in the cloud and on desktop. Take a look at the ",[322,10595,10596],{"href":1698},"download to Google Drive"," step. We also have steps to ",[322,10599,10601],{"href":10600},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsave-screenshot-to-google-drive","automate screenshots",[21,10603,330],{"id":329},[14,10605,333],{},[77,10607,10608],{},[80,10609,10610,10619,10627],{},[83,10611,10612,10614,10616,10617,44],{},[29,10613,363],{},[344,10615],{},"\nTry re-selecting or using ",[322,10618,7498],{"href":380},[83,10620,10621,10624,10626],{},[29,10622,10623],{},"Files do not download?",[344,10625],{},"\nCheck the folder permission on your computer.",[83,10628,10629,10632,10634,10635,10639,10640,44],{},[29,10630,10631],{},"Does the file open in a window?",[344,10633],{},"\nThis is default browser behavior. You can’t override it, but there is a workaround — ",[322,10636,10638],{"href":10637},"\u002Fdocs\u002Fadjusting-how-axiom-runs#using-a-custom-chromium-profile","create a Chrome Profile"," and change the default download setting for the ",[322,10641,10644],{"href":10642,"rel":10643},"https:\u002F\u002Fsupport.google.com\u002Fchrome\u002Fanswer\u002F95759?hl=en-GB&co=GENIE.Platform%3DDesktop",[2245],"profile",[14,10646,483,10647,10649,10650],{},[322,10648,487],{"href":486},"\nLearn how to create a bot from scratch to download files from a website by ",[322,10651,10653],{"href":10652},"\u002Fblog\u002Fhow-to-automate-downloadin-a-file-from-a-website","clicking here.",{"title":494,"searchDepth":495,"depth":495,"links":10655},[10656,10657,10658,10659,10660],{"id":10519,"depth":498,"text":10520},{"id":10530,"depth":498,"text":10531},{"id":10582,"depth":498,"text":10583},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"2023-01-29","This guide explains how to automate file downloads from websites using axiom.ai. Learn to select files, save them locally, and customize the bot for different page types.",{"pinned":522,"read":1314,"level":510,"video":10664,"templateId":4754,"type":513,"format":514,"intent_type":1754,"intent":10665,"tags":10666,"platfrom":10669},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FkuMuOQzietM","Upload and download files",[10667,10668],"files","download",[1757],"\u002Fguides\u002Fhow-to-automate-file-downloads",{"title":10507,"description":10662},"guides\u002Fhow-to-automate-file-downloads","vGM8xcIDtAReyTNraHgFD9L4B_nR-LkcUk5QWKKpJQ0",{"id":10675,"title":10676,"body":10677,"date":523,"description":10801,"extension":506,"meta":10802,"navigation":522,"order":523,"path":10805,"seo":10806,"stem":10807,"__hash__":10808},"guides\u002Fguides\u002Fhow-to-clear-text-from-a-field.md","How to clear text from an Input Field",{"type":8,"value":10678,"toc":10796},[10679,10681,10688,10698,10702,10708,10712,10718,10766,10774,10781,10783],[11,10680],{},[14,10682,10683,10684,10687],{},"When automating form filling, you may encounter input fields that are already populated with default values. The ",[322,10685,10686],{"href":7600},"\"Enter text\""," step should clear those values automatically. However, if it does not, it can lead to messy results when the bot runs, especially if the existing value isn't cleared using the \"Enter text\" step.",[14,10689,10690,10691,450,10694,10697],{},"But don't worry—this guide will show you a simple and effective way to clear those default values. All you need to do is use a combination of the ",[29,10692,10693],{},"\"Click element\"",[29,10695,10696],{},"\"Press key(s)\""," steps.",[21,10699,10701],{"id":10700},"insert-the-following-steps-into-your-automation","Insert the following steps into your automation",[14,10703,10704,10705,10707],{},"Assuming you have a bot set up in axiom.ai. insert the following steps before the ",[29,10706,10686],{}," step you wish to enter a value with. Using the step finder add the following steps.",[21,10709,10711],{"id":10710},"clear-an-input-before-entering-new-text","Clear an input before entering new text",[14,10713,10714,10715,10717],{},"To clear an input field before using an ",[29,10716,10686],{}," step, insert the following two steps directly beforehand:",[77,10719,10720],{},[80,10721,10722,10739],{},[83,10723,10724,10727],{},[29,10725,10726],{},"Step 1.0 - Click element: Focus input",[80,10728,10729],{},[83,10730,10731,132,10733,10735,10736,44],{},[90,10732,155],{},[29,10734,7257],{},", highlight the input field you wish to clear, then press ",[29,10737,10738],{},"\"Complete\"",[83,10740,10741,10744],{},[29,10742,10743],{},"Step 2.0 - Press key(s): Clear value",[80,10745,10746],{},[83,10747,10748,5354,10750,10753,10754,10757,10758,10761,10762,10765],{},[90,10749,5353],{},[29,10751,10752],{},"\"Record\"",", tap the right arrow key repeatedly (",[90,10755,10756],{},"→→→→→→→→→→",") to move the cursor to the end, then press delete (",[90,10759,10760],{},"⌦⌦⌦⌦⌦⌦⌦⌦⌦","). Click ",[29,10763,10764],{},"\"Stop recording\""," when done.",[14,10767,10768,10769,10773],{},"💡 When you run the bot, you will see the cursor move to the right past the value and then back, deleting it. There are other ",[322,10770,10772],{"href":10771},"\u002Fguides\u002Fkeyboard-short-cuts","useful shortcuts"," to discover.",[14,10775,10776,10777,10780],{},"That's it! Assuming your ",[29,10778,10779],{},"\"Enter Text\""," step is next, the input field will now be cleared, and the new data will be entered without any issues.",[21,10782,796],{"id":795},[14,10784,10785,10786,10788,10789,10795],{},"This is a simple way to clear prepopulated text in form automation. You can empty an input field by employing the \"",[29,10787,3639],{},"\" and \"",[29,10790,10791],{},[322,10792,10794],{"href":10793},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fpress-key","Press keys(s)","\" steps. This method enhances the reliability of your form automation tasks, helping you achieve accurate results with minimal effort.",{"title":494,"searchDepth":495,"depth":495,"links":10797},[10798,10799,10800],{"id":10700,"depth":498,"text":10701},{"id":10710,"depth":498,"text":10711},{"id":795,"depth":498,"text":796},"Learn how to clear text from an Input Field using the Press key(s) step.",{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":7308,"tags":10803,"platfrom":10804},[1055],[1757],"\u002Fguides\u002Fhow-to-clear-text-from-a-field",{"title":10676,"description":10801},"guides\u002Fhow-to-clear-text-from-a-field","pUAqiXl4H3c1QPPm4otHZrEhDcNhP8CIUtNW8Rj0lNQ",{"id":10810,"title":10811,"body":10812,"date":523,"description":11173,"extension":506,"meta":11174,"navigation":522,"order":523,"path":11177,"seo":11178,"stem":11179,"__hash__":11180},"guides\u002Fguides\u002Fhow-to-combine-variables.md","How to combine Tokens (variables) into one",{"type":8,"value":10813,"toc":11155},[10814,10816,10819,10822,10826,10829,10833,10839,10843,10847,10889,10893,10899,10903,10907,10919,10925,10929,11001,11005,11008,11011,11018,11022,11026,11033,11036,11040,11083,11087,11111,11114,11125,11129,11132,11150,11153],[11,10815],{},[14,10817,10818],{},"When creating bots in axiom.ai, you will often pass data between steps, perhaps to filter it or enter it into an input field. You may wish to combine variables (tokens) from different steps (data sources) into a single variable.",[14,10820,10821],{},"As ever, there is more than one way! That's why axiom.ai is so powerful.",[21,10823,10825],{"id":10824},"what-are-tokens-in-axiomai","What are tokens in axiom.ai?",[14,10827,10828],{},"Tokens (variables) are pieces of data created at each step as your automation runs. Certain steps can output values such as text, numbers, or lists, which you can reuse in later steps. Tokens let you pass data between steps to output, manipulate, or transform.",[21,10830,10832],{"id":10831},"method-one-the-append-or-merge-data-step","Method one: the Append or merge data step",[14,10834,5070,10835,10838],{},[90,10836,10837],{},"Append or merge data"," step allows you to select two data sources and combine them into a single output. This is by far the simplest, no-brainer method for joining data in Axiom.",[592,10840],{"src":10841,"alt":10842},"\u002Fguides\u002Fcombine-vars-append-data.webp","Axiom.ai Append or merge data step axiom.ai",[639,10844,10846],{"id":10845},"how-to-use-the-append-or-merge-data-step","How to use the Append or merge data step",[77,10848,10849],{},[80,10850,10851],{},[83,10852,10853,88,10855,10857],{},[29,10854,349],{},[90,10856,10837],{},[80,10858,10859,10864,10869],{},[83,10860,10861,10863],{},[29,10862,223],{}," — Select the first data set (e.g., a scraped ticket URL).",[83,10865,10866,10868],{},[29,10867,233],{}," — Select the second data set to combine (e.g., ChatGPT output or a timestamp).",[83,10870,10871,10874,10875],{},[29,10872,10873],{},"Append mode"," — Choose how to combine the data:\n",[80,10876,10877,10883],{},[83,10878,10879,10882],{},[90,10880,10881],{},"\"Horizontally\""," joins values side-by-side",[83,10884,10885,10888],{},[90,10886,10887],{},"\"Vertically\""," stacks values top-to-bottom",[639,10890,10892],{"id":10891},"tip","Tip",[14,10894,10895,10896,10898],{},"💡 You can chain multiple ",[90,10897,10837],{}," steps if you need to combine more than two values.",[21,10900,10902],{"id":10901},"method-two-the-loop-step","Method two: The loop step",[592,10904],{"src":10905,"alt":10906},"\u002Fguides\u002Fjoin-vars-with-loop-step.webp","Join data variables using loop step axiom.ai",[14,10908,5070,10909,10911,10912,10914,10915,10918],{},[90,10910,114],{}," step is most commonly used to repeat actions—like scraping a list of URLs.",[344,10913],{},"\nBut it has a powerful hidden feature: ",[29,10916,10917],{},"it can be used to combine data from multiple steps"," even when you’re not looping.",[14,10920,10921,10922,10924],{},"Any steps that output data, when placed inside a ",[90,10923,114],{}," block, will have their data combined into a single output token.",[639,10926,10928],{"id":10927},"how-to-use-this-trick","How to use this trick",[77,10930,10931],{},[80,10932,10933,10952,10968,10983],{},[83,10934,10935,88,10937,10939],{},[29,10936,349],{},[90,10938,114],{},[80,10940,10941,10946],{},[83,10942,10943,10945],{},[29,10944,114],{}," — Leave this empty or toggle it off.",[83,10947,10948,10951],{},[29,10949,10950],{},"Purpose"," — You are not looping; you're using the loop as a container to combine outputs.",[83,10953,10954,88,10957,10960],{},[29,10955,10956],{},"Step 1.1",[90,10958,10959],{},"Step that outputs data",[80,10961,10962],{},[83,10963,10964,10965,5983],{},"Add any step that returns data (e.g. ",[90,10966,10967],{},"Get data from current page",[83,10969,10970,88,10973,10976],{},[29,10971,10972],{},"Step 1.2",[90,10974,10975],{},"Another step that outputs data",[80,10977,10978],{},[83,10979,10980,10981,5983],{},"Add another step that returns data (e.g. ",[90,10982,7555],{},[83,10984,10985,10988],{},[29,10986,10987],{},"Outside the loop",[80,10989,10990,10995],{},[83,10991,10992,10993,1230],{},"Use the token from the ",[90,10994,114],{},[83,10996,10997,10998,44],{},"This token contains combined data from all steps inside the loop, appended ",[29,10999,11000],{},"horizontally",[639,11002,11004],{"id":11003},"when-to-use-this","When to use this",[14,11006,11007],{},"This trick is useful when merging data from multiple steps to write into a Google Sheet.",[639,11009,10892],{"id":11010},"tip-1",[14,11012,11013,11014,11017],{},"⚠️ The combined data is only available ",[29,11015,11016],{},"outside"," the loop.",[21,11019,11021],{"id":11020},"method-three-the-javascript-step","Method three: The JavaScript step",[592,11023],{"src":11024,"alt":11025},"\u002Fguides\u002Fjoin-vars-javascript.webp","Join data variables using a JavaScript step",[14,11027,11028,11029,11032],{},"If you're comfortable with code, the ",[90,11030,11031],{},"JavaScript"," step is a powerful way to manipulate and combine data however you like.",[14,11034,11035],{},"You can use it to join variables, restructure arrays, clean data, or return a custom output—all inside one step.",[639,11037,11039],{"id":11038},"how-to-use-it","How to use it",[77,11041,11042],{},[80,11043,11044],{},[83,11045,11046,88,11048,11050],{},[29,11047,349],{},[90,11049,11031],{},[80,11051,11052,11059,11068,11074],{},[83,11053,11054,11056,11057,1230],{},[29,11055,610],{}," — Open the step finder and insert the ",[90,11058,11031],{},[83,11060,11061,11064,11065,11067],{},[29,11062,11063],{},"Declare tokens"," — Use the ",[90,11066,135],{}," menu to select tokens and assign them to variables.",[83,11069,11070,11073],{},[29,11071,11072],{},"Write your logic"," — Combine, transform, or filter the data however you like.",[83,11075,11076,11079,11080,11082],{},[29,11077,11078],{},"Return output"," — Use ",[90,11081,2972],{}," to output a single value or an array of values.",[639,11084,11086],{"id":11085},"example","Example",[719,11088,11090],{"className":756,"code":11089,"language":758,"meta":494,"style":494},"var links = [custom-data].flat();\nvar dates = [custom-data_1].flat();\n\nreturn [[...links, ...dates]];\n",[90,11091,11092,11097,11102,11106],{"__ignoreMap":494},[727,11093,11094],{"class":729,"line":730},[727,11095,11096],{},"var links = [custom-data].flat();\n",[727,11098,11099],{"class":729,"line":498},[727,11100,11101],{},"var dates = [custom-data_1].flat();\n",[727,11103,11104],{"class":729,"line":495},[727,11105,1898],{"emptyLinePlaceholder":522},[727,11107,11108],{"class":729,"line":1895},[727,11109,11110],{},"return [[...links, ...dates]];\n",[639,11112,10892],{"id":11113},"tip-2",[80,11115,11116,11119,11122],{},[83,11117,11118],{},"You can return a single value or an array.",[83,11120,11121],{},"The result can be used as input for steps like \"Write to a Google Sheet\".",[83,11123,11124],{},"You don’t need to be an expert—no-coders can still use this step with a bit of help from an LLM like ChatGPT.",[21,11126,11128],{"id":11127},"wrapping-up-axiomai-is-a-flexible-tool","Wrapping up: axiom.ai is a flexible tool",[14,11130,11131],{},"We designed axiom.ai to be flexible, which means there is often more than one way to solve a problem.",[80,11133,11134,11140,11145],{},[83,11135,11136,11137,11139],{},"If you only need to combine two tokens, use the ",[90,11138,10837],{}," step",[83,11141,11142,11143,11139],{},"If you want to output multiple values into a single row, use the ",[90,11144,114],{},[83,11146,11147,11148,11139],{},"If you need full control over how data is combined or transformed, use the ",[90,11149,11031],{},[14,11151,11152],{},"We have also received feedback from users about creating a dedicated step for handling multiple variables. This is something we are actively exploring for a future release.",[811,11154,4898],{},{"title":494,"searchDepth":495,"depth":495,"links":11156},[11157,11158,11162,11167,11172],{"id":10824,"depth":498,"text":10825},{"id":10831,"depth":498,"text":10832,"children":11159},[11160,11161],{"id":10845,"depth":495,"text":10846},{"id":10891,"depth":495,"text":10892},{"id":10901,"depth":498,"text":10902,"children":11163},[11164,11165,11166],{"id":10927,"depth":495,"text":10928},{"id":11003,"depth":495,"text":11004},{"id":11010,"depth":495,"text":10892},{"id":11020,"depth":498,"text":11021,"children":11168},[11169,11170,11171],{"id":11038,"depth":495,"text":11039},{"id":11085,"depth":495,"text":11086},{"id":11113,"depth":495,"text":10892},{"id":11127,"depth":498,"text":11128},"Learn how to combine tokens variables from multiple steps into a single output in axiom.ai using append, loop, or JavaScript steps.",{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":827,"tags":11175,"platfrom":11176},[1838],[1757],"\u002Fguides\u002Fhow-to-combine-variables",{"title":10811,"description":11173},"guides\u002Fhow-to-combine-variables","rdYvcaI2u72hIerXMiaSCTu-MC9AbT3jD8h4WecCUn0",{"id":11182,"title":11183,"body":11184,"date":523,"description":11528,"extension":506,"meta":11529,"navigation":522,"order":523,"path":11535,"seo":11536,"stem":11537,"__hash__":11538},"guides\u002Fguides\u002Fhow-to-dm-on-instagram.md","How to automate Instagram DM's",{"type":8,"value":11185,"toc":11523},[11186,11188,11196],[11,11187],{},[14,11189,11190,11191,11195],{},"This guide takes you through the step-by-step process of setting up a bot to send Instagram DMs. However, if you are keen to get started quickly, we have a ",[322,11192,11194],{"href":11193},"\u002Fguides\u002Finstagram-dm-like","one-click setup"," template you can use instead of this guide.",[11197,11198,11199,11203,11206,11241,11243,11257,11501,11514,11516],"zero-set-up",{},[21,11200,11202],{"id":11201},"create-a-blank-google-sheet","Create a blank Google Sheet",[14,11204,11205],{},"Create a Google Sheet, in Col A add links to profiles and in Col B insert your DM.",[7092,11207,11208,11217],{},[7095,11209,11210],{},[7098,11211,11212,11214],{},[7101,11213,3548],{},[7101,11215,11216],{},"B",[7108,11218,11219,11230],{},[7098,11220,11221,11227],{},[7113,11222,11223],{},[322,11224,11225],{"href":11225,"rel":11226},"https:\u002F\u002Fwww.instagram.com\u002Falfiesmith81\u002F",[2245],[7113,11228,11229],{},"My custom message 1",[7098,11231,11232,11238],{},[7113,11233,11234],{},[322,11235,11236],{"href":11236,"rel":11237},"https:\u002F\u002Fwww.instagram.com\u002Faxiom.ai\u002F",[2245],[7113,11239,11240],{},"My custom message 2",[21,11242,7133],{"id":7132},[14,11244,11245,11246,11250,11251,7142,11253,11256],{},"In the ",[322,11247,3435],{"href":11248,"rel":11249},"http:\u002F\u002Faxiom.ai",[2245]," Chrome extension, click ",[29,11252,7141],{},[29,11254,11255],{},"Start from Blank\"."," Use the step finder to add the steps outlined below.",[77,11258,11259],{},[80,11260,11261,11291],{},[83,11262,11263,88,11265,11267],{},[29,11264,349],{},[90,11266,92],{},[80,11268,11269,11273,11277,11284],{},[83,11270,11271,100],{},[90,11272,99],{},[83,11274,11275,7975],{},[90,11276,105],{},[83,11278,11279,11281,11282,44],{},[90,11280,7182],{},": Start from a specified column and row, e.g., ",[90,11283,7186],{},[83,11285,11286,11288,11289,44],{},[90,11287,5267],{},": End at a specified column and row, e.g., ",[90,11290,7194],{},[83,11292,11293,88,11295,11297,11307],{},[29,11294,908],{},[90,11296,114],{},[80,11298,11299],{},[83,11300,11301,132,11303,136,11305,44],{},[90,11302,114],{},[90,11304,194],{},[90,11306,139],{},[80,11308,11309,11325,11343,11470],{},[83,11310,11311,88,11313,11316],{},[29,11312,917],{},[90,11314,11315],{},"Go to page: Instagram profile",[80,11317,11318],{},[83,11319,11320,132,11322,11324],{},[90,11321,131],{},[90,11323,194],{},", select the column with Instagram profile links.",[83,11326,11327,88,11329,11331],{},[29,11328,935],{},[90,11330,148],{},[80,11332,11333],{},[83,11334,11335,11337,11338,11342],{},[90,11336,155],{},": Use the ",[322,11339,11341],{"href":11340},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool","Selector Tool"," to select the header containing the Message button.",[83,11344,11345,88,11347,11350,11373],{},[29,11346,943],{},[90,11348,11349],{},"If condition: Check for Message button",[80,11351,11352,11358,11367],{},[83,11353,11354,261,11356,44],{},[90,11355,6281],{},[90,11357,198],{},[83,11359,11360,11362,11363,11366],{},[90,11361,6296],{},": Insert text ",[90,11364,11365],{},"\"Message\""," (localise if needed).",[83,11368,11369,11372],{},[90,11370,11371],{},"Reverse condition",": Set to \"Run steps if condition is true\".",[80,11374,11375,11398,11406,11427,11435,11455],{},[83,11376,11377,88,11380,11383],{},[29,11378,11379],{},"Step 2.3.1",[90,11381,11382],{},"Click element: Message",[80,11384,11385,11390],{},[83,11386,11387,11389],{},[90,11388,155],{},": Highlight the Message button.",[83,11391,11392,162,11395,11397],{},[90,11393,11394],{},"Click",[90,11396,3651],{},", enable \"Use element text instead of HTML\", click \"Complete\".",[83,11399,11400,88,11403,10297],{},[29,11401,11402],{},"Step 2.3.2",[90,11404,11405],{},"Wait: For DM dialog to appear",[83,11407,11408,88,11411,11414],{},[29,11409,11410],{},"Step 2.3.3",[90,11412,11413],{},"Click element: Dismiss dialog",[80,11415,11416,11421],{},[83,11417,11418,11420],{},[90,11419,155],{},": Highlight the ‘Not now’ button.",[83,11422,11423,162,11425,11397],{},[90,11424,11394],{},[90,11426,3651],{},[83,11428,11429,88,11432,10297],{},[29,11430,11431],{},"Step 2.3.4",[90,11433,11434],{},"Wait: For dialog to close",[83,11436,11437,88,11440,11443],{},[29,11438,11439],{},"Step 2.3.5",[90,11441,11442],{},"Enter text: DM message",[80,11444,11445],{},[83,11446,11447,132,11449,11451,11452,11454],{},[90,11448,953],{},[90,11450,194],{},", select the message column from ",[90,11453,139],{}," (usually column B).",[83,11456,11457,88,11460,11463],{},[29,11458,11459],{},"Step 2.3.6",[90,11461,11462],{},"Press key(s): Send DM",[80,11464,11465],{},[83,11466,11467,11469],{},[90,11468,5357],{},": Press \"Return\", then click \"Stop recording\".",[83,11471,11472,88,11474,11476],{},[29,11473,959],{},[90,11475,281],{},[80,11477,11478,11482,11486,11494],{},[83,11479,11480,100],{},[90,11481,99],{},[83,11483,11484,7975],{},[90,11485,105],{},[83,11487,11488,11491,11492,44],{},[90,11489,11490],{},"First row to delete",": Leave set to ",[90,11493,165],{},[83,11495,11496,11491,11499,44],{},[90,11497,11498],{},"Last row to delete",[90,11500,165],{},[14,11502,11503,11504,401,11507,11509,11510,11513],{},"💡 For testing, set ",[90,11505,11506],{},"\"Last cell\"",[90,11508,7194],{}," to send a single DM. To send more, increase to ",[90,11511,11512],{},"\"AB10\""," etc. Instagram has limits — avoid getting blocked.",[21,11515,796],{"id":795},[14,11517,11518,11519,11522],{},"By following these steps, it's possible to automate sending direct messages on Instagram. Sending too many messages can get your account blocked, but it works well if you stick within Instagram's DM limits. Better still, there is an ",[322,11520,11521],{"href":11193},"Instagram template"," that can be set up with a single click.",{"title":494,"searchDepth":495,"depth":495,"links":11524},[11525,11526,11527],{"id":11201,"depth":498,"text":11202},{"id":7132,"depth":498,"text":7133},{"id":795,"depth":498,"text":796},"A Step by step guide how to contruct a bot to autoamte sending direct messages on Instagram.",{"pinned":522,"type":513,"format":77,"intent_type":11530,"intent":1050,"tags":11531,"platfrom":11533},"usacase",[11532,1053],"social media",[11534],"Instagram","\u002Fguides\u002Fhow-to-dm-on-instagram",{"title":11183,"description":11528},"guides\u002Fhow-to-dm-on-instagram","S7erdMR8rGd28tmr3LFTugvRH_qqYzR7IQLmPCMj0Mw",{"id":11540,"title":11541,"body":11542,"date":523,"description":11548,"extension":506,"meta":11822,"navigation":522,"order":523,"path":11826,"seo":11827,"stem":11828,"__hash__":11829},"guides\u002Fguides\u002Fhow-to-loop-through-data-in-cells.md","How to loop through data in cells",{"type":8,"value":11543,"toc":11815},[11544,11546,11549,11552,11555,11559,11562,11565,11569,11573,11576,11587,11591,11598,11607,11616,11625,11633,11637,11641,11644,11778,11781,11783,11786,11789,11809,11812],[11,11545],{},[14,11547,11548],{},"When automating web apps, you often need to select more than one option within a dropdown or checkbox group. This is common when entering product data into ecommerce backends, such as assigning colours, size ranges, or other product variants. I recently used this approach while automating workflows for Printful and WooCommerce, where multiple selections are required to correctly configure products.",[14,11550,11551],{},"In the example below, we will open a dropdown and select multiple checkbox entries. The same approach can be adapted to many other use cases.",[14,11553,11554],{},"Let’s dive in.",[21,11556,11558],{"id":11557},"how-to-set-up-your-data","How to set up your data",[14,11560,11561],{},"In this example, I am using a Google Sheet. To loop through multiple values stored inside a single cell, you must separate them using a delimiter. I typically use a comma, but any consistent delimiter will work as long as it is used consistently across the sheet.",[14,11563,11564],{},"For example, in column C you might store sizes like this:",[592,11566],{"src":11567,"alt":11568},"\u002Fguides\u002Fgoogle-cell-data.webp","How to set up you data separated by a delimiter.",[21,11570,11572],{"id":11571},"when-to-use-this-method","When to use this method",[14,11574,11575],{},"Use this approach when:",[80,11577,11578,11581,11584],{},[83,11579,11580],{},"You need to tick multiple checkboxes.",[83,11582,11583],{},"You need to select multiple dropdown options.",[83,11585,11586],{},"You are automating product variants, tags, permissions, or categories.",[21,11588,11590],{"id":11589},"what-steps-we-will-use","What steps we will use",[14,11592,11593,11594,11597],{},"First, we import the source data using the ",[322,11595,11596],{"href":494},"Read data from Google Sheet"," step. This gives us access to all product values stored in the sheet.",[14,11599,11600,11601,11606],{},"Next, we use the ",[322,11602,11605],{"href":11603,"rel":11604},"https:\u002F\u002Faxiom.ai\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Floop",[2245],"Loop through data step"," to process each row individually.",[14,11608,11609,11610,11615],{},"Within that loop, we add a ",[322,11611,11614],{"href":11612,"rel":11613},"https:\u002F\u002Faxiom.ai\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fsplit-by-character",[2245],"Split by character step",". This takes a single cell containing multiple values and splits it using a delimiter, turning the values into an array.",[14,11617,11618,11619,11624],{},"Because the split data is returned horizontally, we then use the ",[322,11620,11623],{"href":11621,"rel":11622},"https:\u002F\u002Faxiom.ai\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fswap-rows-and-columns",[2245],"Swap rows and columns step"," to convert it into a vertical list.",[14,11626,11627,11628,11632],{},"Finally, we use another ",[322,11629,11631],{"href":11603,"rel":11630},[2245],"Loop step"," to iterate through the transposed values one by one. This allows each option to be selected individually in the target dropdown or checkbox group.",[592,11634],{"src":11635,"alt":11636},"\u002Fguides\u002Fnested-cell-loop.webp","steps for nested loop through cell data",[21,11638,11640],{"id":11639},"how-to-structure-the-steps","How to structure the steps",[14,11642,11643],{},"Below is a simplified outline of the structure:",[77,11645,11646],{},[80,11647,11648,11675],{},[83,11649,11650,88,11652,11654],{},[29,11651,349],{},[90,11653,92],{},[80,11655,11656,11660,11664,11670],{},[83,11657,11658,100],{},[90,11659,99],{},[83,11661,11662,7975],{},[90,11663,105],{},[83,11665,11666,11281,11668,44],{},[90,11667,7182],{},[90,11669,7186],{},[83,11671,11672,11674],{},[90,11673,5267],{},": End at a specified column and row, depending on how many rows you want to process.",[83,11676,11677,88,11679,11681,11691],{},[29,11678,908],{},[90,11680,114],{},[80,11682,11683],{},[83,11684,11685,132,11687,136,11689,44],{},[90,11686,114],{},[90,11688,194],{},[90,11690,139],{},[80,11692,11693,11718,11736],{},[83,11694,11695,88,11697,11700],{},[29,11696,917],{},[90,11698,11699],{},"Split by character",[80,11701,11702,11711],{},[83,11703,11704,11707,11708,44],{},[90,11705,11706],{},"Character",": Enter your chosen delimiter, for example ",[90,11709,11710],{},",",[83,11712,11713,132,11715,11717],{},[90,11714,465],{},[90,11716,194],{},", select the column that contains your delimited cell values (e.g., sizes column).",[83,11719,11720,88,11722,11725],{},[29,11721,935],{},[90,11723,11724],{},"Swap rows and columns",[80,11726,11727],{},[83,11728,11729,132,11731,11733,11734,1230],{},[90,11730,465],{},[90,11732,194],{},", select the output from the ",[90,11735,11699],{},[83,11737,11738,88,11740,11743,11753],{},[29,11739,943],{},[90,11741,11742],{},"Loop through data (nested loop)",[80,11744,11745],{},[83,11746,11747,132,11749,11733,11751,1230],{},[90,11748,114],{},[90,11750,194],{},[90,11752,11724],{},[80,11754,11755],{},[83,11756,11757,88,11759,11761],{},[29,11758,11379],{},[90,11760,3639],{},[80,11762,11763,11768],{},[83,11764,11765,11767],{},[90,11766,155],{},": Highlight the size dropdown.",[83,11769,11770,162,11772,11774,11775,11777],{},[90,11771,11394],{},[90,11773,3651],{},", enable \"Use element text instead of HTML\", click \"insert data\" and select the output from the ",[90,11776,11724],{}," step. Finally click \"Complete\".",[14,11779,11780],{},"This allows each value in the cell (for example, each size) to be selected individually.",[21,11782,796],{"id":795},[14,11784,11785],{},"Looping through data inside loops can feel complex at first. The key is setting up your data correctly using a delimiter.",[14,11787,11788],{},"Once your data is structured properly, you only need a few steps:",[80,11790,11791,11797,11803],{},[83,11792,11793],{},[322,11794,11796],{"href":11612,"rel":11795},[2245],"Split",[83,11798,11799],{},[322,11800,11802],{"href":11621,"rel":11801},[2245],"Transpose",[83,11804,11805],{},[322,11806,11808],{"href":11603,"rel":11807},[2245],"loop",[14,11810,11811],{},"From there, you can automate selecting multiple dropdown items, ticking multiple checkboxes, or interacting with repeated UI elements.",[14,11813,11814],{},"Master nested loops, and you unlock the ability to automate highly dynamic interfaces.",{"title":494,"searchDepth":495,"depth":495,"links":11816},[11817,11818,11819,11820,11821],{"id":11557,"depth":498,"text":11558},{"id":11571,"depth":498,"text":11572},{"id":11589,"depth":498,"text":11590},{"id":11639,"depth":498,"text":11640},{"id":795,"depth":498,"text":796},{"pinned":522,"metaTitle":11823,"type":513,"format":77,"intent_type":1754,"intent":827,"tags":11824,"platfrom":11825},"How to loop through data in cells using nested loops and a data source like Google Sheets",[1055],[1757],"\u002Fguides\u002Fhow-to-loop-through-data-in-cells",{"title":11541,"description":11548},"guides\u002Fhow-to-loop-through-data-in-cells","phx8XCoib2bbjF7pVdlaqhsm61REmcK3HabzAgfUBaU",{"id":11831,"title":11832,"body":11833,"date":523,"description":12117,"extension":506,"meta":12118,"navigation":522,"order":523,"path":12122,"seo":12123,"stem":12124,"__hash__":12125},"guides\u002Fguides\u002Fhubspot-sequence-add-contacts.md","How to automate adding contacts to your Hubspot sequences",{"type":8,"value":11834,"toc":12112},[11835,11837,11841,11867,11869,11871,11874,11907,11909,11911,11921,12096,12102,12104,12106],[11,11836],{},[592,11838],{"src":11839,"alt":11840},"\u002Fdocs\u002Fguides\u002Fhubspot-sequences.jpg","Automate hubspot sequences in the browser with axiom.ai",[14,11842,11843,11844,3893,11848,195,11851,11854,11855,11858,11859,11862,11863,11866],{},"This guide shows you how to make a bot that reads contact information from a Google Sheet, opens a HubSpot email sequence, and then ",[322,11845,11847],{"href":11846},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fclicks","clicks",[29,11849,11850],{},"\"Email Contacts\"",[29,11852,11853],{},"\"Enroll Contacts.\""," It then enters the email into the ",[29,11856,11857],{},"\"Search for Contacts\""," input. The bot then selects \"Next\" and finally ",[29,11860,11861],{},"\"Start Sequence\""," before repeating the process in a ",[322,11864,11808],{"href":11865},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Floop"," for the next contact. Better still, the bot can be easily adapted to your use case by adding and removing steps.",[21,11868,11202],{"id":11201},[11,11870],{},[14,11872,11873],{},"Create a Google Sheet add some contact emails to the sheet. See example below.",[7092,11875,11876,11884],{},[7095,11877,11878],{},[7098,11879,11880,11882],{},[7101,11881,3548],{},[7101,11883,11216],{},[7108,11885,11886,11897],{},[7098,11887,11888,11894],{},[7113,11889,11890],{},[322,11891,11893],{"href":11892},"mailto:dummycontact@mywork.com","dummycontact@mywork.com",[7113,11895,11896],{},"---",[7098,11898,11899,11905],{},[7113,11900,11901],{},[322,11902,11904],{"href":11903},"mailto:dummycontact1@mywork.com","dummycontact1@mywork.com",[7113,11906,11896],{},[21,11908,7133],{"id":7132},[11,11910],{},[14,11912,11245,11913,11250,11917,7142,11919,11256],{},[322,11914,3435],{"href":11915,"rel":11916},"http:\u002F\u002Faxiom.ai\u002F",[2245],[29,11918,7141],{},[29,11920,11255],{},[77,11922,11923],{},[80,11924,11925,11955,11969],{},[83,11926,11927,88,11929,11931],{},[29,11928,349],{},[90,11930,92],{},[80,11932,11933,11937,11941,11948],{},[83,11934,11935,100],{},[90,11936,99],{},[83,11938,11939,7975],{},[90,11940,105],{},[83,11942,11943,11945,11946,44],{},[90,11944,7182],{},": Start from ",[90,11947,7186],{},[83,11949,11950,11952,11953,44],{},[90,11951,5267],{},": End at ",[90,11954,7194],{},[83,11956,11957,88,11959,11962],{},[29,11958,908],{},[90,11960,11961],{},"Go to page: Hubspot Sequence",[80,11963,11964],{},[83,11965,11966,11968],{},[90,11967,131],{},": Insert the sequence URL you wish to add contacts into.",[83,11970,11971,88,11973,11975,11985],{},[29,11972,9029],{},[90,11974,114],{},[80,11976,11977],{},[83,11978,11979,132,11981,136,11983,44],{},[90,11980,114],{},[90,11982,194],{},[90,11984,139],{},[80,11986,11987,12009,12025,12039,12053,12068],{},[83,11988,11989,88,11991,11994],{},[29,11990,9038],{},[90,11992,11993],{},"Select list: Enroll contacts",[80,11995,11996,12001],{},[83,11997,11998,12000],{},[90,11999,155],{},": Highlight the “Enroll contacts” dropdown.",[83,12002,12003,12005,12006,44],{},[90,12004,953],{},": Add the text ",[90,12007,12008],{},"\"Email contacts\"",[83,12010,12011,88,12013,12016],{},[29,12012,9046],{},[90,12014,12015],{},"Enter text: Search for contact",[80,12017,12018],{},[83,12019,12020,132,12022,12024],{},[90,12021,953],{},[90,12023,194],{},", select the email column from the Google Sheet (column A).",[83,12026,12027,88,12029,12032],{},[29,12028,9062],{},[90,12030,12031],{},"Click element: Tick contact",[80,12033,12034],{},[83,12035,12036,12038],{},[90,12037,155],{},": Highlight and select the checkbox for the top result.",[83,12040,12041,88,12043,12046],{},[29,12042,9070],{},[90,12044,12045],{},"Click element: Next",[80,12047,12048],{},[83,12049,12050,12052],{},[90,12051,155],{},": Highlight the “Next” button and click Complete.",[83,12054,12055,88,12058,12061],{},[29,12056,12057],{},"Step 3.5",[90,12059,12060],{},"Click element: Start sequence",[80,12062,12063],{},[83,12064,12065,12067],{},[90,12066,155],{},": Highlight the “Start sequence” button and click Complete.",[83,12069,12070,88,12072,12074],{},[29,12071,9212],{},[90,12073,281],{},[80,12075,12076,12080,12084,12090],{},[83,12077,12078,100],{},[90,12079,99],{},[83,12081,12082,7975],{},[90,12083,105],{},[83,12085,12086,162,12088,44],{},[90,12087,11490],{},[90,12089,165],{},[83,12091,12092,162,12094,44],{},[90,12093,11498],{},[90,12095,165],{},[14,12097,12098,12099,12101],{},"💡 Adjust the ",[90,12100,5267],{}," value in Step 1.0 (e.g. \"AB50\") to loop through multiple contacts.",[21,12103,796],{"id":795},[11,12105],{},[14,12107,12108,12109,44],{},"In just a few steps, anyone can create automation that reads contacts from a Google Sheet, opens a HubSpot sequence, and adds a contact. In fact, what you have learned is how to automate virtually any action in HubSpot. Take what you have learned and apply it to marketing, commerce, CRM, content, and even reporting to fully automate HubSpot in the ",[322,12110,12111],{"href":7289},"browser",{"title":494,"searchDepth":495,"depth":495,"links":12113},[12114,12115,12116],{"id":11201,"depth":498,"text":11202},{"id":7132,"depth":498,"text":7133},{"id":795,"depth":498,"text":796},"Learn how to automate adding contacts to your HubSpot sequences using data from Google Sheets. This step-by-step guide walks you through building a browser bot with axiom.ai.",{"type":513,"format":77,"intent_type":1049,"intent":827,"tags":12119,"platfrom":12120},[1055],[12121],"Hubspot","\u002Fguides\u002Fhubspot-sequence-add-contacts",{"title":11832,"description":12117},"guides\u002Fhubspot-sequence-add-contacts","7fkmEqDGbiJAtWBKfOvxQ_u6hVopVfLhafbwt9GON9Y",{"id":12127,"title":12128,"body":12129,"date":523,"description":12687,"extension":506,"meta":12688,"navigation":522,"order":523,"path":12691,"seo":12692,"stem":12693,"__hash__":12694},"guides\u002Fguides\u002Fifttt.md","How to trigger axiom.ai automations using IFTTT",{"type":8,"value":12130,"toc":12676},[12131,12133,12141,12151,12153,12155,12178,12182,12185,12217,12220,12253,12257,12261,12264,12291,12294,12316,12319,12366,12368,12376,12382,12384,12387,12391,12400,12430,12433,12440,12444,12447,12493,12496,12612,12623,12663,12665,12668,12673],[11,12132],{},[14,12134,12135,12140],{},[322,12136,12139],{"href":12137,"rel":12138},"https:\u002F\u002Fifttt.com",[2245],"IFTTT"," offers a wide range of connections to various services, learn how to start using IFTTT automations to trigger your axiom.ai automations and power-up your workflow with access to new services.",[14,12142,12143,12144,12146,12147,12150],{},"This guide assumes that you already have an automation set up, want to create a trigger using IFTTT, and have an axiom.ai plan that supports webhooks (see ",[322,12145,3341],{"href":3340},"). Some features of ",[322,12148,12139],{"href":12137,"rel":12149},[2245]," may require a subscription.",[21,12152,546],{"id":545},[14,12154,551],{},[77,12156,12157],{},[555,12158,12159,12166,12171],{},[83,12160,12161,12163,12164,44],{},[29,12162,561],{},": Your personal API key can be found in the extension ",[322,12165,566],{"href":565},[83,12167,12168,12170],{},[29,12169,571],{},": The name of the automation you wish to trigger.",[83,12172,12173,12175,12176,44],{},[29,12174,577],{},": The current axiom.ai endpoint is ",[90,12177,581],{},[21,12179,12181],{"id":12180},"trigger-an-axiomai-automation-with-ifttt","Trigger an axiom.ai automation with IFTTT",[14,12183,12184],{},"Learn how to trigger an axiom.ai automation from IFTTT by making use of webhooks.",[77,12186,12187],{},[555,12188,12189,12200,12206,12212],{},[83,12190,12191,12194,12195,12199],{},[29,12192,12193],{},"Create IFTTT applet",": Head to ",[322,12196,12198],{"href":12137,"rel":12197},[2245],"ifttt.com"," and click \"create\".",[83,12201,12202,12205],{},[29,12203,12204],{},"Trigger",": IFTTT offer a wide range of triggers for your automations. For this guide we will use \"Date & Time\" for simplicity.",[83,12207,12208,12211],{},[29,12209,12210],{},"Action(s)",": To trigger your axiom.ai automation, select \"Webhooks\" as an action.",[83,12213,12214,12216],{},[29,12215,620],{},": Configure the \"webhooks\" action.",[14,12218,12219],{},"Configure the \"webhooks\" action:",[77,12221,12222],{},[80,12223,12224,12230,12237,12244],{},[83,12225,12226,578,12228,44],{},[29,12227,3922],{},[90,12229,581],{},[83,12231,12232,162,12235,44],{},[29,12233,12234],{},"Method",[90,12236,627],{},[83,12238,12239,162,12242,44],{},[29,12240,12241],{},"Content Type",[90,12243,8859],{},[83,12245,12246,12248,12249,12252],{},[29,12247,632],{},": This should be set per our ",[322,12250,12251],{"href":6720},"API | Triggering an automation"," documentation.",[592,12254],{"src":12255,"alt":12256},"\u002Fdocs\u002Fguides\u002Fifttt-create-datetime-trigger.jpg","create ifttt with date time trigger to trigger axiom.ai automation",[21,12258,12260],{"id":12259},"trigger-an-ifttt-applet-with-an-axiomai-automation","Trigger an IFTTT applet with an axiom.ai automation",[14,12262,12263],{},"Learn how to trigger an IFTTT applet from an axiom.ai automation.",[77,12265,12266],{},[555,12267,12268,12275,12280,12285],{},[83,12269,12270,12194,12272,12199],{},[29,12271,12193],{},[322,12273,12198],{"href":12137,"rel":12274},[2245],[83,12276,12277,12279],{},[29,12278,12204],{},": Select the \"receive a web request with a JSON payload\" trigger, and set an event name.",[83,12281,12282,12284],{},[29,12283,12210],{},": Select the action(s) that you would like your IFTTT flow to take.",[83,12286,12287,12290],{},[29,12288,12289],{},"Save",": Once saved, you will then be given a webhook URL, save this for later.",[14,12292,12293],{},"Now head over to your axiom.ai automation:",[77,12295,12296],{},[555,12297,12298,12304,12310],{"start":1901},[83,12299,12300,12303],{},[29,12301,12302],{},"Trigger a webhook",": Add the \"trigger a webhook\" step to your automation, towards the end of your automation is often best.",[83,12305,12306,12309],{},[29,12307,12308],{},"Set Endpoint",": In the \"endpoint\" field, insert the URL from step 4.",[83,12311,12312,12315],{},[29,12313,12314],{},"Define payload",": (Optional) If you're sending data to IFTTT, define a JSON payload in the \"payload\" field.",[14,12317,12318],{},"Example payload:",[719,12320,12322],{"className":7732,"code":12321,"language":2585,"meta":494,"style":494},"{\n  \"organisation\": \"axiom.ai\",\n  \"address\": \"123 Coast Road\",\n  \"phone\": \"xxx-xxx-xxxx\"\n}\n",[90,12323,12324,12328,12340,12352,12362],{"__ignoreMap":494},[727,12325,12326],{"class":729,"line":730},[727,12327,7740],{"class":768},[727,12329,12330,12333,12335,12338],{"class":729,"line":498},[727,12331,12332],{"class":7745},"  \"organisation\"",[727,12334,1995],{"class":768},[727,12336,12337],{"class":737},"\"axiom.ai\"",[727,12339,2427],{"class":768},[727,12341,12342,12345,12347,12350],{"class":729,"line":495},[727,12343,12344],{"class":7745},"  \"address\"",[727,12346,1995],{"class":768},[727,12348,12349],{"class":737},"\"123 Coast Road\"",[727,12351,2427],{"class":768},[727,12353,12354,12357,12359],{"class":729,"line":1895},[727,12355,12356],{"class":7745},"  \"phone\"",[727,12358,1995],{"class":768},[727,12360,12361],{"class":737},"\"xxx-xxx-xxxx\"\n",[727,12363,12364],{"class":729,"line":1901},[727,12365,2639],{"class":768},[21,12367,776],{"id":775},[14,12369,12370,12371,12375],{},"To test the triggering of your axiom.ai automation from an IFTTT applet, simply run the flow from IFTTT and then check the ",[29,12372,12373],{},[322,12374,792],{"href":791}," in axiom.ai to confirm that the automation has run. If there is no run report present, this could either mean that there was an error in IFTTT, or the automation has yet to run.",[14,12377,12378,12379,12381],{},"To test the triggering of your IFTTT applet, simply click ",[29,12380,784],{}," within your axiom.ai automation and then observe the actions that the IFTTT applet makes - for example, if it writes to a Google Sheet, check the Google Sheet that is connected.",[21,12383,6725],{"id":6724},[14,12385,12386],{},"There are plenty of use cases that this can be applied to, below are some examples.",[639,12388,12390],{"id":12389},"trigger-axiomai-automation-when-an-airtable-database-is-updated","Trigger axiom.ai automation when an Airtable database is updated",[14,12392,12393,12394,12399],{},"To get started, you'll need to ensure that you have your Airtable account connected to IFTTT. To do so, add the Airtable action\u002Ftrigger to an automation and follow the instructions. See IFTTTs documentation: ",[322,12395,12398],{"href":12396,"rel":12397},"https:\u002F\u002Fifttt.com\u002Fairtable",[2245],"Airtable Integrations"," for more information.",[77,12401,12402],{},[555,12403,12404,12411,12416,12424],{},[83,12405,12406,12194,12408,12199],{},[29,12407,12193],{},[322,12409,12198],{"href":12137,"rel":12410},[2245],[83,12412,12413,12415],{},[29,12414,12204],{},": Select the \"Airtable\" trigger.",[83,12417,12418,12420,12421,44],{},[29,12419,12210],{},": Add the \"Webhooks\" action. To configure this action, see ",[322,12422,12181],{"href":12423},"#trigger-an-axiomai-automation-with-ifttt",[83,12425,12426,12429],{},[29,12427,12428],{},"Test",": Add a new entry to your Airtable table, give it a moment, and then check \"run reports\" in your axiom.ai extension.",[592,12431],{"src":12432,"alt":12256},"\u002Fdocs\u002Fguides\u002Fifttt-create-airtable-trigger.jpg",[14,12434,12435,12436,44],{},"Need to post data to Airtable using Axiom? Check out our guide on ",[322,12437,12439],{"href":12438},"\u002Fguides\u002Fpost-data-to-airtable","how to post data to airtable",[639,12441,12443],{"id":12442},"automatically-create-a-new-notion-page-with-ifttt-and-axiomai","Automatically create a new Notion page with IFTTT and axiom.ai",[14,12445,12446],{},"To get started, you'll need to ensure that you have your Notion account connected to IFTTT. To do so, add the Notion action\u002Ftrigger to an automation and follow the instructions. For this example, we are going to be making a company directory with an axiom.ai automation that sends company data to IFTTT to be filed in Notion.so.",[77,12448,12449],{},[555,12450,12451,12458,12462,12467,12472,12482,12488],{},[83,12452,12453,12194,12455,12199],{},[29,12454,12193],{},[322,12456,12198],{"href":12137,"rel":12457},[2245],[83,12459,12460,12279],{},[29,12461,12204],{},[83,12463,12464,12466],{},[29,12465,12210],{},": Search \"Notion\" and select \"create a page\".",[83,12468,12469,12471],{},[29,12470,620],{},": Configure the action(s) as required, you'll need to set values for the page title and content - this can be dummy content for the time being.",[83,12473,12474,12477,12478,12481],{},[29,12475,12476],{},"Add a filter code",":  To make use of the ",[90,12479,12480],{},"JsonPayload"," object that is created by the webhook trigger, a filter code will need to be added. See the code below for more details. This can be modified for use with other services.",[83,12483,12484,12487],{},[29,12485,12486],{},"Set up your Axiom",": Add a \"Trigger webhook\" step to your automation to use when sending data to IFTTT.",[83,12489,12490,12492],{},[29,12491,12428],{},": Click \"run\" on your automation with some test data then check the activity within your IFTTT applet to confirm it ran as expected.",[14,12494,12495],{},"To set up a filter code that changes the Notion.so page name and inserts data into the page, follow the code below. You'll need to switch out with the data that you are sending to the webhook.",[719,12497,12501],{"className":12498,"code":12499,"language":12500,"meta":494,"style":494},"language-ts shiki shiki-themes github-light-default github-dark-default","\u002F\u002F Parse the payload to be able to be used within your applet.\nlet payload = JSON.parse(MakerWebhooks.jsonEvent.JsonPayload)\n\n\u002F\u002F Set the title based on the first value within the payload\nNotionSo.createNewPage.setPageTitle(payload.organisation)\n\n\u002F\u002F Set the page content\nNotionSo.createNewPage.setPageBody(`Organisation: ${payload.organisation}\\nAddress: ${payload.address}\\nPhone: ${payload.phone}`)\n","ts",[90,12502,12503,12508,12528,12532,12537,12548,12552,12557],{"__ignoreMap":494},[727,12504,12505],{"class":729,"line":730},[727,12506,12507],{"class":2920},"\u002F\u002F Parse the payload to be able to be used within your applet.\n",[727,12509,12510,12513,12515,12517,12520,12522,12525],{"class":729,"line":498},[727,12511,12512],{"class":1986},"let",[727,12514,9527],{"class":768},[727,12516,4970],{"class":1986},[727,12518,12519],{"class":1882}," JSON",[727,12521,44],{"class":768},[727,12523,12524],{"class":2376},"parse",[727,12526,12527],{"class":768},"(MakerWebhooks.jsonEvent.JsonPayload)\n",[727,12529,12530],{"class":729,"line":495},[727,12531,1898],{"emptyLinePlaceholder":522},[727,12533,12534],{"class":729,"line":1895},[727,12535,12536],{"class":2920},"\u002F\u002F Set the title based on the first value within the payload\n",[727,12538,12539,12542,12545],{"class":729,"line":1901},[727,12540,12541],{"class":768},"NotionSo.createNewPage.",[727,12543,12544],{"class":2376},"setPageTitle",[727,12546,12547],{"class":768},"(payload.organisation)\n",[727,12549,12550],{"class":729,"line":1973},[727,12551,1898],{"emptyLinePlaceholder":522},[727,12553,12554],{"class":729,"line":2052},[727,12555,12556],{"class":2920},"\u002F\u002F Set the page content\n",[727,12558,12559,12561,12564,12566,12569,12572,12574,12577,12580,12583,12586,12588,12590,12593,12595,12597,12600,12602,12604,12607,12609],{"class":729,"line":2058},[727,12560,12541],{"class":768},[727,12562,12563],{"class":2376},"setPageBody",[727,12565,2542],{"class":768},[727,12567,12568],{"class":737},"`Organisation: ${",[727,12570,12571],{"class":768},"payload",[727,12573,44],{"class":737},[727,12575,12576],{"class":768},"organisation",[727,12578,12579],{"class":737},"}",[727,12581,12582],{"class":1986},"\\n",[727,12584,12585],{"class":737},"Address: ${",[727,12587,12571],{"class":768},[727,12589,44],{"class":737},[727,12591,12592],{"class":768},"address",[727,12594,12579],{"class":737},[727,12596,12582],{"class":1986},[727,12598,12599],{"class":737},"Phone: ${",[727,12601,12571],{"class":768},[727,12603,44],{"class":737},[727,12605,12606],{"class":768},"phone",[727,12608,2448],{"class":737},[727,12610,12611],{"class":768},")\n",[14,12613,12614,12615,12618,12619,12622],{},"To set up your axiom.ai automation, you'll need to add a ",[29,12616,12617],{},"trigger webhook"," step. You'll need to save your IFTTT applet and grab the webhook URL. It should have the following format: ",[90,12620,12621],{},"https:\u002F\u002Fmaker.ifttt.com\u002Ftrigger\u002F\u003CEVENT_NAME>\u002Fjson\u002Fwith\u002Fkey\u002F\u003CID>",". You'll need to then format your payload as JSON, in our example, we used the following:",[719,12624,12625],{"className":7732,"code":12321,"language":2585,"meta":494,"style":494},[90,12626,12627,12631,12641,12651,12659],{"__ignoreMap":494},[727,12628,12629],{"class":729,"line":730},[727,12630,7740],{"class":768},[727,12632,12633,12635,12637,12639],{"class":729,"line":498},[727,12634,12332],{"class":7745},[727,12636,1995],{"class":768},[727,12638,12337],{"class":737},[727,12640,2427],{"class":768},[727,12642,12643,12645,12647,12649],{"class":729,"line":495},[727,12644,12344],{"class":7745},[727,12646,1995],{"class":768},[727,12648,12349],{"class":737},[727,12650,2427],{"class":768},[727,12652,12653,12655,12657],{"class":729,"line":1895},[727,12654,12356],{"class":7745},[727,12656,1995],{"class":768},[727,12658,12361],{"class":737},[727,12660,12661],{"class":729,"line":1901},[727,12662,2639],{"class":768},[21,12664,796],{"id":795},[14,12666,12667],{},"Being able to trigger your IFTTT applets with an axiom.ai automation, or vice verse, can be super powerful. IFTTT offers a wide range of connections that can be used to power up your axiom.ai automations. IFTTT also offers mobile applications that could be used to trigger your axiom.ai automations, making your automations much more portable.",[14,12669,12670],{},[807,12671,12672],{},"Information correct as of October 2024. Updated to any platform mentioned my change or render this process obsolete.",[811,12674,12675],{},"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 .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 .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}",{"title":494,"searchDepth":495,"depth":495,"links":12677},[12678,12679,12680,12681,12682,12686],{"id":545,"depth":498,"text":546},{"id":12180,"depth":498,"text":12181},{"id":12259,"depth":498,"text":12260},{"id":775,"depth":498,"text":776},{"id":6724,"depth":498,"text":6725,"children":12683},[12684,12685],{"id":12389,"depth":495,"text":12390},{"id":12442,"depth":495,"text":12443},{"id":795,"depth":498,"text":796},"Learn how to get started with triggering axiom.ai automations from IFTTT, and trigger IFTTT applets from axiom.ai. Automate Notion, Airtable, X, Twitter, TikTok any many more with axiom.ai and IFTTT.",{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":827,"tags":12689,"platfrom":12690},[829,830],[12139],"\u002Fguides\u002Fifttt",{"title":12128,"description":12687},"guides\u002Fifttt","1cLqZpgYwTB-1PjUZI02YloaxNdFHO1JzIImGmzYrtg",{"id":12696,"title":12697,"body":12698,"date":523,"description":12760,"extension":506,"meta":12761,"navigation":522,"order":523,"path":324,"seo":12762,"stem":12763,"__hash__":12764},"guides\u002Fguides\u002Findex.md","Guides",{"type":8,"value":12699,"toc":12758},[12700,12705,12708,12735,12738,12748,12754],[12701,12702],"page-header-centered-text",{"description":12703,"headline":12704},"Go beyond basics with hands-on guides for browser automation.","Browser automation guides.",[12706,12707],"blog-filters",{},[12709,12710,12711,12720,12728],"three-col",{},[514,12712,12713],{"v-slot:ColOne":494},[12714,12715],"docs-image-card",{"link":12716,"shape":12717,"text":12718,"title":12719},"\u002Fguides\u002Fworkflow","pyramid","Step by step guides for common automation tasks.","Workflows",[514,12721,12722],{"v-slot:ColTwo":494},[12714,12723],{"link":12724,"shape":12725,"text":12726,"title":12727},"\u002Fguides\u002Fpattern","cube","Techniques you can reuse across different workflows.","Patterns",[514,12729,12730],{"v-slot:ColThree":494},[12714,12731],{"link":12732,"shape":12725,"text":12733,"title":12734},"\u002Fguides\u002Fusecase","Real world examples of complete automations.","Use cases",[12736,12737],"guide-index-list",{},[12739,12740,12743],"grid-fade-wrap",{"bg":12741,"color":12742},"gray-to-white","default",[12744,12745],"customer-quote",{"author":12746,"quote":12747},"Nathan Heidemann","Very useful tool, saved a ton of time.",[12749,12750],"chrome-reviews",{"className":12751},[12752,12753],"gray","iso-grid-gray-100",[12755,12756],"call-to-action",{"className":12757},[12752,12753],{"title":494,"searchDepth":495,"depth":495,"links":12759},[],"Explore our collection of browser automation guides. Whether you're scraping data, filling out forms, or triggering automations with APIs, these step-by-step tutorials help no-coders and developers get started fast.",{},{"title":12697,"description":12760},"guides\u002Findex","HfRoBxOIausBy3YNY1npRNevRuZtFl6t2tu7XiFkL_0",{"id":12766,"title":12767,"body":12768,"date":504,"description":12875,"extension":506,"meta":12876,"navigation":522,"order":523,"path":11193,"seo":12884,"stem":12885,"__hash__":12886},"guides\u002Fguides\u002Finstagram-dm-like.md","How to DM Instagram users and like their newest post",{"type":8,"value":12769,"toc":12869},[12770,12777,12779,12781,12788,12792,12799,12804,12808,12821,12825,12838,12844,12850,12856],[14,12771,12772,12773,12776],{},"This one-click template reads a Google Sheet, loops through each row, loads the profile links in the browser, clicks ",[29,12774,12775],{},"'Message'",", and sends the DM. Finally, it likes the user's latest post. To use it, just add a Google Sheet.",[18,12778],{},[21,12780,24],{"id":23},[14,12782,12783,12784,12787],{},"Create a new Google Sheet with a column of Instagram profile links. Even better — when you run the template, click ",[29,12785,12786],{},"'Create new sheet'"," and we'll set the sheet up for you, complete with some test data.",[21,12789,12791],{"id":12790},"install-the-template","Install the template",[14,12793,12794,12795,5868,12797,59],{},"To install this Instagram DM bot click ",[29,12796,54],{},[29,12798,58],{},[14,12800,62,12801,12803],{},[29,12802,65],{},". axiom.ai will guide you through the steps you need to configure in the app.",[21,12805,12807],{"id":12806},"how-it-works","How it works",[14,12809,12810,12811,12813,12814,12817,12818,1230],{},"The bot works by reading your Google Sheet, looping through each row, loading the profile links in the browser, clicking ",[29,12812,12775],{},", and then sending the DM. Finally, it likes the user's latest post. You can ",[322,12815,12816],{"href":11535},"control how many DMs to send"," by setting the first and last rows in the ",[29,12819,12820],{},"'Read data from a Google Sheet'",[21,12822,12824],{"id":12823},"frequently-asked-questions","Frequently asked questions",[14,12826,12827,12830,12831,6072,12834,12837],{},[29,12828,12829],{},"Can I personalize the DM?","\nYes. Click ",[29,12832,12833],{},"'Insert data'",[29,12835,12836],{},"'DM'"," step to pass data — such as names — from the Google Sheet into the DM.",[14,12839,12840,12843],{},[29,12841,12842],{},"How many DMs can I send a day?","\nFor new accounts, the limit is typically between 20 to 50 DMs per day. More established accounts can send between 100 to 150 DMs daily. Start low and ramp up until you hit the limit.",[14,12845,12846,12849],{},[29,12847,12848],{},"Will my account get blocked?","\nIf you exceed the DM limits imposed by Instagram, your account will most likely be suspended. If you continue to repeatedly exceed the limits, your account risks being blocked.",[14,12851,12852,12855],{},[29,12853,12854],{},"Can this tool automate other Instagram tasks?","\nYes — it's possible to adapt the template to log in and out of Instagram accounts, although it is not an optimal solution for a large volume of accounts.",[14,12857,12858,12861,12862,12864,12865,12868],{},[29,12859,12860],{},"Can I control the amount of DMs the bot sends?","\nIn the ",[29,12863,12820],{}," step, ",[322,12866,12867],{"href":11535},"you can specify"," the first and last rows. For example, set the first row to '2' and the last row to '21' — this sends 20 DMs.",{"title":494,"searchDepth":495,"depth":495,"links":12870},[12871,12872,12873,12874],{"id":23,"depth":498,"text":24},{"id":12790,"depth":498,"text":12791},{"id":12806,"depth":498,"text":12807},{"id":12823,"depth":498,"text":12824},"A no-code template that reads a Google Sheet, sends a DM to each Instagram user, and likes their latest post — set it up in minutes with axiom.ai.",{"read":509,"level":510,"video":12877,"templateId":4811,"type":513,"format":514,"intent_type":1049,"intent":12878,"tags":12879,"platform":12882,"featuredimg":12883},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F9TaMS6gqBpc","Automate social media",[12880,12881,1053],"instagram","google sheet",[11534],"\u002Fblog\u002Finstagram-dms2.png",{"title":12767,"description":12875},"guides\u002Finstagram-dm-like","sbZylP-M0hPuivsNxRq81RNxAAMODEqtWI90gYjjQq4",{"id":12888,"title":12889,"body":12890,"date":1043,"description":13143,"extension":506,"meta":13144,"navigation":522,"order":523,"path":13150,"seo":13151,"stem":13152,"__hash__":13153},"guides\u002Fguides\u002Finstagram-post.md","How to automate Instagram posts using Google Sheets",{"type":8,"value":12891,"toc":13135},[12892,12894,12905,12907,12909,12916,12920,12928,12930,12932,12936,13079,13083,13090,13092,13096,13098,13102,13127],[11,12893],{},[14,12895,12896,12897,12900,12901,12904],{},"This ",[29,12898,12899],{},"\"Instagram automation\""," template posts content from a Google Sheet to your Instagram without requiring an API. The bot retrieves data from the Sheet, opens Instagram in Chrome, click ",[29,12902,12903],{},"\"create\""," and inputs the data into the Instagram post web form, your human actions. After clicking confirm the bot removes the processed row from the Sheet.",[18,12906],{},[21,12908,853],{"id":852},[14,12910,27,12911,1085,12913,44],{},[29,12912,31],{},[29,12914,12915],{},"\"Instagram posts\"",[21,12917,12919],{"id":12918},"install-the-instagram-post-bot","Install the Instagram post bot",[14,12921,12922,12923,55,12925,59],{},"To install this Insta data entry bot, click ",[29,12924,54],{},[29,12926,12927],{},"\"\"Install Chrome extension\"\"",[14,12929,876],{},[14,12931,68],{},[21,12933,12935],{"id":12934},"configure-your-instagram-post-bot-in-four-easy-steps","Configure your Instagram post bot in four easy steps",[77,12937,12938],{},[80,12939,12940,12957],{},[83,12941,12942,88,12944,12946],{},[29,12943,87],{},[90,12945,92],{},[80,12947,12948,12952],{},[83,12949,12950,100],{},[90,12951,99],{},[83,12953,12954,12956],{},[90,12955,105],{},": Choose the tab with the posts in it.",[83,12958,12959,88,12961,12963,13077,983],{},[29,12960,111],{},[90,12962,114],{},[80,12964,12965,12972,12978,12991,12998,13004,13021,13027,13034,13052,13060],{},[83,12966,12967,88,12969,10297],{},[29,12968,121],{},[90,12970,12971],{},"Go to page: www.instagram.com",[83,12973,12974,88,12976,10297],{},[29,12975,145],{},[90,12977,2695],{},[83,12979,12980,88,12982,12985,12986],{},[29,12981,170],{},[90,12983,12984],{},"Click element: Not Now"," ^\n",[80,12987,12988],{},[83,12989,12990],{},"Closes pop-up that may appear.",[83,12992,12993,88,12995,10297],{},[29,12994,213],{},[90,12996,12997],{},"Click element: Create",[83,12999,13000,88,13002,10297],{},[29,13001,241],{},[90,13003,9962],{},[83,13005,13006,88,13008,13011],{},[29,13007,278],{},[90,13009,13010],{},"Upload a file: Select from computer",[80,13012,13013],{},[83,13014,13015,132,13017,136,13019,44],{},[90,13016,1189],{},[90,13018,194],{},[90,13020,227],{},[83,13022,13023,88,13025,10297],{},[29,13024,1203],{},[90,13026,12045],{},[83,13028,13029,88,13032,10297],{},[29,13030,13031],{},"2.8",[90,13033,12045],{},[83,13035,13036,88,13039,13042],{},[29,13037,13038],{},"2.9",[90,13040,13041],{},"Enter text: Write a caption",[80,13043,13044],{},[83,13045,13046,132,13048,136,13050,44],{},[90,13047,953],{},[90,13049,194],{},[90,13051,227],{},[83,13053,13054,88,13057,10297],{},[29,13055,13056],{},"2.10",[90,13058,13059],{},"Click element: Share",[83,13061,13062,88,13065,13067],{},[29,13063,13064],{},"2.11",[90,13066,281],{},[80,13068,13069,13073],{},[83,13070,13071,100],{},[90,13072,99],{},[83,13074,13075,12956],{},[90,13076,105],{},[344,13078],{},[21,13080,13082],{"id":13081},"run-your-instagram-post-bot","Run your Instagram post bot",[14,13084,13085,13086,1225,13088,1230],{},"To test the Instagram bot, you should first disable step 2.9 or delete the test post on Instagram. It's necessary to run the bot while being logged into Instagram, as this will allow the sharing of cookies and enable Axiom to open Instagram in a logged-in state. If you wish to schedule the bot ",[322,13087,994],{"href":993},[322,13089,1229],{"href":1228},[21,13091,317],{"id":316},[14,13093,320,13094,326],{},[322,13095,325],{"href":324},[21,13097,330],{"id":329},[14,13099,1009,13100,44],{},[322,13101,994],{"href":993},[77,13103,13104],{},[80,13105,13106,13116],{},[83,13107,13108,13110,13112,13113,44],{},[29,13109,7492],{},[344,13111],{},"\nReselect the element in ",[90,13114,13115],{},"Steps 2.3, 2.4, 2.5, 2.6, 2.7, 2.9 – Click element",[83,13117,13118,13121,346,13123,13126],{},[29,13119,13120],{},"Image does not upload?",[344,13122],{},[90,13124,13125],{},"Step 2.6 – Upload a file: Select from computer",", check your folder permissions and the file size.",[14,13128,483,13129,1299,13131],{},[322,13130,487],{"href":486},[322,13132,13134],{"href":13133},"\u002Fblog\u002Fautomate-instagram-post","posting to Instagram.",{"title":494,"searchDepth":495,"depth":495,"links":13136},[13137,13138,13139,13140,13141,13142],{"id":852,"depth":498,"text":853},{"id":12918,"depth":498,"text":12919},{"id":12934,"depth":498,"text":12935},{"id":13081,"depth":498,"text":13082},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"Learn how to automate posting to Instagram using a Google Sheet and axiom.ai’s No-code tool. This step-by-step guide shows how to create a bot that fills in Instagram’s post form in the browser, uploads an image, adds a caption, and clicks Share—no API required.",{"logoFile":13145,"read":13146,"video":13147,"type":513,"format":514,"intent_type":11530,"intent":1050,"tags":13148,"platfrom":13149,"templateId":4662},"\u002Ftemplates\u002Finstag-logo.png","8 minutes","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F92qIT5U_LWg",[11532,1318],[11534],"\u002Fguides\u002Finstagram-post",{"title":12889,"description":13143},"guides\u002Finstagram-post","Lb9LtZb3_BXc3pC_HFUfFjXQHWqKEbKEPFKmUhjagLE",{"id":13155,"title":13156,"body":13157,"date":1043,"description":13409,"extension":506,"meta":13410,"navigation":522,"order":523,"path":13415,"seo":13416,"stem":13417,"__hash__":13418},"guides\u002Fguides\u002Finstagram-scrape-post-links.md","How to scrape Instagram search for post links",{"type":8,"value":13158,"toc":13401},[13159,13161,13168,13170,13172,13180,13184,13189,13193,13195,13199,13324,13328,13333,13335,13340,13342,13346,13397],[11,13160],{},[14,13162,13163,13164,13167],{},"This template automates ",[29,13165,13166],{},"\"Instagram search scraping\"",": it takes search terms from a Google Sheet, appends them to Instagram's search URL, loads the search pages in Chrome, scrapes post links, saves them to a Sheet, deletes processed rows, and repeats with new search terms.",[18,13169],{},[21,13171,853],{"id":852},[14,13173,27,13174,1085,13176,13179],{},[29,13175,31],{},[29,13177,13178],{},"\"Instagram search scraper\"",". Set up two tabs in Google Sheets: one for search terms and another for scraped data.",[21,13181,13183],{"id":13182},"install-the-instagram-search-scraper-bot","Install the Instagram search scraper bot",[14,13185,13186,13187,59],{},"To install this Instagram search scraper entry bot click **\"Install template'. If you’re a new user, you’ll have to click ",[29,13188,58],{},[14,13190,62,13191,44],{},[29,13192,65],{},[14,13194,68],{},[21,13196,13198],{"id":13197},"configure-your-instagram-search-scraper-in-five-easy-steps","Configure your Instagram search scraper in five easy steps",[77,13200,13201],{},[80,13202,13203,13219],{},[83,13204,13205,88,13207,13209],{},[29,13206,87],{},[90,13208,92],{},[80,13210,13211,13215],{},[83,13212,13213,100],{},[90,13214,99],{},[83,13216,13217,12956],{},[90,13218,105],{},[83,13220,13221,88,13223,13225],{},[29,13222,111],{},[90,13224,114],{},[80,13226,13227,13249,13267,13292,13308],{},[83,13228,13229,88,13231,13233],{},[29,13230,121],{},[90,13232,124],{},[80,13234,13235],{},[83,13236,13237,132,13239,136,13241,13243,13244,13246],{},[90,13238,131],{},[90,13240,194],{},[90,13242,227],{},", and append to the end of the URL:",[344,13245],{},[90,13247,13248],{},"https:\u002F\u002Fwww.instagram.com\u002Fexplore\u002Fsearch\u002Fkeyword\u002F?q=",[83,13250,13251,88,13253,13255],{},[29,13252,145],{},[90,13254,148],{},[80,13256,13257],{},[83,13258,13259,13260,6987,13262,13264],{},"Preconfigured with ",[322,13261,381],{"href":380},[344,13263],{},[90,13265,13266],{},"main a[role=\"link\"]",[83,13268,13269,88,13271,13273],{},[29,13270,170],{},[90,13272,216],{},[80,13274,13275,13284],{},[83,13276,13277,132,13279,13281,13282],{},[90,13278,223],{},[90,13280,194],{},", select post URL in ",[90,13283,6288],{},[83,13285,13286,132,13288,136,13290],{},[90,13287,233],{},[90,13289,194],{},[90,13291,198],{},[83,13293,13294,88,13296,13298],{},[29,13295,213],{},[90,13297,3303],{},[80,13299,13300,13304],{},[83,13301,13302,100],{},[90,13303,99],{},[83,13305,13306,12956],{},[90,13307,105],{},[83,13309,13310,88,13312,13314],{},[29,13311,241],{},[90,13313,281],{},[80,13315,13316,13320],{},[83,13317,13318,100],{},[90,13319,99],{},[83,13321,13322,12956],{},[90,13323,105],{},[21,13325,13327],{"id":13326},"run-your-instagram-search-scraper","Run your Instagram search scraper",[14,13329,13330,13331,44],{},"To test this Instagram scraper, initiate the bot with the desktop runner and let it run a few loops. Then, stop the bot and review the data in the linked Google Sheet for accuracy and completeness. If you wish to schedule the bot ",[322,13332,994],{"href":993},[21,13334,317],{"id":316},[14,13336,320,13337,326],{},[322,13338,325],{"href":13339},"recipes",[21,13341,330],{"id":329},[14,13343,1009,13344,44],{},[322,13345,994],{"href":993},[77,13347,13348],{},[80,13349,13350,13366,13383],{},[83,13351,13352,13355,346,13357,13360,13361,13363],{},[29,13353,13354],{},"Page not loading?",[344,13356],{},[90,13358,13359],{},"Step 2.1 – Go to page",", check if the token is inserted. The URL should look like:",[344,13362],{},[90,13364,13365],{},"https:\u002F\u002Fwww.instagram.com\u002Fexplore\u002Fsearch\u002Fkeyword\u002F?q=[google-sheet-data]",[83,13367,13368,13371,346,13373,13375,13376,13378,13379,13381],{},[29,13369,13370],{},"No data?",[344,13372],{},[90,13374,368],{},", check the ",[322,13377,381],{"href":380}," works:",[344,13380],{},[90,13382,13266],{},[83,13384,13385,13388,346,13390,13393,13394,13396],{},[29,13386,13387],{},"No data being written?",[344,13389],{},[90,13391,13392],{},"Step 2.4 – Write data to a Google Sheet",", ensure ",[90,13395,264],{}," is selected under \"Data\".",[14,13398,483,13399],{},[322,13400,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":13402},[13403,13404,13405,13406,13407,13408],{"id":852,"depth":498,"text":853},{"id":13182,"depth":498,"text":13183},{"id":13197,"depth":498,"text":13198},{"id":13326,"depth":498,"text":13327},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"This guide shows how to automate scraping post links from Instagram search pages using Google Sheets and axiom.ai. It loops through search terms, loads results in Chrome, scrapes post links with a custom selector, writes them to a Sheet, and removes processed rows—no API required.",{"logoFile":13145,"read":13146,"video":13411,"templateId":4783,"type":513,"format":514,"intent_type":11530,"intent":4022,"tags":13412,"platfrom":13414},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FHkhXv-wUvKE",[11532,13413,519],"posts",[11534],"\u002Fguides\u002Finstagram-scrape-post-links",{"title":13156,"description":13409},"guides\u002Finstagram-scrape-post-links","_sweMlt46VfRn-OGfgBVsxRDImdaLBUdpB11JHixe0Y",{"id":13420,"title":13421,"body":13422,"date":1043,"description":13657,"extension":506,"meta":13658,"navigation":522,"order":523,"path":13664,"seo":13665,"stem":13666,"__hash__":13667},"guides\u002Fguides\u002Finstagram-scrape-users-from-hashtag.md","How to scrape Instagram hashtag pages for handles and post links",{"type":8,"value":13423,"toc":13649},[13424,13426,13433,13435,13437,13443,13447,13454,13458,13460,13464,13548,13552,13565,13567,13571,13573,13577,13645],[11,13425],{},[14,13427,13428,13429,13432],{},"This template scrapes ",[29,13430,13431],{},"\"Instagram hashtag pages using a bot\"",". The bot opens a hashtag page in Chrome, collects links to all posts, and then extracts each user's handle and profile link. It records the post URLs, handles, and profile URLs into a Google Sheet",[18,13434],{},[21,13436,853],{"id":852},[14,13438,13439,13440,44],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering the shortcut **\"sheet.new', assuming you already have an account. Name your sheet something like ",[29,13441,13442],{},"\"Instagram hashtag data\"",[21,13444,13446],{"id":13445},"install-the-instagram-hashtag-bot","Install the Instagram hashtag bot",[14,13448,13449,13450,55,13452,59],{},"To install this Instagram handle scraper entry bot click ",[29,13451,54],{},[29,13453,58],{},[14,13455,62,13456,44],{},[29,13457,65],{},[14,13459,68],{},[21,13461,13463],{"id":13462},"configure-your-instagram-hashtag-bot-in-two-easy-steps","Configure your Instagram hashtag bot in two easy steps",[77,13465,13466,13546],{},[80,13467,13468,13491],{},[83,13469,13470,88,13472,13475],{},[29,13471,87],{},[90,13473,13474],{},"Get a list of links to pages from a URL",[80,13476,13477,13485],{},[83,13478,13479,13481,13482],{},[90,13480,3922],{},": Insert an Instagram hashtag URL, e.g. ",[90,13483,13484],{},"instagram.com\u002Fexplore\u002Ftags\u002Fbeach\u002F",[83,13486,13487,13490],{},[90,13488,13489],{},"Max results",": Set the number of posts to scrape",[83,13492,13493,88,13495,13497],{},[29,13494,111],{},[90,13496,114],{},[80,13498,13499,13505,13529],{},[83,13500,13501,88,13503,10297],{},[29,13502,121],{},[90,13504,124],{},[83,13506,13507,88,13509,13511],{},[29,13508,145],{},[90,13510,114],{},[80,13512,13513,13521],{},[83,13514,13515,88,13518,10297],{},[29,13516,13517],{},"2.2.1",[90,13519,13520],{},"Current URL",[83,13522,13523,88,13526,10297],{},[29,13524,13525],{},"2.2.2",[90,13527,13528],{},"Get a list of links to pages from bot's current page",[83,13530,13531,88,13533,13535],{},[29,13532,241],{},[90,13534,3303],{},[80,13536,13537,13541],{},[83,13538,13539,1125],{},[90,13540,99],{},[83,13542,13543,13545],{},[90,13544,105],{},": Set the sheet name",[14,13547,983],{},[21,13549,13551],{"id":13550},"run-your-instagram-hashtag-bot","Run your Instagram hashtag bot",[14,13553,13554,13555,13558,13559,13562,13563,44],{},"To test the Instagram hashtag bot in ",[29,13556,13557],{},"\"Step 1\""," adjust the ",[29,13560,13561],{},"\"max results\""," to a low number, initiate the bot with the desktop runner and let it run a few loops. Then, stop the bot and review the data in the linked Google Sheet. If you wish to schedule the bot ",[322,13564,994],{"href":993},[21,13566,317],{"id":316},[14,13568,320,13569,326],{},[322,13570,325],{"href":324},[21,13572,330],{"id":329},[14,13574,1009,13575,44],{},[322,13576,994],{"href":993},[77,13578,13579],{},[80,13580,13581,13592,13603,13617,13631],{},[83,13582,13583,13586,13588,13589,44],{},[29,13584,13585],{},"Not loading Instagram?",[344,13587],{},"\nMake sure you have added an Instagram hashtag URL in ",[90,13590,13591],{},"Step 1.0 – Get a list of links to pages from a URL",[83,13593,13594,13597,13599,13600,13602],{},[29,13595,13596],{},"Not scraping all posts?",[344,13598],{},"\nIn the same step, check the ",[90,13601,13489],{}," setting.",[83,13604,13605,13608,346,13610,1482,13612,466,13614,44],{},[29,13606,13607],{},"Not looping through scraped links?",[344,13609],{},[90,13611,13359],{},[90,13613,465],{},[90,13615,13616],{},"[scraped-link-data]",[83,13618,13619,13622,346,13624,13627,13628,13630],{},[29,13620,13621],{},"Selectors not working?",[344,13623],{},[90,13625,13626],{},"Step 2.2.2 – Get a list of links to pages from bot's current page",", try reselecting or use ",[322,13629,7498],{"href":380}," if needed.",[83,13632,13633,13635,346,13637,13393,13640,466,13642,44],{},[29,13634,459],{},[344,13636],{},[90,13638,13639],{},"Step 2.5 – Write data to a Google Sheet",[90,13641,465],{},[90,13643,13644],{},"[all-interaction-data_1]",[14,13646,483,13647],{},[322,13648,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":13650},[13651,13652,13653,13654,13655,13656],{"id":852,"depth":498,"text":853},{"id":13445,"depth":498,"text":13446},{"id":13462,"depth":498,"text":13463},{"id":13550,"depth":498,"text":13551},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"This guide explains how to scrape Instagram hashtag pages using axiom.ai. Learn how to collect post links, extract handles and profile URLs, and write the data to a Google Sheet—no API needed, all done in Chrome using a point-and-click bot.",{"logoFile":13145,"read":13146,"video":13659,"templateId":4702,"type":513,"format":514,"intent_type":11530,"intent":4022,"tags":13660,"platfrom":13663},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FhNeBSKoEaGo",[11532,13661,13662,519],"users","hashtags",[11534],"\u002Fguides\u002Finstagram-scrape-users-from-hashtag",{"title":13421,"description":13657},"guides\u002Finstagram-scrape-users-from-hashtag","eRDON-ATQSu5ah1b3SZ78L5IdCy_T8ZVHm6QCsmAi0M",{"id":13669,"title":13670,"body":13671,"date":13862,"description":13677,"extension":506,"meta":13863,"navigation":522,"order":523,"path":13868,"seo":13869,"stem":13870,"__hash__":13871},"guides\u002Fguides\u002Finteracting-with-button-list.md","How to loop through a list of buttons",{"type":8,"value":13672,"toc":13853},[13673,13675,13678,13681,13685,13687,13695,13698,13702,13704,13711,13715,13725,13750,13754,13764,13787,13791,13793,13796,13818,13822,13824,13835,13842],[11,13674],{},[14,13676,13677],{},"Learn how to loop through buttons on the same web page using custom CSS selectors.",[14,13679,13680],{},"This is best used if you have a list that contains buttons, such as downloading invoices from a list.",[21,13682,13684],{"id":13683},"finding-the-right-selector","Finding the right selector",[11,13686],{},[14,13688,13689,13690,13694],{},"Finding the right selector is important to get started. Start by using our blog ",[322,13691,13693],{"href":13692},"..\u002Fblog\u002Fbest-custom-css-selectors-for-web-scraping","The Best Custom CSS Selectors to Use for Automations"," to identify a suitable selector for the button.",[14,13696,13697],{},"Once you have a selector selected, you’ll need to add them into a Google Sheet.",[21,13699,13701],{"id":13700},"building-the-selectors","Building the selectors",[11,13703],{},[14,13705,13706,13707,13710],{},"For this example, we are going to use the following button selector, this is the same selector for all buttons within the list: ",[90,13708,13709],{},"button.download",". When querying this selector this will return a list of elements that match this CSS selector.",[639,13712,13714],{"id":13713},"method-1-nth-child","Method 1: nth-child()",[14,13716,5070,13717,13720,13721,13724],{},[90,13718,13719],{},"nth-child()"," method exists within CSS to allow you to select an element based on it’s position within the list of elements matching that selector. For example, ",[90,13722,13723],{},"button.download:nth-child(1)"," will select the element at position 1. Your list would look something like this:",[7092,13726,13727,13734],{},[7095,13728,13729],{},[7098,13730,13731],{},[7101,13732,13733],{},"Selector",[7108,13735,13736,13741,13745],{},[7098,13737,13738],{},[7113,13739,13740],{},"button.download:nth-child(0)",[7098,13742,13743],{},[7113,13744,13723],{},[7098,13746,13747],{},[7113,13748,13749],{},"etc...",[639,13751,13753],{"id":13752},"method-2-unique-selectors","Method 2: unique selectors",[14,13755,13756,13757,2004,13760,13763],{},"Some buttons will have similar but unique selectors, for example, ",[90,13758,13759],{},"button.download-1",[90,13761,13762],{},"button.download–2"," and so on. This is the easiest method of identifying the elements on the page. Your list would look something like this:",[7092,13765,13766,13772],{},[7095,13767,13768],{},[7098,13769,13770],{},[7101,13771,13733],{},[7108,13773,13774,13778,13783],{},[7098,13775,13776],{},[7113,13777,13759],{},[7098,13779,13780],{},[7113,13781,13782],{},"button.download-2",[7098,13784,13785],{},[7113,13786,13749],{},[21,13788,13790],{"id":13789},"set-up-your-google-sheet-or-excel-sheet","Set up your Google Sheet or Excel Sheet",[11,13792],{},[14,13794,13795],{},"The selectors will need to be entered into a Google Sheet\u002FExcel Sheet manually - this will allow the selectors to be read into your automation and then be looped through. To do this, add the selectors to a single row within within your sheet, for example:",[7092,13797,13798,13804],{},[7095,13799,13800],{},[7098,13801,13802],{},[7101,13803,13733],{},[7108,13805,13806,13810,13814],{},[7098,13807,13808],{},[7113,13809,13740],{},[7098,13811,13812],{},[7113,13813,13723],{},[7098,13815,13816],{},[7113,13817,13749],{},[21,13819,13821],{"id":13820},"set-up-your-automation","Set up your automation",[11,13823],{},[14,13825,13826,13827,3289,13830,13834],{},"Insert a ",[322,13828,92],{"href":13829},"..\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-data-from-a-google-sheet-step",[322,13831,13833],{"href":13832},"..\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-data-from-excel","Read data from Excel"," step into your automation and follow the instructions to set this to read the data from the sheet you set up above.",[14,13836,13837,13838,13841],{},"Next, insert a ",[322,13839,114],{"href":13840},"..\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Floop"," step and set the data that you read into the automation using the read step above as the data to loop through. Any steps included in this step will have access to each row of data as it iterates through the data from your spreadsheet.",[14,13843,13844,13845,13848,13849,12252],{},"Once you are ready to click the button, add a ",[322,13846,3639],{"href":13847},"..\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fclick-element"," step. Click \"Select\", then “Custom” and then “Set selector from data” - select the data from the loop that includes your selector. Learn more in our ",[322,13850,13852],{"href":13851},"..\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fcustom-css-selectors","Custom selector",{"title":494,"searchDepth":495,"depth":495,"links":13854},[13855,13856,13860,13861],{"id":13683,"depth":498,"text":13684},{"id":13700,"depth":498,"text":13701,"children":13857},[13858,13859],{"id":13713,"depth":495,"text":13714},{"id":13752,"depth":495,"text":13753},{"id":13789,"depth":498,"text":13790},{"id":13820,"depth":498,"text":13821},"2025-08-28",{"pinned":522,"read":1046,"level":510,"templateId":498,"type":513,"format":77,"intent_type":515,"intent":1050,"tags":13864,"platfrom":13867},[7290,13865,13866],"click","multi click",[1757],"\u002Fguides\u002Finteracting-with-button-list",{"title":13670,"description":13677},"guides\u002Finteracting-with-button-list","TTpB56u80zcEVwpSWyrYwTBAnv14ThaFSDfEFuzF4ek",{"id":13873,"title":13874,"body":13875,"date":523,"description":14358,"extension":506,"meta":14359,"navigation":522,"order":523,"path":14366,"seo":14367,"stem":14368,"__hash__":14369},"guides\u002Fguides\u002Fjira-ticket-triage.md","How to automate Jira ticket triage with AI (Updated 2026)",{"type":8,"value":13876,"toc":14350},[13877,13879,13882,13885,13888,13895,13899,13901,13913,13916,13920,13922,13934,13937,13948,13951,13955,13957,13974,13977,13981,13983,13986,14313,14317,14321,14323,14326,14329,14343,14345,14347],[11,13878],{},[14,13880,13881],{},"At axiom.ai, as support volume grew, opening and reviewing each ticket just to check whether it belonged in our queue quickly became a bottleneck. From time to time, we’d also see requests from customers trying to reach a completely different company — tickets that were never meant for us at all.",[14,13883,13884],{},"To keep our time focused on helping customers, rather than sorting, filtering, and closing irrelevant tickets, we built this automation. In this guide, we’ll show how it works and how you can apply the same approach to your own support workflow.",[14,13886,13887],{},"This guide walks through a straightforward Axiom automation that reviews Jira tickets, classifies them, and performs actions depending on the category.",[14,13889,13890,13891,13894],{},"As an example, we’ll keep the classification simple: ",[29,13892,13893],{},"spam vs. everything else",". You can extend the same pattern to classify by any other criteria which works for your team.",[21,13896,13898],{"id":13897},"install-axiom-in-your-chrome-browser","Install Axiom in your Chrome browser",[11,13900],{},[14,13902,13903,13904,13906,44],{},"If you haven’t already installed Axiom or created an account, go to the Chrome Web Store and",[344,13905],{},[29,13907,13908],{},[322,13909,13912],{"href":13910,"rel":13911},"https:\u002F\u002Fchrome.google.com\u002Fwebstore\u002Fdetail\u002Faxiom-browser-automation\u002Fcpgamigjcbffkaiciiepndmonbfdimbb?hl=en-GB",[2245],"install Axiom",[14,13914,13915],{},"New accounts include 2 hours of free runtime, which is enough to build and test this automation a few times.",[21,13917,13919],{"id":13918},"set-up-your-google-sheet","Set up your Google Sheet",[11,13921],{},[14,13923,13924,13925,13928,13929,450,13931,44],{},"Create a new Google Sheet and name it ",[29,13926,13927],{},"Triage"," and add two sheets within it ",[807,13930,13927],{},[807,13932,13933],{},"Closed",[14,13935,13936],{},"This sheet will be used to:",[80,13938,13939,13942,13945],{},[83,13940,13941],{},"temporarily store Jira ticket links",[83,13943,13944],{},"log classification results",[83,13946,13947],{},"keep a record of which tickets were processed",[14,13949,13950],{},"You don’t need to add any data manually as Axiom will populate the sheet during the run.",[21,13952,13954],{"id":13953},"open-jira-and-create-a-new-automation","Open Jira and create a new automation",[11,13956],{},[77,13958,13959],{},[555,13960,13961,13964,13967],{},[83,13962,13963],{},"Open Chrome and log in to your Jira support portal (the page that lists incoming tickets).",[83,13965,13966],{},"Open Axiom.",[83,13968,13969,13970,13973],{},"Click ",[29,13971,13972],{},"+ New Automation"," to start building from scratch.",[14,13975,13976],{},"You’ll now begin adding steps using the Step Finder.",[21,13978,13980],{"id":13979},"lets-build-the-jira-ticket-triage-automation","Let’s build the Jira ticket triage automation",[11,13982],{},[14,13984,13985],{},"This section walks through how to build the automation step by step in Axiom. Follow along below to understand exactly how each step works and how the pieces fit together.",[77,13987,13988],{},[80,13989,13990,14011,14024,14047,14072,14092,14118],{},[83,13991,13992,88,13994,13997],{},[29,13993,349],{},[90,13995,13996],{},"Clear data from a Google Sheet",[80,13998,13999,14006],{},[83,14000,14001,14003,14004,9482],{},[29,14002,99],{}," — Select the ",[90,14005,13927],{},[83,14007,14008,14010],{},[29,14009,10950],{}," — Clears old results to ensure each run starts fresh.",[83,14012,14013,88,14015,14017],{},[29,14014,908],{},[90,14016,7555],{},[80,14018,14019],{},[83,14020,14021,14023],{},[29,14022,10950],{}," — Creates a timestamp to log when each run occurred.",[83,14025,14026,88,14028,14030],{},[29,14027,9029],{},[90,14029,13474],{},[80,14031,14032,14037,14042],{},[83,14033,14034,14036],{},[29,14035,3922],{}," — Set to your internal Jira support portal page.",[83,14038,14039,14041],{},[29,14040,155],{}," — Point and click the column with ticket\u002Fwork numbers.",[83,14043,14044,14046],{},[29,14045,10950],{}," — Scrapes individual ticket links for triage.",[83,14048,14049,88,14052,14054],{},[29,14050,14051],{},"Step 4.0",[90,14053,3303],{},[80,14055,14056,14062,14067],{},[83,14057,14058,14003,14060,9482],{},[29,14059,99],{},[90,14061,13927],{},[83,14063,14064,14066],{},[29,14065,260],{}," — Output from step 3.0.",[83,14068,14069,14071],{},[29,14070,10950],{}," — Stores ticket links for staging and review.",[83,14073,14074,88,14077,14079],{},[29,14075,14076],{},"Step 5.0",[90,14078,92],{},[80,14080,14081,14087],{},[83,14082,14083,14003,14085,9482],{},[29,14084,99],{},[90,14086,13927],{},[83,14088,14089,14091],{},[29,14090,10950],{}," — Loads ticket links back into the bot to loop through.",[83,14093,14094,88,14097,14100],{},[29,14095,14096],{},"Step 6.0",[90,14098,14099],{},"Remove results that contain certain words",[80,14101,14102,14107,14113],{},[83,14103,14104,14106],{},[29,14105,465],{}," — Select the output from step 5.0.",[83,14108,14109,14112],{},[29,14110,14111],{},"Words to match"," — Add terms to exclude non-ticket URLs.",[83,14114,14115,14117],{},[29,14116,10950],{}," — Filters out irrelevant links.",[83,14119,14120,88,14123,14125,14138],{},[29,14121,14122],{},"Step 7.0",[90,14124,114],{},[80,14126,14127,14132],{},[83,14128,14129,14131],{},[29,14130,465],{}," — Select the output from step 6.0.",[83,14133,14134,14137],{},[29,14135,14136],{},"Loop through all"," — Enable this to process every ticket.",[80,14139,14140,14159,14179,14210],{},[83,14141,14142,88,14145,14147],{},[29,14143,14144],{},"Step 7.1",[90,14146,124],{},[80,14148,14149,14154],{},[83,14150,14151,14153],{},[29,14152,131],{}," — Insert ticket link from loop data.",[83,14155,14156,14158],{},[29,14157,10950],{}," — Opens each Jira ticket one by one.",[83,14160,14161,88,14164,14167],{},[29,14162,14163],{},"Step 7.2",[90,14165,14166],{},"Get data from bot’s current page",[80,14168,14169,14174],{},[83,14170,14171,14173],{},[29,14172,155],{}," — Point and click content like description or request.",[83,14175,14176,14178],{},[29,14177,10950],{}," — Extracts the content to classify.",[83,14180,14181,88,14184,14186],{},[29,14182,14183],{},"Step 7.3",[90,14185,173],{},[80,14187,14188,14194,14205],{},[83,14189,14190,14193],{},[29,14191,14192],{},"Input"," — Use scraped content from step 7.2.",[83,14195,14196,14198,14199,3289,14202,44],{},[29,14197,186],{}," — Classify as simple output like ",[90,14200,14201],{},"SPAM",[90,14203,14204],{},"VALID",[83,14206,14207,14209],{},[29,14208,10950],{}," — Generates a tag or label for each ticket.",[83,14211,14212,88,14215,14218,14243],{},[29,14213,14214],{},"Step 7.4",[90,14216,14217],{},"If condition",[80,14219,14220,14228,14238],{},[83,14221,14222,14224,14225],{},[29,14223,6281],{}," — ",[90,14226,14227],{},"chatgpt-output",[83,14229,14230,14233,14234,14237],{},[29,14231,14232],{},"Condition"," — When any of ",[90,14235,14236],{},"\"SPAM\""," is present",[83,14239,14240,14242],{},[29,14241,10950],{}," — Filters specific tickets for further action.",[80,14244,14245,14269,14286],{},[83,14246,14247,88,14250,14252],{},[29,14248,14249],{},"Step 7.4.1",[90,14251,10837],{},[80,14253,14254,14259,14264],{},[83,14255,14256,14258],{},[29,14257,223],{}," — Ticket URL",[83,14260,14261,14263],{},[29,14262,233],{}," — Classification result, timestamp",[83,14265,14266,14268],{},[29,14267,10950],{}," — Combines key info for writing.",[83,14270,14271,88,14274,88,14276,14279],{},[29,14272,14273],{},"Step 7.4.2",[90,14275,10837],{},[807,14277,14278],{},"(optional)",[80,14280,14281],{},[83,14282,14283,14285],{},[29,14284,10950],{}," — Combine extra fields or restructure output if needed.",[83,14287,14288,88,14291,14293],{},[29,14289,14290],{},"Step 7.4.3",[90,14292,3303],{},[80,14294,14295,14301,14306],{},[83,14296,14297,14003,14299,9482],{},[29,14298,99],{},[90,14300,13933],{},[83,14302,14303,14305],{},[29,14304,260],{}," — Combined output.",[83,14307,14308,14310,14311,44],{},[29,14309,10950],{}," — Logs all tickets classified as ",[90,14312,14236],{},[592,14314],{"src":14315,"alt":14316},"\u002Fguides\u002Ftriage_bot.png","Jira triage axiom.ai bot",[21,14318,14320],{"id":14319},"testing-the-automation","Testing the automation",[11,14322],{},[14,14324,14325],{},"Before running the automation at scale, it’s a good idea to test it with a small number of tickets.",[14,14327,14328],{},"Run the automation and confirm that:",[80,14330,14331,14334,14337,14340],{},[83,14332,14333],{},"Tickets are opened correctly",[83,14335,14336],{},"Content is extracted as expected",[83,14338,14339],{},"ChatGPT returns the intended labels",[83,14341,14342],{},"Results are written back to the sheet",[21,14344,796],{"id":795},[11,14346],{},[14,14348,14349],{},"This automation provides a clear and maintainable way to triage Jira tickets automatically. While the example focuses on identifying spam-related tickets, the same structure can be extended to handle more detailed classifications, prioritisation, or routing logic as your needs evolve.",{"title":494,"searchDepth":495,"depth":495,"links":14351},[14352,14353,14354,14355,14356,14357],{"id":13897,"depth":498,"text":13898},{"id":13918,"depth":498,"text":13919},{"id":13953,"depth":498,"text":13954},{"id":13979,"depth":498,"text":13980},{"id":14319,"depth":498,"text":14320},{"id":795,"depth":498,"text":796},"Learn how to automate Jira ticket triage with AI by classifying and processing support tickets automatically using a simple no code browser automation.",{"pinned":522,"type":513,"format":77,"intent_type":11530,"intent":14360,"tags":14361,"platfrom":14364},"Classify or filter data",[518,14362,14363,519,1055,1056],"classification","tickets",[14365],"Jira","\u002Fguides\u002Fjira-ticket-triage",{"title":13874,"description":14358},"guides\u002Fjira-ticket-triage","MBeU-mNj1xNknlCgg1uggvsBFhjxc-zcFV5_v6ByUbk",{"id":14371,"title":14372,"body":14373,"date":523,"description":14506,"extension":506,"meta":14507,"navigation":522,"order":523,"path":10771,"seo":14514,"stem":14515,"__hash__":14516},"guides\u002Fguides\u002Fkeyboard-short-cuts.md","How to use keystrokes as workarounds",{"type":8,"value":14374,"toc":14500},[14375,14377,14380,14386,14390,14394,14400,14404,14408,14488,14492,14495,14497],[11,14376],{},[14,14378,14379],{},"When automating a browser, you may need to use workarounds for issues like being unable to select an element. One category of these workarounds includes keyboard shortcuts or hotkeys. These provide alternative methods for actions typically performed with a mouse, such as cutting, copying, and pasting, commonly executed via keyboard.",[14,14381,14382,14383,14385],{},"To utilize the power of keyboard shortcuts, you can use the ",[29,14384,10696],{}," step to record and reuse combinations of hotkeys.",[592,14387],{"src":14388,"alt":14389},"\u002Fdocs\u002Fguides\u002Fpress-key-guide.jpg","adding a Press key(s) step in axiom.ai builder",[21,14391,14393],{"id":14392},"how-to-record-keyboard-shortcuts-with-the-keypress-step","How to record keyboard shortcuts with the keypress step",[14,14395,14396,14397,14399],{},"In the axiom.ai builder, open your automation and navigate to the point where you wish to add a new step. Then, open the step finder, search for, and add the ",[29,14398,10696],{}," step. Inside the step, Click record, then press the keys you want the bot to press. You can record a sequence of keys. The bot will enter these one by one, except for Ctrl, Alt, or Shift, which will be held down until the end of the sequence.",[592,14401],{"src":14402,"alt":14403},"\u002Fdocs\u002Fguides\u002Fpress-keys-step.jpg","recording key presses in axiom.ai's builder",[21,14405,14407],{"id":14406},"examples-of-keyboard-workarounds","Examples of keyboard workarounds",[7092,14409,14410,14419],{},[7095,14411,14412],{},[7098,14413,14414,14417],{},[7101,14415,14416],{},"Keyboard shortcut \u002F hotkey",[7101,14418,6725],{},[7108,14420,14421,14429,14437,14444,14451,14458,14465,14472,14480],{},[7098,14422,14423,14426],{},[7113,14424,14425],{},"Up\u002Fdown arrows",[7113,14427,14428],{},"Scroll a page or a box with scrollbars",[7098,14430,14431,14434],{},[7113,14432,14433],{},"Left\u002Fright arrows",[7113,14435,14436],{},"Move the cursor left or right in an input field",[7098,14438,14439,14441],{},[7113,14440,5361],{},[7113,14442,14443],{},"Tab to move cursor on the page",[7098,14445,14446,14448],{},[7113,14447,5361],{},[7113,14449,14450],{},"Tab between fields in a form",[7098,14452,14453,14455],{},[7113,14454,5361],{},[7113,14456,14457],{},"In pop up windows tab to select elements",[7098,14459,14460,14462],{},[7113,14461,8052],{},[7113,14463,14464],{},"Submit message in a chat interface",[7098,14466,14467,14469],{},[7113,14468,8052],{},[7113,14470,14471],{},"Press a button",[7098,14473,14474,14477],{},[7113,14475,14476],{},"CV+P",[7113,14478,14479],{},"Copy and paste just like a human",[7098,14481,14482,14485],{},[7113,14483,14484],{},"Delete",[7113,14486,14487],{},"Delete values in a text field",[21,14489,14491],{"id":14490},"ensuring-the-cursor-is-correctly-placed","Ensuring the cursor is correctly placed",[14,14493,14494],{},"Sometimes, you must position the mouse cursor so the shortcut works effectively. For instance, to scroll within a box with up\u002Fdown arrows, you would use a \"Click element\" step to activate it. Similarly, for an input field, you must ensure the cursor is inside the field by using a \"Click element\" step.",[21,14496,796],{"id":795},[14,14498,14499],{},"Recording keyboard shortcuts is a valuable workaround in browser automation, helping bypass issues. Correct cursor placement is crucial to ensure correct execution of the recorded shortcuts.",{"title":494,"searchDepth":495,"depth":495,"links":14501},[14502,14503,14504,14505],{"id":14392,"depth":498,"text":14393},{"id":14406,"depth":498,"text":14407},{"id":14490,"depth":498,"text":14491},{"id":795,"depth":498,"text":796},"Learn how to use keyboard shortcuts as workarounds when browser automation gets stuck. This guide shows how to record keystrokes with the “Press key(s)” step and explains where and when to use them to mimic human interaction in tricky scenarios.",{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":1050,"tags":14508,"platfrom":14513},[7290,14509,734,14510,14511,14512],"keyboard","workaround","interaction","navigation",[1757],{"title":14372,"description":14506},"guides\u002Fkeyboard-short-cuts","8rNWhOiTy3YrVXsDEMADZckn91IjZ-pwaOWkHtqkKtQ",{"id":14518,"title":14519,"body":14520,"date":523,"description":14683,"extension":506,"meta":14684,"navigation":522,"order":523,"path":14687,"seo":14688,"stem":14689,"__hash__":14690},"guides\u002Fguides\u002Flangflow.md","How to automate Langflow using an axiom.ai automation",{"type":8,"value":14521,"toc":14677},[14522,14524,14532,14534,14536,14539,14542,14563,14567,14569,14572,14575,14634,14637,14656,14658,14660,14663,14668,14670,14672,14675],[11,14523],{},[14,14525,14526,14531],{},[322,14527,14530],{"href":14528,"rel":14529},"https:\u002F\u002Flangflow.org",[2245],"Langflow"," is a powerful tool that can be used to bring agents into your workflows. Triggering your workflows using your axiom.ai automations gives you the opportunity to pass additional data in to use within your workflow - such as scrape data or data from Google Sheets.",[21,14533,546],{"id":545},[11,14535],{},[14,14537,14538],{},"To get started, we will assume that you have an axiom.ai account, and a Langflow account.",[14,14540,14541],{},"From axiom.ai, you'll need the following information",[77,14543,14544],{},[555,14545,14546,14552,14557],{},[83,14547,14548,562,14550,44],{},[29,14549,561],{},[322,14551,566],{"href":565},[83,14553,14554,14556],{},[29,14555,571],{},": The name of the automation to trigger.",[83,14558,14559,578,14561,44],{},[29,14560,577],{},[90,14562,581],{},[21,14564,14566],{"id":14565},"triggering-an-axiomai-automation-using-langflow","Triggering an axiom.ai automation using Langflow",[11,14568],{},[14,14570,14571],{},"In order to trigger your axiom.ai automation from your workflow, complete your workflow as usual, when you're ready to trigger your automation, continue this guide.",[14,14573,14574],{},"Within your workflow, search for and add an \"API Request\" component to your workflow. You'll need to configure it as such:",[77,14576,14577,14601,14624],{},[80,14578,14579,14588,14595],{},[83,14580,14581,14584,14585,14587],{},[29,14582,14583],{},"URLs",": This should be the ",[29,14586,7026],{}," from above.",[83,14589,14590,14592,14593,44],{},[29,14591,12234],{},": Change to ",[90,14594,627],{},[83,14596,14597,14600],{},[29,14598,14599],{},"Headers",": Click \"Edit Headers\", click the \"+\" icon and add one property, as follows:",[719,14602,14604],{"className":7732,"code":14603,"language":2585,"meta":494,"style":494},"{\n    \"Content-Type\": \"application\u002Fjson\"\n}\n",[90,14605,14606,14610,14620],{"__ignoreMap":494},[727,14607,14608],{"class":729,"line":730},[727,14609,7740],{"class":768},[727,14611,14612,14615,14617],{"class":729,"line":498},[727,14613,14614],{"class":7745},"    \"Content-Type\"",[727,14616,1995],{"class":768},[727,14618,14619],{"class":737},"\"application\u002Fjson\"\n",[727,14621,14622],{"class":729,"line":495},[727,14623,2639],{"class":768},[80,14625,14626],{},[83,14627,14628,14631,14632,44],{},[29,14629,14630],{},"Body"," - The data that you would like to send your automation, this should consist of a JSON payload. This should be formatted as per our ",[322,14633,6721],{"href":6720},[14,14635,14636],{},"To accept this data within your axiom.ai automation, follow the steps below:",[77,14638,14639],{},[555,14640,14641,14648],{},[83,14642,14643,611,14645,14647],{},[29,14644,8895],{},[322,14646,8895],{"href":6958}," step to your automation.",[83,14649,14650,14652,14653,14655],{},[29,14651,620],{},": The \"Test data\" field should be used to replicate the data within the ",[90,14654,1838],{}," portion of the payload.",[21,14657,776],{"id":775},[11,14659],{},[14,14661,14662],{},"Run your workflow to begin testing - a chat window should open to run your workflow. Observe any errors that you see within your work and consult their documentation for more details on resolving the errors.",[14,14664,14665,14666,3342],{},"If there are any errors on axiom.ai's side, follow the instructions provided or see ",[322,14667,4887],{"href":2203},[21,14669,796],{"id":795},[11,14671],{},[14,14673,14674],{},"Langflow can be a great method of adding additional AI features into your workflows, including connecting data from services from the integration library that Langflow offers. We look forward to hearing about what you create with this!",[811,14676,7865],{},{"title":494,"searchDepth":495,"depth":495,"links":14678},[14679,14680,14681,14682],{"id":545,"depth":498,"text":546},{"id":14565,"depth":498,"text":14566},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"Learn how to trigger your Langflow workflows using an axiom.ai automation. This guide walks through how to pass data—like scrape results or values from Google Sheets—into Langflow using API calls.",{"type":513,"format":77,"intent_type":515,"intent":516,"tags":14685,"platfrom":14686},[829,830,518],[14530],"\u002Fguides\u002Flangflow",{"title":14519,"description":14683},"guides\u002Flangflow","573ouRWJNlUZFbhEfRZVBuQFaXqev58eLhiYe4OnCso",{"id":14692,"title":14693,"body":14694,"date":523,"description":14771,"extension":506,"meta":14772,"navigation":522,"order":523,"path":14776,"seo":14777,"stem":14778,"__hash__":14779},"guides\u002Fguides\u002Fline-breaks.md","How to insert line breaks in your Insta DM's",{"type":8,"value":14695,"toc":14767},[14696,14698,14701],[11,14697],{},[14,14699,14700],{},"When automating DMs, you cannot simply press \"Return\" in the 'Enter Text' step, as it will trigger the message to send instead of adding a line break. It's the default behaviour of browser and web forms - not an issue with axiom.ai. However, there is a workaround: in the 'Enter Text' step, you can configure a custom line break. This guide will show you how to enable and use this setting in the 'Enter text' step. The guide will assume you have a bot build or use the template to send Insta DMs.",[11197,14702,14703,14707,14713,14759,14762,14764],{},[21,14704,14706],{"id":14705},"how-to-insert-line-breaks-into-your-dms","How to insert line breaks into your DMs",[14,14708,14709,14710,14712],{},"To insert the line breaks you need to configure the setting inside the ",[90,14711,6426],{}," step being used to input your direct message.",[77,14714,14715],{},[555,14716,14717,14722,14741],{},[83,14718,14719,14721],{},[90,14720,5314],{},": Click on the step to expand it.",[83,14723,14724,14727,14728,13602,14730],{},[90,14725,14726],{},"Custom line break",": At the bottom of the step, click on the ",[90,14729,14726],{},[80,14731,14732],{},[83,14733,14734,14737,14738,44],{},[90,14735,14736],{},"Click \"Record\"",": Record a sequence of characters to use instead of Enter for line breaks. Use something like ",[90,14739,14740],{},"Shift + Return",[83,14742,14743,14745,14746],{},[90,14744,953],{},": Scroll back to the text input.",[80,14747,14748,14753],{},[83,14749,14750,14751,44],{},"Make sure the text is a single paragraph with no line breaks from hitting ",[90,14752,8052],{},[83,14754,14755,14756,14758],{},"Place the cursor where you want your line breaks, then press the recorded key combination (e.g., ",[90,14757,14740],{},") to insert them.",[14,14760,14761],{},"Thats it, however I would suggest doing a short test run.",[21,14763,796],{"id":795},[14,14765,14766],{},"Normal line breaks cannot be used as the defualt browser behaviour \"Return\" submits the DM, so a work around has to be used. Its simple enough and can be found in the Enter text step. The same method will also work for other browser automations that require text entry.",{"title":494,"searchDepth":495,"depth":495,"links":14768},[14769,14770],{"id":14705,"depth":498,"text":14706},{"id":795,"depth":498,"text":796},"Learn how to insert line breaks in Instagram DMs when using axiom.ai automation. Follow this step-by-step guide to customize the Enter Text step and avoid messages being sent too early. Ideal for no-code users automating Instagram messaging.",{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":1050,"tags":14773,"platfrom":14775},[7290,14774,1055],"line break",[1757],"\u002Fguides\u002Fline-breaks",{"title":14693,"description":14771},"guides\u002Fline-breaks","0NziLHd2kRss2wNMuUDPXCV08o5uN-qGuPHswGjNXls",{"id":14781,"title":14782,"body":14783,"date":1043,"description":15065,"extension":506,"meta":15066,"navigation":522,"order":523,"path":15073,"seo":15074,"stem":15075,"__hash__":15076},"guides\u002Fguides\u002Flinkedin-sales-navigator-message-leads.md","How to automate messaging leads in LinkedIn Sales Navigator",{"type":8,"value":14784,"toc":15058},[14785,14787,14794,14796,14800,14803,14807,14814,14818,14820,14824,14969,14973,14976,14978,14982,15054],[11,14786],{},[14,14788,14789,14790,14793],{},"The template scrapes a ",[29,14791,14792],{},"\"Saved list of leads\"",", extracting their profile links and names. It then opens each profile link in Chrome, clicks on the messaging option, and enters a customized message for each lead using their name. This process ensures that a personalized message is sent iteratively to each lead.",[18,14795],{},[21,14797,14799],{"id":14798},"get-started-set-up-your-lead-lists-on-sales-navigator","Get started: Set up your Lead lists on Sales Navigator",[14,14801,14802],{},"Begin by creating and saving your lead list in Sales Navigator.",[21,14804,14806],{"id":14805},"install-the-linkedin-sales-navigator-messenger-bot","Install the LinkedIn Sales Navigator Messenger bot",[14,14808,14809,14810,14813],{},"If you're a new user, first click ",[29,14811,14812],{},"\"Install Chrome Extension\"",", then create a free axiom.ai account to be able to edit the template.",[14,14815,62,14816,44],{},[29,14817,65],{},[14,14819,68],{},[21,14821,14823],{"id":14822},"configure-your-linkedin-sales-navigator-messenger-bot-in-four-easy-steps","Configure your LinkedIn Sales Navigator Messenger bot in four easy steps",[77,14825,14826,14967],{},[80,14827,14828,14846],{},[83,14829,14830,88,14832,14834],{},[29,14831,87],{},[90,14833,13474],{},[80,14835,14836,14841],{},[83,14837,14838,14840],{},[90,14839,3922],{},": Insert your \"Saved list of leads\" URL.",[83,14842,14843,14845],{},[90,14844,161],{},": Controls how many leads you message.",[83,14847,14848,88,14850,14852],{},[29,14849,111],{},[90,14851,114],{},[80,14853,14854,14860,14872,14884,14895,14902,14930,14944,14956],{},[83,14855,14856,88,14858,10297],{},[29,14857,121],{},[90,14859,124],{},[83,14861,14862,88,14864,10297,14867],{},[29,14863,145],{},[90,14865,14866],{},"Split a name into columns",[80,14868,14869],{},[83,14870,14871],{},"Extracts first name.",[83,14873,14874,88,14876,10297,14879],{},[29,14875,170],{},[90,14877,14878],{},"Click Element: Message",[80,14880,14881],{},[83,14882,14883],{},"Clicks message button.",[83,14885,14886,88,14888,10297,14890],{},[29,14887,213],{},[90,14889,148],{},[80,14891,14892],{},[83,14893,14894],{},"Scrapes to see if \"Subject\" is present in the message form.",[83,14896,14897,88,14899,10297],{},[29,14898,241],{},[90,14900,14901],{},"Remove HTML code",[83,14903,14904,88,14906,14908,14913],{},[29,14905,278],{},[90,14907,14217],{},[80,14909,14910],{},[83,14911,14912],{},"Checks if subject is present. If true, a subject line is entered.",[80,14914,14915],{},[83,14916,14917,88,14920,14923],{},[29,14918,14919],{},"2.6.1",[90,14921,14922],{},"Enter Text: Subject (required)",[80,14924,14925],{},[83,14926,14927,14929],{},[90,14928,953],{},": Enter a subject for your message. This field is required for messages to 2nd degree leads.",[83,14931,14932,88,14934,14937],{},[29,14933,1203],{},[90,14935,14936],{},"Enter Text: Type your message",[80,14938,14939],{},[83,14940,14941,14943],{},[90,14942,953],{},": Enter the message to be sent.",[83,14945,14946,88,14948,10297,14951],{},[29,14947,13031],{},[90,14949,14950],{},"Press Key(s)",[80,14952,14953],{},[83,14954,14955],{},"Presses return key to send the message.",[83,14957,14958,88,14960,10297,14962],{},[29,14959,13038],{},[90,14961,2695],{},[80,14963,14964],{},[83,14965,14966],{},"Waits for message to send.",[14,14968,983],{},[21,14970,14972],{"id":14971},"run-your-sales-navigator-messenger-bot","Run your Sales Navigator Messenger bot",[14,14974,14975],{},"To test the Sales Navigator Messenger bot, disable 'Step 2.8: Press Key(s)' to prevent sending messages.",[21,14977,330],{"id":329},[14,14979,1009,14980,44],{},[322,14981,994],{"href":993},[77,14983,14984],{},[80,14985,14986,15000,15010,15022,15032,15043],{},[83,14987,14988,14991,14993,14994,14997,14998,1230],{},[29,14989,14990],{},"Not loading the correct page?",[344,14992],{},"\nCheck that your ",[29,14995,14996],{},"\"Saved List of Leads\""," URL is correctly inserted in the ",[90,14999,13474],{},[83,15001,15002,15005,15007,15008,44],{},[29,15003,15004],{},"Want to change how many people you connect with?",[344,15006],{},"\nIn the same step, adjust ",[90,15009,13489],{},[83,15011,15012,15015,476,15017,15019,15020,1230],{},[29,15013,15014],{},"Not looping through profiles?",[344,15016],{},[90,15018,13616],{}," is inserted and points to the correct column in the ",[90,15021,124],{},[83,15023,15024,15027,15029,15030,1230],{},[29,15025,15026],{},"Not clicking the Message button?",[344,15028],{},"\nReselect the element in the ",[90,15031,6449],{},[83,15033,15034,15037,346,15039,15042],{},[29,15035,15036],{},"Subject line not added during run?",[344,15038],{},[90,15040,15041],{},"Step 2.6.1 – Enter Text: Subject",", make sure text is inserted.",[83,15044,15045,15048,346,15050,15053],{},[29,15046,15047],{},"Message not added during run?",[344,15049],{},[90,15051,15052],{},"Step 2.7 – Enter Text: Type your message",", check that text is inserted.",[14,15055,483,15056],{},[322,15057,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":15059},[15060,15061,15062,15063,15064],{"id":14798,"depth":498,"text":14799},{"id":14805,"depth":498,"text":14806},{"id":14822,"depth":498,"text":14823},{"id":14971,"depth":498,"text":14972},{"id":329,"depth":498,"text":330},"The template scrapes a \"Saved list of leads\", extracting their profile links and names. It then opens each profile link in Chrome, clicks on the messaging option, and enters a customized message for each lead using their name. This process ensures that a personalized message is sent iteratively to each lead.",{"desciription":15067,"logoFile":15068,"read":1527,"video":15069,"templateId":2559,"type":513,"format":514,"intent_type":1049,"intent":1050,"tags":15070,"platfrom":15071},"Learn how to automate sending personalized messages to leads in LinkedIn Sales Navigator using a bot. This guide walks through scraping a lead list, opening profiles, and sending messages with custom text using names from the list.","\u002Ftemplates\u002Flinkedin-logo.png","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FSTb1lViIToM",[11532,1054,1053],[15072],"LinkedIn","\u002Fguides\u002Flinkedin-sales-navigator-message-leads",{"title":14782,"description":15065},"guides\u002Flinkedin-sales-navigator-message-leads","uRHRaNvSnfSwOrRB4byxhzP56v_BRTIJkK4ISwCQ8T0",{"id":15078,"title":15079,"body":15080,"date":523,"description":15365,"extension":506,"meta":15366,"navigation":522,"order":523,"path":15370,"seo":15371,"stem":15372,"__hash__":15373},"guides\u002Fguides\u002Floop-through-links-and-scrape-data.md","Scrape data from a list of links",{"type":8,"value":15081,"toc":15358},[15082,15084,15093,15099,15105,15109,15112,15142,15146,15149,15181,15187,15191,15348,15350,15352],[11,15083],{},[14,15085,15086,15087,15089,15090,15092],{},"Learn how to build an automation that allows you to loop through a list of links from a spreadsheet using our ",[322,15088,9292],{"href":9291}," integration and then extract data from each page. Get started by adding steps from the [Builder](\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder and selecting the links using the ",[322,15091,11341],{"href":11340},".\n::",[14,15094,15095,15098],{},[807,15096,15097],{},"Tip:"," We recommend using websites that have an identical structure to ensure that the Selector Tool does not throw any errors, for example, a list of LinkedIn profiles.",[14,15100,15101,15102,44],{},"To get started quickly, see our ",[322,15103,514],{"href":15104},"\u002Fguides\u002Fweb-scraping-looping-through-pages",[21,15106,15108],{"id":15107},"building-the-automation","Building the automation",[14,15110,15111],{},"There are multiple steps used within the automation:",[77,15113,15114],{},[80,15115,15116,15120,15124,15128,15132,15136],{},[83,15117,15118,1230],{},[322,15119,92],{"href":8384},[83,15121,15122,1230],{},[322,15123,114],{"href":2296},[83,15125,15126,1230],{},[322,15127,124],{"href":4943},[83,15129,15130,1230],{},[322,15131,148],{"href":6242},[83,15133,15134,1230],{},[322,15135,3303],{"href":3302},[83,15137,15138,1230],{},[322,15139,15141],{"href":15140},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdelete-rows-from-a-google-sheet","Delete row from a Google Sheet",[639,15143,15145],{"id":15144},"setup","Setup",[14,15147,15148],{},"Prepare your Google Sheets spreadsheet. Add a single link per row.",[7092,15150,15151,15157],{},[7095,15152,15153],{},[7098,15154,15155],{},[7101,15156,7103],{},[7108,15158,15159,15167,15174],{},[7098,15160,15161],{},[7113,15162,15163],{},[322,15164,15165],{"href":15165,"rel":15166},"https:\u002F\u002Fexample.com",[2245],[7098,15168,15169],{},[7113,15170,15171],{},[322,15172,15165],{"href":15165,"rel":15173},[2245],[7098,15175,15176],{},[7113,15177,15178],{},[322,15179,15165],{"href":15165,"rel":15180},[2245],[14,15182,15183,15184,15186],{},"Create a new axiom.ai automation by opening the extension and clicking \"+ New automation\". Use the ",[322,15185,6182],{"href":6181}," to add new steps to your automation.",[639,15188,15190],{"id":15189},"start-from-blank","Start from blank",[77,15192,15193],{},[80,15194,15195,15228],{},[83,15196,15197,88,15199,15201],{},[29,15198,87],{},[90,15200,92],{},[80,15202,15203,15208,15213,15220],{},[83,15204,15205,15207],{},[90,15206,99],{},": Select the spreadsheet containing your list of links.",[83,15209,15210,15212],{},[90,15211,105],{},": (Optional) Select the sheet within the spreadsheet.",[83,15214,15215,15217,15218,44],{},[90,15216,7182],{},": (Optional) Start cell, e.g. ",[90,15219,7186],{},[83,15221,15222,15224,15225,44],{},[90,15223,5267],{},": (Optional) End cell, e.g. ",[90,15226,15227],{},"\"A21\"",[83,15229,15230,88,15232,15234,15244],{},[29,15231,111],{},[90,15233,114],{},[80,15235,15236],{},[83,15237,15238,132,15240,136,15242,44],{},[90,15239,465],{},[90,15241,194],{},[90,15243,139],{},[80,15245,15246,15267,15280,15318],{},[83,15247,15248,88,15250,15252],{},[29,15249,121],{},[90,15251,124],{},[80,15253,15254,15264],{},[83,15255,15256,132,15258,15260,15261,15263],{},[90,15257,131],{},[90,15259,194],{},", select the column in ",[90,15262,139],{}," with the links.",[83,15265,15266],{},"Tip: Click \"Clear all\" to ensure only one column is selected.",[83,15268,15269,88,15271,15273],{},[29,15270,145],{},[90,15272,148],{},[80,15274,15275],{},[83,15276,15277,15279],{},[90,15278,155],{},": Use the selector tool to select the data to scrape from the page.",[83,15281,15282,88,15284,15286],{},[29,15283,170],{},[90,15285,3303],{},[80,15287,15288,15293,15298,15305],{},[83,15289,15290,15292],{},[90,15291,99],{},": Select the spreadsheet to write to.",[83,15294,15295,15297],{},[90,15296,105],{},": (Optional) Select the sheet.",[83,15299,15300,261,15302,44],{},[90,15301,260],{},[90,15303,15304],{},"scraped-data",[83,15306,15307,15310,15311,15313,15314,15317],{},[90,15308,15309],{},"Write options",": Choose ",[90,15312,6013],{}," to append, or ",[90,15315,15316],{},"\"Clear data before writing\""," to overwrite.",[83,15319,15320,88,15322,15324,15325],{},[29,15321,213],{},[90,15323,281],{}," (optional)",[80,15326,15327,15332,15336,15342],{},[83,15328,15329,15331],{},[90,15330,99],{},": Select the spreadsheet.",[83,15333,15334,15297],{},[90,15335,105],{},[83,15337,15338,162,15340,44],{},[90,15339,11490],{},[90,15341,165],{},[83,15343,15344,162,15346,44],{},[90,15345,11498],{},[90,15347,165],{},[21,15349,796],{"id":795},[11,15351],{},[14,15353,15354,15355,15357],{},"This design pattern is best suited to web pages that share an identical structure, an ecommerce product listing or social media profile page, for example. Combine with the ",[322,15356,8393],{"href":8390}," guide to quickly get started.",{"title":494,"searchDepth":495,"depth":495,"links":15359},[15360,15364],{"id":15107,"depth":498,"text":15108,"children":15361},[15362,15363],{"id":15144,"depth":495,"text":15145},{"id":15189,"depth":495,"text":15190},{"id":795,"depth":498,"text":796},"Learn how to build a no-code web scraper with axiom.ai that loops through a list of links from a Google Sheet, visits each page, extracts data, and writes the results back to your spreadsheet. Ideal for automating data collection from structured pages.",{"type":513,"format":77,"intent_type":1754,"intent":4022,"tags":15367,"platfrom":15369},[519,15368,1056],"links",[1757],"\u002Fguides\u002Floop-through-links-and-scrape-data",{"title":15079,"description":15365},"guides\u002Floop-through-links-and-scrape-data","ZH_UpSwiGa2aHsFuSyXc8sYL56FFthH-l4_qHqELU3E",{"id":15375,"title":15376,"body":15377,"date":523,"description":15950,"extension":506,"meta":15951,"navigation":522,"order":523,"path":15954,"seo":15955,"stem":15956,"__hash__":15957},"guides\u002Fguides\u002Fmagnet.md","How to download keyword data from Magnet into a Google Sheet",{"type":8,"value":15378,"toc":15941},[15379,15381,15384,15389,15392,15395,15401,15403,15405,15416,15440,15444,15446,15454,15462,15788,15791,15795,15799,15801,15815,15819,15823,15849,15851,15853,15861,15890,15894,15900,15902,15904,15921,15929,15931],[11,15380],{},[14,15382,15383],{},"Magnet is a keyword research tool from Helium10, specifically designed for Amazon sellers. It helps users find high-traffic, relevant keywords to optimize product listings, PPC campaigns, and overall Amazon SEO strategy.",[592,15385],{"src":15386,"className":15387,"alt":15388},"\u002Fdocs\u002Fguides\u002Fmagnet-screen-shot.webp",[3384],"Atuomate data entry into the Magnet search field.",[14,15390,15391],{},"In this guide, you'll learn how to use a bot to load the Magnet homepage, automate the entry of search terms to find keyword suggestions, and click \"Get Keywords.\" The bot will then scrape the results and extract them into a Google Sheet.",[14,15393,15394],{},"For this guide, we'll focus on Simple Search Mode, but the same principles apply to automating an Advanced Search.",[14,15396,5173,15397,3289,15399],{},[322,15398,3395],{"href":3394},[322,15400,3961],{"href":3398},[21,15402,3402],{"id":545},[11,15404],{},[14,15406,5186,15407,5189,15409,15412,15413,44],{},[29,15408,3913],{},[29,15410,15411],{},"search terms"," and another to store ",[29,15414,15415],{},"extracted data",[77,15417,15418],{},[555,15419,15420,15426,15433],{},[83,15421,15422,5202,15424,5206],{},[29,15423,3412],{},[90,15425,5205],{},[83,15427,15428,3938,15430,15432],{},[29,15429,3418],{},[29,15431,15411],{}," into the first tab.",[83,15434,15435,5221,15437,5225],{},[29,15436,3424],{},[29,15438,15439],{},"\"data\"",[21,15441,15443],{"id":15442},"how-to-automate-extracting-keywords-from-magnet","How to automate extracting keywords from Magnet",[11,15445],{},[14,15447,3432,15448,3436,15450,3440,15452,3444],{},[29,15449,3435],{},[29,15451,3439],{},[29,15453,3443],{},[14,15455,3447,15456,15459,15460],{},[322,15457,514],{"href":15458,"download":522},"\u002Fdocs\u002Fguides\u002Ftemplates\u002Faxiom_magent.json"," we created for this keyword scraper. Click to learn how to ",[322,15461,3455],{"href":3454},[77,15463,15464],{},[555,15465,15466,15485,15504,15526,15559,15587,15624,15646,15707,15751],{},[83,15467,8350,15468,15470,15471],{},[29,15469,12820],{}," step and configure.",[555,15472,15473,15479],{},[83,15474,15475,15478],{},[29,15476,15477],{},"Spreadsheet:"," Search for and add the Google Sheet you created.",[83,15480,15481,15484],{},[29,15482,15483],{},"Sheet name:"," Choose the tab containing the search terms.",[83,15486,8350,15487,1230,15490],{},[29,15488,15489],{},"'Loop through data'",[555,15491,15492],{},[83,15493,15494,1021,15497,3492,15500,15503],{},[29,15495,15496],{},"Loop through data:",[29,15498,15499],{},"'Insert Data'",[807,15501,15502],{},"'google-sheet-data'",". The loop step will now iterate through the search terms in the Google Sheet.",[83,15505,8350,15506,15509,15510,15512,15513],{},[29,15507,15508],{},"'Go to page'"," sub-step to load the ",[29,15511,5179],{}," landing page with the search field.",[555,15514,15515],{},[83,15516,15517,15520,15521,15523],{},[29,15518,15519],{},"Enter URL:"," The URL will look something like this:",[344,15522],{},[90,15524,15525],{},"\"https:\u002F\u002Fmembers.helium10.com\u002Fmagnet\u002Fproducts?accountId=xxxxxxx\"",[83,15527,15528,15529,15532,15533],{},"Add an ",[29,15530,15531],{},"'Enter text'"," sub-step.",[555,15534,15535,15545],{},[83,15536,15537,1021,15540,3492,15542,15544],{},[29,15538,15539],{},"Text:",[29,15541,15499],{},[29,15543,15502],{}," to pass the search terms from the sheet.",[83,15546,15547,15550,15551,15554,15555,3554],{},[29,15548,15549],{},"Select column:"," Choose column ",[29,15552,15553],{},"‘A’"," in the preview.\n ",[592,15556],{"src":15557,"alt":15558},"\u002Fdocs\u002Fguides\u002Fmagnet-enter-text.webp","axiom.ai using the enter text step to input search terms in Magnet",[83,15560,8350,15561,15564,15565,15567],{},[29,15562,15563],{},"'Click element'"," sub-step to click ",[29,15566,5166],{},[555,15568,15569],{},[83,15570,15571,1021,15574,3648,15577,3652,15580,15583,15584],{},[29,15572,15573],{},"Select:",[29,15575,15576],{},"'Select'",[29,15578,15579],{},"\"Custom\"",[29,15581,15582],{},"\"Use element text.\""," Finally, click ",[29,15585,15586],{},"\"Complete.\"",[83,15588,15589,15590,15592,15593,3289,15596,15599],{},"To close the pop-up, add a ",[29,15591,15563],{}," step to click ",[29,15594,15595],{},"\"Run new search\"",[29,15597,15598],{},"\"Load from history.\"",[555,15600,15601,15615],{},[83,15602,15603,1021,15605,3648,15607,5412,15609,3289,15612,44],{},[29,15604,15573],{},[29,15606,15576],{},[29,15608,15579],{},[90,15610,15611],{},"\"[data-testid=\"runnewsearch\"]\"",[90,15613,15614],{},"\"[data-testid=\"loadfromhistory\"]\"",[83,15616,15617,15620,15621,3554],{},[29,15618,15619],{},"Optional Click:"," Tick this option, as the pop-up does not always appear.\n ",[592,15622],{"src":5427,"alt":15623},"axiom.ai interacting with a dialog in Magnet during bot run",[83,15625,8350,15626,15629,15630],{},[29,15627,15628],{},"'Wait'"," step to pause the bot and allow the data to load.",[555,15631,15632],{},[83,15633,15634,15637,15638,15641,15642,15645],{},[29,15635,15636],{},"Wait time:"," Insert ",[29,15639,15640],{},"\"7000\""," to make the bot wait ",[29,15643,15644],{},"7 seconds."," You may need to experiment with wait time.",[83,15647,8350,15648,15651,15652,15654,15655],{},[29,15649,15650],{},"‘Get data from bot's current page’"," sub-step. With search results displayed on the ",[29,15653,5179],{}," page, select the data you wish to extract.",[555,15656,15657,15668,15677,15690,15699],{},[83,15658,15659,1021,15661,15664,15665,44],{},[29,15660,15573],{},[29,15662,15663],{},"‘Select’"," to open the ",[29,15666,15667],{},"multi-selector tool",[83,15669,15670,6072,15673,15676],{},[29,15671,15672],{},"Select the first keyword",[29,15674,15675],{},"\"Keyword Phrase\""," column, then repeat the selection for rows below to make a repeating selection.",[83,15678,3695,15679,3699,15682,15685,15686,3554],{},[29,15680,15681],{},"\"Shift + N\"",[29,15683,15684],{},"CPR"," column in the first row, then repeat the selection in the second row.\n ",[592,15687],{"src":15688,"alt":15689},"\u002Fdocs\u002Fguides\u002Fmagnet-select-data.png","axiom.ai selecting keyword data from Magnet",[83,15691,15692,15695,15696,44],{},[29,15693,15694],{},"Select the 'Next' button"," for pagination using the ",[29,15697,15698],{},"right arrow key",[83,15700,15701,15704,15705,3755],{},[29,15702,15703],{},"Set a maximum number of results"," you wish to scrape. I chose ",[29,15706,3754],{},[83,15708,8350,15709,1230,15712],{},[29,15710,15711],{},"'Write data to a Google Sheet'",[555,15713,15714,15722,15731,15741],{},[83,15715,15716,15718,15719],{},[29,15717,15477],{}," Select your ",[29,15720,15721],{},"Google Sheet.",[83,15723,15724,15727,15728,44],{},[29,15725,15726],{},"Sheet Name:"," Choose the tab where you want to write the ",[29,15729,15730],{},"Amazon keyword data",[83,15732,15733,1021,15736,3782,15738,44],{},[29,15734,15735],{},"Data:",[29,15737,15499],{},[29,15739,15740],{},"\"scraped-data-\"",[83,15742,15743,15746,15747,15750],{},[29,15744,15745],{},"Write Options:"," Select ",[29,15748,15749],{},"'Add to Existing Data'"," to append the new data without deleting the existing data.",[83,15752,8350,15753,15756,15757],{},[29,15754,15755],{},"'Delete rows from a Google Sheet'"," step to remove the processed search term.",[555,15758,15759,15765,15772,15780],{},[83,15760,15761,15718,15763],{},[29,15762,15477],{},[29,15764,15721],{},[83,15766,15767,15769,15770,44],{},[29,15768,15726],{}," Choose the tab containing the ",[29,15771,3978],{},[83,15773,15774,15777,15778,44],{},[29,15775,15776],{},"First Row to Delete:"," Leave this set to ",[29,15779,165],{},[83,15781,15782,15785,15786,44],{},[29,15783,15784],{},"Last Row to Delete:"," Set to ",[29,15787,3827],{},[14,15789,15790],{},"The Magnet automation, when completed, should resemble the diagram below.",[592,15792],{"src":15793,"className":15794,"alt":5640},"\u002Fdocs\u002Fguides\u002Fmagnet-axiom-design-pattern-steps.webp",[3835],[21,15796,15798],{"id":15797},"testing-your-magnet-automation","Testing your Magnet automation",[11,15800],{},[14,15802,15803,15804,15807,15808,3851,15810,5655,15812,44],{},"Once you have saved your **",[322,15805,15806],{"href":3377},"Helium10 Magnet"," ** automation, click ",[29,15809,3850],{},[29,15811,3435],{},[29,15813,15814],{},"keyword data",[592,15816],{"src":15817,"alt":15818},"\u002Fdocs\u002Fguides\u002Fmagnet-write-data.webp","axiom.ai writing data to a Google Sheet from Magnet",[639,15820,15821],{"id":5661},[29,15822,5664],{},[555,15824,15825,15837],{},[83,15826,15827,15830,15831,15833,15834,44],{},[29,15828,15829],{},"Element not found:"," You may need to reselect elements. Changing ",[29,15832,5675],{}," can sometimes affect ",[29,15835,15836],{},"selectors",[83,15838,15839,88,15841,15843,15844,5688,15846,44],{},[29,15840,5681],{},[29,15842,5179],{}," can sometimes be slow to load data, so you may need to adjust the ",[29,15845,5687],{},[29,15847,15848],{},"Step 7",[21,15850,3887],{"id":3886},[11,15852],{},[14,15854,3890,15855,3893,15857,3897,15859,3900],{},[29,15856,3435],{},[29,15858,5179],{},[29,15860,514],{},[555,15862,15863,15869,15878,15884],{},[83,15864,15865,3910,15867,44],{},[29,15866,3909],{},[29,15868,3913],{},[83,15870,15871,3919,15873,5721,15875,15877],{},[29,15872,3918],{},[29,15874,3922],{},[29,15876,5179],{}," page while logged in.",[83,15879,15880,3929,15882,3932],{},[29,15881,3928],{},[29,15883,1838],{},[83,15885,15886,3910,15888,44],{},[29,15887,3937],{},[29,15889,3913],{},[14,15891,3943,15892,3947],{},[29,15893,3946],{},[14,15895,3950,15896],{},[322,15897,15899],{"href":15898,"download":522},"\u002Fdocs\u002Fguides\u002Ftemplates\u002Faxiom_magnet.json","Magnet template.",[21,15901,796],{"id":795},[11,15903],{},[14,15905,15906,15907,15909,15910,15912,15913,15916,15917,15920],{},"Extracting ",[29,15908,15814],{}," from ",[29,15911,5179],{}," is straightforward. You can simply ",[29,15914,15915],{},"point and select"," the data you want. This template can be ",[29,15918,15919],{},"modified"," and used as a starting point.",[14,15922,5794,15923,3991,15925,5801],{},[29,15924,3378],{},[29,15926,15927],{},[322,15928,3997],{"href":3996},[11,15930],{},[14,15932,15933],{},[807,15934,4002,15935,4006,15937,3289,15939,4011],{},[29,15936,4005],{},[29,15938,3378],{},[29,15940,3435],{},{"title":494,"searchDepth":495,"depth":495,"links":15942},[15943,15944,15945,15948,15949],{"id":545,"depth":498,"text":3402},{"id":15442,"depth":498,"text":15443},{"id":15797,"depth":498,"text":15798,"children":15946},[15947],{"id":5661,"depth":495,"text":5664},{"id":3886,"depth":498,"text":3887},{"id":795,"depth":498,"text":796},"Learn how to use axiom.ai to automate the input of search terms into Magnet, a Helium10 tool, then click \"Get Keywords.\" Once the keyword search is complete, axiom.ai will crape the datat into a Google Sheet.",{"pinned":522,"type":513,"format":77,"intent_type":1049,"intent":4022,"tags":15952,"platfrom":15953},[519,1056],[3378],"\u002Fguides\u002Fmagnet",{"title":15376,"description":15950},"guides\u002Fmagnet","7CmhjEBjM97K98IAwVqTsD9YUhaKtjvjHqUV0Gu86FE",{"id":15959,"title":15960,"body":15961,"date":1043,"description":16259,"extension":506,"meta":16260,"navigation":522,"order":523,"path":16269,"seo":16270,"stem":16271,"__hash__":16272},"guides\u002Fguides\u002Fmonitor-web-page-and-send-message.md","How to monitor a web page and send email",{"type":8,"value":15962,"toc":16251},[15963,15965,15968,15971,15973,15976,15983,15987,15995,15999,16002,16006,16009,16013,16225,16229,16232,16236,16239],[11,15964],{},[14,15966,15967],{},"Monitor a website for new products, this bot is a simple and effective way to achieve your goal. You will need to use this bot on a listing or search page.",[14,15969,15970],{},"The bot scrapes a list of content, such as titles or prices comparing them against a previous scrape to monitor for changes.",[18,15972],{},[14,15974,15975],{},"This template is simple and adaptable to different websites, from products to stock listings. A Google Sheet is required to store data for comparison.",[14,15977,15978,15979],{},"To use this template, you will first need to scrape a list of data into your sheet to compare against. We suggest you adpat this ",[322,15980,15982],{"href":15981},"\u002Fguides\u002Fscrape-links-from-a-website","template.",[21,15984,15986],{"id":15985},"advantages-to-using-this-web-monitoring-design-pattern","Advantages to using this web monitoring design pattern",[555,15988,15989,15992],{},[83,15990,15991],{},"Adaptable to different types of website",[83,15993,15994],{},"Monitoring can be scheduled at regular intervals",[21,15996,15998],{"id":15997},"install-the-monitor-bot-template","Install the Monitor bot template",[14,16000,16001],{},"On this page click 'Install template'. If you are a new user you will be required to create an axiom.ai account before you can edit the template.",[21,16003,16005],{"id":16004},"prepare-a-google-sheet","Prepare a Google Sheet",[14,16007,16008],{},"A Google sheet is required with a list of data to compare against.",[21,16010,16012],{"id":16011},"configure-the-bot","Configure the bot",[77,16014,16015],{},[80,16016,16017,16046,16075,16120,16164,16193],{},[83,16018,16019,88,16021,16023],{},[29,16020,87],{},[90,16022,148],{},[80,16024,16025,16030,16035,16041],{},[83,16026,16027,16029],{},[90,16028,3922],{},": Insert the link of the page you wish to monitor.",[83,16031,16032,16034],{},[90,16033,155],{},": Point and click to select the content to monitor.",[83,16036,16037,16040],{},[90,16038,16039],{},"Find pager"," (optional): Select the “Next” button if the page is paginated.",[83,16042,16043,16045],{},[90,16044,161],{},": When testing, set to 10–20.",[83,16047,16048,88,16050,16052],{},[29,16049,111],{},[90,16051,92],{},[80,16053,16054,16059,16064,16072],{},[83,16055,16056,16058],{},[90,16057,99],{},": Search for the Google Sheet you created.",[83,16060,16061,16063],{},[90,16062,105],{},": Choose the sheet with the comparison data.",[83,16065,16066,16068,16069,16071],{},[90,16067,7182],{}," \u002F ",[90,16070,5267],{},": Leave as default.",[83,16073,16074],{},"A preview of the data should now display.",[83,16076,16077,88,16079,16082],{},[29,16078,3760],{},[90,16080,16081],{},"Remove results that do not contain certain words",[80,16083,16084,16092,16101,16109,16115],{},[83,16085,16086,132,16088,136,16090,44],{},[90,16087,465],{},[90,16089,194],{},[90,16091,5975],{},[83,16093,16094,132,16097,136,16099,44],{},[90,16095,16096],{},"Words",[90,16098,194],{},[90,16100,139],{},[83,16102,16103,11491,16106,44],{},[90,16104,16105],{},"Word matching mode",[90,16107,16108],{},"\"Any\"",[83,16110,16111,16114],{},[90,16112,16113],{},"Match on word boundary",": Leave unticked.",[83,16116,16117,16071],{},[90,16118,16119],{},"Columns (optional)",[83,16121,16122,88,16124,16127],{},[29,16123,3799],{},[90,16125,16126],{},"If condition: Continue only if new content found",[80,16128,16129,16138,16144,16150,16154,16160],{},[83,16130,16131,132,16133,136,16135,44],{},[90,16132,6281],{},[90,16134,194],{},[90,16136,16137],{},"[matching-word-data]",[83,16139,16140,16143],{},[90,16141,16142],{},"Words to check",": Use default (a–z, 0–9).",[83,16145,16146,1995,16148,44],{},[90,16147,16105],{},[90,16149,16108],{},[83,16151,16152,16114],{},[90,16153,16113],{},[83,16155,16156,16159],{},[90,16157,16158],{},"Fail if condition not met",": Tick this box.",[83,16161,16162,16114],{},[90,16163,11371],{},[83,16165,16166,88,16168,16170],{},[29,16167,5343],{},[90,16169,3303],{},[80,16171,16172,16176,16181,16187],{},[83,16173,16174,16058],{},[90,16175,99],{},[83,16177,16178,16180],{},[90,16179,105],{},": Choose the sheet with existing content.",[83,16182,16183,261,16185,44],{},[90,16184,260],{},[90,16186,16137],{},[83,16188,16189,162,16191,44],{},[90,16190,269],{},[90,16192,6013],{},[83,16194,16195,88,16197,16200],{},[29,16196,5366],{},[90,16198,16199],{},"Send email",[80,16201,16202,16208,16214],{},[83,16203,16204,16207],{},[90,16205,16206],{},"Email addresses",": Enter email addresses, one per line.",[83,16209,16210,16213],{},[90,16211,16212],{},"Email subject",": Add your subject.",[83,16215,16216,16219,16220,16222,16223,44],{},[90,16217,16218],{},"Email body",": Add your message. Use ",[90,16221,194],{}," to include ",[90,16224,16137],{},[21,16226,16228],{"id":16227},"test-run","Test run",[14,16230,16231],{},"We always recommed doing a test run - click run then check the output from the scraper. In this case in the sheet.",[21,16233,16235],{"id":16234},"troubleshooting-the-monitoring-axiom","Troubleshooting the monitoring Axiom",[14,16237,16238],{},"As mentioned at the top of the page, you will need to scrape data to compare against before running this bot.",[80,16240,16241,16248],{},[83,16242,16243,16244,16247],{},"All results write to the Google Sheet, check the 'Write' Step is set to '",[727,16245,16246],{},"word-matching-data","'.",[83,16249,16250],{},"No message sent - perhaps no change has been detected.",{"title":494,"searchDepth":495,"depth":495,"links":16252},[16253,16254,16255,16256,16257,16258],{"id":15985,"depth":498,"text":15986},{"id":15997,"depth":498,"text":15998},{"id":16004,"depth":498,"text":16005},{"id":16011,"depth":498,"text":16012},{"id":16227,"depth":498,"text":16228},{"id":16234,"depth":498,"text":16235},"Learn how to monitor a web page for changes and automatically send an email notification using axiom.ai. This guide covers scraping, comparing data, and notifying you of updates.",{"logoFile":1751,"read":16261,"level":16262,"video":16263,"templateId":4729,"type":513,"format":77,"intent_type":1754,"intent":16264,"tags":16265,"platfrom":16268},"16 minutes","Intermediate","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FoUk5xPV-eDQ","Monitor websites for changes",[16266,16267],"monitoring","scrpaing",[1757],"\u002Fguides\u002Fmonitor-web-page-and-send-message",{"title":15960,"description":16259},"guides\u002Fmonitor-web-page-and-send-message","QjcvKkN3dFlZjwXOMNL8Zx1PQ0qZAn-EFA5kh1cq0bE",{"id":16274,"title":16275,"body":16276,"date":1043,"description":16549,"extension":506,"meta":16550,"navigation":522,"order":523,"path":16555,"seo":16556,"stem":16557,"__hash__":16558},"guides\u002Fguides\u002Fmonitoring-send-webhook.md","How to monitor a web page and trigger webhook",{"type":8,"value":16277,"toc":16541},[16278,16280,16283,16285,16287,16289,16293,16295,16303,16305,16307,16309,16311,16316,16320,16512,16515,16523,16525,16528,16530,16532],[11,16279],{},[14,16281,16282],{},"Monitor a website for new products then send a notification via a webhook, this bot is a simple and effective way to achieve your goal. You will need to use this bot on a listing or search page.",[18,16284],{},[14,16286,15970],{},[14,16288,15975],{},[14,16290,15978,16291],{},[322,16292,15982],{"href":15981},[21,16294,15986],{"id":15985},[77,16296,16297],{},[555,16298,16299,16301],{},[83,16300,15991],{},[83,16302,15994],{},[21,16304,15998],{"id":15997},[14,16306,16001],{},[21,16308,16005],{"id":16004},[14,16310,16008],{},[14,16312,16313,16314],{},"We suggest you adpat this ",[322,16315,15982],{"href":15981},[21,16317,16319],{"id":16318},"get-started-open-the-bot-for-editing","Get started open the bot for editing",[77,16321,16322],{},[80,16323,16324,16350,16379,16420,16463,16493],{},[83,16325,16326,88,16328,16330],{},[29,16327,87],{},[90,16329,148],{},[80,16331,16332,16336,16340,16345],{},[83,16333,16334,16029],{},[90,16335,3922],{},[83,16337,16338,16034],{},[90,16339,155],{},[83,16341,16342,16344],{},[90,16343,16039],{}," (optional): Select the “Next” button if the page has pagination. If the page scrolls, leave this blank.",[83,16346,16347,16349],{},[90,16348,161],{},": For testing, set to 10–20.",[83,16351,16352,88,16354,16356],{},[29,16353,111],{},[90,16355,92],{},[80,16357,16358,16363,16368,16372,16376],{},[83,16359,16360,16362],{},[90,16361,99],{},": Search for and select the Google Sheet you created.",[83,16364,16365,16367],{},[90,16366,105],{},": Choose the sheet containing the comparison data.",[83,16369,16370,16071],{},[90,16371,7182],{},[83,16373,16374,16071],{},[90,16375,5267],{},[83,16377,16378],{},"A preview of the data should now appear.",[83,16380,16381,88,16383,16386],{},[29,16382,3760],{},[90,16384,16385],{},"Remove results which do not contain certain words",[80,16387,16388,16396,16405,16411,16415],{},[83,16389,16390,132,16392,136,16394,44],{},[90,16391,465],{},[90,16393,194],{},[90,16395,5975],{},[83,16397,16398,132,16401,136,16403,44],{},[90,16399,16400],{},"Words (comma separated)",[90,16402,194],{},[90,16404,139],{},[83,16406,16407,162,16409,44],{},[90,16408,16105],{},[90,16410,16108],{},[83,16412,16413,16114],{},[90,16414,16113],{},[83,16416,16417,16419],{},[90,16418,16119],{},": Leave default.",[83,16421,16422,88,16424,16427],{},[29,16423,3799],{},[90,16425,16426],{},"If condition: Continue only if new content is found",[80,16428,16429,16437,16445,16451,16455,16459],{},[83,16430,16431,132,16433,136,16435,44],{},[90,16432,6281],{},[90,16434,194],{},[90,16436,16137],{},[83,16438,16439,16441,16442,44],{},[90,16440,16142],{},": Leave as ",[90,16443,16444],{},"(a,b,c,...,z,0–9)",[83,16446,16447,1995,16449,44],{},[90,16448,16105],{},[90,16450,16108],{},[83,16452,16453,16114],{},[90,16454,16113],{},[83,16456,16457,16159],{},[90,16458,16158],{},[83,16460,16461,16114],{},[90,16462,11371],{},[83,16464,16465,88,16467,16469],{},[29,16466,5343],{},[90,16468,3303],{},[80,16470,16471,16475,16480,16487],{},[83,16472,16473,16362],{},[90,16474,99],{},[83,16476,16477,16479],{},[90,16478,105],{},": Choose the sheet you’re appending to.",[83,16481,16482,261,16484,44],{},[90,16483,260],{},[90,16485,16486],{},"[word-matching-data]",[83,16488,16489,162,16491,44],{},[90,16490,15309],{},[90,16492,6013],{},[83,16494,16495,88,16497,16499],{},[29,16496,5366],{},[90,16498,12302],{},[80,16500,16501,16506],{},[83,16502,16503,16505],{},[90,16504,577],{},": Insert the webhook endpoint.",[83,16507,16508,16511],{},[90,16509,16510],{},"Payload",": Enter your payload in JSON format.",[14,16513,16514],{},"Webhook trigger example:",[719,16516,16521],{"className":16517,"code":16519,"language":16520},[16518],"language-text","{\n  \"name\": \"test webhook\",\n  \"type\": 1,\n  \"channel_id\": \"199737254929760256\",\n  \"token\": \"3d89bb7572e0fb30d8128367b3b1b44fecd1726de135cbe28a41f8b2f777c372ba2939e72279b94526ff5d1bd4358d65cf11\",\n  \"avatar\": null,\n  \"guild_id\": \"199737254929760256\",\n  \"id\": \"223704706495545344\",\n  \"application_id\": null,\n  \"user\": {\n    \"username\": \"test\",\n    \"discriminator\": \"7479\",\n    \"id\": \"190320984123768832\",\n    \"avatar\": \"b004ec1740a63ca06ae2e14c5cee11f3\",\n    \"public_flags\": 131328\n  }\n","text",[90,16522,16519],{"__ignoreMap":494},[21,16524,16228],{"id":16227},[14,16526,16527],{},"We always recommend doing a test run - You should test the filter and conditional. Do the first scrape, then delete some rows to test the full bot. You can also test if the webhook is triggered.",[21,16529,16235],{"id":16234},[14,16531,16238],{},[80,16533,16534,16538],{},[83,16535,16243,16536,16247],{},[727,16537,16246],{},[83,16539,16540],{},"No message sent - Check your JSON",{"title":494,"searchDepth":495,"depth":495,"links":16542},[16543,16544,16545,16546,16547,16548],{"id":15985,"depth":498,"text":15986},{"id":15997,"depth":498,"text":15998},{"id":16004,"depth":498,"text":16005},{"id":16318,"depth":498,"text":16319},{"id":16227,"depth":498,"text":16228},{"id":16234,"depth":498,"text":16235},"Learn how to monitor a web page for changes and trigger a webhook notification using axiom.ai. This guide covers scraping, comparing data, and sending webhook notifications for updates.",{"pinned":522,"read":16551,"type":513,"format":77,"intent_type":1754,"intent":16264,"tags":16552,"platfrom":16553,"video":16554,"templateId":4724},"15 minutes",[16266],[1757],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FFUj68AKN5Cs","\u002Fguides\u002Fmonitoring-send-webhook",{"title":16275,"description":16549},"guides\u002Fmonitoring-send-webhook","3vrBE-Bwnp66uZlxpfHtm67D3tNnkmNqxTFl0YedlfA",{"id":16560,"title":16561,"body":16562,"date":523,"description":16572,"extension":506,"meta":16573,"navigation":522,"order":523,"path":12724,"seo":16575,"stem":16576,"__hash__":16577},"guides\u002Fguides\u002Fpattern.md","Pattern guides",{"type":8,"value":16563,"toc":16570},[16564,16567],[14,16565,16566],{},"Reusable techniques for the No-code tool: logins, dialogs, forms, keyboard shortcuts, APIs, and moving data between steps. Use these guides to solve recurring problems and combine them in larger automations.",[16568,16569],"guides-intent-hub",{"intent":515},{"title":494,"searchDepth":495,"depth":495,"links":16571},[],"Reusable techniques for the No-code tool—logins, dialogs, forms, keyboard shortcuts, APIs, and moving data between steps.",{"layout":16574},"guides-intent",{"title":16561,"description":16572},"guides\u002Fpattern","Pu2EeFHS8UD2Lmjfg34vNMZ2WPGp7Pke7bLFNBOS-Z8",{"id":16579,"title":16580,"body":16581,"date":523,"description":18282,"extension":506,"meta":18283,"navigation":522,"order":523,"path":12438,"seo":18289,"stem":18290,"__hash__":18291},"guides\u002Fguides\u002Fpost-data-to-airtable.md","How to post data to Airtable using an axiom.ai automation",{"type":8,"value":16582,"toc":18271},[16583,16585,16588,16590,16593,16595,16597,16617,16620,16650,16653,16704,16708,16712,16714,16717,16721,16723,16732,16736,16738,16752,16789,17199,17203,17205,17215,17242,17666,17670,17672,17675,17700,18247,18249,18252,18263,18265,18268],[11,16584],{},[14,16586,16587],{},"Follow these steps to post data from axiom.ai to Airtable using a webhook. axiom.ai allows you to use webhooks to send data to external APIs, including Airtable's API. To make the integration work, you will need to configure your credentials in Airtable, and in axiom.ai, you will need to create your post request using JavaScript.",[18,16589],{},[14,16591,16592],{},"This guide assumes you are familiar with both axiom.ai and Airtable and have a basic understanding of JavaScript.",[21,16594,546],{"id":545},[14,16596,551],{},[77,16598,16599],{},[555,16600,16601,16607,16611],{},[83,16602,16603,562,16605,44],{},[29,16604,561],{},[322,16606,566],{"href":565},[83,16608,16609,572],{},[29,16610,571],{},[83,16612,16613,1797,16615,44],{},[29,16614,577],{},[90,16616,581],{},[14,16618,16619],{},"You'll also need information from Airtable:",[77,16621,16622],{},[555,16623,16624,16644],{},[83,16625,16626,16629,16630,16635,16636,16639,16640,16643],{},[29,16627,16628],{},"Base ID",": Head to the ",[322,16631,16634],{"href":16632,"rel":16633},"https:\u002F\u002Fairtable.com\u002Fdeveloper-hub\u002Fweb\u002Fapi\u002F",[2245],"Airtable API page"," to grab your ",[29,16637,16638],{},"\"Base ID\"",". Your ID will look something like ",[29,16641,16642],{},"\"appFrf1jmiyIq5nuJ\"",". You can also find this in the URL of your base.",[83,16645,16646,16649],{},[29,16647,16648],{},"Table name",": Open your Airtable base, the tab names will be the table name that you need to use.",[14,16651,16652],{},"Create a personal access token via the Airtable Developer Hub.",[77,16654,16655],{},[555,16656,16657,16669,16678,16683,16692,16698],{},[83,16658,16659,16662,16663,16668],{},[29,16660,16661],{},"Personal access token",": Open the ",[322,16664,16667],{"href":16665,"rel":16666},"https:\u002F\u002Fairtable.com\u002Fcreate\u002Ftokens",[2245],"personal access token"," page.",[83,16670,16671,16674,16675],{},[29,16672,16673],{},"Create new token",": Click on the button ",[29,16676,16677],{},"\"create a new token.\"",[83,16679,16680,16682],{},[29,16681,2662],{},": Name your new token.",[83,16684,16685,16688,16689,44],{},[29,16686,16687],{},"Scopes",": Set the scope to ",[29,16690,16691],{},"\"data.records:write\"",[83,16693,16694,16697],{},[29,16695,16696],{},"Access",": Select the Base you wish to add records to.",[83,16699,16700,16703],{},[29,16701,16702],{},"Create token",": Create the token, copy it for later.",[592,16705],{"src":16706,"alt":16707},"\u002Fdocs\u002Fguides\u002Fpersonnel-access-token-airtable.jpg","Airtable create access token",[21,16709,16711],{"id":16710},"sending-data-to-airtable-using-an-axiomai-automation","Sending data to Airtable using an axiom.ai automation",[11,16713],{},[14,16715,16716],{},"Learn how to get started with sending data from your axiom.ai automation to Airtable.",[639,16718,16720],{"id":16719},"set-up-your-axiomai-automation","Set up your axiom.ai automation",[11,16722],{},[14,16724,16725,16726,16731],{},"Create your automation as per usual. When you need to send data to Airtable, add a ",[29,16727,16728],{},[322,16729,16730],{"href":2300},"write JavaScript"," to your automation. Follow the guides below to determine which script you'll need to send along your data to Airtable.",[639,16733,16735],{"id":16734},"create-a-single-record","Create a single record",[11,16737],{},[14,16739,16740,16741,16743,16744,16747,16748,16751],{},"The following code will create a single record in Airtable. You'll need your credentials from the ",[322,16742,3402],{"href":6615}," section to begin. You'll need to modify the attributes in the ",[90,16745,16746],{},"recordData"," array with this data. When scraping, ensure that the ",[29,16749,16750],{},"max results"," option is set to 1.",[77,16753,16754],{},[555,16755,16756,16771,16780],{},[83,16757,16758,224,16761,2004,16764,16767,16768,16770],{},[29,16759,16760],{},"Add credentials",[29,16762,16763],{},"base ID",[29,16765,16766],{},"table name",", and ",[29,16769,16667],{}," into the script.",[83,16772,16773,16776,16777,16779],{},[29,16774,16775],{},"Field names",": Edit the field names in ",[90,16778,16746],{}," to match your table.",[83,16781,16782,16785,16786],{},[29,16783,16784],{},"Field values",": Insert axiom.ai data tokens for the value of each field, replacing the examples. ",[807,16787,16788],{},"Tip: use the 'insert data' button to do this step.",[719,16790,16792],{"className":756,"code":16791,"language":758,"meta":494,"style":494},"\u002F\u002F Airtable API endpoint URL\nconst AirtableBaseId = '*******'; \u002F\u002F Add Base ID \nconst AirtableTableName = '************'; \u002F\u002F Add table name\nconst AirtableAccessToken = '**********'; \u002F\u002F Add personal access token\nconst AirtableUrl = `https:\u002F\u002Fapi.Airtable.com\u002Fv0\u002F${AirtableBaseId}\u002F${AirtableTableName}`;\n\n\u002F\u002F Data you want to send (adjust according to your Airtable fields)\nconst recordData = {\n  fields: {\n    \"Customer Name\": '[scrape-data?all&0]',  \u002F\u002F Replace field and token \n    \"Email Address\": '[scrape-data?all&1]',  \u002F\u002F Replace field and token\n    \"Phone Number\": '[scrape-data?all&2]',   \u002F\u002F Replace field and token\n    \"Customer ID\": '[scrape-data?all&3]'     \u002F\u002F Replace field and token\n  }\n};\n\n\u002F\u002F Send data to create a single record in Airtable.\nasync function sendToAirtable(data) {\n  try {\n    const response = await fetch(AirtableUrl, {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${AirtableAccessToken}`,\n        'Content-Type': 'application\u002Fjson'\n      },\n      body: JSON.stringify(data)\n    });\n\n    if (response.ok) {\n      const jsonResponse = await response.json();\n      console.log('Record added successfully:', jsonResponse);\n    } else {\n      console.error('Error adding record:', response.statusText);\n    }\n  } catch (error) {\n    console.error('Error with request:', error);\n  }\n}\n\n\u002F\u002F Call the function to send the record to Airtable\nsendToAirtable(recordData);\n",[90,16793,16794,16799,16816,16833,16850,16874,16878,16883,16894,16899,16915,16930,16945,16958,16962,16967,16971,16976,16993,16999,17015,17024,17029,17046,17056,17061,17075,17080,17084,17092,17110,17125,17134,17148,17152,17160,17174,17178,17182,17186,17191],{"__ignoreMap":494},[727,16795,16796],{"class":729,"line":730},[727,16797,16798],{"class":2920},"\u002F\u002F Airtable API endpoint URL\n",[727,16800,16801,16803,16806,16808,16811,16813],{"class":729,"line":498},[727,16802,2315],{"class":1986},[727,16804,16805],{"class":1882}," AirtableBaseId",[727,16807,2321],{"class":1986},[727,16809,16810],{"class":737}," '*******'",[727,16812,9444],{"class":768},[727,16814,16815],{"class":2920},"\u002F\u002F Add Base ID \n",[727,16817,16818,16820,16823,16825,16828,16830],{"class":729,"line":495},[727,16819,2315],{"class":1986},[727,16821,16822],{"class":1882}," AirtableTableName",[727,16824,2321],{"class":1986},[727,16826,16827],{"class":737}," '************'",[727,16829,9444],{"class":768},[727,16831,16832],{"class":2920},"\u002F\u002F Add table name\n",[727,16834,16835,16837,16840,16842,16845,16847],{"class":729,"line":1895},[727,16836,2315],{"class":1986},[727,16838,16839],{"class":1882}," AirtableAccessToken",[727,16841,2321],{"class":1986},[727,16843,16844],{"class":737}," '**********'",[727,16846,9444],{"class":768},[727,16848,16849],{"class":2920},"\u002F\u002F Add personal access token\n",[727,16851,16852,16854,16857,16859,16862,16865,16867,16870,16872],{"class":729,"line":1901},[727,16853,2315],{"class":1986},[727,16855,16856],{"class":1882}," AirtableUrl",[727,16858,2321],{"class":1986},[727,16860,16861],{"class":737}," `https:\u002F\u002Fapi.Airtable.com\u002Fv0\u002F${",[727,16863,16864],{"class":768},"AirtableBaseId",[727,16866,2764],{"class":737},[727,16868,16869],{"class":768},"AirtableTableName",[727,16871,2448],{"class":737},[727,16873,2327],{"class":768},[727,16875,16876],{"class":729,"line":1973},[727,16877,1898],{"emptyLinePlaceholder":522},[727,16879,16880],{"class":729,"line":2052},[727,16881,16882],{"class":2920},"\u002F\u002F Data you want to send (adjust according to your Airtable fields)\n",[727,16884,16885,16887,16890,16892],{"class":729,"line":2058},[727,16886,2315],{"class":1986},[727,16888,16889],{"class":1882}," recordData",[727,16891,2321],{"class":1986},[727,16893,2391],{"class":768},[727,16895,16896],{"class":729,"line":2064},[727,16897,16898],{"class":768},"  fields: {\n",[727,16900,16901,16904,16906,16909,16912],{"class":729,"line":2087},[727,16902,16903],{"class":737},"    \"Customer Name\"",[727,16905,1995],{"class":768},[727,16907,16908],{"class":737},"'[scrape-data?all&0]'",[727,16910,16911],{"class":768},",  ",[727,16913,16914],{"class":2920},"\u002F\u002F Replace field and token \n",[727,16916,16917,16920,16922,16925,16927],{"class":729,"line":2140},[727,16918,16919],{"class":737},"    \"Email Address\"",[727,16921,1995],{"class":768},[727,16923,16924],{"class":737},"'[scrape-data?all&1]'",[727,16926,16911],{"class":768},[727,16928,16929],{"class":2920},"\u002F\u002F Replace field and token\n",[727,16931,16932,16935,16937,16940,16943],{"class":729,"line":2154},[727,16933,16934],{"class":737},"    \"Phone Number\"",[727,16936,1995],{"class":768},[727,16938,16939],{"class":737},"'[scrape-data?all&2]'",[727,16941,16942],{"class":768},",   ",[727,16944,16929],{"class":2920},[727,16946,16947,16950,16952,16955],{"class":729,"line":1529},[727,16948,16949],{"class":737},"    \"Customer ID\"",[727,16951,1995],{"class":768},[727,16953,16954],{"class":737},"'[scrape-data?all&3]'",[727,16956,16957],{"class":2920},"     \u002F\u002F Replace field and token\n",[727,16959,16960],{"class":729,"line":2178},[727,16961,9712],{"class":768},[727,16963,16964],{"class":729,"line":2187},[727,16965,16966],{"class":768},"};\n",[727,16968,16969],{"class":729,"line":2533},[727,16970,1898],{"emptyLinePlaceholder":522},[727,16972,16973],{"class":729,"line":2551},[727,16974,16975],{"class":2920},"\u002F\u002F Send data to create a single record in Airtable.\n",[727,16977,16978,16980,16983,16986,16988,16990],{"class":729,"line":2559},[727,16979,10151],{"class":1986},[727,16981,16982],{"class":1986}," function",[727,16984,16985],{"class":2376}," sendToAirtable",[727,16987,2542],{"class":768},[727,16989,1838],{"class":733},[727,16991,16992],{"class":768},") {\n",[727,16994,16995,16997],{"class":729,"line":2565},[727,16996,9641],{"class":1986},[727,16998,2391],{"class":768},[727,17000,17001,17004,17006,17008,17010,17012],{"class":729,"line":2570},[727,17002,17003],{"class":1986},"    const",[727,17005,2093],{"class":1882},[727,17007,2321],{"class":1986},[727,17009,2410],{"class":1986},[727,17011,2413],{"class":2376},[727,17013,17014],{"class":768},"(AirtableUrl, {\n",[727,17016,17017,17020,17022],{"class":729,"line":2591},[727,17018,17019],{"class":768},"      method: ",[727,17021,2424],{"class":737},[727,17023,2427],{"class":768},[727,17025,17026],{"class":729,"line":2603},[727,17027,17028],{"class":768},"      headers: {\n",[727,17030,17031,17034,17036,17039,17042,17044],{"class":729,"line":2615},[727,17032,17033],{"class":737},"        'Authorization'",[727,17035,1995],{"class":768},[727,17037,17038],{"class":737},"`Bearer ${",[727,17040,17041],{"class":768},"AirtableAccessToken",[727,17043,2448],{"class":737},[727,17045,2427],{"class":768},[727,17047,17048,17051,17053],{"class":729,"line":2630},[727,17049,17050],{"class":737},"        'Content-Type'",[727,17052,1995],{"class":768},[727,17054,17055],{"class":737},"'application\u002Fjson'\n",[727,17057,17058],{"class":729,"line":2636},[727,17059,17060],{"class":768},"      },\n",[727,17062,17063,17066,17068,17070,17072],{"class":729,"line":2642},[727,17064,17065],{"class":768},"      body: ",[727,17067,9620],{"class":1882},[727,17069,44],{"class":768},[727,17071,9625],{"class":2376},[727,17073,17074],{"class":768},"(data)\n",[727,17076,17077],{"class":729,"line":2647},[727,17078,17079],{"class":768},"    });\n",[727,17081,17082],{"class":729,"line":4657},[727,17083,1898],{"emptyLinePlaceholder":522},[727,17085,17086,17089],{"class":729,"line":4662},[727,17087,17088],{"class":1986},"    if",[727,17090,17091],{"class":768}," (response.ok) {\n",[727,17093,17094,17097,17100,17102,17104,17106,17108],{"class":729,"line":1316},[727,17095,17096],{"class":1986},"      const",[727,17098,17099],{"class":1882}," jsonResponse",[727,17101,2321],{"class":1986},[727,17103,2410],{"class":1986},[727,17105,2582],{"class":768},[727,17107,2585],{"class":2376},[727,17109,2588],{"class":768},[727,17111,17112,17115,17117,17119,17122],{"class":729,"line":4671},[727,17113,17114],{"class":768},"      console.",[727,17116,2597],{"class":2376},[727,17118,2542],{"class":768},[727,17120,17121],{"class":737},"'Record added successfully:'",[727,17123,17124],{"class":768},", jsonResponse);\n",[727,17126,17127,17129,17132],{"class":729,"line":4676},[727,17128,2606],{"class":768},[727,17130,17131],{"class":1986},"else",[727,17133,2391],{"class":768},[727,17135,17136,17138,17140,17142,17145],{"class":729,"line":4681},[727,17137,17114],{"class":768},[727,17139,2539],{"class":2376},[727,17141,2542],{"class":768},[727,17143,17144],{"class":737},"'Error adding record:'",[727,17146,17147],{"class":768},", response.statusText);\n",[727,17149,17150],{"class":729,"line":4686},[727,17151,2633],{"class":768},[727,17153,17154,17156,17158],{"class":729,"line":4691},[727,17155,9682],{"class":768},[727,17157,2609],{"class":1986},[727,17159,2612],{"class":768},[727,17161,17162,17165,17167,17169,17172],{"class":729,"line":4696},[727,17163,17164],{"class":768},"    console.",[727,17166,2539],{"class":2376},[727,17168,2542],{"class":768},[727,17170,17171],{"class":737},"'Error with request:'",[727,17173,2627],{"class":768},[727,17175,17176],{"class":729,"line":4702},[727,17177,9712],{"class":768},[727,17179,17180],{"class":729,"line":4708},[727,17181,2639],{"class":768},[727,17183,17184],{"class":729,"line":4714},[727,17185,1898],{"emptyLinePlaceholder":522},[727,17187,17188],{"class":729,"line":4719},[727,17189,17190],{"class":2920},"\u002F\u002F Call the function to send the record to Airtable\n",[727,17192,17193,17196],{"class":729,"line":4724},[727,17194,17195],{"class":2376},"sendToAirtable",[727,17197,17198],{"class":768},"(recordData);\n",[639,17200,17202],{"id":17201},"create-multiple-records-up-to-10","Create multiple records (up to 10)",[11,17204],{},[14,17206,17207,17208,16743,17210,16747,17212,17214],{},"The following code will create multiple records in Airtable. You'll need your credentials from the ",[322,17209,3402],{"href":6615},[90,17211,16746],{},[29,17213,16750],{}," option is set to 10. Airtable's API limits records created per call to 10.",[77,17216,17217],{},[555,17218,17219,17229,17237],{},[83,17220,17221,224,17223,2004,17225,16767,17227,16770],{},[29,17222,16760],{},[29,17224,16763],{},[29,17226,16766],{},[29,17228,16667],{},[83,17230,17231,17234,17235],{},[29,17232,17233],{},"axiomData",": Remove example token and insert your own. ",[807,17236,16788],{},[83,17238,17239,17241],{},[29,17240,16775],{},": Edit the field names in \"recordsToSend\", to match your table.",[719,17243,17245],{"className":756,"code":17244,"language":758,"meta":494,"style":494},"\u002F\u002F Airtable API endpoint URL\nconst AirtableBaseId = '*******'; \u002F\u002F Add base ID\nconst AirtableTableName = '************'; \u002F\u002F Add table name\nconst AirtableAccessToken = '**********'; \u002F\u002F Add personal access token\nconst AirtableUrl = `https:\u002F\u002Fapi.Airtable.com\u002Fv0\u002F${AirtableBaseId}\u002F${AirtableTableName}`;\n\n\u002F\u002F Replace the token used in this variable\nconst axiomData = [scrape-data];\n\n\u002F\u002F Data you want to send (adjust according to your Airtable fields)\nconst recordsToSend = axiomData.map((row) => {\n  return {\n    fields: {\n      \"Customer Name\": row[0],\n      \"Email Address\": row[1],\n      \"Phone Number\": row[2],\n      \"Customer ID\": row[3]\n    }\n  };\n});\n\n\u002F\u002F Send data to create multiple records in Airtable.\nasync function sendToAirtable(records) {\n  try {\n    const response = await fetch(AirtableUrl, {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${AirtableAccessToken}`,\n        'Content-Type': 'application\u002Fjson'\n      },\n      body: JSON.stringify({\n        records: records \u002F\u002F Send multiple records in one request\n      })\n    });\n\n    if (response.ok) {\n      const jsonResponse = await response.json();\n      console.log('Records added successfully:', jsonResponse);\n    } else {\n      console.error('Error adding records:', response.statusText);\n    }\n  } catch (error) {\n    console.error('Error with request:', error);\n  }\n}\n\n\u002F\u002F Call the function to send the records to Airtable\nsendToAirtable(recordsToSend);\n\n",[90,17246,17247,17251,17266,17280,17294,17314,17318,17323,17341,17345,17349,17373,17380,17385,17399,17410,17421,17434,17438,17442,17447,17451,17456,17471,17477,17491,17499,17503,17517,17525,17529,17541,17549,17554,17558,17562,17568,17584,17597,17605,17618,17622,17630,17642,17646,17650,17654,17659],{"__ignoreMap":494},[727,17248,17249],{"class":729,"line":730},[727,17250,16798],{"class":2920},[727,17252,17253,17255,17257,17259,17261,17263],{"class":729,"line":498},[727,17254,2315],{"class":1986},[727,17256,16805],{"class":1882},[727,17258,2321],{"class":1986},[727,17260,16810],{"class":737},[727,17262,9444],{"class":768},[727,17264,17265],{"class":2920},"\u002F\u002F Add base ID\n",[727,17267,17268,17270,17272,17274,17276,17278],{"class":729,"line":495},[727,17269,2315],{"class":1986},[727,17271,16822],{"class":1882},[727,17273,2321],{"class":1986},[727,17275,16827],{"class":737},[727,17277,9444],{"class":768},[727,17279,16832],{"class":2920},[727,17281,17282,17284,17286,17288,17290,17292],{"class":729,"line":1895},[727,17283,2315],{"class":1986},[727,17285,16839],{"class":1882},[727,17287,2321],{"class":1986},[727,17289,16844],{"class":737},[727,17291,9444],{"class":768},[727,17293,16849],{"class":2920},[727,17295,17296,17298,17300,17302,17304,17306,17308,17310,17312],{"class":729,"line":1901},[727,17297,2315],{"class":1986},[727,17299,16856],{"class":1882},[727,17301,2321],{"class":1986},[727,17303,16861],{"class":737},[727,17305,16864],{"class":768},[727,17307,2764],{"class":737},[727,17309,16869],{"class":768},[727,17311,2448],{"class":737},[727,17313,2327],{"class":768},[727,17315,17316],{"class":729,"line":1973},[727,17317,1898],{"emptyLinePlaceholder":522},[727,17319,17320],{"class":729,"line":2052},[727,17321,17322],{"class":2920},"\u002F\u002F Replace the token used in this variable\n",[727,17324,17325,17327,17330,17332,17335,17338],{"class":729,"line":2058},[727,17326,2315],{"class":1986},[727,17328,17329],{"class":1882}," axiomData",[727,17331,2321],{"class":1986},[727,17333,17334],{"class":768}," [scrape",[727,17336,17337],{"class":1986},"-",[727,17339,17340],{"class":768},"data];\n",[727,17342,17343],{"class":729,"line":2064},[727,17344,1898],{"emptyLinePlaceholder":522},[727,17346,17347],{"class":729,"line":2087},[727,17348,16882],{"class":2920},[727,17350,17351,17353,17356,17358,17361,17363,17365,17367,17369,17371],{"class":729,"line":2140},[727,17352,2315],{"class":1986},[727,17354,17355],{"class":1882}," recordsToSend",[727,17357,2321],{"class":1986},[727,17359,17360],{"class":768}," axiomData.",[727,17362,3199],{"class":2376},[727,17364,5025],{"class":768},[727,17366,3204],{"class":733},[727,17368,5031],{"class":768},[727,17370,2388],{"class":1986},[727,17372,2391],{"class":768},[727,17374,17375,17378],{"class":729,"line":2154},[727,17376,17377],{"class":1986},"  return",[727,17379,2391],{"class":768},[727,17381,17382],{"class":729,"line":1529},[727,17383,17384],{"class":768},"    fields: {\n",[727,17386,17387,17390,17393,17396],{"class":729,"line":2178},[727,17388,17389],{"class":737},"      \"Customer Name\"",[727,17391,17392],{"class":768},": row[",[727,17394,17395],{"class":1882},"0",[727,17397,17398],{"class":768},"],\n",[727,17400,17401,17404,17406,17408],{"class":729,"line":2187},[727,17402,17403],{"class":737},"      \"Email Address\"",[727,17405,17392],{"class":768},[727,17407,165],{"class":1882},[727,17409,17398],{"class":768},[727,17411,17412,17415,17417,17419],{"class":729,"line":2533},[727,17413,17414],{"class":737},"      \"Phone Number\"",[727,17416,17392],{"class":768},[727,17418,8883],{"class":1882},[727,17420,17398],{"class":768},[727,17422,17423,17426,17428,17431],{"class":729,"line":2551},[727,17424,17425],{"class":737},"      \"Customer ID\"",[727,17427,17392],{"class":768},[727,17429,17430],{"class":1882},"3",[727,17432,17433],{"class":768},"]\n",[727,17435,17436],{"class":729,"line":2559},[727,17437,2633],{"class":768},[727,17439,17440],{"class":729,"line":2565},[727,17441,9571],{"class":768},[727,17443,17444],{"class":729,"line":2570},[727,17445,17446],{"class":768},"});\n",[727,17448,17449],{"class":729,"line":2591},[727,17450,1898],{"emptyLinePlaceholder":522},[727,17452,17453],{"class":729,"line":2603},[727,17454,17455],{"class":2920},"\u002F\u002F Send data to create multiple records in Airtable.\n",[727,17457,17458,17460,17462,17464,17466,17469],{"class":729,"line":2615},[727,17459,10151],{"class":1986},[727,17461,16982],{"class":1986},[727,17463,16985],{"class":2376},[727,17465,2542],{"class":768},[727,17467,17468],{"class":733},"records",[727,17470,16992],{"class":768},[727,17472,17473,17475],{"class":729,"line":2630},[727,17474,9641],{"class":1986},[727,17476,2391],{"class":768},[727,17478,17479,17481,17483,17485,17487,17489],{"class":729,"line":2636},[727,17480,17003],{"class":1986},[727,17482,2093],{"class":1882},[727,17484,2321],{"class":1986},[727,17486,2410],{"class":1986},[727,17488,2413],{"class":2376},[727,17490,17014],{"class":768},[727,17492,17493,17495,17497],{"class":729,"line":2642},[727,17494,17019],{"class":768},[727,17496,2424],{"class":737},[727,17498,2427],{"class":768},[727,17500,17501],{"class":729,"line":2647},[727,17502,17028],{"class":768},[727,17504,17505,17507,17509,17511,17513,17515],{"class":729,"line":4657},[727,17506,17033],{"class":737},[727,17508,1995],{"class":768},[727,17510,17038],{"class":737},[727,17512,17041],{"class":768},[727,17514,2448],{"class":737},[727,17516,2427],{"class":768},[727,17518,17519,17521,17523],{"class":729,"line":4662},[727,17520,17050],{"class":737},[727,17522,1995],{"class":768},[727,17524,17055],{"class":737},[727,17526,17527],{"class":729,"line":1316},[727,17528,17060],{"class":768},[727,17530,17531,17533,17535,17537,17539],{"class":729,"line":4671},[727,17532,17065],{"class":768},[727,17534,9620],{"class":1882},[727,17536,44],{"class":768},[727,17538,9625],{"class":2376},[727,17540,2479],{"class":768},[727,17542,17543,17546],{"class":729,"line":4676},[727,17544,17545],{"class":768},"        records: records ",[727,17547,17548],{"class":2920},"\u002F\u002F Send multiple records in one request\n",[727,17550,17551],{"class":729,"line":4681},[727,17552,17553],{"class":768},"      })\n",[727,17555,17556],{"class":729,"line":4686},[727,17557,17079],{"class":768},[727,17559,17560],{"class":729,"line":4691},[727,17561,1898],{"emptyLinePlaceholder":522},[727,17563,17564,17566],{"class":729,"line":4696},[727,17565,17088],{"class":1986},[727,17567,17091],{"class":768},[727,17569,17570,17572,17574,17576,17578,17580,17582],{"class":729,"line":4702},[727,17571,17096],{"class":1986},[727,17573,17099],{"class":1882},[727,17575,2321],{"class":1986},[727,17577,2410],{"class":1986},[727,17579,2582],{"class":768},[727,17581,2585],{"class":2376},[727,17583,2588],{"class":768},[727,17585,17586,17588,17590,17592,17595],{"class":729,"line":4708},[727,17587,17114],{"class":768},[727,17589,2597],{"class":2376},[727,17591,2542],{"class":768},[727,17593,17594],{"class":737},"'Records added successfully:'",[727,17596,17124],{"class":768},[727,17598,17599,17601,17603],{"class":729,"line":4714},[727,17600,2606],{"class":768},[727,17602,17131],{"class":1986},[727,17604,2391],{"class":768},[727,17606,17607,17609,17611,17613,17616],{"class":729,"line":4719},[727,17608,17114],{"class":768},[727,17610,2539],{"class":2376},[727,17612,2542],{"class":768},[727,17614,17615],{"class":737},"'Error adding records:'",[727,17617,17147],{"class":768},[727,17619,17620],{"class":729,"line":4724},[727,17621,2633],{"class":768},[727,17623,17624,17626,17628],{"class":729,"line":4729},[727,17625,9682],{"class":768},[727,17627,2609],{"class":1986},[727,17629,2612],{"class":768},[727,17631,17632,17634,17636,17638,17640],{"class":729,"line":4734},[727,17633,17164],{"class":768},[727,17635,2539],{"class":2376},[727,17637,2542],{"class":768},[727,17639,17171],{"class":737},[727,17641,2627],{"class":768},[727,17643,17644],{"class":729,"line":4739},[727,17645,9712],{"class":768},[727,17647,17648],{"class":729,"line":4744},[727,17649,2639],{"class":768},[727,17651,17652],{"class":729,"line":4749},[727,17653,1898],{"emptyLinePlaceholder":522},[727,17655,17656],{"class":729,"line":4754},[727,17657,17658],{"class":2920},"\u002F\u002F Call the function to send the records to Airtable\n",[727,17660,17661,17663],{"class":729,"line":1753},[727,17662,17195],{"class":2376},[727,17664,17665],{"class":768},"(recordsToSend);\n",[639,17667,17669],{"id":17668},"create-multiple-records-more-than-10","Create multiple records (more than 10)",[11,17671],{},[14,17673,17674],{},"To get around Airtable's API limit of 10 records per API call, you can batch your requests. Let's review how we can do this.",[77,17676,17677],{},[555,17678,17679,17689,17694],{},[83,17680,17681,224,17683,2004,17685,16767,17687,16770],{},[29,17682,16760],{},[29,17684,16763],{},[29,17686,16766],{},[29,17688,16667],{},[83,17690,17691,17693],{},[29,17692,17233],{},": Remove example token and insert your own.",[83,17695,17696,17699],{},[29,17697,17698],{},"Fields",": Edit the fields in \"recordsToSend\", to match your table.",[719,17701,17703],{"className":756,"code":17702,"language":758,"meta":494,"style":494},"\u002F\u002F Airtable API endpoint URL\nconst AirtableBaseId = '*******'; \u002F\u002F Add Base ID \nconst AirtableTableName = '************'; \u002F\u002F Add Table Name \nconst AirtableAccessToken = '**********'; \u002F\u002F Add Personal Access Token\nconst AirtableUrl = `https:\u002F\u002Fapi.Airtable.com\u002Fv0\u002F${AirtableBaseId}\u002F${AirtableTableName}`;\n\n\u002F\u002F Replace the token used in this variable\nconst axiomData = [scrape-data];\n\n\u002F\u002F Data you want to send (adjust according to your Airtable fields)\nconst recordsToSend = axiomData.map((row) => {\n  return {\n    fields: {\n      \"Customer Name\": row[0],\n      \"Email Address\": row[1],\n      \"Phone Number\": row[2],\n      \"Customer ID\": row[3]\n    }\n  };\n});\n\n\u002F\u002F Send data to create multiple records in Airtable.\nasync function sendToAirtable(records) {\n  try {\n    const response = await fetch(AirtableUrl, {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${AirtableAccessToken}`,\n        'Content-Type': 'application\u002Fjson'\n      },\n      body: JSON.stringify({ records }) \n    });\n\n    if (response.ok) {\n      const jsonResponse = await response.json();\n      console.log('Records added successfully:', jsonResponse);\n    } else {\n      console.error('Error adding records:', response.statusText);\n    }\n  } catch (error) {\n    console.error('Error with request:', error);\n  }\n}\n\n\u002F\u002F Function to batch and send records in chunks of 10\nasync function sendInBatches(records, batchSize = 10) {\n  for (let i = 0; i \u003C records.length; i += batchSize) {\n    const batch = records.slice(i, i + batchSize); \u002F\u002F Get a batch of up to 10 records\n    console.log(`Sending batch ${Math.floor(i \u002F batchSize) + 1}`);\n    await sendToAirtable(batch); \u002F\u002F Send the batch to Airtable\n  }\n}\n\n\u002F\u002F Call the function to send the records to Airtable in batches\nsendInBatches(recordsToSend);\n",[90,17704,17705,17709,17723,17738,17753,17773,17777,17781,17795,17799,17803,17825,17831,17835,17845,17855,17865,17875,17879,17883,17887,17891,17895,17909,17915,17929,17937,17941,17955,17963,17967,17980,17984,17988,17994,18010,18022,18030,18042,18046,18054,18066,18070,18074,18078,18083,18108,18145,18170,18211,18223,18227,18231,18235,18240],{"__ignoreMap":494},[727,17706,17707],{"class":729,"line":730},[727,17708,16798],{"class":2920},[727,17710,17711,17713,17715,17717,17719,17721],{"class":729,"line":498},[727,17712,2315],{"class":1986},[727,17714,16805],{"class":1882},[727,17716,2321],{"class":1986},[727,17718,16810],{"class":737},[727,17720,9444],{"class":768},[727,17722,16815],{"class":2920},[727,17724,17725,17727,17729,17731,17733,17735],{"class":729,"line":495},[727,17726,2315],{"class":1986},[727,17728,16822],{"class":1882},[727,17730,2321],{"class":1986},[727,17732,16827],{"class":737},[727,17734,9444],{"class":768},[727,17736,17737],{"class":2920},"\u002F\u002F Add Table Name \n",[727,17739,17740,17742,17744,17746,17748,17750],{"class":729,"line":1895},[727,17741,2315],{"class":1986},[727,17743,16839],{"class":1882},[727,17745,2321],{"class":1986},[727,17747,16844],{"class":737},[727,17749,9444],{"class":768},[727,17751,17752],{"class":2920},"\u002F\u002F Add Personal Access Token\n",[727,17754,17755,17757,17759,17761,17763,17765,17767,17769,17771],{"class":729,"line":1901},[727,17756,2315],{"class":1986},[727,17758,16856],{"class":1882},[727,17760,2321],{"class":1986},[727,17762,16861],{"class":737},[727,17764,16864],{"class":768},[727,17766,2764],{"class":737},[727,17768,16869],{"class":768},[727,17770,2448],{"class":737},[727,17772,2327],{"class":768},[727,17774,17775],{"class":729,"line":1973},[727,17776,1898],{"emptyLinePlaceholder":522},[727,17778,17779],{"class":729,"line":2052},[727,17780,17322],{"class":2920},[727,17782,17783,17785,17787,17789,17791,17793],{"class":729,"line":2058},[727,17784,2315],{"class":1986},[727,17786,17329],{"class":1882},[727,17788,2321],{"class":1986},[727,17790,17334],{"class":768},[727,17792,17337],{"class":1986},[727,17794,17340],{"class":768},[727,17796,17797],{"class":729,"line":2064},[727,17798,1898],{"emptyLinePlaceholder":522},[727,17800,17801],{"class":729,"line":2087},[727,17802,16882],{"class":2920},[727,17804,17805,17807,17809,17811,17813,17815,17817,17819,17821,17823],{"class":729,"line":2140},[727,17806,2315],{"class":1986},[727,17808,17355],{"class":1882},[727,17810,2321],{"class":1986},[727,17812,17360],{"class":768},[727,17814,3199],{"class":2376},[727,17816,5025],{"class":768},[727,17818,3204],{"class":733},[727,17820,5031],{"class":768},[727,17822,2388],{"class":1986},[727,17824,2391],{"class":768},[727,17826,17827,17829],{"class":729,"line":2154},[727,17828,17377],{"class":1986},[727,17830,2391],{"class":768},[727,17832,17833],{"class":729,"line":1529},[727,17834,17384],{"class":768},[727,17836,17837,17839,17841,17843],{"class":729,"line":2178},[727,17838,17389],{"class":737},[727,17840,17392],{"class":768},[727,17842,17395],{"class":1882},[727,17844,17398],{"class":768},[727,17846,17847,17849,17851,17853],{"class":729,"line":2187},[727,17848,17403],{"class":737},[727,17850,17392],{"class":768},[727,17852,165],{"class":1882},[727,17854,17398],{"class":768},[727,17856,17857,17859,17861,17863],{"class":729,"line":2533},[727,17858,17414],{"class":737},[727,17860,17392],{"class":768},[727,17862,8883],{"class":1882},[727,17864,17398],{"class":768},[727,17866,17867,17869,17871,17873],{"class":729,"line":2551},[727,17868,17425],{"class":737},[727,17870,17392],{"class":768},[727,17872,17430],{"class":1882},[727,17874,17433],{"class":768},[727,17876,17877],{"class":729,"line":2559},[727,17878,2633],{"class":768},[727,17880,17881],{"class":729,"line":2565},[727,17882,9571],{"class":768},[727,17884,17885],{"class":729,"line":2570},[727,17886,17446],{"class":768},[727,17888,17889],{"class":729,"line":2591},[727,17890,1898],{"emptyLinePlaceholder":522},[727,17892,17893],{"class":729,"line":2603},[727,17894,17455],{"class":2920},[727,17896,17897,17899,17901,17903,17905,17907],{"class":729,"line":2615},[727,17898,10151],{"class":1986},[727,17900,16982],{"class":1986},[727,17902,16985],{"class":2376},[727,17904,2542],{"class":768},[727,17906,17468],{"class":733},[727,17908,16992],{"class":768},[727,17910,17911,17913],{"class":729,"line":2630},[727,17912,9641],{"class":1986},[727,17914,2391],{"class":768},[727,17916,17917,17919,17921,17923,17925,17927],{"class":729,"line":2636},[727,17918,17003],{"class":1986},[727,17920,2093],{"class":1882},[727,17922,2321],{"class":1986},[727,17924,2410],{"class":1986},[727,17926,2413],{"class":2376},[727,17928,17014],{"class":768},[727,17930,17931,17933,17935],{"class":729,"line":2642},[727,17932,17019],{"class":768},[727,17934,2424],{"class":737},[727,17936,2427],{"class":768},[727,17938,17939],{"class":729,"line":2647},[727,17940,17028],{"class":768},[727,17942,17943,17945,17947,17949,17951,17953],{"class":729,"line":4657},[727,17944,17033],{"class":737},[727,17946,1995],{"class":768},[727,17948,17038],{"class":737},[727,17950,17041],{"class":768},[727,17952,2448],{"class":737},[727,17954,2427],{"class":768},[727,17956,17957,17959,17961],{"class":729,"line":4662},[727,17958,17050],{"class":737},[727,17960,1995],{"class":768},[727,17962,17055],{"class":737},[727,17964,17965],{"class":729,"line":1316},[727,17966,17060],{"class":768},[727,17968,17969,17971,17973,17975,17977],{"class":729,"line":4671},[727,17970,17065],{"class":768},[727,17972,9620],{"class":1882},[727,17974,44],{"class":768},[727,17976,9625],{"class":2376},[727,17978,17979],{"class":768},"({ records }) \n",[727,17981,17982],{"class":729,"line":4676},[727,17983,17079],{"class":768},[727,17985,17986],{"class":729,"line":4681},[727,17987,1898],{"emptyLinePlaceholder":522},[727,17989,17990,17992],{"class":729,"line":4686},[727,17991,17088],{"class":1986},[727,17993,17091],{"class":768},[727,17995,17996,17998,18000,18002,18004,18006,18008],{"class":729,"line":4691},[727,17997,17096],{"class":1986},[727,17999,17099],{"class":1882},[727,18001,2321],{"class":1986},[727,18003,2410],{"class":1986},[727,18005,2582],{"class":768},[727,18007,2585],{"class":2376},[727,18009,2588],{"class":768},[727,18011,18012,18014,18016,18018,18020],{"class":729,"line":4696},[727,18013,17114],{"class":768},[727,18015,2597],{"class":2376},[727,18017,2542],{"class":768},[727,18019,17594],{"class":737},[727,18021,17124],{"class":768},[727,18023,18024,18026,18028],{"class":729,"line":4702},[727,18025,2606],{"class":768},[727,18027,17131],{"class":1986},[727,18029,2391],{"class":768},[727,18031,18032,18034,18036,18038,18040],{"class":729,"line":4708},[727,18033,17114],{"class":768},[727,18035,2539],{"class":2376},[727,18037,2542],{"class":768},[727,18039,17615],{"class":737},[727,18041,17147],{"class":768},[727,18043,18044],{"class":729,"line":4714},[727,18045,2633],{"class":768},[727,18047,18048,18050,18052],{"class":729,"line":4719},[727,18049,9682],{"class":768},[727,18051,2609],{"class":1986},[727,18053,2612],{"class":768},[727,18055,18056,18058,18060,18062,18064],{"class":729,"line":4724},[727,18057,17164],{"class":768},[727,18059,2539],{"class":2376},[727,18061,2542],{"class":768},[727,18063,17171],{"class":737},[727,18065,2627],{"class":768},[727,18067,18068],{"class":729,"line":4729},[727,18069,9712],{"class":768},[727,18071,18072],{"class":729,"line":4734},[727,18073,2639],{"class":768},[727,18075,18076],{"class":729,"line":4739},[727,18077,1898],{"emptyLinePlaceholder":522},[727,18079,18080],{"class":729,"line":4744},[727,18081,18082],{"class":2920},"\u002F\u002F Function to batch and send records in chunks of 10\n",[727,18084,18085,18087,18089,18092,18094,18096,18098,18101,18103,18106],{"class":729,"line":4749},[727,18086,10151],{"class":1986},[727,18088,16982],{"class":1986},[727,18090,18091],{"class":2376}," sendInBatches",[727,18093,2542],{"class":768},[727,18095,17468],{"class":733},[727,18097,2004],{"class":768},[727,18099,18100],{"class":733},"batchSize",[727,18102,2321],{"class":1986},[727,18104,18105],{"class":1882}," 10",[727,18107,16992],{"class":768},[727,18109,18110,18113,18115,18117,18120,18122,18125,18128,18131,18134,18137,18139,18142],{"class":729,"line":4754},[727,18111,18112],{"class":1986},"  for",[727,18114,2524],{"class":768},[727,18116,12512],{"class":1986},[727,18118,18119],{"class":768}," i ",[727,18121,4970],{"class":1986},[727,18123,18124],{"class":1882}," 0",[727,18126,18127],{"class":768},"; i ",[727,18129,18130],{"class":1986},"\u003C",[727,18132,18133],{"class":768}," records.",[727,18135,18136],{"class":1882},"length",[727,18138,18127],{"class":768},[727,18140,18141],{"class":1986},"+=",[727,18143,18144],{"class":768}," batchSize) {\n",[727,18146,18147,18149,18152,18154,18156,18159,18162,18164,18167],{"class":729,"line":1753},[727,18148,17003],{"class":1986},[727,18150,18151],{"class":1882}," batch",[727,18153,2321],{"class":1986},[727,18155,18133],{"class":768},[727,18157,18158],{"class":2376},"slice",[727,18160,18161],{"class":768},"(i, i ",[727,18163,8486],{"class":1986},[727,18165,18166],{"class":768}," batchSize); ",[727,18168,18169],{"class":2920},"\u002F\u002F Get a batch of up to 10 records\n",[727,18171,18172,18174,18176,18178,18181,18184,18186,18189,18191,18194,18197,18200,18202,18204,18207,18209],{"class":729,"line":4763},[727,18173,17164],{"class":768},[727,18175,2597],{"class":2376},[727,18177,2542],{"class":768},[727,18179,18180],{"class":737},"`Sending batch ${",[727,18182,18183],{"class":768},"Math",[727,18185,44],{"class":737},[727,18187,18188],{"class":2376},"floor",[727,18190,2542],{"class":737},[727,18192,18193],{"class":768},"i",[727,18195,18196],{"class":1986}," \u002F",[727,18198,18199],{"class":768}," batchSize",[727,18201,5031],{"class":737},[727,18203,8486],{"class":1986},[727,18205,18206],{"class":1882}," 1",[727,18208,2448],{"class":737},[727,18210,5005],{"class":768},[727,18212,18213,18215,18217,18220],{"class":729,"line":4768},[727,18214,10163],{"class":1986},[727,18216,16985],{"class":2376},[727,18218,18219],{"class":768},"(batch); ",[727,18221,18222],{"class":2920},"\u002F\u002F Send the batch to Airtable\n",[727,18224,18225],{"class":729,"line":4773},[727,18226,9712],{"class":768},[727,18228,18229],{"class":729,"line":4778},[727,18230,2639],{"class":768},[727,18232,18233],{"class":729,"line":4783},[727,18234,1898],{"emptyLinePlaceholder":522},[727,18236,18237],{"class":729,"line":4788},[727,18238,18239],{"class":2920},"\u002F\u002F Call the function to send the records to Airtable in batches\n",[727,18241,18242,18245],{"class":729,"line":1048},[727,18243,18244],{"class":2376},"sendInBatches",[727,18246,17665],{"class":768},[21,18248,776],{"id":775},[14,18250,18251],{},"If you encounter problems, check the console log in the runtime browser to view the error message. It may also be worth checking that the credentials have been added correctly.",[555,18253,18254,18257,18260],{},[83,18255,18256],{},"Check for console logs in the runtime browser.",[83,18258,18259],{},"Ensure your credentials are correct.",[83,18261,18262],{},"Make sure all field names match exactly with your Airtable table.",[21,18264,796],{"id":795},[14,18266,18267],{},"You can easily send a single record from axiom.ai to Airtable using javascript and Airtable's rest api. Adjust the data format to match the fields in your Airtable table, and the bot will automatically push the collected data. To send multiple records, you will need a different format for the post request. Airtable also limits records being added to 10 rows only; to get around that, you can use the batching method found in the guide.",[811,18269,18270],{},"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 .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 .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":494,"searchDepth":495,"depth":495,"links":18272},[18273,18274,18280,18281],{"id":545,"depth":498,"text":546},{"id":16710,"depth":498,"text":16711,"children":18275},[18276,18277,18278,18279],{"id":16719,"depth":495,"text":16720},{"id":16734,"depth":495,"text":16735},{"id":17201,"depth":495,"text":17202},{"id":17668,"depth":495,"text":17669},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"Learn how to post scraped data to Airtable and create new records, using axiom.ai's write JavaScript step and webhooks.",{"type":513,"format":77,"intent_type":515,"intent":827,"tags":18284,"platfrom":18286,"video":18288},[829,830,18285],"intergration",[18287],"Airtable","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FM_OVeykbYro?rel=0&amp;",{"title":16580,"description":18282},"guides\u002Fpost-data-to-airtable","0XXXlDEEgXk3aSaUN6tndhALgeN-loYvo4xUMfvE5V4",{"id":18293,"title":18294,"body":18295,"date":523,"description":18476,"extension":506,"meta":18477,"navigation":522,"order":523,"path":18481,"seo":18482,"stem":18483,"__hash__":18484},"guides\u002Fguides\u002Fpost-data-to-make.md","How to trigger and post data to Make with an axiom.ai automation",{"type":8,"value":18296,"toc":18467},[18297,18299,18302,18309,18311,18313,18315,18335,18339,18342,18346,18368,18372,18391,18395,18402,18419,18423,18426,18429,18433,18440,18442,18448,18458,18462,18464],[11,18298],{},[14,18300,18301],{},"You can connect your browser automation to Make and pass data, including scraped data, to any of your scenarios. Connecting the browser to your API couldn’t be simpler. This guide will walk you through using axiom.ai's \"Trigger webhook\" step to post data to Make and setting up a scenario to receive the data.",[14,18303,18304,18305,12252],{},"This guide assumes you have a Make account and have created your axiom.ai automation. To learn more about our Make integration, see our ",[322,18306,18308],{"href":18307},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fmake","working with Make",[18,18310],{},[21,18312,546],{"id":545},[14,18314,551],{},[77,18316,18317],{},[555,18318,18319,18325,18329],{},[83,18320,18321,562,18323,44],{},[29,18322,561],{},[322,18324,566],{"href":565},[83,18326,18327,572],{},[29,18328,571],{},[83,18330,18331,578,18333,44],{},[29,18332,577],{},[90,18334,581],{},[21,18336,18338],{"id":18337},"trigger-and-send-data-to-make-with-an-axiomai-automation","Trigger and send data to Make with an axiom.ai automation",[14,18340,18341],{},"Open Make, and either edit or create a new scenario to get started, then follow the steps below.",[592,18343],{"src":18344,"alt":18345},"\u002Fdocs\u002Fguides\u002Fmake-find-webhooks.jpg","find the webhook app in Make",[77,18347,18348],{},[555,18349,18350,18356,18362],{},[83,18351,18352,18355],{},[29,18353,18354],{},"Log into Make",": Click on \"Scenarios\", and open an existing or create a new scenario.",[83,18357,18358,18361],{},[29,18359,18360],{},"If the App selector is open",": Click \"Webhooks\", or click the plus button to open the app selector.",[83,18363,18364,18367],{},[29,18365,18366],{},"\"Triggers\"",": Select \"Custom webhook\".",[592,18369],{"src":18370,"alt":18371},"\u002Fdocs\u002Fguides\u002Fmake-custom-webhook.jpg","select custom webhook in Make",[77,18373,18374],{},[555,18375,18376,18381,18386],{},[83,18377,18378,18380],{},[29,18379,8187],{},": Give your webhook a name or choose an existing one, then click \"Save\".",[83,18382,18383,18385],{},[29,18384,11394],{},": \"Copy my address\" to get the webhook endpoint to add into your browser automation.",[83,18387,18388,18390],{},[29,18389,3293],{},": Is now listening for the data and will determine the data structure automatically from the incoming data. It's time for a test run of the axiom.ai automation you created.",[592,18392],{"src":18393,"alt":18394},"\u002Fdocs\u002Fguides\u002Fmake-copy-webhook.jpg","Listening for data webhook in Make",[14,18396,18397,18398,18401],{},"Switching to axiom.ai, use the step finder to add the ",[322,18399,7722],{"href":18400},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Ftrigger-webhook"," step and configure it.",[77,18403,18404],{},[555,18405,18406,18411],{},[83,18407,18408,18410],{},[29,18409,577],{},": Paste the endpoint from Make into this field.",[83,18412,18413,18415,18416,18418],{},[29,18414,11394],{},":  \"Insert data\" and select ",[90,18417,198],{}," or any data you wish to send to Make.",[592,18420],{"src":18421,"alt":18422},"\u002Fdocs\u002Fguides\u002Faxiom-webhook-set-up.jpg","Configure the trigger webhook step and post scraped data to Make",[21,18424,12734],{"id":18425},"use-cases",[14,18427,18428],{},"Using Make with axiom.ai can unlock a lot of opportunities, let's drive into some use cases that you can use them for.",[639,18430,18432],{"id":18431},"post-data-to-excel","Post data to Excel",[14,18434,18435,18436,18439],{},"To send data to Excel, set up your automation and Make scenario as normal - follow the ",[322,18437,18338],{"href":18438},"#trigger-and-send-data-to-make-with-an-axiomai-automation"," instructions for more information. You can make use of the \"Microsoft 365 Excel\" integration in Make.com to pass your axiom.ai data to your Excel sheet.",[21,18441,776],{"id":775},[14,18443,18444,18445,18447],{},"Now click ",[29,18446,3850],{}," in axiom.ai and switch back to Make.",[77,18449,18450],{},[555,18451,18452,18455],{},[83,18453,18454],{},"Once the axiom.ai automation has run, check in Make for the message \"successfully determined\".",[83,18456,18457],{},"This means the data has been successfully sent.",[592,18459],{"src":18460,"alt":18461},"\u002Fdocs\u002Fguides\u002Fmake-successfuly-determined.jpg","Successfully determined data format in Make",[21,18463,796],{"id":795},[14,18465,18466],{},"Using axiom.ai and Make allows you to connect your browser to thousands of apps via API connections. With just three steps, you can set up a basic browser scraper to send data to Scenarios in Make within minutes. This setup can be easily adapted to more complex use cases.",{"title":494,"searchDepth":495,"depth":495,"links":18468},[18469,18470,18471,18474,18475],{"id":545,"depth":498,"text":546},{"id":18337,"depth":498,"text":18338},{"id":18425,"depth":498,"text":12734,"children":18472},[18473],{"id":18431,"depth":495,"text":18432},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"Learn how to post data from axiom.ai to Make using webhooks. Follow simple, step-by-step instructions to automate workflows and connect your APIs to the browser.",{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":827,"tags":18478,"platfrom":18479,"video":18480},[829,830,18285],[3293],"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FaGyCO50Gl3s?rel=0&amp;","\u002Fguides\u002Fpost-data-to-make",{"title":18294,"description":18476},"guides\u002Fpost-data-to-make","gO96h9fAt9NsVI7JB5KYTEbaoBRrPfLKCDw7RBwsiDs",{"id":18486,"title":18487,"body":18488,"date":523,"description":18762,"extension":506,"meta":18763,"navigation":522,"order":523,"path":18768,"seo":18769,"stem":18770,"__hash__":18771},"guides\u002Fguides\u002Fpost-on-threads.md","How to automate posting on Meta’s new text message app Threads",{"type":8,"value":18489,"toc":18757},[18490,18492,18503,18505,18508,18535,18537,18547,18747,18749],[11,18491],{},[14,18493,18494,18495,18499,18500,44],{},"Threads is an app for sharing short messages, developed by the Instagram team and owned by Meta. This guide shows how to build a bot that automates posting on Threads. The bot reads a message from a Google Sheet, opens Threads in a web browser, clicks \"Create Post\", enters the message, ",[322,18496,18498],{"href":18497},"\u002Fdocs\u002Ftutorials\u002Ffiles","uploads"," an image and posts it. This Threads automation takes only a few minutes to make using our ",[322,18501,18502],{"href":6181},"builder",[21,18504,11202],{"id":11201},[14,18506,18507],{},"Create a Google Sheet add some Post to the sheet. See example below.",[7092,18509,18510,18518],{},[7095,18511,18512],{},[7098,18513,18514,18516],{},[7101,18515,3548],{},[7101,18517,11216],{},[7108,18519,18520,18528],{},[7098,18521,18522,18525],{},[7113,18523,18524],{},"Axiom can automate Instagram",[7113,18526,18527],{},"\u002FUsers\u002Fthudercloudone\u002FDesktop\u002FScreenshot 2024-04-05 at 12.20.24.png",[7098,18529,18530,18533],{},[7113,18531,18532],{},"Axiom can automate anything in the browser",[7113,18534,18527],{},[21,18536,7133],{"id":7132},[14,18538,11245,18539,11250,18543,7142,18545,11256],{},[322,18540,3435],{"href":18541,"rel":18542},"https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Faxiom-browser-automation\u002Fcpgamigjcbffkaiciiepndmonbfdimbb?hl=en-GB",[2245],[29,18544,7141],{},[29,18546,11255],{},[77,18548,18549],{},[80,18550,18551,18579],{},[83,18552,18553,88,18555,18557],{},[29,18554,87],{},[90,18556,92],{},[80,18558,18559,18563,18567,18573],{},[83,18560,18561,16362],{},[90,18562,99],{},[83,18564,18565,7975],{},[90,18566,105],{},[83,18568,18569,162,18571,44],{},[90,18570,7182],{},[90,18572,7186],{},[83,18574,18575,162,18577,44],{},[90,18576,5267],{},[90,18578,7194],{},[83,18580,18581,88,18583,18585,18595],{},[29,18582,111],{},[90,18584,114],{},[80,18586,18587],{},[83,18588,18589,132,18591,136,18593,44],{},[90,18590,465],{},[90,18592,194],{},[90,18594,139],{},[80,18596,18597,18613,18644,18664,18692,18717],{},[83,18598,18599,88,18601,18604],{},[29,18600,121],{},[90,18602,18603],{},"Go to page: Threads",[80,18605,18606],{},[83,18607,18608,224,18610,44],{},[90,18609,131],{},[90,18611,18612],{},"https:\u002F\u002Fwww.threads.net",[83,18614,18615,88,18617,18620],{},[29,18616,145],{},[90,18618,18619],{},"Click element: Open post modal",[80,18621,18622,18635],{},[83,18623,18624,132,18626,18628,18629,18632,18633,44],{},[90,18625,155],{},[90,18627,155],{},", highlight the ",[90,18630,18631],{},"Post"," button and press ",[90,18634,3659],{},[83,18636,18637,162,18639,3652,18641,44],{},[90,18638,11394],{},[90,18640,15579],{},[90,18642,18643],{},"\"Use element text instead of HTML\"",[83,18645,18646,88,18648,18651],{},[29,18647,170],{},[90,18649,18650],{},"Enter text: Message",[80,18652,18653],{},[83,18654,18655,132,18657,18659,18660,15909,18662,44],{},[90,18656,953],{},[90,18658,194],{},", select column ",[90,18661,3548],{},[90,18663,139],{},[83,18665,18666,88,18668,18671],{},[29,18667,213],{},[90,18669,18670],{},"Upload a file: Add image",[80,18672,18673,18682],{},[83,18674,18675,132,18677,18679,18680,44],{},[90,18676,155],{},[90,18678,155],{},", highlight the image upload icon, click, then press ",[90,18681,3659],{},[83,18683,18684,132,18686,18659,18688,15909,18690,44],{},[90,18685,1189],{},[90,18687,194],{},[90,18689,11216],{},[90,18691,139],{},[83,18693,18694,88,18696,18698],{},[29,18695,241],{},[90,18697,9962],{},[80,18699,18700,18709],{},[83,18701,18702,132,18704,18628,18706,18708],{},[90,18703,155],{},[90,18705,155],{},[90,18707,18631],{}," button again and click.",[83,18710,18711,162,18713,3652,18715,44],{},[90,18712,11394],{},[90,18714,15579],{},[90,18716,18643],{},[83,18718,18719,88,18721,18723],{},[29,18720,278],{},[90,18722,281],{},[80,18724,18725,18730,18735,18741],{},[83,18726,18727,18729],{},[90,18728,99],{},": Search for and select the same Google Sheet.",[83,18731,18732,18734],{},[90,18733,105],{},": Choose the same tab or leave blank.",[83,18736,18737,162,18739,44],{},[90,18738,11490],{},[90,18740,165],{},[83,18742,18743,162,18745,44],{},[90,18744,11498],{},[90,18746,165],{},[21,18748,796],{"id":795},[14,18750,18751,18752,18756],{},"In just a few steps, anyone can create an automation that reads data from a Google Sheet, opens a webpage, and inputs a message into Meta's Threads app without writing any code. This template works on the desktop automation runner, We can swap the \"Upload a file\" step for the ",[322,18753,18755],{"href":18754},"\u002Fdocs\u002Ftutorials\u002Ffiles\u002Fupload-cloud","‘Upload a file from Google Drive’"," to run in the cloud.",{"title":494,"searchDepth":495,"depth":495,"links":18758},[18759,18760,18761],{"id":11201,"depth":498,"text":11202},{"id":7132,"depth":498,"text":7133},{"id":795,"depth":498,"text":796},"Learn how to automate sending posts on threads with this step by step guide for creating a browser bot.",{"type":513,"format":77,"intent_type":1049,"intent":1050,"tags":18764,"platfrom":18765},[1318,11532],[18766,18767],"Threads","Meta","\u002Fguides\u002Fpost-on-threads",{"title":18487,"description":18762},"guides\u002Fpost-on-threads","h95_A5cQ2vTqdpbD2T-NNzBJDndx4ucPTjtaIoeALPU",{"id":18773,"title":18774,"body":18775,"date":523,"description":19079,"extension":506,"meta":19080,"navigation":522,"order":523,"path":19085,"seo":19086,"stem":19087,"__hash__":19088},"guides\u002Fguides\u002Fpower-automate.md","How to trigger axiom.ai automations using Power Automate",{"type":8,"value":18776,"toc":19069},[18777,18779,18782,18785,18787,18789,18809,18813,18816,18820,18829,18850,18857,18899,18903,18907,18915,18945,18949,18978,18982,18989,19031,19035,19037,19040,19056,19059,19061,19064],[11,18778],{},[14,18780,18781],{},"Power Automate offers a powerful Windows experience to build out automations for your desktop applications. When paired with axiom.ai automations there is nothing that you can't automate in order to power up your workflows.",[14,18783,18784],{},"This guide assumes that you already have an automation set up, want to create a trigger using Power Automate, and have an axiom.ai plan that supports webhooks.",[21,18786,546],{"id":545},[14,18788,551],{},[77,18790,18791],{},[555,18792,18793,18799,18803],{},[83,18794,18795,562,18797,44],{},[29,18796,561],{},[322,18798,566],{"href":565},[83,18800,18801,572],{},[29,18802,571],{},[83,18804,18805,578,18807,44],{},[29,18806,577],{},[90,18808,581],{},[21,18810,18812],{"id":18811},"trigger-an-axiomai-automation-with-power-automate","Trigger an axiom.ai automation with Power Automate",[14,18814,18815],{},"Learn how to trigger your axiom.ai automations with Power Automate. The methods vary depending on if you are using desktop or web so be sure to select the right instructions before continuing.",[639,18817,18819],{"id":18818},"triggering-with-the-power-automate-desktop-app","Triggering with the Power Automate desktop app",[14,18821,18822,18823,18828],{},"You will first need to ensure you have installed ",[322,18824,18827],{"href":18825,"rel":18826},"https:\u002F\u002Fwww.microsoft.com\u002Fstore\u002FproductId\u002F9NFTCH6J7FHV?ocid=pdpshare",[2245],"Power Automate"," from the Microsoft Store.",[77,18830,18831],{},[555,18832,18833,18839,18844],{},[83,18834,18835,18838],{},[29,18836,18837],{},"New flow",": Open Power Automate, tap \"+ New flow\" to create a new flow.",[83,18840,18841,18843],{},[29,18842,620],{},": You can add any number of steps to your flow, or use an existing flow to trigger your axiom.ai automation.",[83,18845,18846,18849],{},[29,18847,18848],{},"Invoke web service",": Search for the \"invoke web service\" action, add this to your flow.",[14,18851,18852,18853,18856],{},"To configure the ",[807,18854,18855],{},"invoke web service"," action, you'll need to enable the following:",[77,18858,18859],{},[555,18860,18861,18867,18873,18880,18886,18893],{},[83,18862,18863,578,18865,44],{},[29,18864,3922],{},[90,18866,581],{},[83,18868,18869,162,18871,44],{},[29,18870,12234],{},[90,18872,627],{},[83,18874,18875,162,18878,44],{},[29,18876,18877],{},"Accept",[90,18879,8859],{},[83,18881,18882,162,18884,44],{},[29,18883,12241],{},[90,18885,8859],{},[83,18887,18888,18890,18891,12252],{},[29,18889,632],{},": This should be set to the per our ",[322,18892,12251],{"href":6720},[83,18894,18895,18898],{},[29,18896,18897],{},"Encode request body",": This should be disabled.",[592,18900],{"src":18901,"alt":18902},"\u002Fdocs\u002Fguides\u002Fpower-automate-trigger-desktop.png","set up invoke web service action in power automate",[639,18904,18906],{"id":18905},"triggering-with-the-power-automate-web-app","Triggering with the Power Automate web app",[14,18908,18909,18910,18914],{},"You can access ",[322,18911,18827],{"href":18912,"rel":18913},"https:\u002F\u002Fmake.powerautomate.com\u002F",[2245]," on the web. This requires a paid subscription with Power Automate.",[77,18916,18917],{},[555,18918,18919,18929,18935],{},[83,18920,18921,18924,18925,18928],{},[29,18922,18923],{},"Create a new flow",": Open ",[322,18926,18827],{"href":18912,"rel":18927},[2245]," on the web, create a new \"instant-\" or \"scheduled cloud flow\".",[83,18930,18931,18934],{},[29,18932,18933],{},"Select trigger",": Set to your desired trigger: this guide will focus on the \"manually trigger a flow\" option.",[83,18936,18937,18940,18941,18944],{},[29,18938,18939],{},"Add HTTP action",": Click \"new step\" and search for the ",[807,18942,18943],{},"HTTP"," action.",[14,18946,18852,18947,18856],{},[807,18948,18943],{},[77,18950,18951],{},[555,18952,18953,18959,18965,18972],{},[83,18954,18955,578,18957,44],{},[29,18956,3922],{},[90,18958,581],{},[83,18960,18961,162,18963,44],{},[29,18962,12234],{},[90,18964,627],{},[83,18966,18967,162,18969,44],{},[29,18968,14599],{},[90,18970,18971],{},"Content-Type: application\u002Fjson",[83,18973,18974,18890,18976,12252],{},[29,18975,632],{},[322,18977,12251],{"href":6720},[21,18979,18981],{"id":18980},"trigger-a-power-automate-flow-with-an-axiomai-automation","Trigger a Power Automate flow with an axiom.ai automation",[14,18983,18984,18985,18988],{},"This guide is only applicable to ",[322,18986,18827],{"href":18912,"rel":18987},[2245]," on the web. Power Automate's desktop app currently does not support triggers via webhook.",[77,18990,18991],{},[555,18992,18993,19000,19005,19014,19020,19026],{},[83,18994,18995,18924,18997,18928],{},[29,18996,18923],{},[322,18998,18827],{"href":18912,"rel":18999},[2245],[83,19001,19002,19004],{},[29,19003,18933],{},": Set your trigger to \"when a HTTP request is received\".",[83,19006,19007,19009,19010,19013],{},[29,19008,620],{},": Set the \"when a HTTP request is received\" action to allow for triggering from \"anyone\". ",[807,19011,19012],{},"Note: consider your organisations security needs before enabling this",". Optionally, you can set a \"request body JSON schema\".",[83,19015,19016,19019],{},[29,19017,19018],{},"Save & get URL",": Save your flow to generate the webhook URL, save this for later: this will be unique for your flow.",[83,19021,19022,19025],{},[29,19023,19024],{},"Open your axiom.ai automation",": Head back into axiom.ai and open the automation you'd like to use to trigger your Power Automate flow from.",[83,19027,19028,19030],{},[29,19029,12302],{},": Add a \"trigger a webhook\" step to your automation, using the webhook URL provided by Power Automate. You can also send a payload based on the payload schema set up in Power Automate.",[592,19032],{"src":19033,"alt":19034},"\u002Fdocs\u002Fguides\u002Fpower-automate-trigger-a-webhook.jpg","set up trigger a wehook step in axiom.ai",[21,19036,776],{"id":775},[14,19038,19039],{},"Now that you've built out your entire workflow, you can test it!",[77,19041,19042],{},[555,19043,19044,19050],{},[83,19045,19046,19049],{},[29,19047,19048],{},"Trigger axiom.ai automation",": Open the Power Automate flow you have created to trigger your automation. Hit \"Run\".",[83,19051,19052,19055],{},[29,19053,19054],{},"Open axiom.ai",": Head into your axiom.ai extension - you may already see that your automation is running. If this has completed, you'll find the run report in the \"run reports\" section of the dashboard.",[14,19057,19058],{},"If you find that the automation has not run, and is not present in the \"run reports\", this would mean that the automation has failed to start. Review your Power Automation flow for any error messages that may have been raised.",[21,19060,796],{"id":795},[14,19062,19063],{},"Being able to trigger axiom.ai automations with Power Automate flows, and being able to trigger Power Automate flows with axiom.ai automations, offers a huge range of possiblilities for organisations to power up their workflows.",[14,19065,19066],{},[807,19067,19068],{},"Information valid as of 22nd October 2024..",{"title":494,"searchDepth":495,"depth":495,"links":19070},[19071,19072,19076,19077,19078],{"id":545,"depth":498,"text":546},{"id":18811,"depth":498,"text":18812,"children":19073},[19074,19075],{"id":18818,"depth":495,"text":18819},{"id":18905,"depth":495,"text":18906},{"id":18980,"depth":498,"text":18981},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"Use Power Automate to trigger your axiom.ai automations and use axiom.ai automations to trigger your flows.",{"type":513,"format":77,"intent_type":515,"intent":827,"tags":19081,"platfrom":19082},[829,830,18285],[19083,19084],"power automate","microsoft","\u002Fguides\u002Fpower-automate",{"title":18774,"description":19079},"guides\u002Fpower-automate","QNsoS6BeB0dqhrICsXZWn0mm4ZpjhILTcIgP61Pup0c",{"id":19090,"title":19091,"body":19092,"date":19372,"description":19373,"extension":506,"meta":19374,"navigation":522,"order":523,"path":19380,"seo":19381,"stem":19382,"__hash__":19383},"guides\u002Fguides\u002Fsales-navigator-connect.md","How to automate your lead connections on LinkedIn Sales Navigator",{"type":8,"value":19093,"toc":19365},[19094,19096,19110,19112,19114,19116,19120,19125,19130,19132,19136,19234,19238,19245,19247,19251,19361],[11,19095],{},[14,19097,14789,19098,19101,19102,19105,19106,19109],{},[29,19099,19100],{},"Saved list of leads",", extracting their profile links and names. It then opens each profile link in Chrome, clicks on the menu option, clicks  ",[29,19103,19104],{},"Connect"," and enters a customized message for each lead using their name. Finally, it clicks  ",[29,19107,19108],{},"Send invitation",". This process ensures that a personalized message is sent iteratively to each lead when connecting.",[18,19111],{},[21,19113,14799],{"id":14798},[14,19115,14802],{},[21,19117,19119],{"id":19118},"install-the-sales-navigator-messenger-connection-bot","Install the Sales Navigator Messenger Connection bot",[14,19121,14809,19122,14813],{},[29,19123,19124],{},"Install Chrome Extension",[14,19126,62,19127,44],{},[29,19128,19129],{},"Start",[14,19131,68],{},[21,19133,19135],{"id":19134},"configure-your-sales-navigator-messenger-connection-steps","Configure your Sales Navigator Messenger Connection steps",[77,19137,19138,19232],{},[80,19139,19140,19158],{},[83,19141,19142,88,19144,19146],{},[29,19143,87],{},[90,19145,13474],{},[80,19147,19148,19153],{},[83,19149,19150,19152],{},[90,19151,3922],{},": Paste your \"Saved list of leads\" URL.",[83,19154,19155,19157],{},[90,19156,161],{},": Set how many leads to connect and message.",[83,19159,19160,88,19162,19164],{},[29,19161,111],{},[90,19163,114],{},[80,19165,19166,19174,19182,19190,19197,19205,19218,19225],{},[83,19167,19168,88,19170,19173],{},[29,19169,121],{},[90,19171,19172],{},"Go to page^",": Navigates to each lead’s profile.",[83,19175,19176,88,19178,19181],{},[29,19177,145],{},[90,19179,19180],{},"Split name into columns^",": Extracts first name.",[83,19183,19184,88,19186,19189],{},[29,19185,170],{},[90,19187,19188],{},"Click Element^",": Clicks menu button.",[83,19191,19192,88,19194,19196],{},[29,19193,213],{},[90,19195,19188],{},": Clicks \"Connect\" button.",[83,19198,19199,88,19201,19204],{},[29,19200,241],{},[90,19202,19203],{},"Wait^",": Pauses before next step.",[83,19206,19207,88,19209,19211],{},[29,19208,278],{},[90,19210,6426],{},[80,19212,19213],{},[83,19214,19215,19217],{},[90,19216,953],{},": Enter the message to send.",[83,19219,19220,88,19222,19224],{},[29,19221,1203],{},[90,19223,19188],{},": Clicks \"Send invitation\" button.",[83,19226,19227,88,19229,19231],{},[29,19228,13038],{},[90,19230,19203],{},": Waits for the request to be sent.",[14,19233,983],{},[21,19235,19237],{"id":19236},"run-your-sales-navigator-messenger-connection-bot","Run your Sales Navigator Messenger Connection bot",[14,19239,19240,19241,19244],{},"To test the Sales Navigator Messenger Connection bot, disable ",[90,19242,19243],{},"Step 2.8: Press Key(s)"," to prevent sending messages.",[21,19246,330],{"id":329},[14,19248,1009,19249,44],{},[322,19250,994],{"href":993},[77,19252,19253],{},[80,19254,19255,19264,19279,19290,19303,19317,19330,19341,19348],{},[83,19256,19257,19259,19261,19262,1230],{},[29,19258,10365],{},[344,19260],{},"\nEnsure you have set filters in Apollo, then copy the full filtered search URL into the ",[90,19263,124],{},[83,19265,19266,19269,12861,19271,19273,19274,10385,19276,44],{},[29,19267,19268],{},"Select button not working?",[344,19270],{},[90,19272,3639],{}," step, use the custom selector ",[90,19275,10384],{},[322,19277,19278],{"href":380},"Learn more",[83,19280,19281,19284,19286,19287,19289],{},[29,19282,19283],{},"'Select this page' not clicked?",[344,19285],{},"\nUse the ",[90,19288,10403],{}," option in the selector tool to target \"Select this page\".",[83,19291,19292,19295,19297,19298,19300,19301,44],{},[29,19293,19294],{},"Save People button not working?",[344,19296],{},"\nReselect the 'Save' button in the ",[90,19299,3639],{}," step or try using ",[90,19302,10403],{},[83,19304,19305,19307,19309,19310,19312,19313,10385,19315,44],{},[29,19306,10422],{},[344,19308],{},"\nUse this custom selector in the ",[90,19311,3639],{}," step: ",[90,19314,10431],{},[322,19316,19278],{"href":10402},[83,19318,19319,19322,19324,19325,19327,19328,1230],{},[29,19320,19321],{},"Save keystroke not working?",[344,19323],{},"\nRe-record the ",[90,19326,10445],{}," keystroke in the ",[90,19329,5346],{},[83,19331,19332,19335,19337,19338,19340],{},[29,19333,19334],{},"Save happens too fast?",[344,19336],{},"\nIncrease the wait time in the ",[90,19339,2695],{}," step to ensure save completes.",[83,19342,19343,19345,19347],{},[29,19344,10462],{},[344,19346],{},"\nReselect the \"Next\" button at the bottom of the table.",[83,19349,19350,19353,19355,19356,19358,19359,44],{},[29,19351,19352],{},"Jump goes to the wrong step?",[344,19354],{},"\nSet the ",[90,19357,5619],{}," to return to ",[90,19360,908],{},[14,19362,483,19363],{},[322,19364,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":19366},[19367,19368,19369,19370,19371],{"id":14798,"depth":498,"text":14799},{"id":19118,"depth":498,"text":19119},{"id":19134,"depth":498,"text":19135},{"id":19236,"depth":498,"text":19237},{"id":329,"depth":498,"text":330},"2024-01-07","Learn how to automate LinkedIn Sales Navigator lead connections and personalized messaging using axiom.ai. This guide covers scraping leads, configuring connection steps, and sending custom messages at scale.",{"read":1527,"level":510,"video":19375,"templateId":2565,"type":513,"format":514,"intent_type":1049,"intent":1050,"tags":19376,"platfrom":19378},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FOK6te1y9biM",[11532,19377,1053,1054],"connect",[15072,19379],"Sale Navigator","\u002Fguides\u002Fsales-navigator-connect",{"title":19091,"description":19373},"guides\u002Fsales-navigator-connect","mgHNdbRiUVSON9pSGTXlf-OscbCyDHS8q0WoGSdy_0I",{"id":19385,"title":19386,"body":19387,"date":19685,"description":19686,"extension":506,"meta":19687,"navigation":522,"order":523,"path":19692,"seo":19693,"stem":19694,"__hash__":19695},"guides\u002Fguides\u002Fscrape-amazon.md","How to Scrape Amazon for Product Data (Fast and Easy)",{"type":8,"value":19388,"toc":19677},[19389,19391,19394,19396,19398,19407,19411,19418,19422,19424,19428,19563,19567,19569,19571,19575,19577,19579,19655],[11,19390],{},[14,19392,19393],{},"This Amazon scraper template pulls data from Amazon to a Google Sheet. It cycles through Amazon product links in the sheet, extracts data, and updates the sheet. After processing, it deletes each link. Configurartion takes minutes.",[18,19395],{},[21,19397,24],{"id":23},[14,19399,27,19400,19402,19403,19406],{},[29,19401,31],{},", presuming you already have an account. Name your sheet something like ",[29,19404,19405],{},"\"Amazon Scraper\""," and set up a tab called 'Amazon product links\"**. Add another tab called 'Data'.",[21,19408,19410],{"id":19409},"install-the-amazon-scraper","Install the Amazon Scraper",[14,19412,19413,19414,55,19416,59],{},"To install this Amazon scraper click ",[29,19415,54],{},[29,19417,58],{},[14,19419,62,19420,44],{},[29,19421,65],{},[14,19423,68],{},[21,19425,19427],{"id":19426},"configure-your-amazon-scraper-in-minutes","Configure your Amazon scraper in minutes",[77,19429,19430],{},[80,19431,19432,19450],{},[83,19433,19434,88,19436,19438],{},[29,19435,349],{},[90,19437,92],{},[80,19439,19440,19444],{},[83,19441,19442,100],{},[90,19443,99],{},[83,19445,19446,5910,19448,44],{},[90,19447,105],{},[90,19449,5913],{},[83,19451,19452,88,19454,19456],{},[29,19453,908],{},[90,19455,114],{},[80,19457,19458,19474,19485,19507,19535],{},[83,19459,19460,88,19462,19464],{},[29,19461,917],{},[90,19463,124],{},[80,19465,19466],{},[83,19467,19468,132,19470,136,19472,5936],{},[90,19469,131],{},[90,19471,135],{},[90,19473,139],{},[83,19475,19476,88,19478,19480],{},[29,19477,935],{},[90,19479,13520],{},[80,19481,19482],{},[83,19483,19484],{},"No change required.",[83,19486,19487,88,19489,19491],{},[29,19488,943],{},[90,19490,148],{},[80,19492,19493,19502],{},[83,19494,19495,1995,19497,19501],{},[90,19496,155],{},[322,19498,19500],{"href":19499},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fmulti","Point and click"," to select the data you wish to scrape.",[83,19503,19504,19506],{},[90,19505,161],{},": Set to match the number of columns of data you selected to scrape.",[83,19508,19509,88,19511,19513],{},[29,19510,959],{},[90,19512,3303],{},[80,19514,19515,19519,19523,19529],{},[83,19516,19517,100],{},[90,19518,99],{},[83,19520,19521,255],{},[90,19522,105],{},[83,19524,19525,261,19527,44],{},[90,19526,260],{},[90,19528,198],{},[83,19530,19531,162,19533,44],{},[90,19532,269],{},[90,19534,6013],{},[83,19536,19537,88,19539,19541],{},[29,19538,967],{},[90,19540,281],{},[80,19542,19543,19547,19551,19557],{},[83,19544,19545,100],{},[90,19546,99],{},[83,19548,19549,292],{},[90,19550,105],{},[83,19552,19553,162,19555,44],{},[90,19554,297],{},[90,19556,165],{},[83,19558,19559,162,19561,44],{},[90,19560,304],{},[90,19562,165],{},[21,19564,19566],{"id":19565},"run-your-amazon-scraper","Run your Amazon scraper",[14,19568,313],{},[21,19570,317],{"id":316},[14,19572,320,19573,326],{},[322,19574,325],{"href":324},[21,19576,330],{"id":329},[14,19578,333],{},[77,19580,19581],{},[80,19582,19583,19598,19610,19623,19634,19647],{},[83,19584,19585,19587,346,19589,350,19592,19594,19595,19597],{},[29,19586,342],{},[344,19588],{},[90,19590,19591],{},"Step 1.0 – Read data from a Google Sheet",[90,19593,353],{},". For example, ",[90,19596,1723],{}," will scrape 100 rows.",[83,19599,19600,19602,346,19604,19607,19608,44],{},[29,19601,363],{},[344,19603],{},[90,19605,19606],{},"Step 2.3 – Get data from bot's current page",", try reselecting or using ",[322,19609,7498],{"href":380},[83,19611,19612,19615,393,19617,397,19619,401,19621,44],{},[29,19613,19614],{},"Slow running scraper?",[344,19616],{},[90,19618,396],{},[90,19620,400],{},[90,19622,165],{},[83,19624,19625,19628,19630,19631,19633],{},[29,19626,19627],{},"Want to speed the scraper up?",[344,19629],{},"\nSet ",[90,19632,161],{}," to match the number of columns you selected to scrape.",[83,19635,19636,19638,346,19640,444,19643,466,19645,44],{},[29,19637,459],{},[344,19639],{},[90,19641,19642],{},"Step 2.4 – Write Data to a Google Sheet",[90,19644,465],{},[90,19646,198],{},[83,19648,19649,19651,476,19653,480],{},[29,19650,473],{},[344,19652],{},[90,19654,479],{},[14,19656,483,19657,19659,19660,3289,19664,19668,19669,19672,19673],{},[322,19658,487],{"href":486},"\nLooking to ",[322,19661,19663],{"href":19662},"\u002Fblog\u002Fscrape-amazon-asins","scrape ASINs",[322,19665,19667],{"href":19666},"\u002Fblog\u002Famazon-posts","automate Amazon posts"," follow these ",[322,19670,8921],{"href":19671},"\u002Fblog",". Read this link If you want to ",[322,19674,19676],{"href":19675},"\u002Fblog\u002Fhow-to-scrape-product-details-from-amazon-books","scrape Amazon books.",{"title":494,"searchDepth":495,"depth":495,"links":19678},[19679,19680,19681,19682,19683,19684],{"id":23,"depth":498,"text":24},{"id":19409,"depth":498,"text":19410},{"id":19426,"depth":498,"text":19427},{"id":19565,"depth":498,"text":19566},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"2023-01-20","Learn how to scrape Amazon product data into Google Sheets using axiom.ai's no-code automation tool. This guide covers setting up, configuring, and running an Amazon scraper for efficient data extraction.",{"pinned":522,"read":7527,"level":510,"video":19688,"templateId":4763,"type":513,"format":514,"intent_type":1049,"intent":4022,"tags":19689,"platfrom":19690},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FqDFksZ4GLG0",[519,12881],[19691],"Amazon","\u002Fguides\u002Fscrape-amazon",{"title":19386,"description":19686},"guides\u002Fscrape-amazon","VdVhD1jorL94z-t9X2ZmOBybBKbpeflNOxF6cesCxIo",{"id":19697,"title":19698,"body":19699,"date":523,"description":19962,"extension":506,"meta":19963,"navigation":522,"order":523,"path":19967,"seo":19968,"stem":19969,"__hash__":19970},"guides\u002Fguides\u002Fscrape-html-extract-data-with-ai.md","How to extract data from HTML with an AI",{"type":8,"value":19700,"toc":19956},[19701,19703,19719,19721,19727,19729,19732,19763,19767,19946,19948,19950],[11,19702],{},[14,19704,19705,19706,19709,19710,19713,19714,19718],{},"Learn how simple it is to create a web scraper that loops through URLs in a Google Sheets, scrapes the HTML, and then uses ",[322,19707,521],{"href":19708},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fchatgpt"," to extract data—all by combining just a few steps and completely bypassing the need for CSS selectors. get started quickly with this ",[322,19711,19712],{"href":6142},"ChatGPT web scraper template."," Visit these pages to learn more about getting started with ",[322,19715,19717],{"href":19716},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fget-data","extracting data"," and using our [builder.](\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder A ChatGPT subscription is required to run this bot.",[21,19720,7133],{"id":7132},[14,19722,7138,19723,7142,19725,11256],{},[29,19724,7141],{},[29,19726,7145],{},[21,19728,7085],{"id":7084},[14,19730,19731],{},"Separate your URLs row by row in the same column.",[7092,19733,19734,19742],{},[7095,19735,19736],{},[7098,19737,19738,19740],{},[7101,19739,7103],{},[7101,19741,7106],{},[7108,19743,19744,19751,19757],{},[7098,19745,19746,19749],{},[7113,19747,19748],{},"Insert your URLs like this",[7113,19750,11896],{},[7098,19752,19753,19755],{},[7113,19754,19748],{},[7113,19756,11896],{},[7098,19758,19759,19761],{},[7113,19760,19748],{},[7113,19762,11896],{},[21,19764,19766],{"id":19765},"create-your-bot","Create your bot",[77,19768,19769],{},[80,19770,19771,19799,19817,19833,19858,19884,19917],{},[83,19772,19773,88,19775,19777],{},[29,19774,87],{},[90,19776,92],{},[80,19778,19779,19783,19787,19793],{},[83,19780,19781,100],{},[90,19782,99],{},[83,19784,19785,7975],{},[90,19786,105],{},[83,19788,19789,162,19791,44],{},[90,19790,7182],{},[90,19792,7186],{},[83,19794,19795,162,19797,44],{},[90,19796,5267],{},[90,19798,7194],{},[83,19800,19801,88,19803,19805],{},[29,19802,111],{},[90,19804,114],{},[80,19806,19807],{},[83,19808,19809,132,19812,19814,19815,44],{},[90,19810,19811],{},"Loop source",[90,19813,1004],{},", then select ",[90,19816,139],{},[83,19818,19819,88,19821,19823],{},[29,19820,121],{},[90,19822,124],{},[80,19824,19825],{},[83,19826,19827,132,19829,136,19831,44],{},[90,19828,131],{},[90,19830,1004],{},[90,19832,139],{},[83,19834,19835,88,19837,19839],{},[29,19836,145],{},[90,19838,148],{},[80,19840,19841,19846],{},[83,19842,19843,19845],{},[90,19844,155],{},": Click and choose the outermost HTML element to scrape.",[83,19847,19848,162,19851,19854,19855,44],{},[90,19849,19850],{},"Data type",[90,19852,19853],{},"\"Select HTML\"",". See how ",[322,19856,19857],{"href":19499},"here",[83,19859,19860,88,19862,19864],{},[29,19861,170],{},[90,19863,5962],{},[80,19865,19866,19870,19876],{},[83,19867,19868,181],{},[90,19869,180],{},[83,19871,19872,224,19874,44],{},[90,19873,465],{},[90,19875,198],{},[83,19877,19878,19880,19881,44],{},[90,19879,204],{},": Enter the fields you want to extract, e.g. ",[90,19882,19883],{},"\"name, email, job title\"",[83,19885,19886,88,19888,19890],{},[29,19887,213],{},[90,19889,3303],{},[80,19891,19892,19897,19902,19911],{},[83,19893,19894,19896],{},[90,19895,99],{},": Select your Google Sheet or paste the URL.",[83,19898,19899,19901],{},[90,19900,105],{},": Choose a sheet tab or leave blank for the first tab.",[83,19903,19904,132,19906,3492,19908,44],{},[90,19905,465],{},[90,19907,1004],{},[90,19909,19910],{},"scraped-link-data",[83,19912,19913,162,19915,44],{},[90,19914,15309],{},[90,19916,6013],{},[83,19918,19919,88,19921,19923],{},[29,19920,241],{},[90,19922,281],{},[80,19924,19925,19930,19934,19940],{},[83,19926,19927,19929],{},[90,19928,99],{},": Select the same Google Sheet.",[83,19931,19932,18734],{},[90,19933,105],{},[83,19935,19936,162,19938,44],{},[90,19937,11490],{},[90,19939,165],{},[83,19941,19942,162,19944,44],{},[90,19943,11498],{},[90,19945,165],{},[21,19947,796],{"id":795},[11,19949],{},[14,19951,19952,19953,19955],{},"In just seven steps you can create a simple web scraper to extract data from any website with ",[322,19954,521],{"href":19708}," and write it to a Google Sheet. The super cool thing is that this scraper does not rely on CSS selectors to extract data that can change, because it uses AI to extract the data. So this design pattern will work on any website.",{"title":494,"searchDepth":495,"depth":495,"links":19957},[19958,19959,19960,19961],{"id":7132,"depth":498,"text":7133},{"id":7084,"depth":498,"text":7085},{"id":19765,"depth":498,"text":19766},{"id":795,"depth":498,"text":796},"Learn how to extract data from HTML using AI (ChatGPT) and axiom.ai. This guide covers looping through URLs in Google Sheets and automating data extraction without CSS selectors.",{"pinned":522,"type":513,"format":514,"intent_type":1754,"intent":516,"tags":19964,"platfrom":19966},[519,518,19965],"llm",[1757,521],"\u002Fguides\u002Fscrape-html-extract-data-with-ai",{"title":19698,"description":19962},"guides\u002Fscrape-html-extract-data-with-ai","rj8l-FN_hxQKJ2B_uZy_AxnJvFoaoTbJpMTF8Tb2THE",{"id":19972,"title":19973,"body":19974,"date":1043,"description":20229,"extension":506,"meta":20230,"navigation":522,"order":523,"path":20234,"seo":20235,"stem":20236,"__hash__":20237},"guides\u002Fguides\u002Fscrape-likes-from-instagram-posts.md","How to scrape users from likes on Instagram posts",{"type":8,"value":19975,"toc":20221},[19976,19978,19981,19983,19985,19995,19999,20007,20011,20013,20017,20143,20147,20152,20154,20158,20160,20164,20214],[11,19977],{},[14,19979,19980],{},"This Instagram bot scrapes post likes for user handles and profile links, limited to 100 per post by Instagram. It reads a post link from Google Sheets, opens it in Chrome, likes the post, and scrapes the user data. Afterward, it deletes the row from Google Sheets and moves on to the next post.",[18,19982],{},[21,19984,853],{"id":852},[14,19986,19987,19988,19990,19991,19994],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering the shortcut  ",[29,19989,31],{},", presuming you already have an account. Name your sheet something like  ",[29,19992,19993],{},"\"Instagram likes\"",", create two tabs links and data.",[21,19996,19998],{"id":19997},"install-the-instagram-like-scraper","Install the Instagram like scraper",[14,20000,20001,20002,20004,20005,59],{},"To install this Insta scraper click  ",[29,20003,54],{},". If you’re a new user, you’ll have to click  ",[29,20006,58],{},[14,20008,62,20009,44],{},[29,20010,65],{},[14,20012,68],{},[21,20014,20016],{"id":20015},"configure-your-instagram-like-scraper-in-5-easy-steps","Configure your Instagram Like scraper in 5 easy steps",[77,20018,20019],{},[80,20020,20021,20038],{},[83,20022,20023,88,20025,20027],{},[29,20024,87],{},[90,20026,92],{},[80,20028,20029,20033],{},[83,20030,20031,100],{},[90,20032,99],{},[83,20034,20035,20037],{},[90,20036,105],{},": Choose the tab with the post links in it.",[83,20039,20040,88,20042,20044],{},[29,20041,111],{},[90,20043,114],{},[80,20045,20046,20063,20075,20086,20111,20127],{},[83,20047,20048,88,20050,20052],{},[29,20049,121],{},[90,20051,12971],{},[80,20053,20054],{},[83,20055,20056,132,20058,136,20060,20062],{},[90,20057,131],{},[90,20059,1004],{},[90,20061,227],{},", then choose the column with the post links.",[83,20064,20065,88,20067,20070],{},[29,20066,145],{},[90,20068,20069],{},"Click element: Click on like",[80,20071,20072],{},[83,20073,20074],{},"Preconfigured.",[83,20076,20077,88,20079,20082],{},[29,20078,170],{},[90,20080,20081],{},"Get data from bot's current page: Scrape likes",[80,20083,20084],{},[83,20085,20074],{},[83,20087,20088,88,20090,20093],{},[29,20089,213],{},[90,20091,20092],{},"Append or merge data: Post link + likes",[80,20094,20095,20103],{},[83,20096,20097,132,20099,13281,20101,44],{},[90,20098,223],{},[90,20100,1004],{},[90,20102,227],{},[83,20104,20105,132,20107,136,20109,44],{},[90,20106,233],{},[90,20108,1004],{},[90,20110,198],{},[83,20112,20113,88,20115,20117],{},[29,20114,241],{},[90,20116,3303],{},[80,20118,20119,20123],{},[83,20120,20121,100],{},[90,20122,99],{},[83,20124,20125,12956],{},[90,20126,105],{},[83,20128,20129,88,20131,20133],{},[29,20130,278],{},[90,20132,281],{},[80,20134,20135,20139],{},[83,20136,20137,100],{},[90,20138,99],{},[83,20140,20141,12956],{},[90,20142,105],{},[21,20144,20146],{"id":20145},"run-your-instagram-like-scraper","Run your Instagram like scraper",[14,20148,20149,20150,44],{},"To test the Instagram bot, execute it on the Desktop, monitor its operation, and then verify the scraped data in the Google Sheet. If you wish to schedule the bot ",[322,20151,994],{"href":993},[21,20153,317],{"id":316},[14,20155,320,20156,326],{},[322,20157,325],{"href":324},[21,20159,330],{"id":329},[14,20161,1009,20162,44],{},[322,20163,994],{"href":993},[77,20165,20166],{},[80,20167,20168,20179,20202],{},[83,20169,20170,20173,346,20175,20178],{},[29,20171,20172],{},"Like button not clicked?",[344,20174],{},[90,20176,20177],{},"Step 2.2 – Click element: Click on like",", reselect the like button on a post.",[83,20180,20181,20184,346,20186,20189,20190,20193,20194,20196,450,20199,44],{},[29,20182,20183],{},"No results scraped?",[344,20185],{},[90,20187,20188],{},"Step 2.3 – Get data from bot's current page: Scrape likes",", check that the ",[322,20191,7498],{"href":20192},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool\u002Fcustom-css-selectors\u002F"," used are correct:",[344,20195],{},[90,20197,20198],{},"'[role=\"dialog\"] span div'",[90,20200,20201],{},"'[role=\"dialog\"] [role=\"link\"]'",[83,20203,20204,20206,346,20208,1482,20210,466,20212,44],{},[29,20205,459],{},[344,20207],{},[90,20209,13639],{},[90,20211,465],{},[90,20213,264],{},[14,20215,483,20216,20218,20219],{},[322,20217,487],{"href":486},"\nIntrested in automating Instagram posting, learn more read this full in-depth guide on automating ",[322,20220,13134],{"href":13133},{"title":494,"searchDepth":495,"depth":495,"links":20222},[20223,20224,20225,20226,20227,20228],{"id":852,"depth":498,"text":853},{"id":19997,"depth":498,"text":19998},{"id":20015,"depth":498,"text":20016},{"id":20145,"depth":498,"text":20146},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"Learn how to scrape users from Instagram post likes and export the data to Google Sheets using axiom.ai. This guide covers setting up, configuring, and running an Instagram likes scraper for user data extraction.",{"read":1046,"level":510,"video":20231,"templateId":4708,"type":513,"format":514,"intent_type":11530,"intent":4022,"tags":20232,"platfrom":20233},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FYhChBarQcuo",[11532,13661,13662,519],[11534],"\u002Fguides\u002Fscrape-likes-from-instagram-posts",{"title":19973,"description":20229},"guides\u002Fscrape-likes-from-instagram-posts","tjOPu4FmD472dfYRFDLBeOS_YGIRlrCE6eRQefPFQqQ",{"id":20239,"title":20240,"body":20241,"date":523,"description":20334,"extension":506,"meta":20335,"navigation":522,"order":523,"path":20339,"seo":20340,"stem":20341,"__hash__":20342},"guides\u002Fguides\u002Fscrape-links-export-to-csv.md","How to extract links and write to a CSV",{"type":8,"value":20242,"toc":20330},[20243,20245,20253,20255,20257,20265,20323,20325,20327],[11,20244],{},[14,20246,20247,20248,20252],{},"Learn how to scrape links from a webpage into a ",[322,20249,20251],{"href":20250},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fexport-csv-file","CSV"," saved to your downloads folder by combing a few steps using our [builder.](\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder",[21,20254,7133],{"id":7132},[11,20256],{},[14,20258,7138,20259,20261,20262,11256],{},[29,20260,7141],{}," and then select ",[29,20263,20264],{},"\"Add first step\".",[77,20266,20267],{},[80,20268,20269,20301],{},[83,20270,20271,88,20273,20275],{},[29,20272,349],{},[90,20274,13474],{},[80,20276,20277,20282,20287,20296],{},[83,20278,20279,20281],{},[90,20280,3922],{},": Enter the URL of the page from which to scrape links.",[83,20283,20284,20286],{},[90,20285,155],{},": Choose the links you wish to scrape.",[83,20288,20289,20291,20292,20295],{},[90,20290,16039],{}," (optional): Select the ",[29,20293,20294],{},"\"Next\""," button for pagination if present.",[83,20297,20298,20300],{},[90,20299,13489],{},": Set the maximum number of links to scrape.",[83,20302,20303,88,20305,20308],{},[29,20304,908],{},[90,20306,20307],{},"Export to CSV",[80,20309,20310,20318],{},[83,20311,20312,132,20314,19814,20316,44],{},[90,20313,20307],{},[29,20315,194],{},[29,20317,19910],{},[83,20319,20320,20322],{},[90,20321,1643],{},": Name your CSV file.",[21,20324,796],{"id":795},[11,20326],{},[14,20328,20329],{},"Create an automation with just two steps that extract links from any website. In the first step, simply select the links, and then, in the second step, write the scraped data to a CSV.",{"title":494,"searchDepth":495,"depth":495,"links":20331},[20332,20333],{"id":7132,"depth":498,"text":7133},{"id":795,"depth":498,"text":796},"Learn how to make a bot that will scrape links from a webpage then export them into a CSV.",{"pinned":522,"type":513,"format":77,"intent_type":1754,"intent":4022,"tags":20336,"platfrom":20338},[519,20337],"csv",[1757],"\u002Fguides\u002Fscrape-links-export-to-csv",{"title":20240,"description":20334},"guides\u002Fscrape-links-export-to-csv","1sTMACaO_dDCy4SEf_ZaM48BBE6A94X-Ji62cXEaPlU",{"id":20344,"title":20345,"body":20346,"date":1043,"description":20541,"extension":506,"meta":20542,"navigation":522,"order":523,"path":15981,"seo":20546,"stem":20547,"__hash__":20548},"guides\u002Fguides\u002Fscrape-links-from-a-website.md","How to scrape links from a website into a Google Sheet",{"type":8,"value":20347,"toc":20533},[20348,20350,20353,20355,20361,20363,20370,20374,20382,20387,20389,20393,20455,20459,20462,20464,20468,20470,20472,20529],[11,20349],{},[14,20351,20352],{},"This Link Scraper template extracts links from different webpages like listings, paginated, scrolling, and feed pages, and write them into a Google Sheet. It takes only a minute to set up.",[18,20354],{},[14,20356,20357,20358],{},"We recommend scraping links with one Axiom then scraping the pages with another ",[322,20359,20360],{"href":15104},"see this template.",[21,20362,24],{"id":23},[14,20364,27,20365,20367,20368,44],{},[29,20366,31],{},", presuming you already have an account. Name your sheet something like 'Link Scraper’ and set up a tab called ",[29,20369,39],{},[21,20371,20373],{"id":20372},"install-the-link-scraper","Install the link scraper",[14,20375,20376,20377,20379,20380,59],{},"To install this Web scraper template click  ",[29,20378,54],{},".  If you’re a new user, you’ll have to click  ",[29,20381,58],{},[14,20383,20384,20385,44],{},"Once installed, click  ",[29,20386,65],{},[14,20388,68],{},[21,20390,20392],{"id":20391},"configure-your-link-scraper-in-a-minute","Configure your Link scraper in a minute",[77,20394,20395],{},[80,20396,20397,20427],{},[83,20398,20399,88,20401,20403],{},[29,20400,349],{},[90,20402,13474],{},[80,20404,20405,20410,20417,20422],{},[83,20406,20407,20409],{},[90,20408,3922],{},": Enter the URL of the page you want to scrape.",[83,20411,20412,1995,20414,20416],{},[90,20413,155],{},[322,20415,19500],{"href":19499}," to select the links you wish to scrape.",[83,20418,20419,20421],{},[90,20420,16039],{}," (if any): Select the \"Next\" button if the page is paginated.",[83,20423,20424,20426],{},[90,20425,161],{},": Set the number of links you wish to scrape.",[83,20428,20429,88,20431,20433],{},[29,20430,908],{},[90,20432,3303],{},[80,20434,20435,20439,20443,20449],{},[83,20436,20437,100],{},[90,20438,99],{},[83,20440,20441,255],{},[90,20442,105],{},[83,20444,20445,261,20447,44],{},[90,20446,260],{},[90,20448,13616],{},[83,20450,20451,162,20453,44],{},[90,20452,15309],{},[90,20454,6013],{},[21,20456,20458],{"id":20457},"run-your-link-scraper","Run your link scraper",[14,20460,20461],{},"We suggest running a test first, setting max-results to 10, and reviewing the data.",[21,20463,317],{"id":316},[14,20465,320,20466,326],{},[322,20467,325],{"href":324},[21,20469,330],{"id":329},[14,20471,333],{},[77,20473,20474],{},[80,20475,20476,20488,20500,20508,20521],{},[83,20477,20478,20480,346,20482,20485,20486,44],{},[29,20479,363],{},[344,20481],{},[90,20483,20484],{},"Step 1.0 – Get data from bot's current page",", try re-selecting or use ",[322,20487,7498],{"href":380},[83,20489,20490,20492,393,20494,397,20496,401,20498,44],{},[29,20491,19614],{},[344,20493],{},[90,20495,396],{},[90,20497,400],{},[90,20499,17395],{},[83,20501,20502,20504,19630,20506,19633],{},[29,20503,19627],{},[344,20505],{},[90,20507,161],{},[83,20509,20510,20512,346,20514,444,20517,466,20519,44],{},[29,20511,459],{},[344,20513],{},[90,20515,20516],{},"Step 2.0 – Write Data to a Google Sheet",[90,20518,465],{},[90,20520,13616],{},[83,20522,20523,20525,476,20527,480],{},[29,20524,473],{},[344,20526],{},[90,20528,479],{},[14,20530,483,20531],{},[322,20532,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":20534},[20535,20536,20537,20538,20539,20540],{"id":23,"depth":498,"text":24},{"id":20372,"depth":498,"text":20373},{"id":20391,"depth":498,"text":20392},{"id":20457,"depth":498,"text":20458},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"Learn how to scrape links from a website and export them to Google Sheets using axiom.ai's no-code automation tool. This guide covers setting up, configuring, and running a link scraper for efficient data extraction.",{"read":1527,"level":510,"video":20543,"templateId":4671,"type":513,"format":514,"intent_type":1754,"intent":4022,"tags":20544,"platfrom":20545},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FzUHHWz6Ycgk",[519,15368,12881],[1757],{"title":20345,"description":20541},"guides\u002Fscrape-links-from-a-website","8HHW7YgcBmNnyHuxefIHcgELrxoYKr5LKyQLWNrVV8U",{"id":20550,"title":20551,"body":20552,"date":19685,"description":20816,"extension":506,"meta":20817,"navigation":522,"order":523,"path":20822,"seo":20823,"stem":20824,"__hash__":20825},"guides\u002Fguides\u002Fscrape-spotify-webplayer.md","How to Scrape Spotify Discography: Step-by-Step",{"type":8,"value":20553,"toc":20809},[20554,20556,20559,20561,20563,20571,20575,20580,20584,20586,20692,20696,20701,20703,20708,20710,20714,20805],[11,20555],{},[14,20557,20558],{},"This Spotify Discography Scraper operates by reading artist profile links from a Google Sheet, opening them in Chrome, and navigating to the discography section to scrape album links. It collects data such as album title, copyright, and release date, saving this information into another Google Sheet. After processing each entry, the bot deletes it from the initial sheet and continues to the next.",[18,20560],{},[21,20562,853],{"id":852},[14,20564,27,20565,1085,20567,20570],{},[29,20566,31],{},[29,20568,20569],{},"\"Spotify scraper\"",". Set up two tabs in Google Sheets: one for artist profile links and another for scraped data.",[21,20572,20574],{"id":20573},"install-the-spotify-discography-scraper","Install the Spotify discography scraper",[14,20576,20577,20578,59],{},"To install this Spotify Discography Scraper click '**\"Install template'. If you’re a new user, you’ll have to click ",[29,20579,58],{},[14,20581,62,20582,44],{},[29,20583,65],{},[14,20585,68],{},[77,20587,20588,20690],{},[80,20589,20590,20607],{},[83,20591,20592,88,20594,20596],{},[29,20593,87],{},[90,20595,92],{},[80,20597,20598,20602],{},[83,20599,20600,100],{},[90,20601,99],{},[83,20603,20604,20606],{},[90,20605,105],{},": Choose the tab with the artist profile links.",[83,20608,20609,88,20611,20613],{},[29,20610,111],{},[90,20612,114],{},[80,20614,20615,20637,20642,20673],{},[83,20616,20617,88,20619,20622],{},[29,20618,121],{},[90,20620,20621],{},"Go to page: Artist page",[80,20623,20624],{},[83,20625,20626,132,20628,136,20630,20632,20633,20636],{},[90,20627,131],{},[90,20629,194],{},[90,20631,227],{},", then append ",[90,20634,20635],{},"\u002Fdiscography\u002Fall"," after the token.",[83,20638,20639,10297],{},[29,20640,20641],{},"2.2 – 2.3",[83,20643,20644,88,20646,20649],{},[29,20645,213],{},[90,20647,20648],{},"Loop through data: Album links",[80,20650,20651,20656],{},[83,20652,20653,10297],{},[29,20654,20655],{},"2.4.1 – 2.4.2",[83,20657,20658,88,20661,20663],{},[29,20659,20660],{},"2.4.3",[90,20662,3303],{},[80,20664,20665],{},[83,20666,20667,20669,20670,44],{},[90,20668,260],{},": Ensure this is set to ",[90,20671,20672],{},"[scraped-data]",[83,20674,20675,88,20677,20679],{},[29,20676,241],{},[90,20678,281],{},[80,20680,20681,20685],{},[83,20682,20683,100],{},[90,20684,99],{},[83,20686,20687,20689],{},[90,20688,105],{},": Choose the tab with artist links.",[14,20691,983],{},[21,20693,20695],{"id":20694},"run-your-spotify-discography-scraper","Run your Spotify discography scraper",[14,20697,20698,20699,44],{},"To test this Spotify scraper, initiate the bot with the cloud lo runner and let it run a few loops. Then, stop the bot and review the data in the linked Google Sheet for accuracy and completeness. If you wish to schedule the bot ",[322,20700,994],{"href":993},[21,20702,317],{"id":316},[14,20704,320,20705,20707],{},[322,20706,325],{"href":324},", you can use our no-code bot builder to customize any bot according to your requirements. For example simply click 'Select' in Step 2.4.2 and point and click to chose different data to scrape.",[21,20709,330],{"id":329},[14,20711,1009,20712,44],{},[322,20713,994],{"href":993},[77,20715,20716],{},[80,20717,20718,20735,20746,20756,20773,20784,20795],{},[83,20719,20720,20723,346,20725,20728,20729,20731,20732,20734],{},[29,20721,20722],{},"Artist page not loading?",[344,20724],{},[90,20726,20727],{},"Step 2.1 – Go to page: Artist page",", check that the URL ends with ",[90,20730,20635],{}," after the ",[90,20733,227],{}," token.",[83,20736,20737,20740,346,20742,20745],{},[29,20738,20739],{},"Display not being changed to grid format?",[344,20741],{},[90,20743,20744],{},"Step 2.2 – Click element: Grid layout",", reselect the grid icon from the artist page.",[83,20747,20748,20750,346,20752,20755],{},[29,20749,7492],{},[344,20751],{},[90,20753,20754],{},"Step 2.3 – Get a list of links to pages from bot's current page: Album links",", reselect album links on the artist's discography page.",[83,20757,20758,20761,346,20763,20766,20767,20769,20770,44],{},[29,20759,20760],{},"Album links not loading?",[344,20762],{},[90,20764,20765],{},"Step 2.4.1 – Go to page: Album",", confirm that ",[90,20768,131],{}," is set with ",[90,20771,20772],{},"[link-data?*&0]",[83,20774,20775,20778,346,20780,20783],{},[29,20776,20777],{},"No elements found?",[344,20779],{},[90,20781,20782],{},"Step 2.4.2 – Get data from bot's current page: Scrape Album",", reselect data from within an album page.",[83,20785,20786,20789,346,20791,20794],{},[29,20787,20788],{},"Scraped data not writing?",[344,20790],{},[90,20792,20793],{},"Step 2.4.3 – Write data to a Google Sheet",", check that the correct sheet and tab are selected.",[83,20796,20797,20800,346,20802,20804],{},[29,20798,20799],{},"Bot scrapes same artist every loop?",[344,20801],{},[90,20803,10075],{},", confirm the correct sheet tab (with artist links) is selected.",[14,20806,483,20807],{},[322,20808,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":20810},[20811,20812,20813,20814,20815],{"id":852,"depth":498,"text":853},{"id":20573,"depth":498,"text":20574},{"id":20694,"depth":498,"text":20695},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"Learn how to scrape Spotify discography data and export it to Google Sheets using axiom.ai's no-code automation tool. This guide covers setting up, configuring, and running a Spotify scraper for album and artist data extraction.",{"pinned":522,"read":1046,"level":16262,"video":20818,"templateId":4768,"type":513,"format":514,"intent_type":1049,"intent":4022,"tags":20819,"platfrom":20820},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRL55fL4HOGk",[519,12881],[20821],"Spotify","\u002Fguides\u002Fscrape-spotify-webplayer",{"title":20551,"description":20816},"guides\u002Fscrape-spotify-webplayer","pb388OX_wCAK_EDtYlyA-m8N48rEE1eZLTplX_fmuUg",{"id":20827,"title":20828,"body":20829,"date":523,"description":21211,"extension":506,"meta":21212,"navigation":522,"order":523,"path":21216,"seo":21217,"stem":21218,"__hash__":21219},"guides\u002Fguides\u002Fslack.md","How to automate Slack with axiom.ai",{"type":8,"value":20830,"toc":21200},[20831,20833,20841,20843,20845,20858,20862,20864,20867,20912,20916,20919,20960,20964,20968,20970,20973,20976,21018,21029,21041,21048,21050,21052,21059,21062,21064,21066,21069,21073,21075,21078,21136,21139,21189,21193,21195,21197],[11,20832],{},[14,20834,20835,20840],{},[322,20836,20839],{"href":20837,"rel":20838},"https:\u002F\u002Fslack.com\u002Fintl\u002Fen-gb\u002Ffeatures\u002Fworkflow-automation",[2245],"Slack Workflow Builder"," allows you to automate various actions within your Slack workflow. Using a webhook to trigger these workflows can enhance these workflows. Even better - you can pass data from your axiom.ai automation into your Slack workflow. Let's dive in.",[21,20842,546],{"id":545},[11,20844],{},[14,20846,20847,20848,20853,20854,20857],{},"To get started, you'll need to have a ",[322,20849,20852],{"href":20850,"rel":20851},"https:\u002F\u002Fslack.com",[2245],"Slack"," account that has access to ",[322,20855,20839],{"href":20837,"rel":20856},[2245],". You'll also need to have the axiom.ai extension installed and be logged in.",[21,20859,20861],{"id":20860},"trigger-a-slack-workflow-with-an-axiomai-automation","Trigger a Slack workflow with an axiom.ai automation",[11,20863],{},[14,20865,20866],{},"Learn how to trigger a Slack workflow from an axiom.ai automation.",[77,20868,20869],{},[555,20870,20871,20877,20883,20889,20895,20901,20906],{},[83,20872,20873,20876],{},[29,20874,20875],{},"Create Slack workflow",": Head to the Slack app and open the Workflow Builder.",[83,20878,20879,20882],{},[29,20880,20881],{},"Create workflow",": Click \"+ New workflow\" to get started.",[83,20884,20885,20888],{},[29,20886,20887],{},"Start the workflow",": Click \"Choose an event\" to select a workflow trigger, select \"From a webhook\".",[83,20890,20891,20894],{},[29,20892,20893],{},"Variables",": To set up variables, click \"Set up variables\" – this is required to be able to send data to your workflow and allows the data to be used later.",[83,20896,20897,20900],{},[29,20898,20899],{},"Add steps",": Add steps that meet your requirements – you can use the variables above in certain steps by clicking \"{} Insert a variable\" in the step setup window.",[83,20902,20903,20905],{},[29,20904,12289],{},": Click \"Finish up\" to save your workflow, follow their steps and then click \"Publish\" to publish your workflow.",[83,20907,20908,20911],{},[29,20909,20910],{},"Web request URL",": After saving, re-open your workflow and click on the \"Starts with a webhook\" trigger, copy the \"Web request URL\" and save this for later use.",[592,20913],{"src":20914,"alt":20915},"\u002Fdocs\u002Fguides\u002Ftrigger-slack-workflow-example.png","set up a slack workflow in slack",[14,20917,20918],{},"Now, let's head over to the axiom.ai extension. We are going to assume that you already have an automation created to capture the data that you wish to pass into your Slack workflow.",[77,20920,20921],{},[80,20922,20923],{},[83,20924,20925,611,20927,20929,20930],{},[90,20926,7722],{},[322,20928,7722],{"href":18400}," step to your automation.\n",[80,20931,20932,20941],{},[83,20933,20934,20936,20937,20940],{},[90,20935,577],{},": Paste the ",[29,20938,20939],{},"\"Web request URL\""," you copied from Slack.",[83,20942,20943,20945,20946],{},[90,20944,16510],{},": Match the format shown in your Slack workflow.\n",[80,20947,20948,20954],{},[83,20949,20950,20951,44],{},"To check the structure, open your workflow and click on ",[29,20952,20953],{},"\"Starts with a webhook\"",[83,20955,6209,20956,20959],{},[29,20957,20958],{},"\"Insert Data\""," option in Axiom to add tokens from your automation into the payload.",[592,20961],{"src":20962,"alt":20963},"\u002Fdocs\u002Fguides\u002Ftrigger-slack-workflow-trigger-webhook.png","set up 'trigger webhook' step in axiom.ai to trigger a slack workflow using the slack workflow payload format",[639,20965,20967],{"id":20966},"triggering-a-slack-workflow-with-run-notifications","Triggering a Slack Workflow with Run Notifications",[11,20969],{},[14,20971,20972],{},"Setting up run notifications when an automation run completes can be a helpful way of keeping on top of your automations when they are running unattended. To do this, follow the instructions above to set up your Slack Workflow. The only change that is required is that your Slack Workflow has two variables set up as \"text\" variables: \"status\" and \"log\", see step 4 above for more details.",[14,20974,20975],{},"Then, head into your axiom.ai automation and follow the steps below:",[77,20977,20978],{},[555,20979,20980,20986,20995,21001,21010],{},[83,20981,20982,20985],{},[29,20983,20984],{},"Open your automation",": Open the Axiom automation you want to configure.",[83,20987,20988,20991,20992,44],{},[29,20989,20990],{},"Go to settings",": Navigate to ",[29,20993,20994],{},"Settings → Set up notifications",[83,20996,20997,21000],{},[29,20998,20999],{},"Enable notification types",": Toggle on the options you'd like to be notified of — when a run fails, when it succeeds with warnings, or when it fully succeeds.",[83,21002,21003,21006,21007,44],{},[29,21004,21005],{},"Enable webhook notifications",": Turn on ",[29,21008,21009],{},"Notify by webhook",[83,21011,21012,20936,21015,21017],{},[29,21013,21014],{},"Enter webhook URL",[29,21016,20910],{}," from the Slack workflow setup.",[14,21019,21020,21022,21023,21026,21027,44],{},[807,21021,15097],{}," Using the ",[322,21024,8218],{"href":21025},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fadd-error-metadata"," step before a step allows you to add metadata to the error message produced by that step. This metadata will appear in the \"log\" that is sent if the automation fails - adding more context to your error messages. For more tips on debugging, see ",[322,21028,3313],{"href":3312},[14,21030,21031,21032,21034,21035,21040],{},"To pass custom data to your Slack Workflow, we would still recommend using the ",[322,21033,7722],{"href":18400}," step method described in the section above. These can be used together but we recommend referring to Slack's ",[322,21036,21039],{"href":21037,"rel":21038},"https:\u002F\u002Fapi.slack.com\u002Fapis\u002Frate-limits",[2245],"Rate Limit"," documentation for their API rate limits.",[14,21042,21043,21044,12252],{},"To learn more about Run Notifications, see the ",[322,21045,21047],{"href":21046},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fnotifications","Run Notifications",[21,21049,776],{"id":775},[11,21051],{},[14,21053,21054,21055,21058],{},"Ensure that your workflow has been published and then hit \"Run\" in your axiom.ai automation. If there are error messages, review these error messages for next steps. ",[322,21056,21057],{"href":486},"Contact us"," if you are unsure of the errors that you are experiencing.",[14,21060,21061],{},"If successful, your workflow steps will be performed. For example, if this is set to send a message in a channel, check the channel that you have set within the workflow.",[21,21063,6725],{"id":6724},[11,21065],{},[14,21067,21068],{},"Let's dive into some example use cases.",[639,21070,21072],{"id":21071},"automate-the-creation-of-a-daily-spreadsheet","Automate the creation of a daily spreadsheet",[11,21074],{},[14,21076,21077],{},"Automating the creation of a new spreadsheet on a daily basis and sending this to your team can be a useful way of tracking information within your teams. To get started, create a new Slack workflow:",[77,21079,21080],{},[555,21081,21082,21088,21094,21100,21106,21112,21118,21124,21130],{},[83,21083,21084,21087],{},[29,21085,21086],{},"Create Slack workflow:"," Head to the Slack app and open the Workflow Builder.",[83,21089,21090,21093],{},[29,21091,21092],{},"Create workflow:"," Click \"+ New workflow\" to get started.",[83,21095,21096,21099],{},[29,21097,21098],{},"Start the workflow:"," Click \"Choose an event\" to select a workflow trigger, select \"From a webhook\".",[83,21101,21102,21105],{},[29,21103,21104],{},"Variables:"," To set up variables, click \"Set up variables\" - add two \"test\" variables, one called \"date\" and another called \"url\".",[83,21107,21108,21111],{},[29,21109,21110],{},"Add steps:"," Add a \"Send a message to a channel\" from the \"Messages\" section of the steps. Select the channel you wish to use in the \"Select a channel\" dropdown.",[83,21113,21114,21117],{},[29,21115,21116],{},"Construct message:"," Create a message you'd like to send to the team, use the \"{} Insert a variable\" button to insert variables.",[83,21119,21120,21123],{},[29,21121,21122],{},"Add a button:"," Click \"+ Add button\", add a \"Button label\", change the \"Behaviour\" to \"Open Link\" and use the \"{}\" button to input the \"url\". This will allow the spreadsheet to be opened with a click.",[83,21125,21126,21129],{},[29,21127,21128],{},"Save:"," Click \"Finish up\" to save your workflow, follow their steps and then click \"Publish\" to publish your workflow.",[83,21131,21132,21135],{},[29,21133,21134],{},"Web request URL:"," After saving, re-open your workflow and click on the \"Starts with a webhook\" trigger, copy the \"Web request URL\" and save this for later use.",[14,21137,21138],{},"Now, open your axiom.ai extension and follow the steps below:",[77,21140,21141],{},[555,21142,21143,21149,21158,21168,21177,21183],{},[83,21144,21145,21148],{},[29,21146,21147],{},"Create a new automation:"," Open the extension and click \"+ New Automation\" to get started.",[83,21150,21151,21154,21155,21157],{},[29,21152,21153],{},"Get date:"," To get the current date use the ",[322,21156,7555],{"href":7554}," step. Select the format from in the step.",[83,21159,21160,21163,21164,21167],{},[29,21161,21162],{},"Create Google Sheet:"," Use the ",[322,21165,9391],{"href":21166},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fcreate-a-new-google-sheet"," step to create a new spreadsheet, use the output from the \"Date and time\" step to construct your \"Sheet name\".",[83,21169,21170,21173,21174,21176],{},[29,21171,21172],{},"Trigger webhook:"," Add a ",[322,21175,7722],{"href":18400}," step to your automation, add the \"Web request URL\" from Slack to the \"Endpoint\" input.",[83,21178,21179,21182],{},[29,21180,21181],{},"Payload:"," To construct the \"Payload\" in the \"Trigger webhook\" step, follow the format that is set out within the Slack workflow. Use the \"Insert Data\" option within Axiom to input data from your automation.",[83,21184,21185,21188],{},[29,21186,21187],{},"Schedule:"," If your plan supports it, navigate to \"Settings\", then \"Schedule\" to set up a schedule to run daily, or more frequently.",[592,21190],{"src":21191,"alt":21192},"\u002Fdocs\u002Fguides\u002Ftrigger-slack-workflow-example-gsheets.png","axiom.ai builder showing automation to automatically create new google sheet",[21,21194,796],{"id":795},[11,21196],{},[14,21198,21199],{},"Automating the triggering of Slack workflows from axiom.ai allows you to send data to your Slack workflows. This can offer a wide range of automation opportunities, from automatically generating Google Sheets to notifying your team of data that has been scraped from a website, there are many options that you can use.",{"title":494,"searchDepth":495,"depth":495,"links":21201},[21202,21203,21206,21207,21210],{"id":545,"depth":498,"text":546},{"id":20860,"depth":498,"text":20861,"children":21204},[21205],{"id":20966,"depth":495,"text":20967},{"id":775,"depth":498,"text":776},{"id":6724,"depth":498,"text":6725,"children":21208},[21209],{"id":21071,"depth":495,"text":21072},{"id":795,"depth":498,"text":796},"Learn how to trigger a Slack Workflow using an axiom.ai automation to send messages or automatically perform tasks within your automations",{"type":513,"format":514,"intent_type":515,"intent":827,"tags":21213,"platfrom":21215},[829,830,21214],"integration",[20852],"\u002Fguides\u002Fslack",{"title":20828,"description":21211},"guides\u002Fslack","x5--DXeHbXDxGgORit0jXg9IGbMabiuQAQbFmpBiT6s",{"id":21221,"title":21222,"body":21223,"date":523,"description":22498,"extension":506,"meta":22499,"navigation":522,"order":523,"path":22503,"seo":22504,"stem":22505,"__hash__":22506},"guides\u002Fguides\u002Fsupabase.md","How to automate Supabase with axiom.ai",{"type":8,"value":21224,"toc":22488},[21225,21227,21235,21237,21239,21242,21278,21281,21285,21287,21290,21294,21296,21299,21305,21364,21367,21498,21505,21712,21719,21730,21736,22013,22018,22028,22032,22034,22039,22042,22076,22083,22099,22102,22293,22298,22401,22414,22418,22420,22425,22432,22435,22459,22462,22464,22466,22471,22473,22475,22477,22480,22482,22485],[11,21226],{},[14,21228,21229,21234],{},[322,21230,21233],{"href":21231,"rel":21232},"https:\u002F\u002Fsupabase.com",[2245],"Supabase"," is an open source Firebase alternative offering Postgres databases, Authentication, instant APIs, Edge Functions, Realtime subscriptions, Storage, and Vector embeddings. Combining Supabase with axiom.ai can be a powerful way of levelling up your automations. From storing the data that you scrape from webpages, to retrieving data to be used in your automation, there is a lot you can achieve.",[21,21236,546],{"id":545},[11,21238],{},[14,21240,21241],{},"To get started, you will need to have the following steps completed:",[77,21243,21244],{},[555,21245,21246,21251,21261,21270],{},[83,21247,21248],{},[29,21249,21250],{},"Sign up to Supabase",[83,21252,21253,1995,21256],{},[29,21254,21255],{},"Create a database and a table",[322,21257,21260],{"href":21258,"rel":21259},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fdatabase\u002Ftables",[2245],"Supabase | Tables and Data",[83,21262,21263,21266,21267],{},[29,21264,21265],{},"Retrieve your project URL",": Go to ",[29,21268,21269],{},"Project settings → API → Project URL",[83,21271,21272,21266,21275],{},[29,21273,21274],{},"Retrieve your API key",[29,21276,21277],{},"Project settings → API → Project API Keys",[14,21279,21280],{},"Throughout this guide we will be using a \"Customers\" table, any code provided will need to be modified to your specific use case.",[21,21282,21284],{"id":21283},"working-with-supabase-data-in-axiomai","Working with Supabase data in axiom.ai",[11,21286],{},[14,21288,21289],{},"There are various actions that you can perform with the Supabase API and axiom.ai. To learn more about the Supabase API, and see examples specific to your table, head into your Supabase dashboard, click \"API docs\" and find your table in the sidebar. Let's dive into some use cases.",[639,21291,21293],{"id":21292},"write-data-to-a-supabase-table","Write data to a Supabase table",[11,21295],{},[14,21297,21298],{},"To write data to your Supabase database, set up your axiom.ai automation as normal. When you are ready to send your data, continue this guide.",[14,21300,21301,21302,21304],{},"To get started, add a ",[322,21303,2301],{"href":2300}," step to your automation, we will then create variables to store key information used throughout the script. We will break down this script into sections, but this should all be combined into a single script in a single \"Write Javascript\" step.",[719,21306,21308],{"className":756,"code":21307,"language":758,"meta":494,"style":494},"\u002F\u002F Change the [google-sheet-data] token to the token that stores your data and replace any item in \u003C> with your data.\nconst ogData = [google-sheet-data];\nconst supabase_url = \"\u003CPROJECT_URL>\u002Frest\u002Fv1\u002F\u003CTABLE_NAME>\";\nconst api_key = \"\u003CAPI_KEY>\";\n",[90,21309,21310,21315,21336,21350],{"__ignoreMap":494},[727,21311,21312],{"class":729,"line":730},[727,21313,21314],{"class":2920},"\u002F\u002F Change the [google-sheet-data] token to the token that stores your data and replace any item in \u003C> with your data.\n",[727,21316,21317,21319,21322,21324,21327,21329,21332,21334],{"class":729,"line":498},[727,21318,2315],{"class":1986},[727,21320,21321],{"class":1882}," ogData",[727,21323,2321],{"class":1986},[727,21325,21326],{"class":768}," [google",[727,21328,17337],{"class":1986},[727,21330,21331],{"class":768},"sheet",[727,21333,17337],{"class":1986},[727,21335,17340],{"class":768},[727,21337,21338,21340,21343,21345,21348],{"class":729,"line":495},[727,21339,2315],{"class":1986},[727,21341,21342],{"class":1882}," supabase_url",[727,21344,2321],{"class":1986},[727,21346,21347],{"class":737}," \"\u003CPROJECT_URL>\u002Frest\u002Fv1\u002F\u003CTABLE_NAME>\"",[727,21349,2327],{"class":768},[727,21351,21352,21354,21357,21359,21362],{"class":729,"line":1895},[727,21353,2315],{"class":1986},[727,21355,21356],{"class":1882}," api_key",[727,21358,2321],{"class":1986},[727,21360,21361],{"class":737}," \"\u003CAPI_KEY>\"",[727,21363,2327],{"class":768},[14,21365,21366],{},"Next, we will add a helper function that ensures that your data is formatted in a way that Supabase expects:",[719,21368,21370],{"className":756,"code":21369,"language":758,"meta":494,"style":494},"const format = (data) => {\n    const formatted_data = [];\n    for (var i = 0; i \u003C data.length; i++) {\n        \u002F\u002F Follow the format and add your own column names, incrementing the value in the second [] for each new piece of data.\n        formatted_data.push({\"first_name\": data[i][0], \"last_name\": data[i][1], \"email\": data[i][2]});\n    }\n  \n  return formatted_data;\n}\n",[90,21371,21372,21391,21402,21434,21439,21479,21483,21487,21494],{"__ignoreMap":494},[727,21373,21374,21376,21379,21381,21383,21385,21387,21389],{"class":729,"line":730},[727,21375,2315],{"class":1986},[727,21377,21378],{"class":2376}," format",[727,21380,2321],{"class":1986},[727,21382,2524],{"class":768},[727,21384,1838],{"class":733},[727,21386,5031],{"class":768},[727,21388,2388],{"class":1986},[727,21390,2391],{"class":768},[727,21392,21393,21395,21398,21400],{"class":729,"line":498},[727,21394,17003],{"class":1986},[727,21396,21397],{"class":1882}," formatted_data",[727,21399,2321],{"class":1986},[727,21401,4973],{"class":768},[727,21403,21404,21407,21409,21411,21413,21415,21417,21419,21421,21424,21426,21429,21432],{"class":729,"line":495},[727,21405,21406],{"class":1986},"    for",[727,21408,2524],{"class":768},[727,21410,4964],{"class":1986},[727,21412,18119],{"class":768},[727,21414,4970],{"class":1986},[727,21416,18124],{"class":1882},[727,21418,18127],{"class":768},[727,21420,18130],{"class":1986},[727,21422,21423],{"class":768}," data.",[727,21425,18136],{"class":1882},[727,21427,21428],{"class":768},"; i",[727,21430,21431],{"class":1986},"++",[727,21433,16992],{"class":768},[727,21435,21436],{"class":729,"line":1895},[727,21437,21438],{"class":2920},"        \u002F\u002F Follow the format and add your own column names, incrementing the value in the second [] for each new piece of data.\n",[727,21440,21441,21444,21446,21449,21452,21455,21457,21460,21463,21465,21467,21469,21472,21474,21476],{"class":729,"line":1901},[727,21442,21443],{"class":768},"        formatted_data.",[727,21445,5043],{"class":2376},[727,21447,21448],{"class":768},"({",[727,21450,21451],{"class":737},"\"first_name\"",[727,21453,21454],{"class":768},": data[i][",[727,21456,17395],{"class":1882},[727,21458,21459],{"class":768},"], ",[727,21461,21462],{"class":737},"\"last_name\"",[727,21464,21454],{"class":768},[727,21466,165],{"class":1882},[727,21468,21459],{"class":768},[727,21470,21471],{"class":737},"\"email\"",[727,21473,21454],{"class":768},[727,21475,8883],{"class":1882},[727,21477,21478],{"class":768},"]});\n",[727,21480,21481],{"class":729,"line":1973},[727,21482,2633],{"class":768},[727,21484,21485],{"class":729,"line":2052},[727,21486,3554],{"class":768},[727,21488,21489,21491],{"class":729,"line":2058},[727,21490,17377],{"class":1986},[727,21492,21493],{"class":768}," formatted_data;\n",[727,21495,21496],{"class":729,"line":2064},[727,21497,2639],{"class":768},[14,21499,21500,21501,21504],{},"Finally, we want to send the data to Supabase. There isn't anything that needs to be changed here, but you may want to use the ",[90,21502,21503],{},"result"," in later steps of your automation, you'll need to return this value.",[719,21506,21508],{"className":756,"code":21507,"language":758,"meta":494,"style":494},"const sendToSupabase = async () => {\n    try {\n        const response = await fetch(supabase_url, {\n            method: 'POST',\n            headers: {\n                'apikey': api_key,\n              'Authorization': `Bearer ${api_key}`,\n              'Content-Type': 'application\u002Fjson'\n            },\n            body: JSON.stringify(format(ogData))\n        });\n                               \n        if (!response.ok) {\n            console.error(\"Something went wrong with response\", response); \n            return;\n        }\n      \n        const result = await response.json();\n        console.log(result);\n    } catch (error) {\n        console.error(\"Something went wrong\", error);\n    }\n}\n",[90,21509,21510,21527,21533,21548,21556,21560,21568,21584,21593,21597,21615,21619,21624,21634,21646,21652,21656,21660,21676,21684,21692,21704,21708],{"__ignoreMap":494},[727,21511,21512,21514,21517,21519,21521,21523,21525],{"class":729,"line":730},[727,21513,2315],{"class":1986},[727,21515,21516],{"class":2376}," sendToSupabase",[727,21518,2321],{"class":1986},[727,21520,2382],{"class":1986},[727,21522,2385],{"class":768},[727,21524,2388],{"class":1986},[727,21526,2391],{"class":768},[727,21528,21529,21531],{"class":729,"line":498},[727,21530,2396],{"class":1986},[727,21532,2391],{"class":768},[727,21534,21535,21537,21539,21541,21543,21545],{"class":729,"line":495},[727,21536,2403],{"class":1986},[727,21538,2093],{"class":1882},[727,21540,2321],{"class":1986},[727,21542,2410],{"class":1986},[727,21544,2413],{"class":2376},[727,21546,21547],{"class":768},"(supabase_url, {\n",[727,21549,21550,21552,21554],{"class":729,"line":1895},[727,21551,2421],{"class":768},[727,21553,2424],{"class":737},[727,21555,2427],{"class":768},[727,21557,21558],{"class":729,"line":1901},[727,21559,2432],{"class":768},[727,21561,21562,21565],{"class":729,"line":1973},[727,21563,21564],{"class":737},"                'apikey'",[727,21566,21567],{"class":768},": api_key,\n",[727,21569,21570,21573,21575,21577,21580,21582],{"class":729,"line":2052},[727,21571,21572],{"class":737},"              'Authorization'",[727,21574,1995],{"class":768},[727,21576,17038],{"class":737},[727,21578,21579],{"class":768},"api_key",[727,21581,2448],{"class":737},[727,21583,2427],{"class":768},[727,21585,21586,21589,21591],{"class":729,"line":2058},[727,21587,21588],{"class":737},"              'Content-Type'",[727,21590,1995],{"class":768},[727,21592,17055],{"class":737},[727,21594,21595],{"class":729,"line":2064},[727,21596,2465],{"class":768},[727,21598,21599,21601,21603,21605,21607,21609,21612],{"class":729,"line":2087},[727,21600,2470],{"class":768},[727,21602,9620],{"class":1882},[727,21604,44],{"class":768},[727,21606,9625],{"class":2376},[727,21608,2542],{"class":768},[727,21610,21611],{"class":2376},"format",[727,21613,21614],{"class":768},"(ogData))\n",[727,21616,21617],{"class":729,"line":2140},[727,21618,2511],{"class":768},[727,21620,21621],{"class":729,"line":2154},[727,21622,21623],{"class":768},"                               \n",[727,21625,21626,21628,21630,21632],{"class":729,"line":1529},[727,21627,2521],{"class":1986},[727,21629,2524],{"class":768},[727,21631,2527],{"class":1986},[727,21633,2530],{"class":768},[727,21635,21636,21638,21640,21642,21644],{"class":729,"line":2178},[727,21637,2536],{"class":768},[727,21639,2539],{"class":2376},[727,21641,2542],{"class":768},[727,21643,2545],{"class":737},[727,21645,2887],{"class":768},[727,21647,21648,21650],{"class":729,"line":2187},[727,21649,2554],{"class":1986},[727,21651,2327],{"class":768},[727,21653,21654],{"class":729,"line":2533},[727,21655,2562],{"class":768},[727,21657,21658],{"class":729,"line":2551},[727,21659,2516],{"class":768},[727,21661,21662,21664,21666,21668,21670,21672,21674],{"class":729,"line":2559},[727,21663,2403],{"class":1986},[727,21665,2575],{"class":1882},[727,21667,2321],{"class":1986},[727,21669,2410],{"class":1986},[727,21671,2582],{"class":768},[727,21673,2585],{"class":2376},[727,21675,2588],{"class":768},[727,21677,21678,21680,21682],{"class":729,"line":2565},[727,21679,2594],{"class":768},[727,21681,2597],{"class":2376},[727,21683,2600],{"class":768},[727,21685,21686,21688,21690],{"class":729,"line":2570},[727,21687,2606],{"class":768},[727,21689,2609],{"class":1986},[727,21691,2612],{"class":768},[727,21693,21694,21696,21698,21700,21702],{"class":729,"line":2591},[727,21695,2594],{"class":768},[727,21697,2539],{"class":2376},[727,21699,2542],{"class":768},[727,21701,2624],{"class":737},[727,21703,2627],{"class":768},[727,21705,21706],{"class":729,"line":2603},[727,21707,2633],{"class":768},[727,21709,21710],{"class":729,"line":2615},[727,21711,2639],{"class":768},[14,21713,21714,21715,21718],{},"To use this as is, call the ",[90,21716,21717],{},"sendToSupabase"," function at the end of your script.",[719,21720,21722],{"className":756,"code":21721,"language":758,"meta":494,"style":494},"sendToSupabase();\n",[90,21723,21724],{"__ignoreMap":494},[727,21725,21726,21728],{"class":729,"line":730},[727,21727,21717],{"class":2376},[727,21729,2588],{"class":768},[14,21731,21732,21733,21735],{},"If you are using a large amount of data and you are struggling to pass it all in a single call, you may require the use of batching - breaking down the data and sending it as smaller chunks. This can also help work around the possibility of Supabase not writing rows due to an issue with a single row of data. We will need to use a slightly modified ",[90,21734,21717],{}," function:",[719,21737,21739],{"className":756,"code":21738,"language":758,"meta":494,"style":494},"\u002F\u002F Change this to meet your requirements.\nconst batchSize = 10;\n\nconst sendToSupabase = async () => {\n    for (var i = 0; i \u003C ogData.length; i += batchSize) {\n        try {\n            const response = await fetch(supabase_url, {\n                method: 'POST',\n                headers: {\n                    'apikey': api_key,\n                    'Authorization': `Bearer ${api_key}`,\n                    'Content-Type': 'application\u002Fjson'\n                },\n                body: JSON.stringify(format(ogData.slice(i, i + batchSize)))\n            });\n                               \n            if (!response.ok) {\n                console.error(\"Something went wrong with response\", response); \n                return;\n            }\n      \n            const result = await response.json();\n            console.log(result);\n        } catch (e) {\n            console.log(\"Something went wrong\", e);\n        }\n    }\n}\n",[90,21740,21741,21746,21758,21762,21778,21807,21814,21829,21838,21843,21850,21865,21874,21879,21906,21911,21915,21926,21939,21946,21950,21954,21970,21978,21988,22001,22005,22009],{"__ignoreMap":494},[727,21742,21743],{"class":729,"line":730},[727,21744,21745],{"class":2920},"\u002F\u002F Change this to meet your requirements.\n",[727,21747,21748,21750,21752,21754,21756],{"class":729,"line":498},[727,21749,2315],{"class":1986},[727,21751,18199],{"class":1882},[727,21753,2321],{"class":1986},[727,21755,18105],{"class":1882},[727,21757,2327],{"class":768},[727,21759,21760],{"class":729,"line":495},[727,21761,1898],{"emptyLinePlaceholder":522},[727,21763,21764,21766,21768,21770,21772,21774,21776],{"class":729,"line":1895},[727,21765,2315],{"class":1986},[727,21767,21516],{"class":2376},[727,21769,2321],{"class":1986},[727,21771,2382],{"class":1986},[727,21773,2385],{"class":768},[727,21775,2388],{"class":1986},[727,21777,2391],{"class":768},[727,21779,21780,21782,21784,21786,21788,21790,21792,21794,21796,21799,21801,21803,21805],{"class":729,"line":1901},[727,21781,21406],{"class":1986},[727,21783,2524],{"class":768},[727,21785,4964],{"class":1986},[727,21787,18119],{"class":768},[727,21789,4970],{"class":1986},[727,21791,18124],{"class":1882},[727,21793,18127],{"class":768},[727,21795,18130],{"class":1986},[727,21797,21798],{"class":768}," ogData.",[727,21800,18136],{"class":1882},[727,21802,18127],{"class":768},[727,21804,18141],{"class":1986},[727,21806,18144],{"class":768},[727,21808,21809,21812],{"class":729,"line":1973},[727,21810,21811],{"class":1986},"        try",[727,21813,2391],{"class":768},[727,21815,21816,21819,21821,21823,21825,21827],{"class":729,"line":2052},[727,21817,21818],{"class":1986},"            const",[727,21820,2093],{"class":1882},[727,21822,2321],{"class":1986},[727,21824,2410],{"class":1986},[727,21826,2413],{"class":2376},[727,21828,21547],{"class":768},[727,21830,21831,21834,21836],{"class":729,"line":2058},[727,21832,21833],{"class":768},"                method: ",[727,21835,2424],{"class":737},[727,21837,2427],{"class":768},[727,21839,21840],{"class":729,"line":2064},[727,21841,21842],{"class":768},"                headers: {\n",[727,21844,21845,21848],{"class":729,"line":2087},[727,21846,21847],{"class":737},"                    'apikey'",[727,21849,21567],{"class":768},[727,21851,21852,21855,21857,21859,21861,21863],{"class":729,"line":2140},[727,21853,21854],{"class":737},"                    'Authorization'",[727,21856,1995],{"class":768},[727,21858,17038],{"class":737},[727,21860,21579],{"class":768},[727,21862,2448],{"class":737},[727,21864,2427],{"class":768},[727,21866,21867,21870,21872],{"class":729,"line":2154},[727,21868,21869],{"class":737},"                    'Content-Type'",[727,21871,1995],{"class":768},[727,21873,17055],{"class":737},[727,21875,21876],{"class":729,"line":1529},[727,21877,21878],{"class":768},"                },\n",[727,21880,21881,21884,21886,21888,21890,21892,21894,21897,21899,21901,21903],{"class":729,"line":2178},[727,21882,21883],{"class":768},"                body: ",[727,21885,9620],{"class":1882},[727,21887,44],{"class":768},[727,21889,9625],{"class":2376},[727,21891,2542],{"class":768},[727,21893,21611],{"class":2376},[727,21895,21896],{"class":768},"(ogData.",[727,21898,18158],{"class":2376},[727,21900,18161],{"class":768},[727,21902,8486],{"class":1986},[727,21904,21905],{"class":768}," batchSize)))\n",[727,21907,21908],{"class":729,"line":2187},[727,21909,21910],{"class":768},"            });\n",[727,21912,21913],{"class":729,"line":2533},[727,21914,21623],{"class":768},[727,21916,21917,21920,21922,21924],{"class":729,"line":2551},[727,21918,21919],{"class":1986},"            if",[727,21921,2524],{"class":768},[727,21923,2527],{"class":1986},[727,21925,2530],{"class":768},[727,21927,21928,21931,21933,21935,21937],{"class":729,"line":2559},[727,21929,21930],{"class":768},"                console.",[727,21932,2539],{"class":2376},[727,21934,2542],{"class":768},[727,21936,2545],{"class":737},[727,21938,2887],{"class":768},[727,21940,21941,21944],{"class":729,"line":2565},[727,21942,21943],{"class":1986},"                return",[727,21945,2327],{"class":768},[727,21947,21948],{"class":729,"line":2570},[727,21949,2856],{"class":768},[727,21951,21952],{"class":729,"line":2591},[727,21953,2516],{"class":768},[727,21955,21956,21958,21960,21962,21964,21966,21968],{"class":729,"line":2603},[727,21957,21818],{"class":1986},[727,21959,2575],{"class":1882},[727,21961,2321],{"class":1986},[727,21963,2410],{"class":1986},[727,21965,2582],{"class":768},[727,21967,2585],{"class":2376},[727,21969,2588],{"class":768},[727,21971,21972,21974,21976],{"class":729,"line":2615},[727,21973,2536],{"class":768},[727,21975,2597],{"class":2376},[727,21977,2600],{"class":768},[727,21979,21980,21983,21985],{"class":729,"line":2630},[727,21981,21982],{"class":768},"        } ",[727,21984,2609],{"class":1986},[727,21986,21987],{"class":768}," (e) {\n",[727,21989,21990,21992,21994,21996,21998],{"class":729,"line":2636},[727,21991,2536],{"class":768},[727,21993,2597],{"class":2376},[727,21995,2542],{"class":768},[727,21997,2624],{"class":737},[727,21999,22000],{"class":768},", e);\n",[727,22002,22003],{"class":729,"line":2642},[727,22004,2562],{"class":768},[727,22006,22007],{"class":729,"line":2647},[727,22008,2633],{"class":768},[727,22010,22011],{"class":729,"line":4657},[727,22012,2639],{"class":768},[14,22014,22015,22016,21718],{},"To use this, call the ",[90,22017,21717],{},[719,22019,22020],{"className":756,"code":21721,"language":758,"meta":494,"style":494},[90,22021,22022],{"__ignoreMap":494},[727,22023,22024,22026],{"class":729,"line":730},[727,22025,21717],{"class":2376},[727,22027,2588],{"class":768},[639,22029,22031],{"id":22030},"read-data-from-a-supabase-table","Read data from a Supabase table",[11,22033],{},[14,22035,22036,22037,14647],{},"Reading data from a Supabase table allows you to make use of this data within your axiom.ai automations. To get started, add a ",[322,22038,2301],{"href":2300},[14,22040,22041],{},"We will first create variables to store key information used throughout the script. We will break down this script into sections, but this should all be combined into a single script in a single \"Write Javascript\" step.",[719,22043,22045],{"className":756,"code":22044,"language":758,"meta":494,"style":494},"\u002F\u002F Replace any item in \u003C> with your data.\nconst supabase_url = \"\u003CPROJECT_URL>\u002Frest\u002Fv1\u002F\u003CTABLE_NAME>\";\nconst api_key = \"\u003CAPI_KEY>\";\n",[90,22046,22047,22052,22064],{"__ignoreMap":494},[727,22048,22049],{"class":729,"line":730},[727,22050,22051],{"class":2920},"\u002F\u002F Replace any item in \u003C> with your data.\n",[727,22053,22054,22056,22058,22060,22062],{"class":729,"line":498},[727,22055,2315],{"class":1986},[727,22057,21342],{"class":1882},[727,22059,2321],{"class":1986},[727,22061,21347],{"class":737},[727,22063,2327],{"class":768},[727,22065,22066,22068,22070,22072,22074],{"class":729,"line":495},[727,22067,2315],{"class":1986},[727,22069,21356],{"class":1882},[727,22071,2321],{"class":1986},[727,22073,21361],{"class":737},[727,22075,2327],{"class":768},[14,22077,22078,22079,22082],{},"Your ",[90,22080,22081],{},"supabase_url"," variable will need to be slightly modified, depending on what data you are looking to return, for example:",[80,22084,22085,22088,22091],{},[83,22086,22087],{},"Return all columns: \"\u003CPROJECT_URL>\u002Frest\u002Fv1\u002F\u003CTABLE_NAME>?select=*\"",[83,22089,22090],{},"Return specific columns: \"\u003CPROJECT_URL>\u002Frest\u002Fv1\u002F\u003CTABLE_NAME>?select=some_column,other_column\"",[83,22092,22093,22094,44],{},"Filtered: \"\u003CPROJECT_URL>\u002Frest\u002Fv1\u002F\u003CTABLE_NAME>?id=eq.1\", ",[322,22095,22098],{"href":22096,"rel":22097},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fjavascript\u002Fusing-filters",[2245],"learn more",[14,22100,22101],{},"Next, we will want to retrieve the data from your Supabase database. You won't need to make any changes to this code:",[719,22103,22105],{"className":756,"code":22104,"language":758,"meta":494,"style":494},"const retrieveData = async () => {\n    try {\n      const response = await fetch(supabase_url, {\n        headers: {\n          'apikey': api_key,\n          'Authorization': `Bearer ${api_key}`\n        }\n      });\n        \n      if (!response.ok) {\n        console.error(\"Something went wrong\");\n        return;\n      }\n      \n      const result = await response.json();\n      return result;\n    } catch(e) {\n      console.error(\"Something went wrong\", e);\n    }\n}\n\nconst data = await retrieveData();\n",[90,22106,22107,22124,22130,22144,22149,22156,22170,22174,22179,22183,22194,22206,22212,22217,22221,22237,22245,22254,22266,22270,22274,22278],{"__ignoreMap":494},[727,22108,22109,22111,22114,22116,22118,22120,22122],{"class":729,"line":730},[727,22110,2315],{"class":1986},[727,22112,22113],{"class":2376}," retrieveData",[727,22115,2321],{"class":1986},[727,22117,2382],{"class":1986},[727,22119,2385],{"class":768},[727,22121,2388],{"class":1986},[727,22123,2391],{"class":768},[727,22125,22126,22128],{"class":729,"line":498},[727,22127,2396],{"class":1986},[727,22129,2391],{"class":768},[727,22131,22132,22134,22136,22138,22140,22142],{"class":729,"line":495},[727,22133,17096],{"class":1986},[727,22135,2093],{"class":1882},[727,22137,2321],{"class":1986},[727,22139,2410],{"class":1986},[727,22141,2413],{"class":2376},[727,22143,21547],{"class":768},[727,22145,22146],{"class":729,"line":1895},[727,22147,22148],{"class":768},"        headers: {\n",[727,22150,22151,22154],{"class":729,"line":1901},[727,22152,22153],{"class":737},"          'apikey'",[727,22155,21567],{"class":768},[727,22157,22158,22161,22163,22165,22167],{"class":729,"line":1973},[727,22159,22160],{"class":737},"          'Authorization'",[727,22162,1995],{"class":768},[727,22164,17038],{"class":737},[727,22166,21579],{"class":768},[727,22168,22169],{"class":737},"}`\n",[727,22171,22172],{"class":729,"line":2052},[727,22173,2562],{"class":768},[727,22175,22176],{"class":729,"line":2058},[727,22177,22178],{"class":768},"      });\n",[727,22180,22181],{"class":729,"line":2064},[727,22182,3185],{"class":768},[727,22184,22185,22188,22190,22192],{"class":729,"line":2087},[727,22186,22187],{"class":1986},"      if",[727,22189,2524],{"class":768},[727,22191,2527],{"class":1986},[727,22193,2530],{"class":768},[727,22195,22196,22198,22200,22202,22204],{"class":729,"line":2140},[727,22197,2594],{"class":768},[727,22199,2539],{"class":2376},[727,22201,2542],{"class":768},[727,22203,2624],{"class":737},[727,22205,5005],{"class":768},[727,22207,22208,22210],{"class":729,"line":2154},[727,22209,2143],{"class":1986},[727,22211,2327],{"class":768},[727,22213,22214],{"class":729,"line":1529},[727,22215,22216],{"class":768},"      }\n",[727,22218,22219],{"class":729,"line":2178},[727,22220,2516],{"class":768},[727,22222,22223,22225,22227,22229,22231,22233,22235],{"class":729,"line":2187},[727,22224,17096],{"class":1986},[727,22226,2575],{"class":1882},[727,22228,2321],{"class":1986},[727,22230,2410],{"class":1986},[727,22232,2582],{"class":768},[727,22234,2585],{"class":2376},[727,22236,2588],{"class":768},[727,22238,22239,22242],{"class":729,"line":2533},[727,22240,22241],{"class":1986},"      return",[727,22243,22244],{"class":768}," result;\n",[727,22246,22247,22249,22251],{"class":729,"line":2551},[727,22248,2606],{"class":768},[727,22250,2609],{"class":1986},[727,22252,22253],{"class":768},"(e) {\n",[727,22255,22256,22258,22260,22262,22264],{"class":729,"line":2559},[727,22257,17114],{"class":768},[727,22259,2539],{"class":2376},[727,22261,2542],{"class":768},[727,22263,2624],{"class":737},[727,22265,22000],{"class":768},[727,22267,22268],{"class":729,"line":2565},[727,22269,2633],{"class":768},[727,22271,22272],{"class":729,"line":2570},[727,22273,2639],{"class":768},[727,22275,22276],{"class":729,"line":2591},[727,22277,1898],{"emptyLinePlaceholder":522},[727,22279,22280,22282,22285,22287,22289,22291],{"class":729,"line":2603},[727,22281,2315],{"class":1986},[727,22283,22284],{"class":1882}," data",[727,22286,2321],{"class":1986},[727,22288,2410],{"class":1986},[727,22290,22113],{"class":2376},[727,22292,2588],{"class":768},[14,22294,5070,22295,22297],{},[90,22296,1838],{}," variable should now contain the data from your database. We'll need to change the format of this data and return it to allow your automation to use it, we'll use the following code, again, no changes are required:",[719,22299,22301],{"className":756,"code":22300,"language":758,"meta":494,"style":494},"const format = () => {\n  const formatted_data = [];\n  for (var i = 0; i \u003C data.length; i++) {\n    formatted_data.push(Object.values(data[i]))\n  }\n  \n  return formatted_data;\n}\n\nreturn format();\n",[90,22302,22303,22317,22328,22356,22371,22375,22379,22385,22389,22393],{"__ignoreMap":494},[727,22304,22305,22307,22309,22311,22313,22315],{"class":729,"line":730},[727,22306,2315],{"class":1986},[727,22308,21378],{"class":2376},[727,22310,2321],{"class":1986},[727,22312,2385],{"class":768},[727,22314,2388],{"class":1986},[727,22316,2391],{"class":768},[727,22318,22319,22322,22324,22326],{"class":729,"line":498},[727,22320,22321],{"class":1986},"  const",[727,22323,21397],{"class":1882},[727,22325,2321],{"class":1986},[727,22327,4973],{"class":768},[727,22329,22330,22332,22334,22336,22338,22340,22342,22344,22346,22348,22350,22352,22354],{"class":729,"line":495},[727,22331,18112],{"class":1986},[727,22333,2524],{"class":768},[727,22335,4964],{"class":1986},[727,22337,18119],{"class":768},[727,22339,4970],{"class":1986},[727,22341,18124],{"class":1882},[727,22343,18127],{"class":768},[727,22345,18130],{"class":1986},[727,22347,21423],{"class":768},[727,22349,18136],{"class":1882},[727,22351,21428],{"class":768},[727,22353,21431],{"class":1986},[727,22355,16992],{"class":768},[727,22357,22358,22361,22363,22366,22368],{"class":729,"line":1895},[727,22359,22360],{"class":768},"    formatted_data.",[727,22362,5043],{"class":2376},[727,22364,22365],{"class":768},"(Object.",[727,22367,2931],{"class":2376},[727,22369,22370],{"class":768},"(data[i]))\n",[727,22372,22373],{"class":729,"line":1901},[727,22374,9712],{"class":768},[727,22376,22377],{"class":729,"line":1973},[727,22378,3554],{"class":768},[727,22380,22381,22383],{"class":729,"line":2052},[727,22382,17377],{"class":1986},[727,22384,21493],{"class":768},[727,22386,22387],{"class":729,"line":2058},[727,22388,2639],{"class":768},[727,22390,22391],{"class":729,"line":2064},[727,22392,1898],{"emptyLinePlaceholder":522},[727,22394,22395,22397,22399],{"class":729,"line":2087},[727,22396,2972],{"class":1986},[727,22398,21378],{"class":2376},[727,22400,2588],{"class":768},[14,22402,22403,22404,22406,22407,22410,22411,22413],{},"Your data will now be stored in the ",[90,22405,2982],{}," data token that is output from the \"Write Javascript\" step. Learn more about ",[322,22408,22409],{"href":2670},"How to pass data between steps in your automation",". Use the ",[322,22412,114],{"href":2296}," step to loop through the rows of data returned.",[21,22415,22417],{"id":22416},"triggering-an-axiomai-automation-from-a-supabase-database-event","Triggering an axiom.ai automation from a Supabase database event",[11,22419],{},[14,22421,22422,22423,3342],{},"Supabase offers the ability to trigger webhooks based on events happening within your database. Triggering axiom.ai automations with webhooks requires a paid plan, see ",[322,22424,3341],{"href":3340},[14,22426,21301,22427,22429,22430,44],{},[322,22428,8895],{"href":6958}," step to your automation - we recommend adding this as the first step of your automation. For more information on setting test data, see ",[322,22431,8895],{"href":6958},[14,22433,22434],{},"In Supabase, head to your Dashboard, then into \"Integrations\" and \"Database Webhooks\" - it should already be installed. Click \"Create a new hook\" to create a new webhook. Configure as instructed by the user interface, specifically setting the following fields with axiom.ai data:",[77,22436,22437],{},[555,22438,22439,22445,22453],{},[83,22440,22441,22444],{},[29,22442,22443],{},"HTTP Request - Method:"," Set to 'POST'.",[83,22446,22447,22450,22451,44],{},[29,22448,22449],{},"HTTP Request - URL:"," the axiom.ai endpoint is ",[90,22452,581],{},[83,22454,22455,22458],{},[29,22456,22457],{},"Headers:"," often pre-configured, 'Content-Type': 'application\u002Fjson'.",[14,22460,22461],{},"Note, it's not currently possible to send data to axiom.ai with these webhooks - however, an automation that retrieves data from Supabase can be triggered using this method. Supabase webhooks are for notification purpose only.",[21,22463,776],{"id":775},[11,22465],{},[14,22467,22468,22469,1230],{},"To test adding data to Supabase, click \"Run\" within the Builder - open up your Supabase dashboard and open the table to view any changes. To test retrieving data from Supabase, add an output for your data, for example, a ",[322,22470,3303],{"href":3302},[14,22472,3306],{},[21,22474,796],{"id":795},[11,22476],{},[14,22478,22479],{},"Combining Supabase and axiom.ai allows you more flexibility on your data storage to power up your automations. Using Supabase opens up the possibility to connect external databases using their integrations such as S3, Stripe, Firebase and much more. We are excited to see what you build!",[11,22481],{},[14,22483,22484],{},"Information accurate as of November 2024.",[811,22486,22487],{},"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 .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 .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}",{"title":494,"searchDepth":495,"depth":495,"links":22489},[22490,22491,22495,22496,22497],{"id":545,"depth":498,"text":546},{"id":21283,"depth":498,"text":21284,"children":22492},[22493,22494],{"id":21292,"depth":495,"text":21293},{"id":22030,"depth":495,"text":22031},{"id":22416,"depth":498,"text":22417},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"Learn how to automatically send data to your Supabase databases and trigger your axiom.ai automations using triggers.",{"type":90,"format":77,"intent_type":22500,"intent":827,"tags":22501,"platfrom":22502},"wokflow",[829,830,21214],[21233],"\u002Fguides\u002Fsupabase",{"title":21222,"description":22498},"guides\u002Fsupabase","3QWB2e30Zph2x51OK35CFrTWcGp5GoCSUP_TRpnm_bI",{"id":22508,"title":22509,"body":22510,"date":523,"description":22876,"extension":506,"meta":22877,"navigation":522,"order":523,"path":22880,"seo":22881,"stem":22882,"__hash__":22883},"guides\u002Fguides\u002Ftadabase.md","How to automate Tadabase with axiom.ai",{"type":8,"value":22511,"toc":22865},[22512,22514,22522,22524,22526,22551,22559,22563,22566,22570,22579,22585,22588,22592,22595,22615,22649,22654,22658,22661,22677,22760,22766,22770,22774,22777,22780,22796,22830,22834,22836,22839,22846,22852,22854,22857,22863],[11,22513],{},[14,22515,22516,22521],{},[322,22517,22520],{"href":22518,"rel":22519},"https:\u002F\u002Ftadabase.io",[2245],"Tadabase"," allows you to built custom applications and databases to power your workflows. When combined with axiom.ai, it's easy to send data to your Tadabase data tables and update the data as needed with their webhook systems.",[21,22523,546],{"id":545},[14,22525,21241],{},[77,22527,22528],{},[555,22529,22530,22533,22536,22539,22548],{},[83,22531,22532],{},"Sign up to Tadabase.",[83,22534,22535],{},"Create a new application.",[83,22537,22538],{},"Create a new data table.",[83,22540,22541,22542,22547],{},"Sign up to ",[322,22543,22546],{"href":22544,"rel":22545},"https:\u002F\u002Fcatcher.tadabase.io",[2245],"Tadabase's Webhook Catcher"," (using the same email as your Tadabase account).",[83,22549,22550],{},"The \"App ID\", \"API Key\" and \"API Secret\" for the application (\"Settings\" → \"API Keys\" → \"Generate New Key\").",[14,22552,22553,22554,12252],{},"More details on how to do the steps above can be found in the ",[322,22555,22558],{"href":22556,"rel":22557},"https:\u002F\u002Fdocs.tadabase.io\u002Fgetting-started\u002Farticle\u002Fgetting-started-with-tadabase",[2245],"Getting Started with Tadabase",[21,22560,22562],{"id":22561},"working-with-tadabase-data-in-axiomai","Working with Tadabase data in axiom.ai",[14,22564,22565],{},"For demonstration purposes, we will be making use of a simple \"users\" data table throughout this guide - you will need to update any code or triggers used in this guide to your own use case and data table fields.",[639,22567,22569],{"id":22568},"creating-a-new-webhook","Creating a new webhook",[14,22571,22572,22573,22578],{},"Tadabase has a great guide on how to set up your application to be ready to receive webhooks, you'll find their ",[322,22574,22577],{"href":22575,"rel":22576},"https:\u002F\u002Fdocs.tadabase.io\u002Fwebhooks\u002Farticle\u002Fincoming-webhooks",[2245],"Incoming Webhooks"," documentation on their website. We recommend following this before continuing this guide.",[14,22580,22581,22582,44],{},"You should end up with a webhook URL similar to the following: ",[90,22583,22584],{},"https:\u002F\u002Fcatcher.tadabase.io\u002Fwebhook\u002F\u003CID>",[14,22586,22587],{},"You'll want to use the \"Field Slug\" for the fields that you wish to edit or update - you can find these by heading into the data table, then into the \"Fields\" tab.",[639,22589,22591],{"id":22590},"creating-a-single-record","Creating a single record",[14,22593,22594],{},"To create a single record, you'll need the webhook URL that was created in the previous section. Then, in your axiom.ai automation set up your automation as normal, once you are ready to send your data, add the following step:",[77,22596,22597],{},[555,22598,22599,22603,22609],{},[83,22600,8350,22601,14647],{},[322,22602,7722],{"href":18400},[83,22604,22605,22606,22608],{},"Add the webhook URL in the ",[90,22607,577],{}," field.",[83,22610,22611,22612,22614],{},"Configure the ",[90,22613,16510],{}," field based on your data table fields. See an example below.",[719,22616,22618],{"className":7732,"code":22617,"language":2585,"meta":494,"style":494},"{\n    \"name\": \"Jane Doe\",\n    \"email\": \"example@axiom.ai\"\n}\n",[90,22619,22620,22624,22635,22645],{"__ignoreMap":494},[727,22621,22622],{"class":729,"line":730},[727,22623,7740],{"class":768},[727,22625,22626,22628,22630,22633],{"class":729,"line":498},[727,22627,9548],{"class":7745},[727,22629,1995],{"class":768},[727,22631,22632],{"class":737},"\"Jane Doe\"",[727,22634,2427],{"class":768},[727,22636,22637,22640,22642],{"class":729,"line":495},[727,22638,22639],{"class":7745},"    \"email\"",[727,22641,1995],{"class":768},[727,22643,22644],{"class":737},"\"example@axiom.ai\"\n",[727,22646,22647],{"class":729,"line":1895},[727,22648,2639],{"class":768},[14,22650,22651,22652,12252],{},"Remember, you can use the \"Insert data\" button to insert data tokens from your automation, learn more in our ",[322,22653,7795],{"href":2670},[639,22655,22657],{"id":22656},"creating-multiple-records","Creating multiple records",[14,22659,22660],{},"To create multiple records, you'll need the webhook URL that was created in the previous section. You'll need to have the field mapping of your webhook set to \"Multi-value Webhook\" - you can edit this if it's not already set. Then, in your axiom.ai automation set up your automation as normal, once you are ready to send your data, add the following step:",[77,22662,22663],{},[555,22664,22665,22669,22673],{},[83,22666,8350,22667,14647],{},[322,22668,7722],{"href":18400},[83,22670,22605,22671,22608],{},[90,22672,577],{},[83,22674,22611,22675,22614],{},[90,22676,16510],{},[719,22678,22680],{"className":7732,"code":22679,"language":2585,"meta":494,"style":494},"{\n    \"\u003CMAPPING_FIELD>\": [\n        {\n            \"name\": \"Jane Doe\",\n            \"email\": \"example@axiom.ai\"\n        },\n        {\n            \"name\": \"John Smith\",\n            \"email\": \"example@axiom.ai\"\n        }\n    ]\n}\n",[90,22681,22682,22686,22694,22699,22710,22719,22724,22728,22739,22747,22751,22756],{"__ignoreMap":494},[727,22683,22684],{"class":729,"line":730},[727,22685,7740],{"class":768},[727,22687,22688,22691],{"class":729,"line":498},[727,22689,22690],{"class":7745},"    \"\u003CMAPPING_FIELD>\"",[727,22692,22693],{"class":768},": [\n",[727,22695,22696],{"class":729,"line":495},[727,22697,22698],{"class":768},"        {\n",[727,22700,22701,22704,22706,22708],{"class":729,"line":1895},[727,22702,22703],{"class":7745},"            \"name\"",[727,22705,1995],{"class":768},[727,22707,22632],{"class":737},[727,22709,2427],{"class":768},[727,22711,22712,22715,22717],{"class":729,"line":1901},[727,22713,22714],{"class":7745},"            \"email\"",[727,22716,1995],{"class":768},[727,22718,22644],{"class":737},[727,22720,22721],{"class":729,"line":1973},[727,22722,22723],{"class":768},"        },\n",[727,22725,22726],{"class":729,"line":2052},[727,22727,22698],{"class":768},[727,22729,22730,22732,22734,22737],{"class":729,"line":2058},[727,22731,22703],{"class":7745},[727,22733,1995],{"class":768},[727,22735,22736],{"class":737},"\"John Smith\"",[727,22738,2427],{"class":768},[727,22740,22741,22743,22745],{"class":729,"line":2064},[727,22742,22714],{"class":7745},[727,22744,1995],{"class":768},[727,22746,22644],{"class":737},[727,22748,22749],{"class":729,"line":2087},[727,22750,2562],{"class":768},[727,22752,22753],{"class":729,"line":2140},[727,22754,22755],{"class":768},"    ]\n",[727,22757,22758],{"class":729,"line":2154},[727,22759,2639],{"class":768},[14,22761,5070,22762,22765],{},[90,22763,22764],{},"\u003CMAPPING_FIELD>"," should correspond with the field that you inserted into the \"Multi-value Webhook\" field in the field mapping section of your webhook.",[14,22767,22651,22768,12252],{},[322,22769,7795],{"href":2670},[639,22771,22773],{"id":22772},"updating-a-record","Updating a record",[14,22775,22776],{},"To create multiple records, you'll need the webhook URL that was created in the previous section. You'll need to edit your webhook and set the \"Upon Receiving Webhook\" option to \"Update an Existing Record By ID\" or \"Update an Existing Record by Field\", depending on your needs. Optionally, you can set the webhook to \"create new if record not found\". Set the field that the webhook should match into the input, for example, \"id\" set to \"Dynamic\".",[14,22778,22779],{},"Then, in your axiom.ai automation set up your automation as normal, once you are ready to send your data, add the following step:",[77,22781,22782],{},[555,22783,22784,22788,22792],{},[83,22785,8350,22786,14647],{},[322,22787,7722],{"href":18400},[83,22789,22605,22790,22608],{},[29,22791,577],{},[83,22793,22611,22794,22614],{},[29,22795,16510],{},[719,22797,22799],{"className":7732,"code":22798,"language":2585,"meta":494,"style":494},"{\n    \"id\": \"4MXQJdrZ6v\",\n    \"name\": \"John Smith\"\n}\n",[90,22800,22801,22805,22817,22826],{"__ignoreMap":494},[727,22802,22803],{"class":729,"line":730},[727,22804,7740],{"class":768},[727,22806,22807,22810,22812,22815],{"class":729,"line":498},[727,22808,22809],{"class":7745},"    \"id\"",[727,22811,1995],{"class":768},[727,22813,22814],{"class":737},"\"4MXQJdrZ6v\"",[727,22816,2427],{"class":768},[727,22818,22819,22821,22823],{"class":729,"line":495},[727,22820,9548],{"class":7745},[727,22822,1995],{"class":768},[727,22824,22825],{"class":737},"\"John Smith\"\n",[727,22827,22828],{"class":729,"line":1895},[727,22829,2639],{"class":768},[14,22831,22651,22832,12252],{},[322,22833,7795],{"href":2670},[21,22835,776],{"id":775},[14,22837,22838],{},"To test your workflow, click \"Run\" in your axiom.ai automation. Tadabase takes a few minutes to process API calls so give it a few minutes, and then head to your data table to check if your data has been added.",[14,22840,22841,22842,22845],{},"If your data has not been added, navigate to your webhook in the ",[322,22843,22546],{"href":22544,"rel":22844},[2245]," where there is a section that details failed webhook requests - review these failed requests for more information on what the error may be.",[14,22847,22848,22849],{},"If there are errors within your automation, you'll find these in the builder, or in your run reports. Learn more about ",[322,22850,22851],{"href":3312},"How to Debug",[21,22853,796],{"id":795},[14,22855,22856],{},"Combining the automation powers of axiom.ai with the storage options offered by Tadabase offers you an abundance of opportunities to power up your workflow. There are many use cases for this workflow, such as storing the data that your automation scrapes, and then providing it to your team using a Tadabase web application interface.",[14,22858,22859,22862],{},[807,22860,22861],{},"Note",", it's not currently possible to use Tadabase's Outgoing Webhooks to trigger your axiom.ai automations from changes to your data tables - it's not currently possible to customise these webhooks to include the data that axiom.ai needs to trigger your automations. We hope that this changes in the future, but for now would recommend contacting their support team to log your feedback request.",[811,22864,7865],{},{"title":494,"searchDepth":495,"depth":495,"links":22866},[22867,22868,22874,22875],{"id":545,"depth":498,"text":546},{"id":22561,"depth":498,"text":22562,"children":22869},[22870,22871,22872,22873],{"id":22568,"depth":495,"text":22569},{"id":22590,"depth":495,"text":22591},{"id":22656,"depth":495,"text":22657},{"id":22772,"depth":495,"text":22773},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"Learn how to automatically send data to your Tadabase databases and trigger your axiom.ai automations using triggers.",{"type":90,"format":77,"intent_type":515,"intent":827,"tags":22878,"platfrom":22879},[829,830,21214],[22520],"\u002Fguides\u002Ftadabase",{"title":22509,"description":22876},"guides\u002Ftadabase","_cFNjxGk-vDSB7sAhmka_Q0nrME7lvBVsOExsf6KD_Y",{"id":22885,"title":22886,"body":22887,"date":523,"description":23107,"extension":506,"meta":23108,"navigation":522,"order":523,"path":23112,"seo":23113,"stem":23114,"__hash__":23115},"guides\u002Fguides\u002Ftransparency-report.md","How to scrape Google Transparency reports",{"type":8,"value":22888,"toc":23103},[22889,22891,22897,22900,22914,22932,22936,22938,22940,22943,22973,22977,22979,22996,23002],[11,22890],{},[14,22892,5070,22893,22896],{},[29,22894,22895],{},"Copyright"," section of the Google Transparency Report provides users insights into URLs removed from Google Search due to copyright infringement. It's possible to scrape and extract information about the flagged content, the entities requesting removal, and the reasons for delisting.",[14,22898,22899],{},"In this guide, you'll learn how to scrape copyright data from these reports into a Google Sheet using two web scrapers:",[77,22901,22902],{},[555,22903,22904,22911],{},[83,22905,22906,22907,22910],{},"The first web scraper will input search terms, extract links to ",[29,22908,22909],{},"\"Copyright Owners\"",", and save them to a Google Sheet.",[83,22912,22913],{},"The second web scraper will process the extracted links by visiting the pages, extracting data for \"Specified Domains\" and \"Reporting Organizations,\" and writing this information into the same or another Google Sheet.",[14,22915,3950,22916,450,22922,22928,22929],{},[29,22917,22918],{},[322,22919,22921],{"href":22920,"download":522},"\u002Fdocs\u002Fguides\u002Ftemplates\u002Faxiom_input_search_term_and_scrape_template.json","first",[29,22923,22924],{},[322,22925,22927],{"href":22926,"download":522},"\u002Fdocs\u002Fguides\u002Ftemplates\u002Faxiom_scraper_two-owners-data.json","second"," template featured in this guide. This template was correct at the time of creation but may require updating or customization to suit your specific use case. If you’re unsure how to upload it, ",[322,22930,22931],{"href":3454},"watch this video.",[592,22933],{"src":22934,"alt":22935},"\u002Fdocs\u002Fguides\u002Fexplore-the-data.webp","Scraping Google Transparency Report pages for content delistings due to copyright data.",[21,22937,546],{"id":545},[11,22939],{},[14,22941,22942],{},"To begin, create a Google Sheet and add search terms to input into the \"Search\" field.",[77,22944,22945],{},[80,22946,22947,22955,22961,22967],{},[83,22948,22949,22952,22953,5206],{},[29,22950,22951],{},"1. Create a new Google Sheet",": If you're logged into Google, type ",[90,22954,5205],{},[83,22956,22957,22960],{},[29,22958,22959],{},"2. Set up tab one",": Add your search terms to the first tab.",[83,22962,22963,22966],{},[29,22964,22965],{},"3. Set up tab two",": Name this second tab \"Copyright Owners.\"",[83,22968,22969,22972],{},[29,22970,22971],{},"4. Set up tab three",": Name this third tab \"Domain and Reporting Data.\"",[21,22974,22976],{"id":22975},"how-to-build-a-web-scraper-to-extract-copyright-owners","How to build a web scraper to extract 'copyright owners'",[11,22978],{},[14,22980,22981,22982,22987,22988,3436,22990,22992,22993,22995],{},"This web scraper extracts data from the ",[322,22983,22986],{"href":22984,"rel":22985},"https:\u002F\u002Ftransparencyreport.google.com\u002Fcopyright\u002Fexplore",[2245],"Copyright Removal Request Data"," search page. The bot inputs search terms and extracts links to \"Copyright Owners,\" saving them to a Google Sheet.\nTo get started, open ",[29,22989,3435],{},[29,22991,3439],{}," to use the no-code bot builder for creating the Google scraper. Then, click ",[29,22994,3443],{}," to begin.",[14,22997,3447,22998,3451,23000],{},[322,22999,514],{"href":22920,"download":522},[322,23001,3455],{"href":3454},[77,23003,23004],{},[80,23005,23006,23023,23043],{},[83,23007,23008,88,23010,23012],{},[29,23009,87],{},[90,23011,92],{},[80,23013,23014,23019],{},[83,23015,23016,23018],{},[90,23017,99],{},": Search for the Google Sheet you created in the \"Spreadsheet\" field. Once found, click to select.",[83,23020,23021,7975],{},[90,23022,105],{},[83,23024,23025,88,23027,23029],{},[29,23026,111],{},[90,23028,124],{},[80,23030,23031],{},[83,23032,23033,23035,23036,3731,23039,3554],{},[90,23034,131],{},": Insert this ",[322,23037,3922],{"href":22984,"rel":23038},[2245],[592,23040],{"src":23041,"alt":23042},"\u002Fdocs\u002Fguides\u002Fscraper-one-url.webp","axiom.ai using the go-to page step to load the Transparency Report page",[83,23044,23045,88,23047,23049,23059],{},[29,23046,3760],{},[90,23048,114],{},[80,23050,23051],{},[83,23052,23053,23055,23056,23058],{},[90,23054,114],{},": Click 'Insert Data' and select ",[90,23057,139],{},". The loop step will now iterate through the URLs in the Google Sheet.",[80,23060,23061,23085,23098],{},[83,23062,23063,88,23065,23067],{},[29,23064,6423],{},[90,23066,6426],{},[80,23068,23069,23076],{},[83,23070,23071,23055,23073,23075],{},[90,23072,953],{},[90,23074,139],{}," to pass the search term from the sheet.",[83,23077,23078,23080,23081,3554],{},[90,23079,5330],{},": Choose column 'A' in the preview.\n",[592,23082],{"src":23083,"alt":23084},"\u002Fdocs\u002Fguides\u002Fscraper-one-search.webp","axiom.ai using the enter text step to input search terms in the Google Transparency Report page",[83,23086,23087,88,23089,23091],{},[29,23088,6435],{},[90,23090,14950],{},[80,23092,23093],{},[83,23094,23095,23097],{},[90,23096,5353],{},": Press 'Record', then 'Return'.",[83,23099,23100,23102],{},[29,23101,6446],{}," `",{"title":494,"searchDepth":495,"depth":495,"links":23104},[23105,23106],{"id":545,"depth":498,"text":546},{"id":22975,"depth":498,"text":22976},"Learn how to use axiom.ai to scrape content delistings due to copyright data from Google Transparency Report pages and export it directly into a Google Sheet without writing a single line of code. This guide will walk you through setting up the no-code web scraper step by step, enabling you to extract and analyze copyright delisting data.",{"pinned":522,"type":513,"format":77,"intent_type":1049,"intent":8314,"tags":23109,"platfrom":23111},[519,23110,12881],"reporting",[7311],"\u002Fguides\u002Ftransparency-report",{"title":22886,"description":23107},"guides\u002Ftransparency-report","n9dwxRTZYdzNhbDsqBJA1jTx-eCKxyLJTTXnM5rSDUg",{"id":23117,"title":23118,"body":23119,"date":1043,"description":23368,"extension":506,"meta":23369,"navigation":522,"order":523,"path":23373,"seo":23374,"stem":23375,"__hash__":23376},"guides\u002Fguides\u002Ftwitter-direct-messages.md","How to automate Twitter X direct messages",{"type":8,"value":23120,"toc":23360},[23121,23123,23126,23128,23130,23138,23142,23149,23153,23155,23159,23265,23269,23274,23276,23280,23282,23287,23356],[11,23122],{},[14,23124,23125],{},"Learn how to automate sending tweets with a Chrome bot for X(Twitter). Install the template and set up your bot in a few clicks on your browser. This Twitter template utilises a Google Sheet that includes a list of Twitter profiles for messaging. It proceeds to launch Twitter in Chrome and loops through each profile, clicking on the message button and then entering a message before hitting the return key to send the message. Just like how you would message from a profile page.",[18,23127],{},[21,23129,853],{"id":852},[14,23131,27,23132,19402,23134,23137],{},[29,23133,31],{},[29,23135,23136],{},"\"Twitter Messages\""," then add profile links.",[21,23139,23141],{"id":23140},"install-the-twitter-x-direct-messages-bot","Install the Twitter X direct messages bot",[14,23143,23144,23145,55,23147,59],{},"To install this Twitter X direct messages bot click ",[29,23146,54],{},[29,23148,58],{},[14,23150,62,23151,44],{},[29,23152,65],{},[14,23154,68],{},[21,23156,23158],{"id":23157},"configure-your-twitter-x-direct-messages-bot","Configure your Twitter X direct messages bot",[77,23160,23161,23263],{},[80,23162,23163,23180],{},[83,23164,23165,88,23167,23169],{},[29,23166,87],{},[90,23168,92],{},[80,23170,23171,23175],{},[83,23172,23173,100],{},[90,23174,99],{},[83,23176,23177,23179],{},[90,23178,105],{},": Choose the tab with the profile links.",[83,23181,23182,88,23184,23186],{},[29,23183,111],{},[90,23185,114],{},[80,23187,23188,23204,23210,23247],{},[83,23189,23190,88,23192,23194],{},[29,23191,121],{},[90,23193,124],{},[80,23195,23196],{},[83,23197,23198,132,23200,136,23202,44],{},[90,23199,131],{},[90,23201,194],{},[90,23203,227],{},[83,23205,23206,88,23208,10297],{},[29,23207,145],{},[90,23209,148],{},[83,23211,23212,88,23214,12985,23216],{},[29,23213,170],{},[90,23215,11349],{},[80,23217,23218,23223,23239],{},[83,23219,23220,10297],{},[29,23221,23222],{},"2.3.1 – 2.3.2",[83,23224,23225,88,23228,23230],{},[29,23226,23227],{},"2.3.3",[90,23229,946],{},[80,23231,23232],{},[83,23233,23234,132,23236,23238],{},[90,23235,953],{},[90,23237,194],{},", select message from Google Sheet or type directly into the input.",[83,23240,23241,88,23244,10297],{},[29,23242,23243],{},"2.3.4",[90,23245,23246],{},"Press Key(s): Send message",[83,23248,23249,88,23251,23253],{},[29,23250,213],{},[90,23252,281],{},[80,23254,23255,23259],{},[83,23256,23257,100],{},[90,23258,99],{},[83,23260,23261,12956],{},[90,23262,105],{},[14,23264,983],{},[21,23266,23268],{"id":23267},"run-your-twitter-x-direct-messages-bot","Run your Twitter X direct messages bot",[14,23270,23271,23272,44],{},"To test an Instagram scraper, initiate the bot with the desktop runner and let it run a few loops. If you do not want the Messages to send disable step 2.3.6. Then, stop the bot and review the data in the linked Google Sheet for accuracy and completeness. If you wish to schedule the bot, ",[322,23273,994],{"href":993},[21,23275,317],{"id":316},[14,23277,320,23278,326],{},[322,23279,325],{"href":324},[21,23281,330],{"id":329},[14,23283,23284,23285,44],{},"We recommend you watch the video to troubleshoot. If you wish to schedule the bot, you will need to share the Cookie in settings or ",[322,23286,994],{"href":993},[77,23288,23289],{},[80,23290,23291,23301,23311,23322,23332,23345],{},[83,23292,23293,23296,346,23298,23300],{},[29,23294,23295],{},"Profile pages not loading?",[344,23297],{},[90,23299,13359],{},", check you have inserted the data correctly.",[83,23302,23303,23306,346,23308,23310],{},[29,23304,23305],{},"No data being found?",[344,23307],{},[90,23309,368],{},", reselect an element that wraps around the message button.",[83,23312,23313,23316,346,23318,23321],{},[29,23314,23315],{},"Not running X in English?",[344,23317],{},[90,23319,23320],{},"Step 2.3 – If condition: Check for Message button",", change the condition to check for 'Message' in your native language.",[83,23323,23324,23327,23329,23330,44],{},[29,23325,23326],{},"Data to check not set?",[344,23328],{},"\nIn the same step, make sure it is set to ",[90,23331,198],{},[83,23333,23334,23336,346,23338,23341,23342,44],{},[29,23335,7492],{},[344,23337],{},[90,23339,23340],{},"Step 2.3.1 – Click Element: Message",", reselect the message button. Try using the ",[322,23343,23344],{"href":10402},"text selector",[83,23346,23347,23350,346,23352,23355],{},[29,23348,23349],{},"No message being added?",[344,23351],{},[90,23353,23354],{},"Step 2.3.3 – Enter Text: Message",", check you have inserted data or try reselecting the text input field.",[14,23357,483,23358],{},[322,23359,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":23361},[23362,23363,23364,23365,23366,23367],{"id":852,"depth":498,"text":853},{"id":23140,"depth":498,"text":23141},{"id":23157,"depth":498,"text":23158},{"id":23267,"depth":498,"text":23268},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"Learn how to automate Twitter\u002FX direct messages using axiom.ai and Google Sheets. This guide covers setting up, configuring, and running a bot to send personalized messages.",{"read":1046,"level":510,"video":23370,"templateId":4806,"type":513,"format":514,"intent_type":1049,"intent":1050,"tags":23371,"platfrom":23372},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F6GPiwu8on0Q",[1052,1053,1056],[10101,10102],"\u002Fguides\u002Ftwitter-direct-messages",{"title":23118,"description":23368},"guides\u002Ftwitter-direct-messages","FRkc4W9-rgU8_sevokVUqlIUROXCjeQr_UiMjeNXmIs",{"id":23378,"title":23379,"body":23380,"date":23558,"description":23559,"extension":506,"meta":23560,"navigation":522,"order":523,"path":23565,"seo":23566,"stem":23567,"__hash__":23568},"guides\u002Fguides\u002Fupload-files-from-a-google-sheet.md","How to automate uploading files",{"type":8,"value":23381,"toc":23550},[23382,23384,23387,23389,23391,23396,23400,23408,23410,23412,23416,23494,23498,23501,23503,23514,23516,23518,23546],[11,23383],{},[14,23385,23386],{},"This template automates file uploads to various webpages from a Google Sheet. It reads a file path and uploads the file through a webpage's input field, simulating human interactions.",[18,23388],{},[21,23390,24],{"id":23},[14,23392,27,23393,23395],{},[29,23394,31],{},", assuming you already have an account. Name your sheet something like 'Uploads’, add file paths into column A.",[21,23397,23399],{"id":23398},"install-the-file-upload-bot","Install the File upload bot",[14,23401,23402,23403,23405,23406,59],{},"To install this File upload bot click ",[29,23404,54],{},".  If you’re a new user, you’ll have to click ",[29,23407,58],{},[14,23409,876],{},[14,23411,68],{},[21,23413,23415],{"id":23414},"configure-your-file-upload-bot","Configure your File upload bot",[77,23417,23418],{},[80,23419,23420,23437],{},[83,23421,23422,88,23424,23426],{},[29,23423,87],{},[90,23425,92],{},[80,23427,23428,23432],{},[83,23429,23430,100],{},[90,23431,99],{},[83,23433,23434,23436],{},[90,23435,105],{},": Choose the sheet tab with your file paths in.",[83,23438,23439,88,23441,23443],{},[29,23440,111],{},[90,23442,114],{},[80,23444,23445,23458,23480],{},[83,23446,23447,88,23449,23451],{},[29,23448,121],{},[90,23450,124],{},[80,23452,23453],{},[83,23454,23455,23457],{},[90,23456,131],{},": Please enter the URL of the website where you want to upload your file.",[83,23459,23460,88,23462,23465],{},[29,23461,145],{},[90,23463,23464],{},"Upload a file",[80,23466,23467,23472],{},[83,23468,23469,23471],{},[90,23470,9946],{},": Click 'Select' to choose the form element to upload the file to.",[83,23473,23474,23476,23477,23479],{},[90,23475,1189],{},": Input the file paths by clicking 'Insert data', select ",[90,23478,139],{},", then select the column with the file paths.",[83,23481,23482,88,23484,23487],{},[29,23483,170],{},[90,23485,23486],{},"Wait step",[80,23488,23489],{},[83,23490,23491,23493],{},[90,23492,15636],{},": Pause the bot to allow the file upload to complete. Set a wait time appropriate for the file size.",[21,23495,23497],{"id":23496},"run-your-file-upload-bot","Run your File upload bot",[14,23499,23500],{},"We suggest running a test first, stopping the bot after a few uploads and checking the files uploaded.",[21,23502,317],{"id":316},[14,23504,320,23505,23507,23508,23510,23511,1230],{},[322,23506,325],{"href":324},", you can use our no-code bot builder to customize any bot according to your requirements. We have other upload file ",[322,23509,7285],{"href":7353}," you can use that work in the cloud and on desktop. Take a look at the ",[322,23512,23513],{"href":1228},"upload to Google Drive",[21,23515,330],{"id":329},[14,23517,333],{},[77,23519,23520],{},[80,23521,23522,23531,23538],{},[83,23523,23524,23527,10616,23529,44],{},[29,23525,23526],{},"Selectors fail to find the element?",[344,23528],{},[322,23530,7498],{"href":380},[83,23532,23533,23536,10626],{},[29,23534,23535],{},"Files do not upload?",[344,23537],{},[83,23539,23540,23543,23545],{},[29,23541,23542],{},"Upload does not complete?",[344,23544],{},"\nIncrease the pause, to allow the file upload to complete.",[14,23547,483,23548],{},[322,23549,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":23551},[23552,23553,23554,23555,23556,23557],{"id":23,"depth":498,"text":24},{"id":23398,"depth":498,"text":23399},{"id":23414,"depth":498,"text":23415},{"id":23496,"depth":498,"text":23497},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"2023-02-01","Learn how to automate file uploads from Google Sheets to websites using axiom.ai's no-code tool. This guide covers setting up, configuring, and running a file upload bot for efficient automation.",{"pinned":522,"read":1527,"level":510,"video":23561,"templateId":4739,"type":513,"format":514,"intent_type":1754,"intent":10665,"tags":23562,"platfrom":23564},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F6lYZkxOmcX0",[10667,23563,23110],"upload",[1757],"\u002Fguides\u002Fupload-files-from-a-google-sheet",{"title":23379,"description":23559},"guides\u002Fupload-files-from-a-google-sheet","yrDvrLFpwWbzcEWFvdDQ6ARjTuCr6cu1-Fj2YUAfSCk",{"id":23570,"title":23571,"body":23572,"date":523,"description":23581,"extension":506,"meta":23582,"navigation":522,"order":523,"path":12732,"seo":23583,"stem":23584,"__hash__":23585},"guides\u002Fguides\u002Fusecase.md","Use case guides",{"type":8,"value":23573,"toc":23579},[23574,23577],[14,23575,23576],{},"Real world examples of complete automations in Axiom.ai, with ready to use templates for scraping data and automating tasks across sites like LinkedIn, Instagram, and Helium10. Each guide shows a practical workflow from collecting data to taking action, and can be used as a starting point or adapted to your needs.",[16568,23578],{"intent":1049},{"title":494,"searchDepth":495,"depth":495,"links":23580},[],"Real-world automation examples with ready-to-use templates for scraping and automating tasks across popular sites and tools.",{"layout":16574},{"title":23571,"description":23581},"guides\u002Fusecase","KSJPmun6PZ5eQQVLXvr_iU6DVYfyFqS1YL7LGbghts0",{"id":23587,"title":23588,"body":23589,"date":1043,"description":23861,"extension":506,"meta":23862,"navigation":522,"order":523,"path":15104,"seo":23866,"stem":23867,"__hash__":23868},"guides\u002Fguides\u002Fweb-scraping-looping-through-pages.md","How to scrape links in a Google Sheet",{"type":8,"value":23590,"toc":23853},[23591,23593,23596,23598,23600,23611,23615,23622,23626,23628,23632,23751,23755,23758,23760,23764,23766,23768,23835],[11,23592],{},[14,23594,23595],{},"This template scrapes data from a website to a Google Sheet. It loops through links in the sheet, extracts data, and updates the sheet. After each loop, it deletes each link. Configuration takes minutes.",[18,23597],{},[21,23599,24],{"id":23},[14,23601,23602,23603,36,23606,40,23609,44],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering the shortcut 'sheet.new', assuming you already have an account. Name your sheet something like ",[29,23604,23605],{},"Web Scraper",[29,23607,23608],{},"\"Page links\"",[29,23610,43],{},[21,23612,23614],{"id":23613},"install-the-web-scraper","Install the Web scraper",[14,23616,23617,23618,55,23620,59],{},"To install this Web scraper click ",[29,23619,54],{},[29,23621,58],{},[14,23623,62,23624,44],{},[29,23625,65],{},[14,23627,68],{},[21,23629,23631],{"id":23630},"configure-your-web-scraper-in-minutes","Configure your Web scraper in minutes",[77,23633,23634],{},[80,23635,23636,23654],{},[83,23637,23638,88,23640,23642],{},[29,23639,87],{},[90,23641,92],{},[80,23643,23644,23648],{},[83,23645,23646,100],{},[90,23647,99],{},[83,23649,23650,5910,23652,44],{},[90,23651,105],{},[90,23653,5913],{},[83,23655,23656,88,23658,23660],{},[29,23657,111],{},[90,23659,114],{},[80,23661,23662,23676,23695,23723],{},[83,23663,23664,88,23666,23668],{},[29,23665,121],{},[90,23667,124],{},[80,23669,23670],{},[83,23671,23672,1620,23674,1623],{},[90,23673,131],{},[90,23675,139],{},[83,23677,23678,88,23680,23682],{},[29,23679,145],{},[90,23681,148],{},[80,23683,23684,23691],{},[83,23685,23686,1995,23688,23690],{},[90,23687,155],{},[322,23689,19500],{"href":19499}," to choose the data you wish to scrape.",[83,23692,23693,19506],{},[90,23694,161],{},[83,23696,23697,88,23699,23701],{},[29,23698,170],{},[90,23700,3303],{},[80,23702,23703,23707,23711,23717],{},[83,23704,23705,100],{},[90,23706,99],{},[83,23708,23709,255],{},[90,23710,105],{},[83,23712,23713,261,23715,44],{},[90,23714,260],{},[90,23716,198],{},[83,23718,23719,270,23721,44],{},[90,23720,269],{},[90,23722,273],{},[83,23724,23725,88,23727,23729],{},[29,23726,213],{},[90,23728,281],{},[80,23730,23731,23735,23739,23745],{},[83,23732,23733,100],{},[90,23734,99],{},[83,23736,23737,292],{},[90,23738,105],{},[83,23740,23741,162,23743,44],{},[90,23742,297],{},[90,23744,165],{},[83,23746,23747,162,23749,44],{},[90,23748,304],{},[90,23750,165],{},[21,23752,23754],{"id":23753},"run-your-web-scraper","Run your Web scraper",[14,23756,23757],{},"We suggest running a test first, stopping the bot after a few loops, and reviewing the scraped data.",[21,23759,317],{"id":316},[14,23761,320,23762,326],{},[322,23763,325],{"href":324},[21,23765,330],{"id":329},[14,23767,333],{},[77,23769,23770],{},[80,23771,23772,23784,23794,23806,23814,23827],{},[83,23773,23774,23776,346,23778,350,23780,19594,23782,19597],{},[29,23775,342],{},[344,23777],{},[90,23779,349],{},[90,23781,353],{},[90,23783,1723],{},[83,23785,23786,23788,346,23790,19607,23792,44],{},[29,23787,363],{},[344,23789],{},[90,23791,368],{},[322,23793,7498],{"href":380},[83,23795,23796,23798,393,23800,397,23802,401,23804,44],{},[29,23797,19614],{},[344,23799],{},[90,23801,396],{},[90,23803,400],{},[90,23805,165],{},[83,23807,23808,23810,19630,23812,19633],{},[29,23809,19627],{},[344,23811],{},[90,23813,161],{},[83,23815,23816,23818,346,23820,444,23823,466,23825,44],{},[29,23817,459],{},[344,23819],{},[90,23821,23822],{},"Step 2.3 – Write Data to a Google Sheet",[90,23824,465],{},[90,23826,198],{},[83,23828,23829,23831,476,23833,480],{},[29,23830,473],{},[344,23832],{},[90,23834,479],{},[14,23836,483,23837,23839,23840,23843,23844,23848,23849],{},[322,23838,487],{"href":486},"\nIf you are keen to learn more about scraping, take a look at these guides: ",[322,23841,23842],{"href":491},"web scraping with an AI",", Killer-problems with ",[322,23845,23847],{"href":23846},"\u002Fblog\u002F5-problems-webscrapers","web scrapers"," and how to use ",[322,23850,23852],{"href":23851},"\u002Fblog\u002Fcss-attribute-selectors","Custom CSS selectors.",{"title":494,"searchDepth":495,"depth":495,"links":23854},[23855,23856,23857,23858,23859,23860],{"id":23,"depth":498,"text":24},{"id":23613,"depth":498,"text":23614},{"id":23630,"depth":498,"text":23631},{"id":23753,"depth":498,"text":23754},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"Learn how to scrape links in a Google Sheet and automate data extraction from multiple pages using axiom.ai's no-code tool. This guide covers setup, configuration, and running a looping web scraper for efficient data collection.",{"pinned":522,"read":7527,"level":510,"video":23863,"templateId":498,"type":513,"format":514,"intent_type":1754,"intent":4022,"tags":23864,"platfrom":23865},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fl8KtLMXuDes",[519,1056],[1757],{"title":23588,"description":23861},"guides\u002Fweb-scraping-looping-through-pages","u_dFgHDZm4XmAusPoEzM6_TryYrpGFZntWPnkkJxQJk",{"id":23870,"title":23871,"body":23872,"date":523,"description":24379,"extension":506,"meta":24380,"navigation":522,"order":523,"path":24383,"seo":24384,"stem":24385,"__hash__":24386},"guides\u002Fguides\u002Fwebhooks.md","How to use webhooks with axiom.ai",{"type":8,"value":23873,"toc":24369},[23874,23876,23883,23885,23888,23908,23911,23915,23918,23932,23936,23941,23955,23960,23963,23966,23980,23988,24269,24280,24284,24288,24291,24312,24315,24320,24322,24325,24328,24331,24347,24349,24360,24366],[11,23875],{},[14,23877,23878,23879,23882],{},"Using webhooks within your axiom.ai automations can help you to connect to an unlimited number of third party tools, for example, a database management tool and various other tools that can be chained together to complex a complex process to get you to your endpoint. See our ",[322,23880,8921],{"href":23881},".\u002F"," for more specific guides.",[21,23884,546],{"id":545},[14,23886,23887],{},"To get started with triggering a webhook using an automation, you will need the following from the axiom.ai Chrome extension:",[77,23889,23890],{},[80,23891,23892,23898,23902],{},[83,23893,23894,562,23896,44],{},[90,23895,561],{},[322,23897,566],{"href":565},[83,23899,23900,572],{},[90,23901,571],{},[83,23903,23904,578,23906,44],{},[90,23905,577],{},[90,23907,581],{},[14,23909,23910],{},"The information that you'll need to trigger your automation from a third party service varies, check with the service to determine the steps that you need to take in order to set up outgoing webhooks.",[21,23912,23914],{"id":23913},"triggering-a-webhook-from-an-axiomai-automation","Triggering a webhook from an axiom.ai automation",[14,23916,23917],{},"There are two methods of triggering a webhook within your automations. For both methods, you'll need to acquire the following data from the third party you're looking to implement:",[77,23919,23920],{},[555,23921,23922,23927],{},[83,23923,23924,23926],{},[90,23925,577],{},": The endpoint that needs to be triggered by your automation.",[83,23928,23929,23931],{},[90,23930,16510],{},": The payload format that is required.",[639,23933,23935],{"id":23934},"low-code","Low-code",[14,23937,5070,23938,23940],{},[322,23939,7722],{"href":18400}," step can be used in order to trigger a webhook from your automations. Follow the steps below to get started:",[77,23942,23943],{},[555,23944,23945,23949,23952],{},[83,23946,8350,23947,1230],{},[322,23948,7722],{"href":18400},[83,23950,23951],{},"Enter the \"Endpoint\".",[83,23953,23954],{},"Enter the \"Payload\".",[14,23956,23957,23958,12399],{},"Remember, the \"Insert data\" option can be used to dynamically input data from your automation into your payload, see ",[322,23959,7640],{"href":2670},[639,23961,11031],{"id":23962},"javascript",[14,23964,23965],{},"Webhooks can be triggered using custom JavaScript. This can be used for more advanced fetches and the use of the data that is returned. This has a few benefits, such as:",[555,23967,23968,23971,23974,23977],{},[83,23969,23970],{},"Allowing you to receive additional data, from a database, for example.",[83,23972,23973],{},"Having more control over headers - for example, authorization headers.",[83,23975,23976],{},"Being able to parse the response.",[83,23978,23979],{},"Being able to use the response to automatically retry the call in the event of a rate limit being hit.",[14,23981,21301,23982,23984,23985,23987],{},[322,23983,2301],{"href":2300}," step to your automation and use the ",[90,23986,9658],{}," method. See the example below to get started.",[719,23989,23991],{"className":756,"code":23990,"language":758,"meta":494,"style":494},"const url = \"https:\u002F\u002Fexample.com\u002Fwebhook\";\nconst apiKey = \"xxxxxxxxxx\";\nconst data = {\n    \"key\": apiKey,\n    \"data\": [[1, 2], [3, 4]]\n};\n\nconst sendData = async () => {\n    try {\n        const response = await fetch(url, {\n            method: 'POST',\n            headers: {\n                'apikey': apiKey,\n                'Authorization': `Bearer ${apiKey}`,\n                'Content-Type': 'application\u002Fjson'\n            },\n            body: JSON.stringify(format(data))\n        });\n                               \n        if (!response.ok) {\n            console.error(\"Something went wrong with response\", response); \n            return;\n        }\n      \n        const result = await response.json();\n        console.log(result);\n    } catch (error) {\n        console.error(\"Something went wrong\", error);\n    }\n}\n",[90,23992,23993,24007,24021,24031,24038,24063,24067,24071,24088,24094,24109,24117,24121,24127,24143,24152,24156,24173,24177,24181,24191,24203,24209,24213,24217,24233,24241,24249,24261,24265],{"__ignoreMap":494},[727,23994,23995,23997,24000,24002,24005],{"class":729,"line":730},[727,23996,2315],{"class":1986},[727,23998,23999],{"class":1882}," url",[727,24001,2321],{"class":1986},[727,24003,24004],{"class":737}," \"https:\u002F\u002Fexample.com\u002Fwebhook\"",[727,24006,2327],{"class":768},[727,24008,24009,24011,24014,24016,24019],{"class":729,"line":498},[727,24010,2315],{"class":1986},[727,24012,24013],{"class":1882}," apiKey",[727,24015,2321],{"class":1986},[727,24017,24018],{"class":737}," \"xxxxxxxxxx\"",[727,24020,2327],{"class":768},[727,24022,24023,24025,24027,24029],{"class":729,"line":495},[727,24024,2315],{"class":1986},[727,24026,22284],{"class":1882},[727,24028,2321],{"class":1986},[727,24030,2391],{"class":768},[727,24032,24033,24035],{"class":729,"line":1895},[727,24034,9536],{"class":737},[727,24036,24037],{"class":768},": apiKey,\n",[727,24039,24040,24042,24044,24046,24048,24050,24053,24055,24057,24060],{"class":729,"line":1901},[727,24041,9560],{"class":737},[727,24043,2030],{"class":768},[727,24045,165],{"class":1882},[727,24047,2004],{"class":768},[727,24049,8883],{"class":1882},[727,24051,24052],{"class":768},"], [",[727,24054,17430],{"class":1882},[727,24056,2004],{"class":768},[727,24058,24059],{"class":1882},"4",[727,24061,24062],{"class":768},"]]\n",[727,24064,24065],{"class":729,"line":1973},[727,24066,16966],{"class":768},[727,24068,24069],{"class":729,"line":2052},[727,24070,1898],{"emptyLinePlaceholder":522},[727,24072,24073,24075,24078,24080,24082,24084,24086],{"class":729,"line":2058},[727,24074,2315],{"class":1986},[727,24076,24077],{"class":2376}," sendData",[727,24079,2321],{"class":1986},[727,24081,2382],{"class":1986},[727,24083,2385],{"class":768},[727,24085,2388],{"class":1986},[727,24087,2391],{"class":768},[727,24089,24090,24092],{"class":729,"line":2064},[727,24091,2396],{"class":1986},[727,24093,2391],{"class":768},[727,24095,24096,24098,24100,24102,24104,24106],{"class":729,"line":2087},[727,24097,2403],{"class":1986},[727,24099,2093],{"class":1882},[727,24101,2321],{"class":1986},[727,24103,2410],{"class":1986},[727,24105,2413],{"class":2376},[727,24107,24108],{"class":768},"(url, {\n",[727,24110,24111,24113,24115],{"class":729,"line":2140},[727,24112,2421],{"class":768},[727,24114,2424],{"class":737},[727,24116,2427],{"class":768},[727,24118,24119],{"class":729,"line":2154},[727,24120,2432],{"class":768},[727,24122,24123,24125],{"class":729,"line":1529},[727,24124,21564],{"class":737},[727,24126,24037],{"class":768},[727,24128,24129,24132,24134,24136,24139,24141],{"class":729,"line":2178},[727,24130,24131],{"class":737},"                'Authorization'",[727,24133,1995],{"class":768},[727,24135,17038],{"class":737},[727,24137,24138],{"class":768},"apiKey",[727,24140,2448],{"class":737},[727,24142,2427],{"class":768},[727,24144,24145,24148,24150],{"class":729,"line":2187},[727,24146,24147],{"class":737},"                'Content-Type'",[727,24149,1995],{"class":768},[727,24151,17055],{"class":737},[727,24153,24154],{"class":729,"line":2533},[727,24155,2465],{"class":768},[727,24157,24158,24160,24162,24164,24166,24168,24170],{"class":729,"line":2551},[727,24159,2470],{"class":768},[727,24161,9620],{"class":1882},[727,24163,44],{"class":768},[727,24165,9625],{"class":2376},[727,24167,2542],{"class":768},[727,24169,21611],{"class":2376},[727,24171,24172],{"class":768},"(data))\n",[727,24174,24175],{"class":729,"line":2559},[727,24176,2511],{"class":768},[727,24178,24179],{"class":729,"line":2565},[727,24180,21623],{"class":768},[727,24182,24183,24185,24187,24189],{"class":729,"line":2570},[727,24184,2521],{"class":1986},[727,24186,2524],{"class":768},[727,24188,2527],{"class":1986},[727,24190,2530],{"class":768},[727,24192,24193,24195,24197,24199,24201],{"class":729,"line":2591},[727,24194,2536],{"class":768},[727,24196,2539],{"class":2376},[727,24198,2542],{"class":768},[727,24200,2545],{"class":737},[727,24202,2887],{"class":768},[727,24204,24205,24207],{"class":729,"line":2603},[727,24206,2554],{"class":1986},[727,24208,2327],{"class":768},[727,24210,24211],{"class":729,"line":2615},[727,24212,2562],{"class":768},[727,24214,24215],{"class":729,"line":2630},[727,24216,2516],{"class":768},[727,24218,24219,24221,24223,24225,24227,24229,24231],{"class":729,"line":2636},[727,24220,2403],{"class":1986},[727,24222,2575],{"class":1882},[727,24224,2321],{"class":1986},[727,24226,2410],{"class":1986},[727,24228,2582],{"class":768},[727,24230,2585],{"class":2376},[727,24232,2588],{"class":768},[727,24234,24235,24237,24239],{"class":729,"line":2642},[727,24236,2594],{"class":768},[727,24238,2597],{"class":2376},[727,24240,2600],{"class":768},[727,24242,24243,24245,24247],{"class":729,"line":2647},[727,24244,2606],{"class":768},[727,24246,2609],{"class":1986},[727,24248,2612],{"class":768},[727,24250,24251,24253,24255,24257,24259],{"class":729,"line":4657},[727,24252,2594],{"class":768},[727,24254,2539],{"class":2376},[727,24256,2542],{"class":768},[727,24258,2624],{"class":737},[727,24260,2627],{"class":768},[727,24262,24263],{"class":729,"line":4662},[727,24264,2633],{"class":768},[727,24266,24267],{"class":729,"line":1316},[727,24268,2639],{"class":768},[14,24270,24271,24272,24274,24275,12252],{},"Learn more about the ",[90,24273,9658],{}," function in the Mozilla ",[322,24276,24279],{"href":24277,"rel":24278},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FFetch_API\u002FUsing_Fetch",[2245],"Using the Fetch API",[14,24281,23957,24282,12399],{},[322,24283,7640],{"href":2670},[21,24285,24287],{"id":24286},"triggering-an-axiomai-automation-from-a-webhook","Triggering an axiom.ai automation from a webhook",[14,24289,24290],{},"To get started, we're going to assume that you have already set up outgoing webhooks or API calls from the service that you are looking to send information from to your automation. Once this has been done, follow the steps below:",[77,24292,24293],{},[80,24294,24295,24304],{},[83,24296,24297,88,24299,611,24302,1230],{},[29,24298,87],{},[90,24300,24301],{},"Receive data from a webhook",[322,24303,24301],{"href":6958},[83,24305,24306,88,24308,24311],{},[29,24307,111],{},[90,24309,24310],{},"Test data",": Configure the test data input with the expected payload from the third-party application.",[14,24313,24314],{},"Configuring the \"Test data\" helps to test your automation - clicking \"Run\" on your automation will make use of the test data and can help debug your automation without needing additional webhook calls.",[14,24316,24317],{},[807,24318,24319],{},"Note, triggering automations from webhooks is only available in specific plans with the 'webhooks' feature.",[21,24321,776],{"id":775},[14,24323,24324],{},"To test your automation, click \"Run\". Once done, check the third party tool to confirm if the webhook has been received. Review the builder and your run reports within the extension to determine if there were any issues.",[14,24326,24327],{},"To test sending a webhook to your automation, trigger the webhook from the third party tool that you are implementing. Alternatively, click \"Run\" to run your automation with the test data in place.",[14,24329,24330],{},"Additionally, the resources below may be helpful in debugging your automation:",[80,24332,24333,24337,24341],{},[83,24334,24335],{},[322,24336,3313],{"href":3312},[83,24338,24339],{},[322,24340,3316],{"href":2203},[83,24342,24343],{},[322,24344,24346],{"href":24345},"\u002Fdocs\u002Fno-code-tool\u002Ftroubleshooting\u002Ferror-handling","Handling errors",[21,24348,796],{"id":795},[14,24350,24351,24352,24355,24356,44],{},"Triggering webhooks from your automations, or triggering your automations from a webhook call, can allow you to expand the functionality of your automations to give you endless possibilities. Our personal favourite here is our ",[322,24353,21233],{"href":24354},".\u002Fsupabase"," guide which uses this method to interact with Supabase and allows for the reading and writing of data from your tables. We would love to hear what you do with this option, feel free to post it in our ",[322,24357,24359],{"href":3324,"rel":24358},[2245],"Reddit community",[14,24361,24362,24363,44],{},"Can't get an API call to work? Ask an expert in our ",[322,24364,24359],{"href":3324,"rel":24365},[2245],[811,24367,24368],{},"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 .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);}",{"title":494,"searchDepth":495,"depth":495,"links":24370},[24371,24372,24376,24377,24378],{"id":545,"depth":498,"text":546},{"id":23913,"depth":498,"text":23914,"children":24373},[24374,24375],{"id":23934,"depth":495,"text":23935},{"id":23962,"depth":495,"text":11031},{"id":24286,"depth":498,"text":24287},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"Learn how to use webhooks to send or receive data within your axiom.ai automations.",{"type":513,"format":514,"intent_type":515,"intent":827,"tags":24381,"platfrom":24382},[829,830],[1757],"\u002Fguides\u002Fwebhooks",{"title":23871,"description":24379},"guides\u002Fwebhooks","yUw3OkbuU80B2i3-FtNSJ5BOsb_O3TQKsAwcVGh_W6k",{"id":24388,"title":24389,"body":24390,"date":523,"description":24399,"extension":506,"meta":24400,"navigation":522,"order":523,"path":12716,"seo":24401,"stem":24402,"__hash__":24403},"guides\u002Fguides\u002Fworkflow.md","Workflow guides",{"type":8,"value":24391,"toc":24397},[24392,24395],[14,24393,24394],{},"Step-by-step tutorials for common browser automation tasks in axiom.ai—scraping loops, monitoring pages, data entry, file flows, and webhooks. Each guide walks through building a bot you can run as-is or extend for your own workflows.",[16568,24396],{"intent":1754},{"title":494,"searchDepth":495,"depth":495,"links":24398},[],"Step-by-step tutorials for common browser automation tasks in axiom.ai—scraping loops, monitoring pages, data entry, file flows, and webhooks.",{"layout":16574},{"title":24389,"description":24399},"guides\u002Fworkflow","2mWYgSRKBVREDCn9DZLg_Bm7gPaUyDR82rvzN-3ocCE",{"id":24405,"title":24406,"body":24407,"date":523,"description":24678,"extension":506,"meta":24679,"navigation":522,"order":523,"path":24683,"seo":24684,"stem":24685,"__hash__":24686},"guides\u002Fguides\u002Fzapier.md","How to trigger Zapier Zaps using axiom.ai",{"type":8,"value":24408,"toc":24668},[24409,24411,24414,24416,24418,24420,24422,24442,24446,24448,24451,24475,24478,24488,24491,24506,24509,24553,24557,24559,24561,24564,24571,24573,24575,24579,24581,24584,24612,24619,24623,24625,24632,24658,24661,24663,24665],[11,24410],{},[14,24412,24413],{},"You can connect your automation to Zapier, pass scraped data, and access 7,000+ apps. We'll guide you through using axiom.ai's \"Get data from URL\" steps to post data to Zapier, setting up a Zap to receive the data, and using Zapier Formatter to extract it from an array.",[18,24415],{},[21,24417,546],{"id":545},[11,24419],{},[14,24421,551],{},[77,24423,24424],{},[555,24425,24426,24432,24436],{},[83,24427,24428,1785,24430,44],{},[29,24429,561],{},[322,24431,566],{"href":565},[83,24433,24434,1792],{},[29,24435,571],{},[83,24437,24438,1797,24440,44],{},[29,24439,577],{},[90,24441,581],{},[21,24443,24445],{"id":24444},"triggering-a-zap-using-an-axiomai-automation","Triggering a Zap using an axiom.ai automation",[11,24447],{},[14,24449,24450],{},"To get started, we are going to assume that you have an automation created.",[77,24452,24453],{},[555,24454,24455,24461,24467],{},[83,24456,24457,24460],{},[29,24458,24459],{},"Create Zap"," - Create a new Zap by navigating to Zapier, and clicking \"+ Create\".",[83,24462,24463,24466],{},[29,24464,24465],{},"Add trigger"," - Click \"Trigger\", then select \"Webhooks by Zapier\". See the section below for more information on configuring this trigger.",[83,24468,24469,24471,24472,24474],{},[29,24470,7722],{}," - In axiom.ai, add a ",[322,24473,7722],{"href":18400}," step to your automation. Input the URL from the \"your webhook URL\" section in Zapier.",[14,24476,24477],{},"Learn more about configuring the \"Webhooks by Zapier\" trigger:",[77,24479,24480],{},[80,24481,24482,24485],{},[83,24483,24484],{},"Set the \"trigger event\" to \"catch raw webhook\", press continue.",[83,24486,24487],{},"Save the URL in the \"your webhook URL\" section for later.",[14,24489,24490],{},"To use data within your Zap, you'll need to first process the data:",[77,24492,24493],{},[555,24494,24495,24501],{},[83,24496,24497,24500],{},[29,24498,24499],{},"Actions"," - Add your actions to process the data that is being sent to the Zap, for this example, we will be using the \"Formatter by Zapier\" action.",[83,24502,24503,24505],{},[29,24504,620],{}," - Follow the instructions below to configure the \"Formatter by Zapier\" action.",[14,24507,24508],{},"To configure the \"Formatter by Zapier\" step, follow the steps below:",[77,24510,24511],{},[555,24512,24513,24519,24525,24530,24536,24542,24548],{},[83,24514,24515,24518],{},[29,24516,24517],{},"Action event"," - Set to \"text\".",[83,24520,24521,24524],{},[29,24522,24523],{},"Transform"," - Set to \"split text\".",[83,24526,24527,24529],{},[29,24528,14192],{}," - Click \"+\" and set to \"raw body\".",[83,24531,24532,24535],{},[29,24533,24534],{},"Separator"," - Click into the field and set to \"single speech mark\".",[83,24537,24538,24541],{},[29,24539,24540],{},"Segment index"," - Set to \"all (as separate fields)\".",[83,24543,24544,24547],{},[29,24545,24546],{},"Continue"," - click continue.",[83,24549,24550,24552],{},[29,24551,12428],{}," - Click \"test step\".",[592,24554],{"src":24555,"alt":24556},"\u002Fdocs\u002Fguides\u002Fzapier-formatter-step.jpg","Configure the formatter by Zapier step",[21,24558,776],{"id":775},[11,24560],{},[14,24562,24563],{},"To test your workflow, open your axiom.ai automation and click \"Run\" to start the automation. Once complete, review any destinations where your data is being sent once it's been processed by Zapier. Alternatively, review your Zap runs within Zapier to confirm the zap ran.",[14,24565,24566,24567,24570],{},"If the desired results have not been achieved, review the ",[322,24568,24569],{"href":791},"Run Reports"," within axiom.ai, or the Zap runs section within Zapier.",[21,24572,6725],{"id":6724},[11,24574],{},[639,24576,24578],{"id":24577},"sending-scraper-data-from-an-axiomai-automation-to-zapier-for-processing","Sending scraper data from an axiom.ai automation to Zapier for processing",[11,24580],{},[14,24582,24583],{},"Extracting data from a webpage and sending it to Zapier to be processed can unlock a huge amount of potential for your workflows. Learn how to get started below.",[77,24585,24586],{},[555,24587,24588,24602],{},[83,24589,24590,24593,24594,24597,24598,1230],{},[29,24591,24592],{},"Scrape"," - Create a new axiom.ai automation, add a ",[322,24595,24596],{"href":19716},"scraping step",". In this example, we will be using the ",[322,24599,24601],{"href":24600},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fget-data-from-url","Get data from a URL",[83,24603,24604,24606,24607,24609,24610,20734],{},[29,24605,7722],{}," - Following the instructions above, configure your Zap to be triggered by incoming webhooks. Add a ",[322,24608,7722],{"href":18400}," step and use the \"Insert data\" option to insert the ",[90,24611,198],{},[14,24613,24614,24615,24618],{},"Follow the steps from the ",[322,24616,24445],{"href":24617},"#triggering-a-zap-using-an-axiomai-automation"," to learn how to process the data that you send to your Zap.",[639,24620,24622],{"id":24621},"write-data-to-excel","Write data to Excel",[11,24624],{},[14,24626,24627,24628,24631],{},"To write data to Excel, follow the steps in ",[322,24629,24445],{"href":24630},"\u002Fguides\u002Fzapier#triggering-a-zap-using-an-axiom-ai-automation"," to create your Zap. Once this has been done, head over to your Zap. After the \"Formatter by Zapier\" step, do the following:",[77,24633,24634],{},[555,24635,24636,24642,24647,24653],{},[83,24637,24638,24641],{},[29,24639,24640],{},"Excel"," - Search for \"Microsoft Excel\" and add a new step to your Zap.",[83,24643,24644,24646],{},[29,24645,24517],{}," - Set this to \"Add Row\".",[83,24648,24649,24652],{},[29,24650,24651],{},"Set up"," - Follow the instructions in the Zap to connect your account and configure your step.",[83,24654,24655,24657],{},[29,24656,620],{}," - To configure your data, head into the \"Configure\" tab. Click the \"+\" button beside the \"Column\" inputs to select your variables.",[14,24659,24660],{},"To test, trigger your automation within axiom.ai",[21,24662,796],{"id":795},[11,24664],{},[14,24666,24667],{},"Using axiom.ai and Zapier together allows you to scrape data quickly and pass it to over 7,000 apps. With just two steps in each app (four total), you can set up a basic browser scraper to Zapier automation in minutes, which can be easily adapted to more complex use cases.",{"title":494,"searchDepth":495,"depth":495,"links":24669},[24670,24671,24672,24673,24677],{"id":545,"depth":498,"text":546},{"id":24444,"depth":498,"text":24445},{"id":775,"depth":498,"text":776},{"id":6724,"depth":498,"text":6725,"children":24674},[24675,24676],{"id":24577,"depth":495,"text":24578},{"id":24621,"depth":495,"text":24622},{"id":795,"depth":498,"text":796},"How to build an automation that scrapes data from a webpage and connects to Zapier via a webhook.",{"video":24680,"type":513,"format":77,"intent_type":515,"intent":827,"tags":24681,"platfrom":24682},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FV3I7w8fnO88?rel=0&amp;",[829,830,1055,21214],[3288],"\u002Fguides\u002Fzapier",{"title":24406,"description":24678},"guides\u002Fzapier","mvO_R6ltR7wBcrltiSx-f3NdEw7mmmsEToYoJLF1ht8",{"id":24688,"title":24689,"body":24690,"date":1043,"description":24862,"extension":506,"meta":24863,"navigation":522,"order":498,"path":24867,"seo":24868,"stem":24869,"__hash__":24870},"guides\u002Fguides\u002Fzapier-forms.md","How to automate data entry without an API using Zapier",{"type":8,"value":24691,"toc":24854},[24692,24694,24710,24712,24716,24727,24731,24736,24740,24742,24746,24755,24824,24828,24835,24837,24841,24843,24845],[11,24693],{},[14,24695,24696,24697,24700,24701,24706,24707,44],{},"This Zapier data entry template is ",[29,24698,24699],{},"triggered by a webhook"," that passes data in a 2D array from our ",[322,24702,24705],{"href":24703,"rel":24704},"https:\u002F\u002Fzapier.com\u002Fapps\u002Faxiomai\u002Fintegrations",[2245],"axiom.ai Zapier app",". The bot then systematically processes the array, emulating human interactions by inputting data into web forms on any website. It serves as a valuable solution for automating data entry in situations where there is ",[29,24708,24709],{},"no API integration option",[18,24711],{},[21,24713,24715],{"id":24714},"get-started-set-up-your-zap","Get started: Set up your Zap",[14,24717,24718,24719,24722,24723],{},"In fact, we recommend not setting up your Zap first. Instead, prioritize creating and thoroughly testing your bot. Utilize the ",[29,24720,24721],{},"dummy data"," feature within our Zapier step, and set up your Zap only after your bot is fully functional. If you require assistance with the Zap setup, please refer to our ",[322,24724,24726],{"href":24725},"\u002Fdocs\u002Fworking-with-zapier-and-webhooks#select-axiom-s-zapier-app-within-zapier","Zapier documentation page.",[21,24728,24730],{"id":24729},"install-the-zapier-data-entry-bot","Install the Zapier data entry bot",[14,24732,24733,24734,1098],{},"To install this Zapier data entry bot click ",[29,24735,5867],{},[14,24737,20384,24738,44],{},[29,24739,19129],{},[14,24741,68],{},[21,24743,24745],{"id":24744},"configure-your-zapier-data-entry-bot-in-just-a-few-steps","Configure your Zapier data entry bot in just a few steps",[14,24747,24748,24749,24752,24753,7354],{},"We've provided a set of example steps within ",[90,24750,24751],{},"Step 2.0 - Loop through data",". You can further customize this bot by adding additional ",[322,24754,7285],{"href":7353},[77,24756,24757],{},[80,24758,24759,24776],{},[83,24760,24761,88,24763,24765,24766,24768,24769,44],{},[29,24762,87],{},[90,24764,8895],{},": Toggle on ",[90,24767,24310],{}," and input: ",[29,24770,24771,24772,24775],{},"\"[[Row 1 colA, Row 1 colB, Row 1 colC], ",[727,24773,24774],{},"Row 2 colA, Row 2 colB, Row 2 colC","]\"",[83,24777,24778,88,24780,3731,24782],{},[29,24779,111],{},[90,24781,114],{},[80,24783,24784,24801,24815],{},[83,24785,24786,88,24788,24790,24791,24793,24794,401,24796,136,24798,44],{},[29,24787,121],{},[90,24789,6426],{},": Set ",[90,24792,155],{}," to the input field and ",[90,24795,953],{},[29,24797,20958],{},[90,24799,24800],{},"[webhook-data]",[83,24802,24803,88,24805,24790,24807,24793,24809,401,24811,136,24813,44],{},[29,24804,145],{},[90,24806,6426],{},[90,24808,155],{},[90,24810,953],{},[29,24812,20958],{},[90,24814,24800],{},[83,24816,24817,88,24819,24790,24821,24823],{},[29,24818,170],{},[90,24820,6449],{},[90,24822,155],{}," to the submit form button.",[21,24825,24827],{"id":24826},"run-your-zapier-data-entry-bot","Run your Zapier data entry bot",[14,24829,24830,24831],{},"Test your bot with sample data before proceeding to test your ",[322,24832,24834],{"href":24833},"\u002Fdocs\u002Fworking-with-zapier-and-webhooks#test-the-zapier-axiom-trigger","Zapier trigger.",[21,24836,317],{"id":316},[14,24838,320,24839,326],{},[322,24840,12697],{"href":324},[21,24842,330],{"id":329},[14,24844,333],{},[14,24846,483,24847,24849,24850],{},[322,24848,487],{"href":486},"\nTo learn more about using triggering Axiom with Zaps read our ",[322,24851,24853],{"href":24852},"\u002Fdocs\u002Fworking-with-zapier-and-webhooks","Zapier page.",{"title":494,"searchDepth":495,"depth":495,"links":24855},[24856,24857,24858,24859,24860,24861],{"id":24714,"depth":498,"text":24715},{"id":24729,"depth":498,"text":24730},{"id":24744,"depth":498,"text":24745},{"id":24826,"depth":498,"text":24827},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},"Learn how to automate data entry into web forms using Zapier and axiom.ai. This guide covers setup, configuration, and customizing a bot to process data from webhooks and input it into any website.",{"pinned":522,"read":13146,"level":16262,"video":24864,"templateId":4686,"type":513,"format":514,"intent_type":1754,"intent":7308,"tags":24865,"platfrom":24866},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FBNLTBsEYXu8",[829,830,1055,21214],[3288],"\u002Fguides\u002Fzapier-forms",{"title":24689,"description":24862},"guides\u002Fzapier-forms","kmzGzPGXZeG3tTRcZ51BWD0KQ5Nr3x1V5cgOZB4W1OM",{"id":24872,"title":24873,"body":24874,"date":523,"description":25144,"extension":506,"meta":25145,"navigation":522,"order":523,"path":25148,"seo":25149,"stem":25150,"__hash__":25151},"guides\u002Fguides\u002Fzapier-tables.md","How to automate Zapier Tables with axiom.ai",{"type":8,"value":24875,"toc":25135},[24876,24878,24889,24891,24893,24895,24903,24906,24926,24931,24935,24937,24940,24944,24946,24949,24952,24971,24973,24981,24984,24996,24998,25030,25032,25035,25039,25041,25044,25068,25071,25094,25097,25099,25101,25104,25107,25109,25123,25125,25127,25130,25132],[11,24877],{},[14,24879,24880,24885,24886,24888],{},[322,24881,24884],{"href":24882,"rel":24883},"https:\u002F\u002Fzapier.com\u002F",[2245],"Zapier Tables"," offers the ability to store data within your Zapier account. This can be used to create interfaces and chatbots that can use your data. Zapier Tables can be used within your axiom.ai automations similar to how ",[322,24887,3288],{"href":3287}," can be used.",[21,24890,546],{"id":545},[11,24892],{},[14,24894,21241],{},[555,24896,24897,24900],{},[83,24898,24899],{},"Sign up to Zapier.",[83,24901,24902],{},"Create a new Table by clicking \"Create\" and selecting \"Table\" - create this to meet your own requirements.",[14,24904,24905],{},"To trigger your axiom.ai automations, you'll need the following:",[77,24907,24908],{},[555,24909,24910,24916,24920],{},[83,24911,24912,1785,24914,44],{},[29,24913,561],{},[322,24915,566],{"href":565},[83,24917,24918,1792],{},[29,24919,571],{},[83,24921,24922,1797,24924,44],{},[29,24923,577],{},[90,24925,581],{},[14,24927,24928],{},[807,24929,24930],{},"You may require a Zapier subscription and an axiom.ai subscription to use some of the steps within this guide.",[21,24932,24934],{"id":24933},"working-with-zapier-tables-data-in-axiomai","Working with Zapier Tables data in axiom.ai",[11,24936],{},[14,24938,24939],{},"Zapier Zaps can be used to create or modify data automatically within your Tables. Actions within your Zapier Tables can be used to automatically trigger your automations. See the guides below to get started.",[639,24941,24943],{"id":24942},"create-a-new-record","Create a new record",[11,24945],{},[14,24947,24948],{},"To get started, create your automation as normal, once you are ready to send the data to your Zapier Table, continue this guide.",[14,24950,24951],{},"Create a new Zap that has the ability to catch a webhook that is going to be sent from your automation. Follow the steps below:",[77,24953,24954],{},[555,24955,24956,24961,24965],{},[83,24957,24958,24960],{},[29,24959,24459],{}," - Create a new Zap by navigating to Zapier, and clicking \"Create\".",[83,24962,24963,24466],{},[29,24964,24465],{},[83,24966,24967,24471,24969,24474],{},[29,24968,7722],{},[322,24970,7722],{"href":18400},[14,24972,24477],{},[77,24974,24975],{},[80,24976,24977,24979],{},[83,24978,24484],{},[83,24980,24487],{},[14,24982,24983],{},"Once this has been created, we recommend sending a test request to popular your Zap with test data - hit \"Run\" on your automation. Next, you'll want to add a \"Formatter by Zapier\" step to format the incoming data. Set this up as follows:",[77,24985,24986],{},[555,24987,24988,24992],{},[83,24989,24990,24500],{},[29,24991,24499],{},[83,24993,24994,24505],{},[29,24995,620],{},[14,24997,24508],{},[77,24999,25000],{},[555,25001,25002,25006,25010,25014,25018,25022,25026],{},[83,25003,25004,24518],{},[29,25005,24517],{},[83,25007,25008,24524],{},[29,25009,24523],{},[83,25011,25012,24529],{},[29,25013,14192],{},[83,25015,25016,24535],{},[29,25017,24534],{},[83,25019,25020,24541],{},[29,25021,24540],{},[83,25023,25024,24547],{},[29,25025,24546],{},[83,25027,25028,24552],{},[29,25029,12428],{},[592,25031],{"src":24555,"alt":24556},[14,25033,25034],{},"When you're ready, add a \"Create Record\" step to your Zap from the \"Zapier Tables\" category. Navigate to the \"Configure\" section of this step and set the fields to use the data from the \"Formatter by Zapier\" step above. This stage will depend on how your Table has been set up.",[639,25036,25038],{"id":25037},"send-data-to-axiomai-automation","Send data to axiom.ai automation",[11,25040],{},[14,25042,25043],{},"To get started, create a new \"Zap\":",[77,25045,25046],{},[555,25047,25048,25053,25058,25063],{},[83,25049,25050,25052],{},[29,25051,24499],{}," - Add a \"Zapier Tables\" action to your Zap.",[83,25054,25055,25057],{},[29,25056,620],{}," - Configure the \"Zapier Tables\" action with a \"Trigger event\". This can automatically trigger the Zap when a record is created, modified or deleted. This can also be set to be triggered directly from the table itself. Click \"Test\" to test your trigger.",[83,25059,25060,25062],{},[29,25061,24499],{}," - Add an \"axiom.ai\" action using the search functionality.",[83,25064,25065,25067],{},[29,25066,620],{}," - Connect your axiom.ai account, set the \"Action event\" to \"Run an Axiom\". Configure the action to input your Zapier Table columns into the \"Input column\" fields of the action.",[14,25069,25070],{},"Now, set up your axiom.ai automation:",[77,25072,25073],{},[555,25074,25075,25081,25089],{},[83,25076,25077,25080],{},[29,25078,25079],{},"Create"," - Click \"+ New Automation\" to create a new automation.",[83,25082,25083,25086,25087,1230],{},[29,25084,25085],{},"Receive data"," - Add a ",[322,25088,8895],{"href":6958},[83,25090,25091,25093],{},[29,25092,620],{}," - Input test data into the \"Test data\" field, this will assist in the testing.",[14,25095,25096],{},"Continue to create your automation as required, using the data from the \"Test data\" input to build out an automation that uses your data. When you're ready, click \"Run\".",[21,25098,776],{"id":775},[11,25100],{},[14,25102,25103],{},"To test adding data to your Zapier Table, click \"Run\" in your automation. If there are errors with your automation, you may find these in the builder or in the Run Report for your run. If there is an error in your Zap, check your Zapier logs for more information on how to continue.",[14,25105,25106],{},"To test triggering your automation from your Zapier Table, run your Zap, or click \"Test step\" in the \"Test\" tab of the \"axiom.ai\" Zapier step.",[14,25108,24330],{},[80,25110,25111,25115,25119],{},[83,25112,25113],{},[322,25114,3313],{"href":3312},[83,25116,25117],{},[322,25118,3316],{"href":2203},[83,25120,25121],{},[322,25122,24346],{"href":24345},[21,25124,796],{"id":795},[11,25126],{},[14,25128,25129],{},"Zapier Tables can be a great alternative to storing your data - with the added benefit of being able to be used within your axiom.ai automations, and your Zapier Zaps. This opens up powerful opportunities to automate your workflow and get working even faster by integrating axiom.ai with the vast library of integrations that Zapier offers.",[11,25131],{},[14,25133,25134],{},"Information accurate as of December 2024.",{"title":494,"searchDepth":495,"depth":495,"links":25136},[25137,25138,25142,25143],{"id":545,"depth":498,"text":546},{"id":24933,"depth":498,"text":24934,"children":25139},[25140,25141],{"id":24942,"depth":495,"text":24943},{"id":25037,"depth":495,"text":25038},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},"Learn how to automatically send data to your Zapier Tables databases and trigger your axiom.ai automations using triggers.",{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":827,"tags":25146,"platfrom":25147},[829,830,1055,21214],[3288,24884],"\u002Fguides\u002Fzapier-tables",{"title":24873,"description":25144},"guides\u002Fzapier-tables","Kxe6B04quaLH01fQuJeN1B7QyP0-n7ljpFRpw_yCDFU",[25153,25603,25816,26041],{"id":23870,"title":23871,"body":25154,"date":523,"description":24379,"extension":506,"meta":25599,"navigation":522,"order":523,"path":24383,"seo":25602,"stem":24385,"__hash__":24386},{"type":8,"value":25155,"toc":25589},[25156,25158,25162,25164,25166,25186,25188,25190,25192,25204,25206,25210,25222,25226,25228,25230,25240,25246,25512,25519,25523,25525,25527,25545,25547,25551,25553,25555,25557,25559,25573,25575,25582,25587],[11,25157],{},[14,25159,23878,25160,23882],{},[322,25161,8921],{"href":23881},[21,25163,546],{"id":545},[14,25165,23887],{},[77,25167,25168],{},[80,25169,25170,25176,25180],{},[83,25171,25172,562,25174,44],{},[90,25173,561],{},[322,25175,566],{"href":565},[83,25177,25178,572],{},[90,25179,571],{},[83,25181,25182,578,25184,44],{},[90,25183,577],{},[90,25185,581],{},[14,25187,23910],{},[21,25189,23914],{"id":23913},[14,25191,23917],{},[77,25193,25194],{},[555,25195,25196,25200],{},[83,25197,25198,23926],{},[90,25199,577],{},[83,25201,25202,23931],{},[90,25203,16510],{},[639,25205,23935],{"id":23934},[14,25207,5070,25208,23940],{},[322,25209,7722],{"href":18400},[77,25211,25212],{},[555,25213,25214,25218,25220],{},[83,25215,8350,25216,1230],{},[322,25217,7722],{"href":18400},[83,25219,23951],{},[83,25221,23954],{},[14,25223,23957,25224,12399],{},[322,25225,7640],{"href":2670},[639,25227,11031],{"id":23962},[14,25229,23965],{},[555,25231,25232,25234,25236,25238],{},[83,25233,23970],{},[83,25235,23973],{},[83,25237,23976],{},[83,25239,23979],{},[14,25241,21301,25242,23984,25244,23987],{},[322,25243,2301],{"href":2300},[90,25245,9658],{},[719,25247,25248],{"className":756,"code":23990,"language":758,"meta":494,"style":494},[90,25249,25250,25262,25274,25284,25290,25312,25316,25320,25336,25342,25356,25364,25368,25374,25388,25396,25400,25416,25420,25424,25434,25446,25452,25456,25460,25476,25484,25492,25504,25508],{"__ignoreMap":494},[727,25251,25252,25254,25256,25258,25260],{"class":729,"line":730},[727,25253,2315],{"class":1986},[727,25255,23999],{"class":1882},[727,25257,2321],{"class":1986},[727,25259,24004],{"class":737},[727,25261,2327],{"class":768},[727,25263,25264,25266,25268,25270,25272],{"class":729,"line":498},[727,25265,2315],{"class":1986},[727,25267,24013],{"class":1882},[727,25269,2321],{"class":1986},[727,25271,24018],{"class":737},[727,25273,2327],{"class":768},[727,25275,25276,25278,25280,25282],{"class":729,"line":495},[727,25277,2315],{"class":1986},[727,25279,22284],{"class":1882},[727,25281,2321],{"class":1986},[727,25283,2391],{"class":768},[727,25285,25286,25288],{"class":729,"line":1895},[727,25287,9536],{"class":737},[727,25289,24037],{"class":768},[727,25291,25292,25294,25296,25298,25300,25302,25304,25306,25308,25310],{"class":729,"line":1901},[727,25293,9560],{"class":737},[727,25295,2030],{"class":768},[727,25297,165],{"class":1882},[727,25299,2004],{"class":768},[727,25301,8883],{"class":1882},[727,25303,24052],{"class":768},[727,25305,17430],{"class":1882},[727,25307,2004],{"class":768},[727,25309,24059],{"class":1882},[727,25311,24062],{"class":768},[727,25313,25314],{"class":729,"line":1973},[727,25315,16966],{"class":768},[727,25317,25318],{"class":729,"line":2052},[727,25319,1898],{"emptyLinePlaceholder":522},[727,25321,25322,25324,25326,25328,25330,25332,25334],{"class":729,"line":2058},[727,25323,2315],{"class":1986},[727,25325,24077],{"class":2376},[727,25327,2321],{"class":1986},[727,25329,2382],{"class":1986},[727,25331,2385],{"class":768},[727,25333,2388],{"class":1986},[727,25335,2391],{"class":768},[727,25337,25338,25340],{"class":729,"line":2064},[727,25339,2396],{"class":1986},[727,25341,2391],{"class":768},[727,25343,25344,25346,25348,25350,25352,25354],{"class":729,"line":2087},[727,25345,2403],{"class":1986},[727,25347,2093],{"class":1882},[727,25349,2321],{"class":1986},[727,25351,2410],{"class":1986},[727,25353,2413],{"class":2376},[727,25355,24108],{"class":768},[727,25357,25358,25360,25362],{"class":729,"line":2140},[727,25359,2421],{"class":768},[727,25361,2424],{"class":737},[727,25363,2427],{"class":768},[727,25365,25366],{"class":729,"line":2154},[727,25367,2432],{"class":768},[727,25369,25370,25372],{"class":729,"line":1529},[727,25371,21564],{"class":737},[727,25373,24037],{"class":768},[727,25375,25376,25378,25380,25382,25384,25386],{"class":729,"line":2178},[727,25377,24131],{"class":737},[727,25379,1995],{"class":768},[727,25381,17038],{"class":737},[727,25383,24138],{"class":768},[727,25385,2448],{"class":737},[727,25387,2427],{"class":768},[727,25389,25390,25392,25394],{"class":729,"line":2187},[727,25391,24147],{"class":737},[727,25393,1995],{"class":768},[727,25395,17055],{"class":737},[727,25397,25398],{"class":729,"line":2533},[727,25399,2465],{"class":768},[727,25401,25402,25404,25406,25408,25410,25412,25414],{"class":729,"line":2551},[727,25403,2470],{"class":768},[727,25405,9620],{"class":1882},[727,25407,44],{"class":768},[727,25409,9625],{"class":2376},[727,25411,2542],{"class":768},[727,25413,21611],{"class":2376},[727,25415,24172],{"class":768},[727,25417,25418],{"class":729,"line":2559},[727,25419,2511],{"class":768},[727,25421,25422],{"class":729,"line":2565},[727,25423,21623],{"class":768},[727,25425,25426,25428,25430,25432],{"class":729,"line":2570},[727,25427,2521],{"class":1986},[727,25429,2524],{"class":768},[727,25431,2527],{"class":1986},[727,25433,2530],{"class":768},[727,25435,25436,25438,25440,25442,25444],{"class":729,"line":2591},[727,25437,2536],{"class":768},[727,25439,2539],{"class":2376},[727,25441,2542],{"class":768},[727,25443,2545],{"class":737},[727,25445,2887],{"class":768},[727,25447,25448,25450],{"class":729,"line":2603},[727,25449,2554],{"class":1986},[727,25451,2327],{"class":768},[727,25453,25454],{"class":729,"line":2615},[727,25455,2562],{"class":768},[727,25457,25458],{"class":729,"line":2630},[727,25459,2516],{"class":768},[727,25461,25462,25464,25466,25468,25470,25472,25474],{"class":729,"line":2636},[727,25463,2403],{"class":1986},[727,25465,2575],{"class":1882},[727,25467,2321],{"class":1986},[727,25469,2410],{"class":1986},[727,25471,2582],{"class":768},[727,25473,2585],{"class":2376},[727,25475,2588],{"class":768},[727,25477,25478,25480,25482],{"class":729,"line":2642},[727,25479,2594],{"class":768},[727,25481,2597],{"class":2376},[727,25483,2600],{"class":768},[727,25485,25486,25488,25490],{"class":729,"line":2647},[727,25487,2606],{"class":768},[727,25489,2609],{"class":1986},[727,25491,2612],{"class":768},[727,25493,25494,25496,25498,25500,25502],{"class":729,"line":4657},[727,25495,2594],{"class":768},[727,25497,2539],{"class":2376},[727,25499,2542],{"class":768},[727,25501,2624],{"class":737},[727,25503,2627],{"class":768},[727,25505,25506],{"class":729,"line":4662},[727,25507,2633],{"class":768},[727,25509,25510],{"class":729,"line":1316},[727,25511,2639],{"class":768},[14,25513,24271,25514,24274,25516,12252],{},[90,25515,9658],{},[322,25517,24279],{"href":24277,"rel":25518},[2245],[14,25520,23957,25521,12399],{},[322,25522,7640],{"href":2670},[21,25524,24287],{"id":24286},[14,25526,24290],{},[77,25528,25529],{},[80,25530,25531,25539],{},[83,25532,25533,88,25535,611,25537,1230],{},[29,25534,87],{},[90,25536,24301],{},[322,25538,24301],{"href":6958},[83,25540,25541,88,25543,24311],{},[29,25542,111],{},[90,25544,24310],{},[14,25546,24314],{},[14,25548,25549],{},[807,25550,24319],{},[21,25552,776],{"id":775},[14,25554,24324],{},[14,25556,24327],{},[14,25558,24330],{},[80,25560,25561,25565,25569],{},[83,25562,25563],{},[322,25564,3313],{"href":3312},[83,25566,25567],{},[322,25568,3316],{"href":2203},[83,25570,25571],{},[322,25572,24346],{"href":24345},[21,25574,796],{"id":795},[14,25576,24351,25577,24355,25579,44],{},[322,25578,21233],{"href":24354},[322,25580,24359],{"href":3324,"rel":25581},[2245],[14,25583,24362,25584,44],{},[322,25585,24359],{"href":3324,"rel":25586},[2245],[811,25588,24368],{},{"title":494,"searchDepth":495,"depth":495,"links":25590},[25591,25592,25596,25597,25598],{"id":545,"depth":498,"text":546},{"id":23913,"depth":498,"text":23914,"children":25593},[25594,25595],{"id":23934,"depth":495,"text":23935},{"id":23962,"depth":495,"text":11031},{"id":24286,"depth":498,"text":24287},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"type":513,"format":514,"intent_type":515,"intent":827,"tags":25600,"platfrom":25601},[829,830],[1757],{"title":23871,"description":24379},{"id":24405,"title":24406,"body":25604,"date":523,"description":24678,"extension":506,"meta":25812,"navigation":522,"order":523,"path":24683,"seo":25815,"stem":24685,"__hash__":24686},{"type":8,"value":25605,"toc":25802},[25606,25608,25610,25612,25614,25616,25618,25638,25640,25642,25644,25662,25664,25672,25674,25686,25688,25720,25722,25724,25726,25728,25732,25734,25736,25738,25740,25742,25762,25766,25768,25770,25774,25794,25796,25798,25800],[11,25607],{},[14,25609,24413],{},[18,25611],{},[21,25613,546],{"id":545},[11,25615],{},[14,25617,551],{},[77,25619,25620],{},[555,25621,25622,25628,25632],{},[83,25623,25624,1785,25626,44],{},[29,25625,561],{},[322,25627,566],{"href":565},[83,25629,25630,1792],{},[29,25631,571],{},[83,25633,25634,1797,25636,44],{},[29,25635,577],{},[90,25637,581],{},[21,25639,24445],{"id":24444},[11,25641],{},[14,25643,24450],{},[77,25645,25646],{},[555,25647,25648,25652,25656],{},[83,25649,25650,24460],{},[29,25651,24459],{},[83,25653,25654,24466],{},[29,25655,24465],{},[83,25657,25658,24471,25660,24474],{},[29,25659,7722],{},[322,25661,7722],{"href":18400},[14,25663,24477],{},[77,25665,25666],{},[80,25667,25668,25670],{},[83,25669,24484],{},[83,25671,24487],{},[14,25673,24490],{},[77,25675,25676],{},[555,25677,25678,25682],{},[83,25679,25680,24500],{},[29,25681,24499],{},[83,25683,25684,24505],{},[29,25685,620],{},[14,25687,24508],{},[77,25689,25690],{},[555,25691,25692,25696,25700,25704,25708,25712,25716],{},[83,25693,25694,24518],{},[29,25695,24517],{},[83,25697,25698,24524],{},[29,25699,24523],{},[83,25701,25702,24529],{},[29,25703,14192],{},[83,25705,25706,24535],{},[29,25707,24534],{},[83,25709,25710,24541],{},[29,25711,24540],{},[83,25713,25714,24547],{},[29,25715,24546],{},[83,25717,25718,24552],{},[29,25719,12428],{},[592,25721],{"src":24555,"alt":24556},[21,25723,776],{"id":775},[11,25725],{},[14,25727,24563],{},[14,25729,24566,25730,24570],{},[322,25731,24569],{"href":791},[21,25733,6725],{"id":6724},[11,25735],{},[639,25737,24578],{"id":24577},[11,25739],{},[14,25741,24583],{},[77,25743,25744],{},[555,25745,25746,25754],{},[83,25747,25748,24593,25750,24597,25752,1230],{},[29,25749,24592],{},[322,25751,24596],{"href":19716},[322,25753,24601],{"href":24600},[83,25755,25756,24606,25758,24609,25760,20734],{},[29,25757,7722],{},[322,25759,7722],{"href":18400},[90,25761,198],{},[14,25763,24614,25764,24618],{},[322,25765,24445],{"href":24617},[639,25767,24622],{"id":24621},[11,25769],{},[14,25771,24627,25772,24631],{},[322,25773,24445],{"href":24630},[77,25775,25776],{},[555,25777,25778,25782,25786,25790],{},[83,25779,25780,24641],{},[29,25781,24640],{},[83,25783,25784,24646],{},[29,25785,24517],{},[83,25787,25788,24652],{},[29,25789,24651],{},[83,25791,25792,24657],{},[29,25793,620],{},[14,25795,24660],{},[21,25797,796],{"id":795},[11,25799],{},[14,25801,24667],{},{"title":494,"searchDepth":495,"depth":495,"links":25803},[25804,25805,25806,25807,25811],{"id":545,"depth":498,"text":546},{"id":24444,"depth":498,"text":24445},{"id":775,"depth":498,"text":776},{"id":6724,"depth":498,"text":6725,"children":25808},[25809,25810],{"id":24577,"depth":495,"text":24578},{"id":24621,"depth":495,"text":24622},{"id":795,"depth":498,"text":796},{"video":24680,"type":513,"format":77,"intent_type":515,"intent":827,"tags":25813,"platfrom":25814},[829,830,1055,21214],[3288],{"title":24406,"description":24678},{"id":11540,"title":11541,"body":25817,"date":523,"description":11548,"extension":506,"meta":26037,"navigation":522,"order":523,"path":11826,"seo":26040,"stem":11828,"__hash__":11829},{"type":8,"value":25818,"toc":26030},[25819,25821,25823,25825,25827,25829,25831,25833,25835,25837,25839,25847,25849,25853,25858,25863,25868,25873,25875,25877,25879,26001,26003,26005,26007,26009,26026,26028],[11,25820],{},[14,25822,11548],{},[14,25824,11551],{},[14,25826,11554],{},[21,25828,11558],{"id":11557},[14,25830,11561],{},[14,25832,11564],{},[592,25834],{"src":11567,"alt":11568},[21,25836,11572],{"id":11571},[14,25838,11575],{},[80,25840,25841,25843,25845],{},[83,25842,11580],{},[83,25844,11583],{},[83,25846,11586],{},[21,25848,11590],{"id":11589},[14,25850,11593,25851,11597],{},[322,25852,11596],{"href":494},[14,25854,11600,25855,11606],{},[322,25856,11605],{"href":11603,"rel":25857},[2245],[14,25859,11609,25860,11615],{},[322,25861,11614],{"href":11612,"rel":25862},[2245],[14,25864,11618,25865,11624],{},[322,25866,11623],{"href":11621,"rel":25867},[2245],[14,25869,11627,25870,11632],{},[322,25871,11631],{"href":11603,"rel":25872},[2245],[592,25874],{"src":11635,"alt":11636},[21,25876,11640],{"id":11639},[14,25878,11643],{},[77,25880,25881],{},[80,25882,25883,25909],{},[83,25884,25885,88,25887,25889],{},[29,25886,349],{},[90,25888,92],{},[80,25890,25891,25895,25899,25905],{},[83,25892,25893,100],{},[90,25894,99],{},[83,25896,25897,7975],{},[90,25898,105],{},[83,25900,25901,11281,25903,44],{},[90,25902,7182],{},[90,25904,7186],{},[83,25906,25907,11674],{},[90,25908,5267],{},[83,25910,25911,88,25913,25915,25925],{},[29,25912,908],{},[90,25914,114],{},[80,25916,25917],{},[83,25918,25919,132,25921,136,25923,44],{},[90,25920,114],{},[90,25922,194],{},[90,25924,139],{},[80,25926,25927,25947,25963],{},[83,25928,25929,88,25931,25933],{},[29,25930,917],{},[90,25932,11699],{},[80,25934,25935,25941],{},[83,25936,25937,11707,25939,44],{},[90,25938,11706],{},[90,25940,11710],{},[83,25942,25943,132,25945,11717],{},[90,25944,465],{},[90,25946,194],{},[83,25948,25949,88,25951,25953],{},[29,25950,935],{},[90,25952,11724],{},[80,25954,25955],{},[83,25956,25957,132,25959,11733,25961,1230],{},[90,25958,465],{},[90,25960,194],{},[90,25962,11699],{},[83,25964,25965,88,25967,25969,25979],{},[29,25966,943],{},[90,25968,11742],{},[80,25970,25971],{},[83,25972,25973,132,25975,11733,25977,1230],{},[90,25974,114],{},[90,25976,194],{},[90,25978,11724],{},[80,25980,25981],{},[83,25982,25983,88,25985,25987],{},[29,25984,11379],{},[90,25986,3639],{},[80,25988,25989,25993],{},[83,25990,25991,11767],{},[90,25992,155],{},[83,25994,25995,162,25997,11774,25999,11777],{},[90,25996,11394],{},[90,25998,3651],{},[90,26000,11724],{},[14,26002,11780],{},[21,26004,796],{"id":795},[14,26006,11785],{},[14,26008,11788],{},[80,26010,26011,26016,26021],{},[83,26012,26013],{},[322,26014,11796],{"href":11612,"rel":26015},[2245],[83,26017,26018],{},[322,26019,11802],{"href":11621,"rel":26020},[2245],[83,26022,26023],{},[322,26024,11808],{"href":11603,"rel":26025},[2245],[14,26027,11811],{},[14,26029,11814],{},{"title":494,"searchDepth":495,"depth":495,"links":26031},[26032,26033,26034,26035,26036],{"id":11557,"depth":498,"text":11558},{"id":11571,"depth":498,"text":11572},{"id":11589,"depth":498,"text":11590},{"id":11639,"depth":498,"text":11640},{"id":795,"depth":498,"text":796},{"pinned":522,"metaTitle":11823,"type":513,"format":77,"intent_type":1754,"intent":827,"tags":26038,"platfrom":26039},[1055],[1757],{"title":11541,"description":11548},{"id":20344,"title":20345,"body":26042,"date":1043,"description":20541,"extension":506,"meta":26216,"navigation":522,"order":523,"path":15981,"seo":26219,"stem":20547,"__hash__":20548},{"type":8,"value":26043,"toc":26208},[26044,26046,26048,26050,26054,26056,26062,26064,26070,26074,26076,26078,26136,26138,26140,26142,26146,26148,26150,26204],[11,26045],{},[14,26047,20352],{},[18,26049],{},[14,26051,20357,26052],{},[322,26053,20360],{"href":15104},[21,26055,24],{"id":23},[14,26057,27,26058,20367,26060,44],{},[29,26059,31],{},[29,26061,39],{},[21,26063,20373],{"id":20372},[14,26065,20376,26066,20379,26068,59],{},[29,26067,54],{},[29,26069,58],{},[14,26071,20384,26072,44],{},[29,26073,65],{},[14,26075,68],{},[21,26077,20392],{"id":20391},[77,26079,26080],{},[80,26081,26082,26108],{},[83,26083,26084,88,26086,26088],{},[29,26085,349],{},[90,26087,13474],{},[80,26089,26090,26094,26100,26104],{},[83,26091,26092,20409],{},[90,26093,3922],{},[83,26095,26096,1995,26098,20416],{},[90,26097,155],{},[322,26099,19500],{"href":19499},[83,26101,26102,20421],{},[90,26103,16039],{},[83,26105,26106,20426],{},[90,26107,161],{},[83,26109,26110,88,26112,26114],{},[29,26111,908],{},[90,26113,3303],{},[80,26115,26116,26120,26124,26130],{},[83,26117,26118,100],{},[90,26119,99],{},[83,26121,26122,255],{},[90,26123,105],{},[83,26125,26126,261,26128,44],{},[90,26127,260],{},[90,26129,13616],{},[83,26131,26132,162,26134,44],{},[90,26133,15309],{},[90,26135,6013],{},[21,26137,20458],{"id":20457},[14,26139,20461],{},[21,26141,317],{"id":316},[14,26143,320,26144,326],{},[322,26145,325],{"href":324},[21,26147,330],{"id":329},[14,26149,333],{},[77,26151,26152],{},[80,26153,26154,26164,26176,26184,26196],{},[83,26155,26156,26158,346,26160,20485,26162,44],{},[29,26157,363],{},[344,26159],{},[90,26161,20484],{},[322,26163,7498],{"href":380},[83,26165,26166,26168,393,26170,397,26172,401,26174,44],{},[29,26167,19614],{},[344,26169],{},[90,26171,396],{},[90,26173,400],{},[90,26175,17395],{},[83,26177,26178,26180,19630,26182,19633],{},[29,26179,19627],{},[344,26181],{},[90,26183,161],{},[83,26185,26186,26188,346,26190,444,26192,466,26194,44],{},[29,26187,459],{},[344,26189],{},[90,26191,20516],{},[90,26193,465],{},[90,26195,13616],{},[83,26197,26198,26200,476,26202,480],{},[29,26199,473],{},[344,26201],{},[90,26203,479],{},[14,26205,483,26206],{},[322,26207,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":26209},[26210,26211,26212,26213,26214,26215],{"id":23,"depth":498,"text":24},{"id":20372,"depth":498,"text":20373},{"id":20391,"depth":498,"text":20392},{"id":20457,"depth":498,"text":20458},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"read":1527,"level":510,"video":20543,"templateId":4671,"type":513,"format":514,"intent_type":1754,"intent":4022,"tags":26217,"platfrom":26218},[519,15368,12881],[1757],{"title":20345,"description":20541},[],{"id":26222,"title":26223,"author":523,"body":26224,"date":523,"description":494,"draft":26250,"extension":506,"meta":26251,"navigation":522,"path":19671,"seo":26252,"stem":26253,"__hash__":26254},"blog\u002Fblog\u002Findex.md","The axiom.ai browser automation blog",{"type":8,"value":26225,"toc":26248},[26226,26230,26232,26235,26240,26245],[12701,26227],{"description":26228,"headline":26229},"Discover the most effective ways to automate website actions such as filling in forms, downloading files, and web scraping. Our comprehensive step-by-step guides and tips will help you streamline your workflow and save valuable time and effort.","Browser automation blog",[12706,26231],{},[26233,26234],"post-card-listing",{},[12744,26236],{"author":26237,"className":26238,"quote":26239},"Tom Ugarte",[12741],"I have been using Axiom daily for nearly two years!",[26241,26242,26243],"background-wrapper",{"bg-class":12752},[12749,26244],{},[12755,26246],{"className":26247},[12752],{"title":494,"searchDepth":495,"depth":495,"links":26249},[],false,{},{"title":26223,"description":494},"blog\u002Findex","Vmkzft4-syYQUfwehmdvXcYsg0f5xJVAcmJEIPvn2bA",[26256,26404,26636,26975,27242,27319,27476,27603,27870,28094,28303,28466,28667,28821,29006,29261,29500,29723,29950,30149,30387,30630,30882,31111,31290,31511,31766,31904,32081,32281,32628,33549,34027,34748,34906,35448,35755,36125,36322,36408,36565,36766,36901,37259,37404,37825,37908,37998,38269,38556,38781,39028,39475,39512,39900,40007,40147,40212,40461,40909,40920,42420,42562,42813,43059,43300,43383,43659,44793,45096,45277,45288,45738,45749,45988],{"id":13669,"title":13670,"body":26257,"date":13862,"description":13677,"extension":506,"meta":26400,"navigation":522,"order":523,"path":13868,"seo":26403,"stem":13870,"__hash__":13871},{"type":8,"value":26258,"toc":26391},[26259,26261,26263,26265,26267,26269,26273,26275,26277,26279,26283,26285,26291,26313,26315,26321,26343,26345,26347,26349,26371,26373,26375,26381,26385],[11,26260],{},[14,26262,13677],{},[14,26264,13680],{},[21,26266,13684],{"id":13683},[11,26268],{},[14,26270,13689,26271,13694],{},[322,26272,13693],{"href":13692},[14,26274,13697],{},[21,26276,13701],{"id":13700},[11,26278],{},[14,26280,13706,26281,13710],{},[90,26282,13709],{},[639,26284,13714],{"id":13713},[14,26286,5070,26287,13720,26289,13724],{},[90,26288,13719],{},[90,26290,13723],{},[7092,26292,26293,26299],{},[7095,26294,26295],{},[7098,26296,26297],{},[7101,26298,13733],{},[7108,26300,26301,26305,26309],{},[7098,26302,26303],{},[7113,26304,13740],{},[7098,26306,26307],{},[7113,26308,13723],{},[7098,26310,26311],{},[7113,26312,13749],{},[639,26314,13753],{"id":13752},[14,26316,13756,26317,2004,26319,13763],{},[90,26318,13759],{},[90,26320,13762],{},[7092,26322,26323,26329],{},[7095,26324,26325],{},[7098,26326,26327],{},[7101,26328,13733],{},[7108,26330,26331,26335,26339],{},[7098,26332,26333],{},[7113,26334,13759],{},[7098,26336,26337],{},[7113,26338,13782],{},[7098,26340,26341],{},[7113,26342,13749],{},[21,26344,13790],{"id":13789},[11,26346],{},[14,26348,13795],{},[7092,26350,26351,26357],{},[7095,26352,26353],{},[7098,26354,26355],{},[7101,26356,13733],{},[7108,26358,26359,26363,26367],{},[7098,26360,26361],{},[7113,26362,13740],{},[7098,26364,26365],{},[7113,26366,13723],{},[7098,26368,26369],{},[7113,26370,13749],{},[21,26372,13821],{"id":13820},[11,26374],{},[14,26376,13826,26377,3289,26379,13834],{},[322,26378,92],{"href":13829},[322,26380,13833],{"href":13832},[14,26382,13837,26383,13841],{},[322,26384,114],{"href":13840},[14,26386,13844,26387,13848,26389,12252],{},[322,26388,3639],{"href":13847},[322,26390,13852],{"href":13851},{"title":494,"searchDepth":495,"depth":495,"links":26392},[26393,26394,26398,26399],{"id":13683,"depth":498,"text":13684},{"id":13700,"depth":498,"text":13701,"children":26395},[26396,26397],{"id":13713,"depth":495,"text":13714},{"id":13752,"depth":495,"text":13753},{"id":13789,"depth":498,"text":13790},{"id":13820,"depth":498,"text":13821},{"pinned":522,"read":1046,"level":510,"templateId":498,"type":513,"format":77,"intent_type":515,"intent":1050,"tags":26401,"platfrom":26402},[7290,13865,13866],[1757],{"title":13670,"description":13677},{"id":19090,"title":19091,"body":26405,"date":19372,"description":19373,"extension":506,"meta":26632,"navigation":522,"order":523,"path":19380,"seo":26635,"stem":19382,"__hash__":19383},{"type":8,"value":26406,"toc":26625},[26407,26409,26417,26419,26421,26423,26425,26429,26433,26435,26437,26521,26523,26527,26529,26533,26621],[11,26408],{},[14,26410,14789,26411,19101,26413,19105,26415,19109],{},[29,26412,19100],{},[29,26414,19104],{},[29,26416,19108],{},[18,26418],{},[21,26420,14799],{"id":14798},[14,26422,14802],{},[21,26424,19119],{"id":19118},[14,26426,14809,26427,14813],{},[29,26428,19124],{},[14,26430,62,26431,44],{},[29,26432,19129],{},[14,26434,68],{},[21,26436,19135],{"id":19134},[77,26438,26439,26519],{},[80,26440,26441,26457],{},[83,26442,26443,88,26445,26447],{},[29,26444,87],{},[90,26446,13474],{},[80,26448,26449,26453],{},[83,26450,26451,19152],{},[90,26452,3922],{},[83,26454,26455,19157],{},[90,26456,161],{},[83,26458,26459,88,26461,26463],{},[29,26460,111],{},[90,26462,114],{},[80,26464,26465,26471,26477,26483,26489,26495,26507,26513],{},[83,26466,26467,88,26469,19173],{},[29,26468,121],{},[90,26470,19172],{},[83,26472,26473,88,26475,19181],{},[29,26474,145],{},[90,26476,19180],{},[83,26478,26479,88,26481,19189],{},[29,26480,170],{},[90,26482,19188],{},[83,26484,26485,88,26487,19196],{},[29,26486,213],{},[90,26488,19188],{},[83,26490,26491,88,26493,19204],{},[29,26492,241],{},[90,26494,19203],{},[83,26496,26497,88,26499,26501],{},[29,26498,278],{},[90,26500,6426],{},[80,26502,26503],{},[83,26504,26505,19217],{},[90,26506,953],{},[83,26508,26509,88,26511,19224],{},[29,26510,1203],{},[90,26512,19188],{},[83,26514,26515,88,26517,19231],{},[29,26516,13038],{},[90,26518,19203],{},[14,26520,983],{},[21,26522,19237],{"id":19236},[14,26524,19240,26525,19244],{},[90,26526,19243],{},[21,26528,330],{"id":329},[14,26530,1009,26531,44],{},[322,26532,994],{"href":993},[77,26534,26535],{},[80,26536,26537,26545,26557,26565,26575,26587,26597,26605,26611],{},[83,26538,26539,26541,19261,26543,1230],{},[29,26540,10365],{},[344,26542],{},[90,26544,124],{},[83,26546,26547,26549,12861,26551,19273,26553,10385,26555,44],{},[29,26548,19268],{},[344,26550],{},[90,26552,3639],{},[90,26554,10384],{},[322,26556,19278],{"href":380},[83,26558,26559,26561,19286,26563,19289],{},[29,26560,19283],{},[344,26562],{},[90,26564,10403],{},[83,26566,26567,26569,19297,26571,19300,26573,44],{},[29,26568,19294],{},[344,26570],{},[90,26572,3639],{},[90,26574,10403],{},[83,26576,26577,26579,19309,26581,19312,26583,10385,26585,44],{},[29,26578,10422],{},[344,26580],{},[90,26582,3639],{},[90,26584,10431],{},[322,26586,19278],{"href":10402},[83,26588,26589,26591,19324,26593,19327,26595,1230],{},[29,26590,19321],{},[344,26592],{},[90,26594,10445],{},[90,26596,5346],{},[83,26598,26599,26601,19337,26603,19340],{},[29,26600,19334],{},[344,26602],{},[90,26604,2695],{},[83,26606,26607,26609,19347],{},[29,26608,10462],{},[344,26610],{},[83,26612,26613,26615,19355,26617,19358,26619,44],{},[29,26614,19352],{},[344,26616],{},[90,26618,5619],{},[90,26620,908],{},[14,26622,483,26623],{},[322,26624,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":26626},[26627,26628,26629,26630,26631],{"id":14798,"depth":498,"text":14799},{"id":19118,"depth":498,"text":19119},{"id":19134,"depth":498,"text":19135},{"id":19236,"depth":498,"text":19237},{"id":329,"depth":498,"text":330},{"read":1527,"level":510,"video":19375,"templateId":2565,"type":513,"format":514,"intent_type":1049,"intent":1050,"tags":26633,"platfrom":26634},[11532,19377,1053,1054],[15072,19379],{"title":19091,"description":19373},{"id":5,"title":6,"body":26637,"date":504,"description":505,"extension":506,"meta":26971,"navigation":522,"order":523,"path":524,"seo":26974,"stem":526,"__hash__":527},{"type":8,"value":26638,"toc":26963},[26639,26641,26643,26645,26647,26657,26659,26665,26669,26671,26673,26675,26841,26843,26845,26847,26851,26853,26855,26957],[11,26640],{},[14,26642,16],{},[18,26644],{},[21,26646,24],{"id":23},[14,26648,27,26649,32,26651,36,26653,40,26655,44],{},[29,26650,31],{},[29,26652,35],{},[29,26654,39],{},[29,26656,43],{},[21,26658,48],{"id":47},[14,26660,51,26661,55,26663,59],{},[29,26662,54],{},[29,26664,58],{},[14,26666,62,26667,44],{},[29,26668,65],{},[14,26670,68],{},[21,26672,72],{"id":71},[14,26674,75],{},[77,26676,26677],{},[80,26678,26679,26695],{},[83,26680,26681,88,26683,26685],{},[29,26682,87],{},[90,26684,92],{},[80,26686,26687,26691],{},[83,26688,26689,100],{},[90,26690,99],{},[83,26692,26693,106],{},[90,26694,105],{},[83,26696,26697,88,26699,26701],{},[29,26698,111],{},[90,26700,114],{},[80,26702,26703,26719,26737,26765,26785,26813],{},[83,26704,26705,88,26707,26709],{},[29,26706,121],{},[90,26708,124],{},[80,26710,26711],{},[83,26712,26713,132,26715,136,26717,140],{},[90,26714,131],{},[90,26716,135],{},[90,26718,139],{},[83,26720,26721,88,26723,26725],{},[29,26722,145],{},[90,26724,148],{},[80,26726,26727,26731],{},[83,26728,26729,156],{},[90,26730,155],{},[83,26732,26733,162,26735,44],{},[90,26734,161],{},[90,26736,165],{},[83,26738,26739,88,26741,26743],{},[29,26740,170],{},[90,26742,173],{},[80,26744,26745,26749,26759],{},[83,26746,26747,181],{},[90,26748,180],{},[83,26750,26751,187,26753,191,26755,195,26757,199],{},[90,26752,186],{},[90,26754,190],{},[90,26756,194],{},[90,26758,198],{},[83,26760,26761,205,26763,44],{},[90,26762,204],{},[90,26764,208],{},[83,26766,26767,88,26769,26771],{},[29,26768,213],{},[90,26770,216],{},[80,26772,26773,26779],{},[83,26774,26775,224,26777,228],{},[90,26776,223],{},[90,26778,227],{},[83,26780,26781,224,26783,44],{},[90,26782,233],{},[90,26784,236],{},[83,26786,26787,88,26789,26791],{},[29,26788,241],{},[90,26790,244],{},[80,26792,26793,26797,26801,26807],{},[83,26794,26795,100],{},[90,26796,99],{},[83,26798,26799,255],{},[90,26800,105],{},[83,26802,26803,261,26805,44],{},[90,26804,260],{},[90,26806,264],{},[83,26808,26809,270,26811,44],{},[90,26810,269],{},[90,26812,273],{},[83,26814,26815,88,26817,26819],{},[29,26816,278],{},[90,26818,281],{},[80,26820,26821,26825,26829,26835],{},[83,26822,26823,100],{},[90,26824,99],{},[83,26826,26827,292],{},[90,26828,105],{},[83,26830,26831,162,26833,44],{},[90,26832,297],{},[90,26834,165],{},[83,26836,26837,162,26839,44],{},[90,26838,304],{},[90,26840,165],{},[21,26842,310],{"id":309},[14,26844,313],{},[21,26846,317],{"id":316},[14,26848,320,26849,326],{},[322,26850,325],{"href":324},[21,26852,330],{"id":329},[14,26854,333],{},[77,26856,26857],{},[80,26858,26859,26871,26879,26889,26901,26909,26923,26939,26949],{},[83,26860,26861,26863,346,26865,350,26867,354,26869,358],{},[29,26862,342],{},[344,26864],{},[90,26866,349],{},[90,26868,353],{},[90,26870,357],{},[83,26872,26873,26875,346,26877,369],{},[29,26874,363],{},[344,26876],{},[90,26878,368],{},[83,26880,26881,26883,377,26885,382,26887,44],{},[29,26882,374],{},[344,26884],{},[322,26886,381],{"href":380},[90,26888,385],{},[83,26890,26891,26893,393,26895,397,26897,401,26899,44],{},[29,26892,390],{},[344,26894],{},[90,26896,396],{},[90,26898,400],{},[90,26900,165],{},[83,26902,26903,26905,346,26907,414],{},[29,26904,408],{},[344,26906],{},[90,26908,413],{},[83,26910,26911,26913,422,26915,425,26917,26919,26921,433],{},[29,26912,419],{},[344,26914],{},[90,26916,186],{},[344,26918],{},[90,26920,430],{},[344,26922],{},[83,26924,26925,26927,346,26929,444,26931,447,26933,450,26935,447,26937,44],{},[29,26926,438],{},[344,26928],{},[90,26930,443],{},[90,26932,223],{},[90,26934,227],{},[90,26936,233],{},[90,26938,236],{},[83,26940,26941,26943,462,26945,466,26947,44],{},[29,26942,459],{},[344,26944],{},[90,26946,465],{},[90,26948,264],{},[83,26950,26951,26953,476,26955,480],{},[29,26952,473],{},[344,26954],{},[90,26956,479],{},[14,26958,483,26959,488,26961],{},[322,26960,487],{"href":486},[322,26962,492],{"href":491},{"title":494,"searchDepth":495,"depth":495,"links":26964},[26965,26966,26967,26968,26969,26970],{"id":23,"depth":498,"text":24},{"id":47,"depth":498,"text":48},{"id":71,"depth":498,"text":72},{"id":309,"depth":498,"text":310},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"logoFile":508,"read":509,"level":510,"video":511,"templateId":512,"type":513,"format":514,"intent_type":515,"intent":516,"tags":26972,"platfrom":26973},[518,519],[521],{"title":6,"description":505},{"id":5832,"title":5833,"body":26976,"date":504,"description":6137,"extension":506,"meta":27238,"navigation":522,"order":523,"path":6142,"seo":27241,"stem":6144,"__hash__":6145},{"type":8,"value":26977,"toc":27230},[26978,26980,26982,26984,26986,26996,26998,27004,27008,27010,27012,27016,27158,27160,27162,27164,27168,27170,27172],[11,26979],{},[14,26981,5840],{},[18,26983],{},[21,26985,24],{"id":23},[14,26987,27,26988,1085,26990,5852,26992,40,26994,44],{},[29,26989,5205],{},[29,26991,5851],{},[29,26993,5855],{},[29,26995,465],{},[21,26997,5861],{"id":5860},[14,26999,5864,27000,5868,27002,59],{},[29,27001,5867],{},[29,27003,5871],{},[14,27005,62,27006,44],{},[29,27007,5876],{},[14,27009,68],{},[21,27011,5882],{"id":5881},[14,27013,5885,27014,5889],{},[90,27015,5888],{},[77,27017,27018],{},[80,27019,27020,27038],{},[83,27021,27022,88,27024,27026],{},[29,27023,87],{},[90,27025,92],{},[80,27027,27028,27032],{},[83,27029,27030,100],{},[90,27031,99],{},[83,27033,27034,5910,27036,44],{},[90,27035,105],{},[90,27037,5913],{},[83,27039,27040,88,27042,27044],{},[29,27041,111],{},[90,27043,114],{},[80,27045,27046,27060,27078,27102,27130],{},[83,27047,27048,88,27050,27052],{},[29,27049,121],{},[90,27051,124],{},[80,27053,27054],{},[83,27055,27056,1620,27058,5936],{},[90,27057,131],{},[90,27059,139],{},[83,27061,27062,88,27064,27066],{},[29,27063,145],{},[90,27065,148],{},[80,27067,27068,27072],{},[83,27069,27070,5949],{},[90,27071,155],{},[83,27073,27074,162,27076,44],{},[90,27075,161],{},[90,27077,165],{},[83,27079,27080,88,27082,27084],{},[29,27081,170],{},[90,27083,5962],{},[80,27085,27086,27090,27096],{},[83,27087,27088,181],{},[90,27089,180],{},[83,27091,27092,224,27094,44],{},[90,27093,465],{},[90,27095,5975],{},[83,27097,27098,5980,27100,5983],{},[90,27099,204],{},[90,27101,208],{},[83,27103,27104,88,27106,27108],{},[29,27105,213],{},[90,27107,3303],{},[80,27109,27110,27114,27118,27124],{},[83,27111,27112,100],{},[90,27113,99],{},[83,27115,27116,255],{},[90,27117,105],{},[83,27119,27120,261,27122,44],{},[90,27121,260],{},[90,27123,6006],{},[83,27125,27126,162,27128,44],{},[90,27127,269],{},[90,27129,6013],{},[83,27131,27132,88,27134,27136],{},[29,27133,241],{},[90,27135,281],{},[80,27137,27138,27142,27146,27152],{},[83,27139,27140,1125],{},[90,27141,99],{},[83,27143,27144,292],{},[90,27145,105],{},[83,27147,27148,162,27150,44],{},[90,27149,297],{},[90,27151,165],{},[83,27153,27154,162,27156,44],{},[90,27155,304],{},[90,27157,165],{},[21,27159,6045],{"id":6044},[14,27161,313],{},[21,27163,317],{"id":316},[14,27165,320,27166,326],{},[322,27167,325],{"href":324},[21,27169,330],{"id":329},[14,27171,333],{},[77,27173,27174],{},[80,27175,27176,27188,27196,27208,27220],{},[83,27177,27178,27180,6069,27182,6072,27184,6075,27186,358],{},[29,27179,6066],{},[344,27181],{},[90,27183,353],{},[90,27185,92],{},[90,27187,357],{},[83,27189,27190,27192,346,27194,6087],{},[29,27191,6082],{},[344,27193],{},[90,27195,148],{},[83,27197,27198,27200,6095,27202,6098,27204,6072,27206,1230],{},[29,27199,6092],{},[344,27201],{},[322,27203,381],{"href":380},[90,27205,385],{},[90,27207,148],{},[83,27209,27210,27212,6110,27214,397,27216,401,27218,6117],{},[29,27211,6107],{},[344,27213],{},[90,27215,396],{},[90,27217,400],{},[90,27219,165],{},[83,27221,27222,27224,476,27226,466,27228],{},[29,27223,6122],{},[344,27225],{},[90,27227,465],{},[90,27229,5975],{},{"title":494,"searchDepth":495,"depth":495,"links":27231},[27232,27233,27234,27235,27236,27237],{"id":23,"depth":498,"text":24},{"id":5860,"depth":498,"text":5861},{"id":5881,"depth":498,"text":5882},{"id":6044,"depth":498,"text":6045},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"pinned":522,"read":1046,"level":510,"video":6139,"templateId":4778,"type":513,"format":514,"intent_type":1754,"intent":516,"tags":27239,"platfrom":27240},[519,1056],[521],{"title":5833,"description":6137},{"id":12766,"title":12767,"body":27243,"date":504,"description":12875,"extension":506,"meta":27315,"navigation":522,"order":523,"path":11193,"seo":27318,"stem":12885,"__hash__":12886},{"type":8,"value":27244,"toc":27309},[27245,27249,27251,27253,27257,27259,27265,27269,27271,27279,27281,27289,27293,27297,27301],[14,27246,12772,27247,12776],{},[29,27248,12775],{},[18,27250],{},[21,27252,24],{"id":23},[14,27254,12783,27255,12787],{},[29,27256,12786],{},[21,27258,12791],{"id":12790},[14,27260,12794,27261,5868,27263,59],{},[29,27262,54],{},[29,27264,58],{},[14,27266,62,27267,12803],{},[29,27268,65],{},[21,27270,12807],{"id":12806},[14,27272,12810,27273,12813,27275,12817,27277,1230],{},[29,27274,12775],{},[322,27276,12816],{"href":11535},[29,27278,12820],{},[21,27280,12824],{"id":12823},[14,27282,27283,12830,27285,6072,27287,12837],{},[29,27284,12829],{},[29,27286,12833],{},[29,27288,12836],{},[14,27290,27291,12843],{},[29,27292,12842],{},[14,27294,27295,12849],{},[29,27296,12848],{},[14,27298,27299,12855],{},[29,27300,12854],{},[14,27302,27303,12861,27305,12864,27307,12868],{},[29,27304,12860],{},[29,27306,12820],{},[322,27308,12867],{"href":11535},{"title":494,"searchDepth":495,"depth":495,"links":27310},[27311,27312,27313,27314],{"id":23,"depth":498,"text":24},{"id":12790,"depth":498,"text":12791},{"id":12806,"depth":498,"text":12807},{"id":12823,"depth":498,"text":12824},{"read":509,"level":510,"video":12877,"templateId":4811,"type":513,"format":514,"intent_type":1049,"intent":12878,"tags":27316,"platform":27317,"featuredimg":12883},[12880,12881,1053],[11534],{"title":12767,"description":12875},{"id":23378,"title":23379,"body":27320,"date":23558,"description":23559,"extension":506,"meta":27472,"navigation":522,"order":523,"path":23565,"seo":27475,"stem":23567,"__hash__":23568},{"type":8,"value":27321,"toc":27464},[27322,27324,27326,27328,27330,27334,27336,27342,27344,27346,27348,27418,27420,27422,27424,27432,27434,27436,27460],[11,27323],{},[14,27325,23386],{},[18,27327],{},[21,27329,24],{"id":23},[14,27331,27,27332,23395],{},[29,27333,31],{},[21,27335,23399],{"id":23398},[14,27337,23402,27338,23405,27340,59],{},[29,27339,54],{},[29,27341,58],{},[14,27343,876],{},[14,27345,68],{},[21,27347,23415],{"id":23414},[77,27349,27350],{},[80,27351,27352,27368],{},[83,27353,27354,88,27356,27358],{},[29,27355,87],{},[90,27357,92],{},[80,27359,27360,27364],{},[83,27361,27362,100],{},[90,27363,99],{},[83,27365,27366,23436],{},[90,27367,105],{},[83,27369,27370,88,27372,27374],{},[29,27371,111],{},[90,27373,114],{},[80,27375,27376,27388,27406],{},[83,27377,27378,88,27380,27382],{},[29,27379,121],{},[90,27381,124],{},[80,27383,27384],{},[83,27385,27386,23457],{},[90,27387,131],{},[83,27389,27390,88,27392,27394],{},[29,27391,145],{},[90,27393,23464],{},[80,27395,27396,27400],{},[83,27397,27398,23471],{},[90,27399,9946],{},[83,27401,27402,23476,27404,23479],{},[90,27403,1189],{},[90,27405,139],{},[83,27407,27408,88,27410,27412],{},[29,27409,170],{},[90,27411,23486],{},[80,27413,27414],{},[83,27415,27416,23493],{},[90,27417,15636],{},[21,27419,23497],{"id":23496},[14,27421,23500],{},[21,27423,317],{"id":316},[14,27425,320,27426,23507,27428,23510,27430,1230],{},[322,27427,325],{"href":324},[322,27429,7285],{"href":7353},[322,27431,23513],{"href":1228},[21,27433,330],{"id":329},[14,27435,333],{},[77,27437,27438],{},[80,27439,27440,27448,27454],{},[83,27441,27442,27444,10616,27446,44],{},[29,27443,23526],{},[344,27445],{},[322,27447,7498],{"href":380},[83,27449,27450,27452,10626],{},[29,27451,23535],{},[344,27453],{},[83,27455,27456,27458,23545],{},[29,27457,23542],{},[344,27459],{},[14,27461,483,27462],{},[322,27463,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":27465},[27466,27467,27468,27469,27470,27471],{"id":23,"depth":498,"text":24},{"id":23398,"depth":498,"text":23399},{"id":23414,"depth":498,"text":23415},{"id":23496,"depth":498,"text":23497},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"pinned":522,"read":1527,"level":510,"video":23561,"templateId":4739,"type":513,"format":514,"intent_type":1754,"intent":10665,"tags":27473,"platfrom":27474},[10667,23563,23110],[1757],{"title":23379,"description":23559},{"id":10506,"title":10507,"body":27477,"date":10661,"description":10662,"extension":506,"meta":27599,"navigation":522,"order":523,"path":10670,"seo":27602,"stem":10672,"__hash__":10673},{"type":8,"value":27478,"toc":27592},[27479,27481,27483,27485,27487,27489,27491,27493,27495,27539,27541,27543,27545,27553,27555,27557,27586],[11,27480],{},[14,27482,10514],{},[18,27484],{},[21,27486,10520],{"id":10519},[14,27488,10523],{},[14,27490,876],{},[14,27492,68],{},[21,27494,10531],{"id":10530},[77,27496,27497],{},[80,27498,27499,27515],{},[83,27500,27501,88,27503,27505],{},[29,27502,349],{},[90,27504,124],{},[80,27506,27507],{},[83,27508,27509,132,27511,136,27513,10552],{},[90,27510,131],{},[90,27512,135],{},[90,27514,139],{},[83,27516,27517,88,27519,27521],{},[29,27518,908],{},[90,27520,10559],{},[80,27522,27523,27527,27531,27535],{},[83,27524,27525,10566],{},[90,27526,155],{},[83,27528,27529,1638],{},[90,27530,1637],{},[83,27532,27533,1644],{},[90,27534,1643],{},[83,27536,27537,1644],{},[90,27538,10579],{},[21,27540,10583],{"id":10582},[14,27542,10586],{},[21,27544,317],{"id":316},[14,27546,320,27547,10593,27549,10597,27551,44],{},[322,27548,325],{"href":324},[322,27550,10596],{"href":1698},[322,27552,10601],{"href":10600},[21,27554,330],{"id":329},[14,27556,333],{},[77,27558,27559],{},[80,27560,27561,27569,27575],{},[83,27562,27563,27565,10616,27567,44],{},[29,27564,363],{},[344,27566],{},[322,27568,7498],{"href":380},[83,27570,27571,27573,10626],{},[29,27572,10623],{},[344,27574],{},[83,27576,27577,27579,10634,27581,10639,27583,44],{},[29,27578,10631],{},[344,27580],{},[322,27582,10638],{"href":10637},[322,27584,10644],{"href":10642,"rel":27585},[2245],[14,27587,483,27588,10649,27590],{},[322,27589,487],{"href":486},[322,27591,10653],{"href":10652},{"title":494,"searchDepth":495,"depth":495,"links":27593},[27594,27595,27596,27597,27598],{"id":10519,"depth":498,"text":10520},{"id":10530,"depth":498,"text":10531},{"id":10582,"depth":498,"text":10583},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"pinned":522,"read":1314,"level":510,"video":10664,"templateId":4754,"type":513,"format":514,"intent_type":1754,"intent":10665,"tags":27600,"platfrom":27601},[10667,10668],[1757],{"title":10507,"description":10662},{"id":19385,"title":19386,"body":27604,"date":19685,"description":19686,"extension":506,"meta":27866,"navigation":522,"order":523,"path":19692,"seo":27869,"stem":19694,"__hash__":19695},{"type":8,"value":27605,"toc":27858},[27606,27608,27610,27612,27614,27620,27622,27628,27632,27634,27636,27766,27768,27770,27772,27776,27778,27780,27846],[11,27607],{},[14,27609,19393],{},[18,27611],{},[21,27613,24],{"id":23},[14,27615,27,27616,19402,27618,19406],{},[29,27617,31],{},[29,27619,19405],{},[21,27621,19410],{"id":19409},[14,27623,19413,27624,55,27626,59],{},[29,27625,54],{},[29,27627,58],{},[14,27629,62,27630,44],{},[29,27631,65],{},[14,27633,68],{},[21,27635,19427],{"id":19426},[77,27637,27638],{},[80,27639,27640,27658],{},[83,27641,27642,88,27644,27646],{},[29,27643,349],{},[90,27645,92],{},[80,27647,27648,27652],{},[83,27649,27650,100],{},[90,27651,99],{},[83,27653,27654,5910,27656,44],{},[90,27655,105],{},[90,27657,5913],{},[83,27659,27660,88,27662,27664],{},[29,27661,908],{},[90,27663,114],{},[80,27665,27666,27682,27692,27710,27738],{},[83,27667,27668,88,27670,27672],{},[29,27669,917],{},[90,27671,124],{},[80,27673,27674],{},[83,27675,27676,132,27678,136,27680,5936],{},[90,27677,131],{},[90,27679,135],{},[90,27681,139],{},[83,27683,27684,88,27686,27688],{},[29,27685,935],{},[90,27687,13520],{},[80,27689,27690],{},[83,27691,19484],{},[83,27693,27694,88,27696,27698],{},[29,27695,943],{},[90,27697,148],{},[80,27699,27700,27706],{},[83,27701,27702,1995,27704,19501],{},[90,27703,155],{},[322,27705,19500],{"href":19499},[83,27707,27708,19506],{},[90,27709,161],{},[83,27711,27712,88,27714,27716],{},[29,27713,959],{},[90,27715,3303],{},[80,27717,27718,27722,27726,27732],{},[83,27719,27720,100],{},[90,27721,99],{},[83,27723,27724,255],{},[90,27725,105],{},[83,27727,27728,261,27730,44],{},[90,27729,260],{},[90,27731,198],{},[83,27733,27734,162,27736,44],{},[90,27735,269],{},[90,27737,6013],{},[83,27739,27740,88,27742,27744],{},[29,27741,967],{},[90,27743,281],{},[80,27745,27746,27750,27754,27760],{},[83,27747,27748,100],{},[90,27749,99],{},[83,27751,27752,292],{},[90,27753,105],{},[83,27755,27756,162,27758,44],{},[90,27757,297],{},[90,27759,165],{},[83,27761,27762,162,27764,44],{},[90,27763,304],{},[90,27765,165],{},[21,27767,19566],{"id":19565},[14,27769,313],{},[21,27771,317],{"id":316},[14,27773,320,27774,326],{},[322,27775,325],{"href":324},[21,27777,330],{"id":329},[14,27779,333],{},[77,27781,27782],{},[80,27783,27784,27796,27806,27818,27826,27838],{},[83,27785,27786,27788,346,27790,350,27792,19594,27794,19597],{},[29,27787,342],{},[344,27789],{},[90,27791,19591],{},[90,27793,353],{},[90,27795,1723],{},[83,27797,27798,27800,346,27802,19607,27804,44],{},[29,27799,363],{},[344,27801],{},[90,27803,19606],{},[322,27805,7498],{"href":380},[83,27807,27808,27810,393,27812,397,27814,401,27816,44],{},[29,27809,19614],{},[344,27811],{},[90,27813,396],{},[90,27815,400],{},[90,27817,165],{},[83,27819,27820,27822,19630,27824,19633],{},[29,27821,19627],{},[344,27823],{},[90,27825,161],{},[83,27827,27828,27830,346,27832,444,27834,466,27836,44],{},[29,27829,459],{},[344,27831],{},[90,27833,19642],{},[90,27835,465],{},[90,27837,198],{},[83,27839,27840,27842,476,27844,480],{},[29,27841,473],{},[344,27843],{},[90,27845,479],{},[14,27847,483,27848,19659,27850,3289,27852,19668,27854,19672,27856],{},[322,27849,487],{"href":486},[322,27851,19663],{"href":19662},[322,27853,19667],{"href":19666},[322,27855,8921],{"href":19671},[322,27857,19676],{"href":19675},{"title":494,"searchDepth":495,"depth":495,"links":27859},[27860,27861,27862,27863,27864,27865],{"id":23,"depth":498,"text":24},{"id":19409,"depth":498,"text":19410},{"id":19426,"depth":498,"text":19427},{"id":19565,"depth":498,"text":19566},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"pinned":522,"read":7527,"level":510,"video":19688,"templateId":4763,"type":513,"format":514,"intent_type":1049,"intent":4022,"tags":27867,"platfrom":27868},[519,12881],[19691],{"title":19386,"description":19686},{"id":20550,"title":20551,"body":27871,"date":19685,"description":20816,"extension":506,"meta":28090,"navigation":522,"order":523,"path":20822,"seo":28093,"stem":20824,"__hash__":20825},{"type":8,"value":27872,"toc":28083},[27873,27875,27877,27879,27881,27887,27889,27893,27897,27899,27993,27995,27999,28001,28005,28007,28011,28079],[11,27874],{},[14,27876,20558],{},[18,27878],{},[21,27880,853],{"id":852},[14,27882,27,27883,1085,27885,20570],{},[29,27884,31],{},[29,27886,20569],{},[21,27888,20574],{"id":20573},[14,27890,20577,27891,59],{},[29,27892,58],{},[14,27894,62,27895,44],{},[29,27896,65],{},[14,27898,68],{},[77,27900,27901,27991],{},[80,27902,27903,27919],{},[83,27904,27905,88,27907,27909],{},[29,27906,87],{},[90,27908,92],{},[80,27910,27911,27915],{},[83,27912,27913,100],{},[90,27914,99],{},[83,27916,27917,20606],{},[90,27918,105],{},[83,27920,27921,88,27923,27925],{},[29,27922,111],{},[90,27924,114],{},[80,27926,27927,27945,27949,27975],{},[83,27928,27929,88,27931,27933],{},[29,27930,121],{},[90,27932,20621],{},[80,27934,27935],{},[83,27936,27937,132,27939,136,27941,20632,27943,20636],{},[90,27938,131],{},[90,27940,194],{},[90,27942,227],{},[90,27944,20635],{},[83,27946,27947,10297],{},[29,27948,20641],{},[83,27950,27951,88,27953,27955],{},[29,27952,213],{},[90,27954,20648],{},[80,27956,27957,27961],{},[83,27958,27959,10297],{},[29,27960,20655],{},[83,27962,27963,88,27965,27967],{},[29,27964,20660],{},[90,27966,3303],{},[80,27968,27969],{},[83,27970,27971,20669,27973,44],{},[90,27972,260],{},[90,27974,20672],{},[83,27976,27977,88,27979,27981],{},[29,27978,241],{},[90,27980,281],{},[80,27982,27983,27987],{},[83,27984,27985,100],{},[90,27986,99],{},[83,27988,27989,20689],{},[90,27990,105],{},[14,27992,983],{},[21,27994,20695],{"id":20694},[14,27996,20698,27997,44],{},[322,27998,994],{"href":993},[21,28000,317],{"id":316},[14,28002,320,28003,20707],{},[322,28004,325],{"href":324},[21,28006,330],{"id":329},[14,28008,1009,28009,44],{},[322,28010,994],{"href":993},[77,28012,28013],{},[80,28014,28015,28027,28035,28043,28055,28063,28071],{},[83,28016,28017,28019,346,28021,20728,28023,20731,28025,20734],{},[29,28018,20722],{},[344,28020],{},[90,28022,20727],{},[90,28024,20635],{},[90,28026,227],{},[83,28028,28029,28031,346,28033,20745],{},[29,28030,20739],{},[344,28032],{},[90,28034,20744],{},[83,28036,28037,28039,346,28041,20755],{},[29,28038,7492],{},[344,28040],{},[90,28042,20754],{},[83,28044,28045,28047,346,28049,20766,28051,20769,28053,44],{},[29,28046,20760],{},[344,28048],{},[90,28050,20765],{},[90,28052,131],{},[90,28054,20772],{},[83,28056,28057,28059,346,28061,20783],{},[29,28058,20777],{},[344,28060],{},[90,28062,20782],{},[83,28064,28065,28067,346,28069,20794],{},[29,28066,20788],{},[344,28068],{},[90,28070,20793],{},[83,28072,28073,28075,346,28077,20804],{},[29,28074,20799],{},[344,28076],{},[90,28078,10075],{},[14,28080,483,28081],{},[322,28082,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":28084},[28085,28086,28087,28088,28089],{"id":852,"depth":498,"text":853},{"id":20573,"depth":498,"text":20574},{"id":20694,"depth":498,"text":20695},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"pinned":522,"read":1046,"level":16262,"video":20818,"templateId":4768,"type":513,"format":514,"intent_type":1049,"intent":4022,"tags":28091,"platfrom":28092},[519,12881],[20821],{"title":20551,"description":20816},{"id":10224,"title":10225,"body":28095,"date":10494,"description":10495,"extension":506,"meta":28299,"navigation":522,"order":523,"path":10501,"seo":28302,"stem":10503,"__hash__":10504},{"type":8,"value":28096,"toc":28291},[28097,28099,28107,28109,28111,28113,28115,28121,28125,28127,28129,28179,28181,28185,28187,28191,28193,28197,28287],[11,28098],{},[14,28100,10232,28101,10236,28103,10240,28105,10243],{},[29,28102,10235],{},[29,28104,10239],{},[29,28106,10235],{},[18,28108],{},[21,28110,10249],{"id":10248},[14,28112,10252],{},[21,28114,10256],{"id":10255},[14,28116,10259,28117,55,28119,59],{},[29,28118,54],{},[29,28120,58],{},[14,28122,62,28123,44],{},[29,28124,65],{},[14,28126,68],{},[21,28128,10273],{"id":10272},[77,28130,28131,28177],{},[80,28132,28133,28145,28149,28161,28165],{},[83,28134,28135,88,28137,28139],{},[29,28136,349],{},[90,28138,10284],{},[80,28140,28141],{},[83,28142,28143,10291],{},[90,28144,131],{},[83,28146,28147,10297],{},[29,28148,10296],{},[83,28150,28151,88,28153,28155],{},[29,28152,5343],{},[90,28154,3524],{},[80,28156,28157],{},[83,28158,28159,10310],{},[90,28160,953],{},[83,28162,28163,10297],{},[29,28164,10315],{},[83,28166,28167,88,28169,28171],{},[29,28168,5451],{},[90,28170,10322],{},[80,28172,28173],{},[83,28174,28175,10329],{},[90,28176,5631],{},[14,28178,983],{},[21,28180,10335],{"id":10334},[14,28182,10338,28183,10342],{},[29,28184,10341],{},[21,28186,10346],{"id":10345},[14,28188,320,28189,326],{},[322,28190,325],{"href":324},[21,28192,330],{"id":329},[14,28194,1009,28195,44],{},[322,28196,994],{"href":993},[77,28198,28199],{},[80,28200,28201,28209,28221,28231,28241,28251,28261,28269,28277],{},[83,28202,28203,28205,10368,28207,1230],{},[29,28204,10365],{},[344,28206],{},[90,28208,124],{},[83,28210,28211,28213,346,28215,10381,28217,10385,28219],{},[29,28212,10375],{},[344,28214],{},[90,28216,10380],{},[90,28218,10384],{},[322,28220,10388],{"href":380},[83,28222,28223,28225,346,28227,10399,28229,10404],{},[29,28224,10393],{},[344,28226],{},[90,28228,10398],{},[322,28230,10403],{"href":10402},[83,28232,28233,28235,346,28237,10415,28239,44],{},[29,28234,10409],{},[344,28236],{},[90,28238,10414],{},[322,28240,10403],{"href":10402},[83,28242,28243,28245,346,28247,10428,28249,44],{},[29,28244,10422],{},[344,28246],{},[90,28248,10427],{},[90,28250,10431],{},[83,28252,28253,28255,346,28257,10442,28259,10446],{},[29,28254,10436],{},[344,28256],{},[90,28258,10441],{},[90,28260,10445],{},[83,28262,28263,28265,346,28267,10457],{},[29,28264,10451],{},[344,28266],{},[90,28268,10456],{},[83,28270,28271,28273,346,28275,10468],{},[29,28272,10462],{},[344,28274],{},[90,28276,10467],{},[83,28278,28279,28281,346,28283,10479,28285,44],{},[29,28280,10473],{},[344,28282],{},[90,28284,10478],{},[90,28286,908],{},[14,28288,483,28289],{},[322,28290,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":28292},[28293,28294,28295,28296,28297,28298],{"id":10248,"depth":498,"text":10249},{"id":10255,"depth":498,"text":10256},{"id":10272,"depth":498,"text":10273},{"id":10334,"depth":498,"text":10335},{"id":10345,"depth":498,"text":10346},{"id":329,"depth":498,"text":330},{"read":1527,"level":510,"video":10497,"templateId":4744,"type":513,"format":514,"intent_type":1049,"intent":827,"tags":28300,"platfrom":28301},[1055],[10500],{"title":10225,"description":10495},{"id":839,"title":840,"body":28304,"date":1043,"description":1044,"extension":506,"meta":28462,"navigation":522,"order":523,"path":1059,"seo":28465,"stem":1061,"__hash__":1062},{"type":8,"value":28305,"toc":28454},[28306,28308,28310,28312,28314,28318,28320,28326,28328,28330,28332,28416,28418,28422,28424,28430,28432,28436,28450],[11,28307],{},[14,28309,847],{},[18,28311],{},[21,28313,853],{"id":852},[14,28315,856,28316,860],{},[29,28317,859],{},[21,28319,864],{"id":863},[14,28321,867,28322,870,28324,873],{},[29,28323,54],{},[29,28325,58],{},[14,28327,876],{},[14,28329,68],{},[21,28331,882],{"id":881},[77,28333,28334,28414],{},[80,28335,28336,28352],{},[83,28337,28338,88,28340,28342],{},[29,28339,349],{},[90,28341,92],{},[80,28343,28344,28348],{},[83,28345,28346,100],{},[90,28347,99],{},[83,28349,28350,903],{},[90,28351,105],{},[83,28353,28354,88,28356,28358],{},[29,28355,908],{},[90,28357,114],{},[80,28359,28360,28374,28380,28392,28398],{},[83,28361,28362,88,28364,28366],{},[29,28363,917],{},[90,28365,920],{},[80,28367,28368],{},[83,28369,28370,927,28372,930],{},[90,28371,131],{},[90,28373,139],{},[83,28375,28376,88,28378],{},[29,28377,935],{},[90,28379,938],{},[83,28381,28382,88,28384,28386],{},[29,28383,943],{},[90,28385,946],{},[80,28387,28388],{},[83,28389,28390,954],{},[90,28391,953],{},[83,28393,28394,88,28396],{},[29,28395,959],{},[90,28397,962],{},[83,28399,28400,88,28402,28404],{},[29,28401,967],{},[90,28403,281],{},[80,28405,28406,28410],{},[83,28407,28408,100],{},[90,28409,99],{},[83,28411,28412,980],{},[90,28413,105],{},[14,28415,983],{},[21,28417,987],{"id":986},[14,28419,990,28420,44],{},[322,28421,994],{"href":993},[21,28423,317],{"id":316},[14,28425,320,28426,1001,28428,44],{},[322,28427,325],{"href":324},[29,28429,1004],{},[21,28431,330],{"id":329},[14,28433,1009,28434,44],{},[322,28435,994],{"href":993},[77,28437,28438],{},[80,28439,28440,28446],{},[83,28441,28442,1021,28444,1024],{},[29,28443,1020],{},[90,28445,155],{},[83,28447,28448,1030],{},[29,28449,1029],{},[14,28451,483,28452],{},[322,28453,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":28455},[28456,28457,28458,28459,28460,28461],{"id":852,"depth":498,"text":853},{"id":863,"depth":498,"text":864},{"id":881,"depth":498,"text":882},{"id":986,"depth":498,"text":987},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"pinned":522,"read":1046,"level":510,"video":1047,"templateId":1048,"type":513,"format":514,"intent_type":1049,"intent":1050,"tags":28463,"platfrom":28464},[1052,1053,1054,1055,1056],[1058],{"title":840,"description":1044},{"id":1064,"title":1065,"body":28467,"date":1043,"description":1312,"extension":506,"meta":28663,"navigation":522,"order":523,"path":1320,"seo":28666,"stem":1322,"__hash__":1323},{"type":8,"value":28468,"toc":28655},[28469,28471,28475,28477,28479,28485,28487,28491,28495,28497,28499,28595,28597,28603,28605,28609,28611,28615,28649],[11,28470],{},[14,28472,1072,28473,1076],{},[29,28474,1075],{},[18,28476],{},[21,28478,853],{"id":852},[14,28480,27,28481,1085,28483,44],{},[29,28482,31],{},[29,28484,1088],{},[21,28486,1092],{"id":1091},[14,28488,1095,28489,1098],{},[29,28490,54],{},[14,28492,62,28493,44],{},[29,28494,65],{},[14,28496,68],{},[21,28498,1108],{"id":1107},[77,28500,28501],{},[80,28502,28503,28519],{},[83,28504,28505,88,28507,28509],{},[29,28506,87],{},[90,28508,92],{},[80,28510,28511,28515],{},[83,28512,28513,1125],{},[90,28514,99],{},[83,28516,28517,1130],{},[90,28518,105],{},[83,28520,28521,88,28523,28525],{},[29,28522,111],{},[90,28524,114],{},[80,28526,28527,28533,28539,28553,28559,28573,28579],{},[83,28528,28529,88,28531],{},[29,28530,121],{},[90,28532,1145],{},[83,28534,28535,88,28537],{},[29,28536,145],{},[90,28538,1152],{},[83,28540,28541,88,28543,28545],{},[29,28542,170],{},[90,28544,1159],{},[80,28546,28547],{},[83,28548,28549,1166,28551],{},[90,28550,953],{},[90,28552,227],{},[83,28554,28555,88,28557],{},[29,28556,213],{},[90,28558,1175],{},[83,28560,28561,88,28563,28565],{},[29,28562,241],{},[90,28564,1182],{},[80,28566,28567],{},[83,28568,28569,1166,28571],{},[90,28570,1189],{},[90,28572,227],{},[83,28574,28575,88,28577],{},[29,28576,278],{},[90,28578,1198],{},[83,28580,28581,88,28583,28585],{},[29,28582,1203],{},[90,28584,281],{},[80,28586,28587,28591],{},[83,28588,28589,1125],{},[90,28590,99],{},[83,28592,28593,1130],{},[90,28594,105],{},[21,28596,1219],{"id":1218},[14,28598,1222,28599,1225,28601,1230],{},[322,28600,994],{"href":993},[322,28602,1229],{"href":1228},[21,28604,317],{"id":316},[14,28606,320,28607,326],{},[322,28608,325],{"href":324},[21,28610,330],{"id":329},[14,28612,1009,28613,44],{},[322,28614,994],{"href":993},[77,28616,28617],{},[80,28618,28619,28627,28633,28637,28643],{},[83,28620,28621,1252,28623,1255,28625,44],{},[29,28622,1251],{},[322,28624,381],{"href":380},[90,28626,1258],{},[83,28628,28629,1264,28631,1268],{},[29,28630,1263],{},[90,28632,1267],{},[83,28634,28635,1274],{},[29,28636,1273],{},[83,28638,28639,1280,28641,1284],{},[29,28640,1279],{},[29,28642,1283],{},[83,28644,28645,28647,1294],{},[29,28646,1289],{},[322,28648,1293],{"href":1292},[14,28650,483,28651,1299,28653],{},[322,28652,487],{"href":486},[322,28654,1303],{"href":1302},{"title":494,"searchDepth":495,"depth":495,"links":28656},[28657,28658,28659,28660,28661,28662],{"id":852,"depth":498,"text":853},{"id":1091,"depth":498,"text":1092},{"id":1107,"depth":498,"text":1108},{"id":1218,"depth":498,"text":1219},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"pinned":522,"read":1314,"level":510,"video":1315,"templateId":1316,"type":513,"format":514,"intent_type":1049,"intent":1050,"tags":28664,"platfrom":28665},[1052,1318,1056],[1058],{"title":1065,"description":1312},{"id":1325,"title":1326,"body":28668,"date":1043,"description":1525,"extension":506,"meta":28817,"navigation":522,"order":523,"path":1535,"seo":28820,"stem":1537,"__hash__":1538},{"type":8,"value":28669,"toc":28810},[28670,28672,28674,28676,28678,28680,28682,28684,28686,28710,28712,28714,28716,28720,28722,28724,28804],[11,28671],{},[14,28673,1333],{},[18,28675],{},[21,28677,1339],{"id":1338},[14,28679,1342],{},[14,28681,876],{},[14,28683,1347],{},[21,28685,1351],{"id":1350},[77,28687,28688],{},[80,28689,28690,28702],{},[83,28691,28692,88,28694,1363,28696],{},[29,28693,349],{},[90,28695,1362],{},[80,28697,28698],{},[83,28699,28700,1371],{},[90,28701,1370],{},[83,28703,28704,28706],{},[29,28705,1376],{},[80,28707,28708],{},[83,28709,983],{},[21,28711,1384],{"id":1383},[14,28713,1387],{},[21,28715,317],{"id":316},[14,28717,320,28718,326],{},[322,28719,325],{"href":324},[21,28721,1397],{"id":1396},[14,28723,333],{},[77,28725,28726],{},[80,28727,28728,28736,28746,28754,28762,28770,28778,28788,28796],{},[83,28729,28730,28732,346,28734,1414],{},[29,28731,1408],{},[344,28733],{},[90,28735,1413],{},[83,28737,28738,28740,346,28742,1425,28744,44],{},[29,28739,1419],{},[344,28741],{},[90,28743,1424],{},[90,28745,1428],{},[83,28747,28748,28750,346,28752,1439],{},[29,28749,1433],{},[344,28751],{},[90,28753,1438],{},[83,28755,28756,28758,346,28760,1450],{},[29,28757,1444],{},[344,28759],{},[90,28761,1449],{},[83,28763,28764,28766,346,28768,1461],{},[29,28765,1455],{},[344,28767],{},[90,28769,1460],{},[83,28771,28772,28774,1469,28776,44],{},[29,28773,1466],{},[344,28775],{},[90,28777,165],{},[83,28779,28780,28782,346,28784,1482,28786,1485],{},[29,28781,1476],{},[344,28783],{},[90,28785,1481],{},[90,28787,198],{},[83,28789,28790,28792,346,28794,1496],{},[29,28791,1490],{},[344,28793],{},[90,28795,1495],{},[83,28797,28798,28800,346,28802,1507],{},[29,28799,1501],{},[344,28801],{},[90,28803,1506],{},[14,28805,483,28806,1512,28808,1517],{},[322,28807,487],{"href":486},[322,28809,1516],{"href":1515},{"title":494,"searchDepth":495,"depth":495,"links":28811},[28812,28813,28814,28815,28816],{"id":1338,"depth":498,"text":1339},{"id":1350,"depth":498,"text":1351},{"id":1383,"depth":498,"text":1384},{"id":316,"depth":498,"text":317},{"id":1396,"depth":498,"text":1397},{"read":1527,"level":510,"video":1528,"templateId":1529,"type":513,"format":514,"intent_type":1049,"intent":1530,"tags":28818,"platfrom":28819},[1532],[1534],{"title":1326,"description":1525},{"id":7317,"title":7318,"body":28822,"date":1043,"description":7525,"extension":506,"meta":29002,"navigation":522,"order":523,"path":7052,"seo":29005,"stem":7532,"__hash__":7533},{"type":8,"value":28823,"toc":28994},[28824,28826,28828,28830,28832,28834,28836,28838,28840,28842,28844,28848,28956,28958,28960,28962,28966,28968,28970,28988],[11,28825],{},[14,28827,7325],{},[18,28829],{},[21,28831,853],{"id":852},[14,28833,7332],{},[21,28835,7336],{"id":7335},[14,28837,7339],{},[14,28839,876],{},[14,28841,68],{},[21,28843,7347],{"id":7346},[14,28845,7350,28846,7354],{},[322,28847,7285],{"href":7353},[77,28849,28850],{},[80,28851,28852,28868],{},[83,28853,28854,88,28856,28858],{},[29,28855,87],{},[90,28857,92],{},[80,28859,28860,28864],{},[83,28861,28862,100],{},[90,28863,99],{},[83,28865,28866,7375],{},[90,28867,105],{},[83,28869,28870,88,28872,28874],{},[29,28871,111],{},[90,28873,114],{},[80,28875,28876,28896,28916,28928],{},[83,28877,28878,88,28880,28882],{},[29,28879,121],{},[90,28881,5314],{},[80,28883,28884,28888],{},[83,28885,28886,7396],{},[90,28887,155],{},[83,28889,28890,132,28892,136,28894,44],{},[90,28891,953],{},[90,28893,135],{},[90,28895,227],{},[83,28897,28898,88,28900,28902],{},[29,28899,145],{},[90,28901,5314],{},[80,28903,28904,28908],{},[83,28905,28906,7396],{},[90,28907,155],{},[83,28909,28910,132,28912,136,28914,44],{},[90,28911,953],{},[90,28913,135],{},[90,28915,227],{},[83,28917,28918,88,28920,28922],{},[29,28919,170],{},[90,28921,3639],{},[80,28923,28924],{},[83,28925,28926,7437],{},[90,28927,155],{},[83,28929,28930,88,28932,28934],{},[29,28931,213],{},[90,28933,281],{},[80,28935,28936,28940,28944,28950],{},[83,28937,28938,100],{},[90,28939,99],{},[83,28941,28942,292],{},[90,28943,105],{},[83,28945,28946,162,28948,44],{},[90,28947,297],{},[90,28949,165],{},[83,28951,28952,162,28954,44],{},[90,28953,304],{},[90,28955,165],{},[21,28957,7469],{"id":7468},[14,28959,7472],{},[21,28961,317],{"id":316},[14,28963,7477,28964,326],{},[322,28965,325],{"href":324},[21,28967,330],{"id":329},[14,28969,333],{},[77,28971,28972],{},[80,28973,28974,28982],{},[83,28975,28976,28978,7495,28980,44],{},[29,28977,7492],{},[344,28979],{},[322,28981,7498],{"href":380},[83,28983,28984,7504,28986,7508],{},[29,28985,7503],{},[322,28987,7507],{"href":1292},[14,28989,483,28990,1299,28992],{},[322,28991,487],{"href":486},[322,28993,7516],{"href":7515},{"title":494,"searchDepth":495,"depth":495,"links":28995},[28996,28997,28998,28999,29000,29001],{"id":852,"depth":498,"text":853},{"id":7335,"depth":498,"text":7336},{"id":7346,"depth":498,"text":7347},{"id":7468,"depth":498,"text":7469},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"pinned":522,"application":1757,"read":7527,"level":510,"video":7528,"templateId":4734,"type":513,"format":514,"intent_type":1754,"intent":7308,"tags":29003,"platfrom":29004},[1055,1056],[7311],{"title":7318,"description":7525},{"id":8951,"title":8952,"body":29007,"date":1043,"description":9266,"extension":506,"meta":29257,"navigation":522,"order":523,"path":9272,"seo":29260,"stem":9274,"__hash__":9275},{"type":8,"value":29008,"toc":29249},[29009,29011,29015,29017,29019,29023,29025,29031,29035,29037,29039,29153,29155,29159,29161,29165,29167,29171,29243],[11,29010],{},[14,29012,8959,29013,8963],{},[29,29014,8962],{},[18,29016],{},[21,29018,853],{"id":852},[14,29020,8970,29021,8974],{},[29,29022,8973],{},[21,29024,8978],{"id":8977},[14,29026,8981,29027,55,29029,59],{},[29,29028,54],{},[29,29030,58],{},[14,29032,62,29033,44],{},[29,29034,65],{},[14,29036,68],{},[21,29038,8995],{"id":8994},[77,29040,29041,29151],{},[80,29042,29043,29059,29065],{},[83,29044,29045,88,29047,29049],{},[29,29046,349],{},[90,29048,92],{},[80,29050,29051,29055],{},[83,29052,29053,100],{},[90,29054,99],{},[83,29056,29057,9016],{},[90,29058,105],{},[83,29060,29061,88,29063,9024],{},[29,29062,908],{},[90,29064,9023],{},[83,29066,29067,88,29069,29071],{},[29,29068,9029],{},[90,29070,114],{},[80,29072,29073,29079,29093,29099,29113,29117,29131,29135],{},[83,29074,29075,88,29077,9024],{},[29,29076,9038],{},[90,29078,9041],{},[83,29080,29081,88,29083,29085],{},[29,29082,9046],{},[90,29084,9049],{},[80,29086,29087],{},[83,29088,29089,1166,29091,44],{},[90,29090,953],{},[90,29092,227],{},[83,29094,29095,88,29097,9024],{},[29,29096,9062],{},[90,29098,9065],{},[83,29100,29101,88,29103,29105],{},[29,29102,9070],{},[90,29104,9073],{},[80,29106,29107],{},[83,29108,29109,1166,29111,44],{},[90,29110,953],{},[90,29112,227],{},[83,29114,29115,9024],{},[29,29116,9086],{},[83,29118,29119,88,29121,29123],{},[29,29120,9091],{},[90,29122,9094],{},[80,29124,29125],{},[83,29126,29127,1166,29129,44],{},[90,29128,953],{},[90,29130,227],{},[83,29132,29133,9024],{},[29,29134,9107],{},[83,29136,29137,88,29139,29141],{},[29,29138,9112],{},[90,29140,281],{},[80,29142,29143,29147],{},[83,29144,29145,100],{},[90,29146,99],{},[83,29148,29149,9125],{},[90,29150,105],{},[14,29152,983],{},[21,29154,9131],{"id":9130},[14,29156,9134,29157,44],{},[322,29158,994],{"href":993},[21,29160,317],{"id":316},[14,29162,320,29163,9143],{},[322,29164,325],{"href":324},[21,29166,330],{"id":329},[14,29168,9148,29169,44],{},[322,29170,994],{"href":993},[77,29172,29173],{},[80,29174,29175,29183,29195,29207,29217,29225,29233],{},[83,29176,29177,29179,346,29181,9165],{},[29,29178,9159],{},[344,29180],{},[90,29182,9164],{},[83,29184,29185,29187,346,29189,9176,29191,9179,29193,9182],{},[29,29186,9170],{},[344,29188],{},[90,29190,9175],{},[90,29192,8052],{},[90,29194,5361],{},[83,29196,29197,29199,346,29201,9193,29203,9196,29205,44],{},[29,29198,9187],{},[344,29200],{},[90,29202,9192],{},[90,29204,194],{},[90,29206,227],{},[83,29208,29209,29211,346,29213,9209,29215,9213],{},[29,29210,9203],{},[344,29212],{},[90,29214,9208],{},[90,29216,9212],{},[83,29218,29219,29221,346,29223,9224],{},[29,29220,9218],{},[344,29222],{},[90,29224,9223],{},[83,29226,29227,29229,346,29231,9235],{},[29,29228,9229],{},[344,29230],{},[90,29232,9234],{},[83,29234,29235,29237,346,29239,9246,29241,9249],{},[29,29236,9240],{},[344,29238],{},[90,29240,9245],{},[344,29242],{},[14,29244,483,29245,9254,29247],{},[322,29246,487],{"href":486},[322,29248,9257],{"href":1515},{"title":494,"searchDepth":495,"depth":495,"links":29250},[29251,29252,29253,29254,29255,29256],{"id":852,"depth":498,"text":853},{"id":8977,"depth":498,"text":8978},{"id":8994,"depth":498,"text":8995},{"id":9130,"depth":498,"text":9131},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"pinned":522,"read":1527,"level":510,"video":9268,"templateId":2187,"type":513,"format":514,"intent_type":1049,"intent":1530,"tags":29258,"platfrom":29259},[1532,9270],[1534],{"title":8952,"description":9266},{"id":9812,"title":9813,"body":29262,"date":1043,"description":10096,"extension":506,"meta":29496,"navigation":522,"order":523,"path":10103,"seo":29499,"stem":10105,"__hash__":10106},{"type":8,"value":29263,"toc":29488},[29264,29266,29270,29272,29274,29282,29284,29292,29296,29298,29300,29420,29422,29424,29426,29430,29432,29434,29480,29484],[11,29265],{},[14,29267,9820,29268,9824],{},[29,29269,9823],{},[18,29271],{},[21,29273,24],{"id":23},[14,29275,27,29276,1085,29278,36,29280,9839],{},[29,29277,31],{},[29,29279,9835],{},[29,29281,9838],{},[21,29283,9843],{"id":9842},[14,29285,9846,29286,9850,29288,55,29290,59],{},[29,29287,9849],{},[29,29289,9853],{},[29,29291,9856],{},[14,29293,62,29294,44],{},[29,29295,9861],{},[14,29297,68],{},[21,29299,9867],{"id":9866},[77,29301,29302],{},[80,29303,29304,29322],{},[83,29305,29306,88,29308,29310],{},[29,29307,349],{},[90,29309,92],{},[80,29311,29312,29316],{},[83,29313,29314,100],{},[90,29315,99],{},[83,29317,29318,5910,29320,44],{},[90,29319,105],{},[90,29321,9890],{},[83,29323,29324,88,29326,29328],{},[29,29325,908],{},[90,29327,114],{},[80,29329,29330,29340,29360,29380,29392],{},[83,29331,29332,88,29334,29336],{},[29,29333,917],{},[90,29335,9905],{},[80,29337,29338],{},[83,29339,983],{},[83,29341,29342,88,29344,29346],{},[29,29343,935],{},[90,29345,9916],{},[80,29347,29348,29352],{},[83,29349,29350,9923],{},[90,29351,155],{},[83,29353,29354,132,29356,136,29358,9932],{},[90,29355,953],{},[90,29357,135],{},[90,29359,227],{},[83,29361,29362,88,29364,29366],{},[29,29363,943],{},[90,29365,9939],{},[80,29367,29368,29372],{},[83,29369,29370,9923],{},[90,29371,9946],{},[83,29373,29374,132,29376,136,29378,9955],{},[90,29375,1189],{},[90,29377,135],{},[90,29379,227],{},[83,29381,29382,88,29384,29386],{},[29,29383,959],{},[90,29385,9962],{},[80,29387,29388],{},[83,29389,29390,9923],{},[90,29391,155],{},[83,29393,29394,88,29396,29398],{},[29,29395,967],{},[90,29397,281],{},[80,29399,29400,29404,29408,29414],{},[83,29401,29402,100],{},[90,29403,99],{},[83,29405,29406,9985],{},[90,29407,105],{},[83,29409,29410,162,29412,44],{},[90,29411,297],{},[90,29413,165],{},[83,29415,29416,162,29418,44],{},[90,29417,304],{},[90,29419,165],{},[21,29421,10001],{"id":10000},[14,29423,10004],{},[21,29425,317],{"id":316},[14,29427,320,29428,326],{},[322,29429,325],{"href":324},[21,29431,330],{"id":329},[14,29433,333],{},[77,29435,29436],{},[80,29437,29438,29448,29456,29464,29472],{},[83,29439,29440,29442,346,29444,10029,29446,44],{},[29,29441,10023],{},[344,29443],{},[90,29445,10028],{},[90,29447,10032],{},[83,29449,29450,29452,346,29454,10043],{},[29,29451,10037],{},[344,29453],{},[90,29455,10042],{},[83,29457,29458,29460,346,29462,10054],{},[29,29459,10048],{},[344,29461],{},[90,29463,10053],{},[83,29465,29466,29468,346,29470,10065],{},[29,29467,10059],{},[344,29469],{},[90,29471,10064],{},[83,29473,29474,29476,346,29478,10076],{},[29,29475,10070],{},[344,29477],{},[90,29479,10075],{},[14,29481,483,29482],{},[322,29483,487],{"href":486},[14,29485,10083,29486],{},[322,29487,10087],{"href":10086},{"title":494,"searchDepth":495,"depth":495,"links":29489},[29490,29491,29492,29493,29494,29495],{"id":23,"depth":498,"text":24},{"id":9842,"depth":498,"text":9843},{"id":9866,"depth":498,"text":9867},{"id":10000,"depth":498,"text":10001},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"read":1314,"level":510,"video":10098,"templateId":2551,"type":513,"format":514,"intent_type":1049,"intent":1050,"tags":29497,"platfrom":29498},[1052,1318,1056],[10101,10102],{"title":9813,"description":10096},{"id":12888,"title":12889,"body":29501,"date":1043,"description":13143,"extension":506,"meta":29719,"navigation":522,"order":523,"path":13150,"seo":29722,"stem":13152,"__hash__":13153},{"type":8,"value":29502,"toc":29711},[29503,29505,29511,29513,29515,29521,29523,29529,29531,29533,29535,29665,29667,29673,29675,29679,29681,29685,29705],[11,29504],{},[14,29506,12896,29507,12900,29509,12904],{},[29,29508,12899],{},[29,29510,12903],{},[18,29512],{},[21,29514,853],{"id":852},[14,29516,27,29517,1085,29519,44],{},[29,29518,31],{},[29,29520,12915],{},[21,29522,12919],{"id":12918},[14,29524,12922,29525,55,29527,59],{},[29,29526,54],{},[29,29528,12927],{},[14,29530,876],{},[14,29532,68],{},[21,29534,12935],{"id":12934},[77,29536,29537],{},[80,29538,29539,29555],{},[83,29540,29541,88,29543,29545],{},[29,29542,87],{},[90,29544,92],{},[80,29546,29547,29551],{},[83,29548,29549,100],{},[90,29550,99],{},[83,29552,29553,12956],{},[90,29554,105],{},[83,29556,29557,88,29559,29561,29663,983],{},[29,29558,111],{},[90,29560,114],{},[80,29562,29563,29569,29575,29585,29591,29597,29613,29619,29625,29641,29647],{},[83,29564,29565,88,29567,10297],{},[29,29566,121],{},[90,29568,12971],{},[83,29570,29571,88,29573,10297],{},[29,29572,145],{},[90,29574,2695],{},[83,29576,29577,88,29579,12985,29581],{},[29,29578,170],{},[90,29580,12984],{},[80,29582,29583],{},[83,29584,12990],{},[83,29586,29587,88,29589,10297],{},[29,29588,213],{},[90,29590,12997],{},[83,29592,29593,88,29595,10297],{},[29,29594,241],{},[90,29596,9962],{},[83,29598,29599,88,29601,29603],{},[29,29600,278],{},[90,29602,13010],{},[80,29604,29605],{},[83,29606,29607,132,29609,136,29611,44],{},[90,29608,1189],{},[90,29610,194],{},[90,29612,227],{},[83,29614,29615,88,29617,10297],{},[29,29616,1203],{},[90,29618,12045],{},[83,29620,29621,88,29623,10297],{},[29,29622,13031],{},[90,29624,12045],{},[83,29626,29627,88,29629,29631],{},[29,29628,13038],{},[90,29630,13041],{},[80,29632,29633],{},[83,29634,29635,132,29637,136,29639,44],{},[90,29636,953],{},[90,29638,194],{},[90,29640,227],{},[83,29642,29643,88,29645,10297],{},[29,29644,13056],{},[90,29646,13059],{},[83,29648,29649,88,29651,29653],{},[29,29650,13064],{},[90,29652,281],{},[80,29654,29655,29659],{},[83,29656,29657,100],{},[90,29658,99],{},[83,29660,29661,12956],{},[90,29662,105],{},[344,29664],{},[21,29666,13082],{"id":13081},[14,29668,13085,29669,1225,29671,1230],{},[322,29670,994],{"href":993},[322,29672,1229],{"href":1228},[21,29674,317],{"id":316},[14,29676,320,29677,326],{},[322,29678,325],{"href":324},[21,29680,330],{"id":329},[14,29682,1009,29683,44],{},[322,29684,994],{"href":993},[77,29686,29687],{},[80,29688,29689,29697],{},[83,29690,29691,29693,13112,29695,44],{},[29,29692,7492],{},[344,29694],{},[90,29696,13115],{},[83,29698,29699,29701,346,29703,13126],{},[29,29700,13120],{},[344,29702],{},[90,29704,13125],{},[14,29706,483,29707,1299,29709],{},[322,29708,487],{"href":486},[322,29710,13134],{"href":13133},{"title":494,"searchDepth":495,"depth":495,"links":29712},[29713,29714,29715,29716,29717,29718],{"id":852,"depth":498,"text":853},{"id":12918,"depth":498,"text":12919},{"id":12934,"depth":498,"text":12935},{"id":13081,"depth":498,"text":13082},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"logoFile":13145,"read":13146,"video":13147,"type":513,"format":514,"intent_type":11530,"intent":1050,"tags":29720,"platfrom":29721,"templateId":4662},[11532,1318],[11534],{"title":12889,"description":13143},{"id":13155,"title":13156,"body":29724,"date":1043,"description":13409,"extension":506,"meta":29946,"navigation":522,"order":523,"path":13415,"seo":29949,"stem":13417,"__hash__":13418},{"type":8,"value":29725,"toc":29938},[29726,29728,29732,29734,29736,29742,29744,29748,29752,29754,29756,29876,29878,29882,29884,29888,29890,29894,29934],[11,29727],{},[14,29729,13163,29730,13167],{},[29,29731,13166],{},[18,29733],{},[21,29735,853],{"id":852},[14,29737,27,29738,1085,29740,13179],{},[29,29739,31],{},[29,29741,13178],{},[21,29743,13183],{"id":13182},[14,29745,13186,29746,59],{},[29,29747,58],{},[14,29749,62,29750,44],{},[29,29751,65],{},[14,29753,68],{},[21,29755,13198],{"id":13197},[77,29757,29758],{},[80,29759,29760,29776],{},[83,29761,29762,88,29764,29766],{},[29,29763,87],{},[90,29765,92],{},[80,29767,29768,29772],{},[83,29769,29770,100],{},[90,29771,99],{},[83,29773,29774,12956],{},[90,29775,105],{},[83,29777,29778,88,29780,29782],{},[29,29779,111],{},[90,29781,114],{},[80,29783,29784,29804,29820,29844,29860],{},[83,29785,29786,88,29788,29790],{},[29,29787,121],{},[90,29789,124],{},[80,29791,29792],{},[83,29793,29794,132,29796,136,29798,13243,29800,29802],{},[90,29795,131],{},[90,29797,194],{},[90,29799,227],{},[344,29801],{},[90,29803,13248],{},[83,29805,29806,88,29808,29810],{},[29,29807,145],{},[90,29809,148],{},[80,29811,29812],{},[83,29813,13259,29814,6987,29816,29818],{},[322,29815,381],{"href":380},[344,29817],{},[90,29819,13266],{},[83,29821,29822,88,29824,29826],{},[29,29823,170],{},[90,29825,216],{},[80,29827,29828,29836],{},[83,29829,29830,132,29832,13281,29834],{},[90,29831,223],{},[90,29833,194],{},[90,29835,6288],{},[83,29837,29838,132,29840,136,29842],{},[90,29839,233],{},[90,29841,194],{},[90,29843,198],{},[83,29845,29846,88,29848,29850],{},[29,29847,213],{},[90,29849,3303],{},[80,29851,29852,29856],{},[83,29853,29854,100],{},[90,29855,99],{},[83,29857,29858,12956],{},[90,29859,105],{},[83,29861,29862,88,29864,29866],{},[29,29863,241],{},[90,29865,281],{},[80,29867,29868,29872],{},[83,29869,29870,100],{},[90,29871,99],{},[83,29873,29874,12956],{},[90,29875,105],{},[21,29877,13327],{"id":13326},[14,29879,13330,29880,44],{},[322,29881,994],{"href":993},[21,29883,317],{"id":316},[14,29885,320,29886,326],{},[322,29887,325],{"href":13339},[21,29889,330],{"id":329},[14,29891,1009,29892,44],{},[322,29893,994],{"href":993},[77,29895,29896],{},[80,29897,29898,29910,29924],{},[83,29899,29900,29902,346,29904,13360,29906,29908],{},[29,29901,13354],{},[344,29903],{},[90,29905,13359],{},[344,29907],{},[90,29909,13365],{},[83,29911,29912,29914,346,29916,13375,29918,13378,29920,29922],{},[29,29913,13370],{},[344,29915],{},[90,29917,368],{},[322,29919,381],{"href":380},[344,29921],{},[90,29923,13266],{},[83,29925,29926,29928,346,29930,13393,29932,13396],{},[29,29927,13387],{},[344,29929],{},[90,29931,13392],{},[90,29933,264],{},[14,29935,483,29936],{},[322,29937,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":29939},[29940,29941,29942,29943,29944,29945],{"id":852,"depth":498,"text":853},{"id":13182,"depth":498,"text":13183},{"id":13197,"depth":498,"text":13198},{"id":13326,"depth":498,"text":13327},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"logoFile":13145,"read":13146,"video":13411,"templateId":4783,"type":513,"format":514,"intent_type":11530,"intent":4022,"tags":29947,"platfrom":29948},[11532,13413,519],[11534],{"title":13156,"description":13409},{"id":13420,"title":13421,"body":29951,"date":1043,"description":13657,"extension":506,"meta":30145,"navigation":522,"order":523,"path":13664,"seo":30148,"stem":13666,"__hash__":13667},{"type":8,"value":29952,"toc":30137},[29953,29955,29959,29961,29963,29967,29969,29975,29979,29981,29983,30057,30059,30067,30069,30073,30075,30079,30133],[11,29954],{},[14,29956,13428,29957,13432],{},[29,29958,13431],{},[18,29960],{},[21,29962,853],{"id":852},[14,29964,13439,29965,44],{},[29,29966,13442],{},[21,29968,13446],{"id":13445},[14,29970,13449,29971,55,29973,59],{},[29,29972,54],{},[29,29974,58],{},[14,29976,62,29977,44],{},[29,29978,65],{},[14,29980,68],{},[21,29982,13463],{"id":13462},[77,29984,29985,30055],{},[80,29986,29987,30005],{},[83,29988,29989,88,29991,29993],{},[29,29990,87],{},[90,29992,13474],{},[80,29994,29995,30001],{},[83,29996,29997,13481,29999],{},[90,29998,3922],{},[90,30000,13484],{},[83,30002,30003,13490],{},[90,30004,13489],{},[83,30006,30007,88,30009,30011],{},[29,30008,111],{},[90,30010,114],{},[80,30012,30013,30019,30039],{},[83,30014,30015,88,30017,10297],{},[29,30016,121],{},[90,30018,124],{},[83,30020,30021,88,30023,30025],{},[29,30022,145],{},[90,30024,114],{},[80,30026,30027,30033],{},[83,30028,30029,88,30031,10297],{},[29,30030,13517],{},[90,30032,13520],{},[83,30034,30035,88,30037,10297],{},[29,30036,13525],{},[90,30038,13528],{},[83,30040,30041,88,30043,30045],{},[29,30042,241],{},[90,30044,3303],{},[80,30046,30047,30051],{},[83,30048,30049,1125],{},[90,30050,99],{},[83,30052,30053,13545],{},[90,30054,105],{},[14,30056,983],{},[21,30058,13551],{"id":13550},[14,30060,13554,30061,13558,30063,13562,30065,44],{},[29,30062,13557],{},[29,30064,13561],{},[322,30066,994],{"href":993},[21,30068,317],{"id":316},[14,30070,320,30071,326],{},[322,30072,325],{"href":324},[21,30074,330],{"id":329},[14,30076,1009,30077,44],{},[322,30078,994],{"href":993},[77,30080,30081],{},[80,30082,30083,30091,30099,30111,30121],{},[83,30084,30085,30087,13588,30089,44],{},[29,30086,13585],{},[344,30088],{},[90,30090,13591],{},[83,30092,30093,30095,13599,30097,13602],{},[29,30094,13596],{},[344,30096],{},[90,30098,13489],{},[83,30100,30101,30103,346,30105,1482,30107,466,30109,44],{},[29,30102,13607],{},[344,30104],{},[90,30106,13359],{},[90,30108,465],{},[90,30110,13616],{},[83,30112,30113,30115,346,30117,13627,30119,13630],{},[29,30114,13621],{},[344,30116],{},[90,30118,13626],{},[322,30120,7498],{"href":380},[83,30122,30123,30125,346,30127,13393,30129,466,30131,44],{},[29,30124,459],{},[344,30126],{},[90,30128,13639],{},[90,30130,465],{},[90,30132,13644],{},[14,30134,483,30135],{},[322,30136,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":30138},[30139,30140,30141,30142,30143,30144],{"id":852,"depth":498,"text":853},{"id":13445,"depth":498,"text":13446},{"id":13462,"depth":498,"text":13463},{"id":13550,"depth":498,"text":13551},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"logoFile":13145,"read":13146,"video":13659,"templateId":4702,"type":513,"format":514,"intent_type":11530,"intent":4022,"tags":30146,"platfrom":30147},[11532,13661,13662,519],[11534],{"title":13421,"description":13657},{"id":14781,"title":14782,"body":30150,"date":1043,"description":15065,"extension":506,"meta":30383,"navigation":522,"order":523,"path":15073,"seo":30386,"stem":15075,"__hash__":15076},{"type":8,"value":30151,"toc":30376},[30152,30154,30158,30160,30162,30164,30166,30170,30174,30176,30178,30306,30308,30310,30312,30316,30372],[11,30153],{},[14,30155,14789,30156,14793],{},[29,30157,14792],{},[18,30159],{},[21,30161,14799],{"id":14798},[14,30163,14802],{},[21,30165,14806],{"id":14805},[14,30167,14809,30168,14813],{},[29,30169,14812],{},[14,30171,62,30172,44],{},[29,30173,65],{},[14,30175,68],{},[21,30177,14823],{"id":14822},[77,30179,30180,30304],{},[80,30181,30182,30198],{},[83,30183,30184,88,30186,30188],{},[29,30185,87],{},[90,30187,13474],{},[80,30189,30190,30194],{},[83,30191,30192,14840],{},[90,30193,3922],{},[83,30195,30196,14845],{},[90,30197,161],{},[83,30199,30200,88,30202,30204],{},[29,30201,111],{},[90,30203,114],{},[80,30205,30206,30212,30222,30232,30242,30248,30272,30284,30294],{},[83,30207,30208,88,30210,10297],{},[29,30209,121],{},[90,30211,124],{},[83,30213,30214,88,30216,10297,30218],{},[29,30215,145],{},[90,30217,14866],{},[80,30219,30220],{},[83,30221,14871],{},[83,30223,30224,88,30226,10297,30228],{},[29,30225,170],{},[90,30227,14878],{},[80,30229,30230],{},[83,30231,14883],{},[83,30233,30234,88,30236,10297,30238],{},[29,30235,213],{},[90,30237,148],{},[80,30239,30240],{},[83,30241,14894],{},[83,30243,30244,88,30246,10297],{},[29,30245,241],{},[90,30247,14901],{},[83,30249,30250,88,30252,30254,30258],{},[29,30251,278],{},[90,30253,14217],{},[80,30255,30256],{},[83,30257,14912],{},[80,30259,30260],{},[83,30261,30262,88,30264,30266],{},[29,30263,14919],{},[90,30265,14922],{},[80,30267,30268],{},[83,30269,30270,14929],{},[90,30271,953],{},[83,30273,30274,88,30276,30278],{},[29,30275,1203],{},[90,30277,14936],{},[80,30279,30280],{},[83,30281,30282,14943],{},[90,30283,953],{},[83,30285,30286,88,30288,10297,30290],{},[29,30287,13031],{},[90,30289,14950],{},[80,30291,30292],{},[83,30293,14955],{},[83,30295,30296,88,30298,10297,30300],{},[29,30297,13038],{},[90,30299,2695],{},[80,30301,30302],{},[83,30303,14966],{},[14,30305,983],{},[21,30307,14972],{"id":14971},[14,30309,14975],{},[21,30311,330],{"id":329},[14,30313,1009,30314,44],{},[322,30315,994],{"href":993},[77,30317,30318],{},[80,30319,30320,30330,30338,30348,30356,30364],{},[83,30321,30322,30324,14993,30326,14997,30328,1230],{},[29,30323,14990],{},[344,30325],{},[29,30327,14996],{},[90,30329,13474],{},[83,30331,30332,30334,15007,30336,44],{},[29,30333,15004],{},[344,30335],{},[90,30337,13489],{},[83,30339,30340,30342,476,30344,15019,30346,1230],{},[29,30341,15014],{},[344,30343],{},[90,30345,13616],{},[90,30347,124],{},[83,30349,30350,30352,15029,30354,1230],{},[29,30351,15026],{},[344,30353],{},[90,30355,6449],{},[83,30357,30358,30360,346,30362,15042],{},[29,30359,15036],{},[344,30361],{},[90,30363,15041],{},[83,30365,30366,30368,346,30370,15053],{},[29,30367,15047],{},[344,30369],{},[90,30371,15052],{},[14,30373,483,30374],{},[322,30375,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":30377},[30378,30379,30380,30381,30382],{"id":14798,"depth":498,"text":14799},{"id":14805,"depth":498,"text":14806},{"id":14822,"depth":498,"text":14823},{"id":14971,"depth":498,"text":14972},{"id":329,"depth":498,"text":330},{"desciription":15067,"logoFile":15068,"read":1527,"video":15069,"templateId":2559,"type":513,"format":514,"intent_type":1049,"intent":1050,"tags":30384,"platfrom":30385},[11532,1054,1053],[15072],{"title":14782,"description":15065},{"id":15959,"title":15960,"body":30388,"date":1043,"description":16259,"extension":506,"meta":30626,"navigation":522,"order":523,"path":16269,"seo":30629,"stem":16271,"__hash__":16272},{"type":8,"value":30389,"toc":30618},[30390,30392,30394,30396,30398,30400,30404,30406,30412,30414,30416,30418,30420,30422,30602,30604,30606,30608,30610],[11,30391],{},[14,30393,15967],{},[14,30395,15970],{},[18,30397],{},[14,30399,15975],{},[14,30401,15978,30402],{},[322,30403,15982],{"href":15981},[21,30405,15986],{"id":15985},[555,30407,30408,30410],{},[83,30409,15991],{},[83,30411,15994],{},[21,30413,15998],{"id":15997},[14,30415,16001],{},[21,30417,16005],{"id":16004},[14,30419,16008],{},[21,30421,16012],{"id":16011},[77,30423,30424],{},[80,30425,30426,30450,30474,30512,30550,30578],{},[83,30427,30428,88,30430,30432],{},[29,30429,87],{},[90,30431,148],{},[80,30433,30434,30438,30442,30446],{},[83,30435,30436,16029],{},[90,30437,3922],{},[83,30439,30440,16034],{},[90,30441,155],{},[83,30443,30444,16040],{},[90,30445,16039],{},[83,30447,30448,16045],{},[90,30449,161],{},[83,30451,30452,88,30454,30456],{},[29,30453,111],{},[90,30455,92],{},[80,30457,30458,30462,30466,30472],{},[83,30459,30460,16058],{},[90,30461,99],{},[83,30463,30464,16063],{},[90,30465,105],{},[83,30467,30468,16068,30470,16071],{},[90,30469,7182],{},[90,30471,5267],{},[83,30473,16074],{},[83,30475,30476,88,30478,30480],{},[29,30477,3760],{},[90,30479,16081],{},[80,30481,30482,30490,30498,30504,30508],{},[83,30483,30484,132,30486,136,30488,44],{},[90,30485,465],{},[90,30487,194],{},[90,30489,5975],{},[83,30491,30492,132,30494,136,30496,44],{},[90,30493,16096],{},[90,30495,194],{},[90,30497,139],{},[83,30499,30500,11491,30502,44],{},[90,30501,16105],{},[90,30503,16108],{},[83,30505,30506,16114],{},[90,30507,16113],{},[83,30509,30510,16071],{},[90,30511,16119],{},[83,30513,30514,88,30516,30518],{},[29,30515,3799],{},[90,30517,16126],{},[80,30519,30520,30528,30532,30538,30542,30546],{},[83,30521,30522,132,30524,136,30526,44],{},[90,30523,6281],{},[90,30525,194],{},[90,30527,16137],{},[83,30529,30530,16143],{},[90,30531,16142],{},[83,30533,30534,1995,30536,44],{},[90,30535,16105],{},[90,30537,16108],{},[83,30539,30540,16114],{},[90,30541,16113],{},[83,30543,30544,16159],{},[90,30545,16158],{},[83,30547,30548,16114],{},[90,30549,11371],{},[83,30551,30552,88,30554,30556],{},[29,30553,5343],{},[90,30555,3303],{},[80,30557,30558,30562,30566,30572],{},[83,30559,30560,16058],{},[90,30561,99],{},[83,30563,30564,16180],{},[90,30565,105],{},[83,30567,30568,261,30570,44],{},[90,30569,260],{},[90,30571,16137],{},[83,30573,30574,162,30576,44],{},[90,30575,269],{},[90,30577,6013],{},[83,30579,30580,88,30582,30584],{},[29,30581,5366],{},[90,30583,16199],{},[80,30585,30586,30590,30594],{},[83,30587,30588,16207],{},[90,30589,16206],{},[83,30591,30592,16213],{},[90,30593,16212],{},[83,30595,30596,16219,30598,16222,30600,44],{},[90,30597,16218],{},[90,30599,194],{},[90,30601,16137],{},[21,30603,16228],{"id":16227},[14,30605,16231],{},[21,30607,16235],{"id":16234},[14,30609,16238],{},[80,30611,30612,30616],{},[83,30613,16243,30614,16247],{},[727,30615,16246],{},[83,30617,16250],{},{"title":494,"searchDepth":495,"depth":495,"links":30619},[30620,30621,30622,30623,30624,30625],{"id":15985,"depth":498,"text":15986},{"id":15997,"depth":498,"text":15998},{"id":16004,"depth":498,"text":16005},{"id":16011,"depth":498,"text":16012},{"id":16227,"depth":498,"text":16228},{"id":16234,"depth":498,"text":16235},{"logoFile":1751,"read":16261,"level":16262,"video":16263,"templateId":4729,"type":513,"format":77,"intent_type":1754,"intent":16264,"tags":30627,"platfrom":30628},[16266,16267],[1757],{"title":15960,"description":16259},{"id":16274,"title":16275,"body":30631,"date":1043,"description":16549,"extension":506,"meta":30878,"navigation":522,"order":523,"path":16555,"seo":30881,"stem":16557,"__hash__":16558},{"type":8,"value":30632,"toc":30870},[30633,30635,30637,30639,30641,30643,30647,30649,30657,30659,30661,30663,30665,30669,30671,30847,30849,30854,30856,30858,30860,30862],[11,30634],{},[14,30636,16282],{},[18,30638],{},[14,30640,15970],{},[14,30642,15975],{},[14,30644,15978,30645],{},[322,30646,15982],{"href":15981},[21,30648,15986],{"id":15985},[77,30650,30651],{},[555,30652,30653,30655],{},[83,30654,15991],{},[83,30656,15994],{},[21,30658,15998],{"id":15997},[14,30660,16001],{},[21,30662,16005],{"id":16004},[14,30664,16008],{},[14,30666,16313,30667],{},[322,30668,15982],{"href":15981},[21,30670,16319],{"id":16318},[77,30672,30673],{},[80,30674,30675,30699,30725,30763,30803,30831],{},[83,30676,30677,88,30679,30681],{},[29,30678,87],{},[90,30680,148],{},[80,30682,30683,30687,30691,30695],{},[83,30684,30685,16029],{},[90,30686,3922],{},[83,30688,30689,16034],{},[90,30690,155],{},[83,30692,30693,16344],{},[90,30694,16039],{},[83,30696,30697,16349],{},[90,30698,161],{},[83,30700,30701,88,30703,30705],{},[29,30702,111],{},[90,30704,92],{},[80,30706,30707,30711,30715,30719,30723],{},[83,30708,30709,16362],{},[90,30710,99],{},[83,30712,30713,16367],{},[90,30714,105],{},[83,30716,30717,16071],{},[90,30718,7182],{},[83,30720,30721,16071],{},[90,30722,5267],{},[83,30724,16378],{},[83,30726,30727,88,30729,30731],{},[29,30728,3760],{},[90,30730,16385],{},[80,30732,30733,30741,30749,30755,30759],{},[83,30734,30735,132,30737,136,30739,44],{},[90,30736,465],{},[90,30738,194],{},[90,30740,5975],{},[83,30742,30743,132,30745,136,30747,44],{},[90,30744,16400],{},[90,30746,194],{},[90,30748,139],{},[83,30750,30751,162,30753,44],{},[90,30752,16105],{},[90,30754,16108],{},[83,30756,30757,16114],{},[90,30758,16113],{},[83,30760,30761,16419],{},[90,30762,16119],{},[83,30764,30765,88,30767,30769],{},[29,30766,3799],{},[90,30768,16426],{},[80,30770,30771,30779,30785,30791,30795,30799],{},[83,30772,30773,132,30775,136,30777,44],{},[90,30774,6281],{},[90,30776,194],{},[90,30778,16137],{},[83,30780,30781,16441,30783,44],{},[90,30782,16142],{},[90,30784,16444],{},[83,30786,30787,1995,30789,44],{},[90,30788,16105],{},[90,30790,16108],{},[83,30792,30793,16114],{},[90,30794,16113],{},[83,30796,30797,16159],{},[90,30798,16158],{},[83,30800,30801,16114],{},[90,30802,11371],{},[83,30804,30805,88,30807,30809],{},[29,30806,5343],{},[90,30808,3303],{},[80,30810,30811,30815,30819,30825],{},[83,30812,30813,16362],{},[90,30814,99],{},[83,30816,30817,16479],{},[90,30818,105],{},[83,30820,30821,261,30823,44],{},[90,30822,260],{},[90,30824,16486],{},[83,30826,30827,162,30829,44],{},[90,30828,15309],{},[90,30830,6013],{},[83,30832,30833,88,30835,30837],{},[29,30834,5366],{},[90,30836,12302],{},[80,30838,30839,30843],{},[83,30840,30841,16505],{},[90,30842,577],{},[83,30844,30845,16511],{},[90,30846,16510],{},[14,30848,16514],{},[719,30850,30852],{"className":30851,"code":16519,"language":16520},[16518],[90,30853,16519],{"__ignoreMap":494},[21,30855,16228],{"id":16227},[14,30857,16527],{},[21,30859,16235],{"id":16234},[14,30861,16238],{},[80,30863,30864,30868],{},[83,30865,16243,30866,16247],{},[727,30867,16246],{},[83,30869,16540],{},{"title":494,"searchDepth":495,"depth":495,"links":30871},[30872,30873,30874,30875,30876,30877],{"id":15985,"depth":498,"text":15986},{"id":15997,"depth":498,"text":15998},{"id":16004,"depth":498,"text":16005},{"id":16318,"depth":498,"text":16319},{"id":16227,"depth":498,"text":16228},{"id":16234,"depth":498,"text":16235},{"pinned":522,"read":16551,"type":513,"format":77,"intent_type":1754,"intent":16264,"tags":30879,"platfrom":30880,"video":16554,"templateId":4724},[16266],[1757],{"title":16275,"description":16549},{"id":19972,"title":19973,"body":30883,"date":1043,"description":20229,"extension":506,"meta":31107,"navigation":522,"order":523,"path":20234,"seo":31110,"stem":20236,"__hash__":20237},{"type":8,"value":30884,"toc":31099},[30885,30887,30889,30891,30893,30899,30901,30907,30911,30913,30915,31035,31037,31041,31043,31047,31049,31053,31093],[11,30886],{},[14,30888,19980],{},[18,30890],{},[21,30892,853],{"id":852},[14,30894,19987,30895,19990,30897,19994],{},[29,30896,31],{},[29,30898,19993],{},[21,30900,19998],{"id":19997},[14,30902,20001,30903,20004,30905,59],{},[29,30904,54],{},[29,30906,58],{},[14,30908,62,30909,44],{},[29,30910,65],{},[14,30912,68],{},[21,30914,20016],{"id":20015},[77,30916,30917],{},[80,30918,30919,30935],{},[83,30920,30921,88,30923,30925],{},[29,30922,87],{},[90,30924,92],{},[80,30926,30927,30931],{},[83,30928,30929,100],{},[90,30930,99],{},[83,30932,30933,20037],{},[90,30934,105],{},[83,30936,30937,88,30939,30941],{},[29,30938,111],{},[90,30940,114],{},[80,30942,30943,30959,30969,30979,31003,31019],{},[83,30944,30945,88,30947,30949],{},[29,30946,121],{},[90,30948,12971],{},[80,30950,30951],{},[83,30952,30953,132,30955,136,30957,20062],{},[90,30954,131],{},[90,30956,1004],{},[90,30958,227],{},[83,30960,30961,88,30963,30965],{},[29,30962,145],{},[90,30964,20069],{},[80,30966,30967],{},[83,30968,20074],{},[83,30970,30971,88,30973,30975],{},[29,30972,170],{},[90,30974,20081],{},[80,30976,30977],{},[83,30978,20074],{},[83,30980,30981,88,30983,30985],{},[29,30982,213],{},[90,30984,20092],{},[80,30986,30987,30995],{},[83,30988,30989,132,30991,13281,30993,44],{},[90,30990,223],{},[90,30992,1004],{},[90,30994,227],{},[83,30996,30997,132,30999,136,31001,44],{},[90,30998,233],{},[90,31000,1004],{},[90,31002,198],{},[83,31004,31005,88,31007,31009],{},[29,31006,241],{},[90,31008,3303],{},[80,31010,31011,31015],{},[83,31012,31013,100],{},[90,31014,99],{},[83,31016,31017,12956],{},[90,31018,105],{},[83,31020,31021,88,31023,31025],{},[29,31022,278],{},[90,31024,281],{},[80,31026,31027,31031],{},[83,31028,31029,100],{},[90,31030,99],{},[83,31032,31033,12956],{},[90,31034,105],{},[21,31036,20146],{"id":20145},[14,31038,20149,31039,44],{},[322,31040,994],{"href":993},[21,31042,317],{"id":316},[14,31044,320,31045,326],{},[322,31046,325],{"href":324},[21,31048,330],{"id":329},[14,31050,1009,31051,44],{},[322,31052,994],{"href":993},[77,31054,31055],{},[80,31056,31057,31065,31081],{},[83,31058,31059,31061,346,31063,20178],{},[29,31060,20172],{},[344,31062],{},[90,31064,20177],{},[83,31066,31067,31069,346,31071,20189,31073,20193,31075,31077,450,31079,44],{},[29,31068,20183],{},[344,31070],{},[90,31072,20188],{},[322,31074,7498],{"href":20192},[344,31076],{},[90,31078,20198],{},[90,31080,20201],{},[83,31082,31083,31085,346,31087,1482,31089,466,31091,44],{},[29,31084,459],{},[344,31086],{},[90,31088,13639],{},[90,31090,465],{},[90,31092,264],{},[14,31094,483,31095,20218,31097],{},[322,31096,487],{"href":486},[322,31098,13134],{"href":13133},{"title":494,"searchDepth":495,"depth":495,"links":31100},[31101,31102,31103,31104,31105,31106],{"id":852,"depth":498,"text":853},{"id":19997,"depth":498,"text":19998},{"id":20015,"depth":498,"text":20016},{"id":20145,"depth":498,"text":20146},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"read":1046,"level":510,"video":20231,"templateId":4708,"type":513,"format":514,"intent_type":11530,"intent":4022,"tags":31108,"platfrom":31109},[11532,13661,13662,519],[11534],{"title":19973,"description":20229},{"id":20344,"title":20345,"body":31112,"date":1043,"description":20541,"extension":506,"meta":31286,"navigation":522,"order":523,"path":15981,"seo":31289,"stem":20547,"__hash__":20548},{"type":8,"value":31113,"toc":31278},[31114,31116,31118,31120,31124,31126,31132,31134,31140,31144,31146,31148,31206,31208,31210,31212,31216,31218,31220,31274],[11,31115],{},[14,31117,20352],{},[18,31119],{},[14,31121,20357,31122],{},[322,31123,20360],{"href":15104},[21,31125,24],{"id":23},[14,31127,27,31128,20367,31130,44],{},[29,31129,31],{},[29,31131,39],{},[21,31133,20373],{"id":20372},[14,31135,20376,31136,20379,31138,59],{},[29,31137,54],{},[29,31139,58],{},[14,31141,20384,31142,44],{},[29,31143,65],{},[14,31145,68],{},[21,31147,20392],{"id":20391},[77,31149,31150],{},[80,31151,31152,31178],{},[83,31153,31154,88,31156,31158],{},[29,31155,349],{},[90,31157,13474],{},[80,31159,31160,31164,31170,31174],{},[83,31161,31162,20409],{},[90,31163,3922],{},[83,31165,31166,1995,31168,20416],{},[90,31167,155],{},[322,31169,19500],{"href":19499},[83,31171,31172,20421],{},[90,31173,16039],{},[83,31175,31176,20426],{},[90,31177,161],{},[83,31179,31180,88,31182,31184],{},[29,31181,908],{},[90,31183,3303],{},[80,31185,31186,31190,31194,31200],{},[83,31187,31188,100],{},[90,31189,99],{},[83,31191,31192,255],{},[90,31193,105],{},[83,31195,31196,261,31198,44],{},[90,31197,260],{},[90,31199,13616],{},[83,31201,31202,162,31204,44],{},[90,31203,15309],{},[90,31205,6013],{},[21,31207,20458],{"id":20457},[14,31209,20461],{},[21,31211,317],{"id":316},[14,31213,320,31214,326],{},[322,31215,325],{"href":324},[21,31217,330],{"id":329},[14,31219,333],{},[77,31221,31222],{},[80,31223,31224,31234,31246,31254,31266],{},[83,31225,31226,31228,346,31230,20485,31232,44],{},[29,31227,363],{},[344,31229],{},[90,31231,20484],{},[322,31233,7498],{"href":380},[83,31235,31236,31238,393,31240,397,31242,401,31244,44],{},[29,31237,19614],{},[344,31239],{},[90,31241,396],{},[90,31243,400],{},[90,31245,17395],{},[83,31247,31248,31250,19630,31252,19633],{},[29,31249,19627],{},[344,31251],{},[90,31253,161],{},[83,31255,31256,31258,346,31260,444,31262,466,31264,44],{},[29,31257,459],{},[344,31259],{},[90,31261,20516],{},[90,31263,465],{},[90,31265,13616],{},[83,31267,31268,31270,476,31272,480],{},[29,31269,473],{},[344,31271],{},[90,31273,479],{},[14,31275,483,31276],{},[322,31277,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":31279},[31280,31281,31282,31283,31284,31285],{"id":23,"depth":498,"text":24},{"id":20372,"depth":498,"text":20373},{"id":20391,"depth":498,"text":20392},{"id":20457,"depth":498,"text":20458},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"read":1527,"level":510,"video":20543,"templateId":4671,"type":513,"format":514,"intent_type":1754,"intent":4022,"tags":31287,"platfrom":31288},[519,15368,12881],[1757],{"title":20345,"description":20541},{"id":23117,"title":23118,"body":31291,"date":1043,"description":23368,"extension":506,"meta":31507,"navigation":522,"order":523,"path":23373,"seo":31510,"stem":23375,"__hash__":23376},{"type":8,"value":31292,"toc":31499},[31293,31295,31297,31299,31301,31307,31309,31315,31319,31321,31323,31423,31425,31429,31431,31435,31437,31441,31495],[11,31294],{},[14,31296,23125],{},[18,31298],{},[21,31300,853],{"id":852},[14,31302,27,31303,19402,31305,23137],{},[29,31304,31],{},[29,31306,23136],{},[21,31308,23141],{"id":23140},[14,31310,23144,31311,55,31313,59],{},[29,31312,54],{},[29,31314,58],{},[14,31316,62,31317,44],{},[29,31318,65],{},[14,31320,68],{},[21,31322,23158],{"id":23157},[77,31324,31325,31421],{},[80,31326,31327,31343],{},[83,31328,31329,88,31331,31333],{},[29,31330,87],{},[90,31332,92],{},[80,31334,31335,31339],{},[83,31336,31337,100],{},[90,31338,99],{},[83,31340,31341,23179],{},[90,31342,105],{},[83,31344,31345,88,31347,31349],{},[29,31346,111],{},[90,31348,114],{},[80,31350,31351,31367,31373,31405],{},[83,31352,31353,88,31355,31357],{},[29,31354,121],{},[90,31356,124],{},[80,31358,31359],{},[83,31360,31361,132,31363,136,31365,44],{},[90,31362,131],{},[90,31364,194],{},[90,31366,227],{},[83,31368,31369,88,31371,10297],{},[29,31370,145],{},[90,31372,148],{},[83,31374,31375,88,31377,12985,31379],{},[29,31376,170],{},[90,31378,11349],{},[80,31380,31381,31385,31399],{},[83,31382,31383,10297],{},[29,31384,23222],{},[83,31386,31387,88,31389,31391],{},[29,31388,23227],{},[90,31390,946],{},[80,31392,31393],{},[83,31394,31395,132,31397,23238],{},[90,31396,953],{},[90,31398,194],{},[83,31400,31401,88,31403,10297],{},[29,31402,23243],{},[90,31404,23246],{},[83,31406,31407,88,31409,31411],{},[29,31408,213],{},[90,31410,281],{},[80,31412,31413,31417],{},[83,31414,31415,100],{},[90,31416,99],{},[83,31418,31419,12956],{},[90,31420,105],{},[14,31422,983],{},[21,31424,23268],{"id":23267},[14,31426,23271,31427,44],{},[322,31428,994],{"href":993},[21,31430,317],{"id":316},[14,31432,320,31433,326],{},[322,31434,325],{"href":324},[21,31436,330],{"id":329},[14,31438,23284,31439,44],{},[322,31440,994],{"href":993},[77,31442,31443],{},[80,31444,31445,31453,31461,31469,31477,31487],{},[83,31446,31447,31449,346,31451,23300],{},[29,31448,23295],{},[344,31450],{},[90,31452,13359],{},[83,31454,31455,31457,346,31459,23310],{},[29,31456,23305],{},[344,31458],{},[90,31460,368],{},[83,31462,31463,31465,346,31467,23321],{},[29,31464,23315],{},[344,31466],{},[90,31468,23320],{},[83,31470,31471,31473,23329,31475,44],{},[29,31472,23326],{},[344,31474],{},[90,31476,198],{},[83,31478,31479,31481,346,31483,23341,31485,44],{},[29,31480,7492],{},[344,31482],{},[90,31484,23340],{},[322,31486,23344],{"href":10402},[83,31488,31489,31491,346,31493,23355],{},[29,31490,23349],{},[344,31492],{},[90,31494,23354],{},[14,31496,483,31497],{},[322,31498,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":31500},[31501,31502,31503,31504,31505,31506],{"id":852,"depth":498,"text":853},{"id":23140,"depth":498,"text":23141},{"id":23157,"depth":498,"text":23158},{"id":23267,"depth":498,"text":23268},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"read":1046,"level":510,"video":23370,"templateId":4806,"type":513,"format":514,"intent_type":1049,"intent":1050,"tags":31508,"platfrom":31509},[1052,1053,1056],[10101,10102],{"title":23118,"description":23368},{"id":23587,"title":23588,"body":31512,"date":1043,"description":23861,"extension":506,"meta":31762,"navigation":522,"order":523,"path":15104,"seo":31765,"stem":23867,"__hash__":23868},{"type":8,"value":31513,"toc":31754},[31514,31516,31518,31520,31522,31530,31532,31538,31542,31544,31546,31664,31666,31668,31670,31674,31676,31678,31744],[11,31515],{},[14,31517,23595],{},[18,31519],{},[21,31521,24],{"id":23},[14,31523,23602,31524,36,31526,40,31528,44],{},[29,31525,23605],{},[29,31527,23608],{},[29,31529,43],{},[21,31531,23614],{"id":23613},[14,31533,23617,31534,55,31536,59],{},[29,31535,54],{},[29,31537,58],{},[14,31539,62,31540,44],{},[29,31541,65],{},[14,31543,68],{},[21,31545,23631],{"id":23630},[77,31547,31548],{},[80,31549,31550,31568],{},[83,31551,31552,88,31554,31556],{},[29,31553,87],{},[90,31555,92],{},[80,31557,31558,31562],{},[83,31559,31560,100],{},[90,31561,99],{},[83,31563,31564,5910,31566,44],{},[90,31565,105],{},[90,31567,5913],{},[83,31569,31570,88,31572,31574],{},[29,31571,111],{},[90,31573,114],{},[80,31575,31576,31590,31608,31636],{},[83,31577,31578,88,31580,31582],{},[29,31579,121],{},[90,31581,124],{},[80,31583,31584],{},[83,31585,31586,1620,31588,1623],{},[90,31587,131],{},[90,31589,139],{},[83,31591,31592,88,31594,31596],{},[29,31593,145],{},[90,31595,148],{},[80,31597,31598,31604],{},[83,31599,31600,1995,31602,23690],{},[90,31601,155],{},[322,31603,19500],{"href":19499},[83,31605,31606,19506],{},[90,31607,161],{},[83,31609,31610,88,31612,31614],{},[29,31611,170],{},[90,31613,3303],{},[80,31615,31616,31620,31624,31630],{},[83,31617,31618,100],{},[90,31619,99],{},[83,31621,31622,255],{},[90,31623,105],{},[83,31625,31626,261,31628,44],{},[90,31627,260],{},[90,31629,198],{},[83,31631,31632,270,31634,44],{},[90,31633,269],{},[90,31635,273],{},[83,31637,31638,88,31640,31642],{},[29,31639,213],{},[90,31641,281],{},[80,31643,31644,31648,31652,31658],{},[83,31645,31646,100],{},[90,31647,99],{},[83,31649,31650,292],{},[90,31651,105],{},[83,31653,31654,162,31656,44],{},[90,31655,297],{},[90,31657,165],{},[83,31659,31660,162,31662,44],{},[90,31661,304],{},[90,31663,165],{},[21,31665,23754],{"id":23753},[14,31667,23757],{},[21,31669,317],{"id":316},[14,31671,320,31672,326],{},[322,31673,325],{"href":324},[21,31675,330],{"id":329},[14,31677,333],{},[77,31679,31680],{},[80,31681,31682,31694,31704,31716,31724,31736],{},[83,31683,31684,31686,346,31688,350,31690,19594,31692,19597],{},[29,31685,342],{},[344,31687],{},[90,31689,349],{},[90,31691,353],{},[90,31693,1723],{},[83,31695,31696,31698,346,31700,19607,31702,44],{},[29,31697,363],{},[344,31699],{},[90,31701,368],{},[322,31703,7498],{"href":380},[83,31705,31706,31708,393,31710,397,31712,401,31714,44],{},[29,31707,19614],{},[344,31709],{},[90,31711,396],{},[90,31713,400],{},[90,31715,165],{},[83,31717,31718,31720,19630,31722,19633],{},[29,31719,19627],{},[344,31721],{},[90,31723,161],{},[83,31725,31726,31728,346,31730,444,31732,466,31734,44],{},[29,31727,459],{},[344,31729],{},[90,31731,23822],{},[90,31733,465],{},[90,31735,198],{},[83,31737,31738,31740,476,31742,480],{},[29,31739,473],{},[344,31741],{},[90,31743,479],{},[14,31745,483,31746,23839,31748,23843,31750,23848,31752],{},[322,31747,487],{"href":486},[322,31749,23842],{"href":491},[322,31751,23847],{"href":23846},[322,31753,23852],{"href":23851},{"title":494,"searchDepth":495,"depth":495,"links":31755},[31756,31757,31758,31759,31760,31761],{"id":23,"depth":498,"text":24},{"id":23613,"depth":498,"text":23614},{"id":23630,"depth":498,"text":23631},{"id":23753,"depth":498,"text":23754},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"pinned":522,"read":7527,"level":510,"video":23863,"templateId":498,"type":513,"format":514,"intent_type":1754,"intent":4022,"tags":31763,"platfrom":31764},[519,1056],[1757],{"title":23588,"description":23861},{"id":24688,"title":24689,"body":31767,"date":1043,"description":24862,"extension":506,"meta":31900,"navigation":522,"order":498,"path":24867,"seo":31903,"stem":24869,"__hash__":24870},{"type":8,"value":31768,"toc":31892},[31769,31771,31780,31782,31784,31790,31792,31796,31800,31802,31804,31810,31870,31872,31876,31878,31882,31884,31886],[11,31770],{},[14,31772,24696,31773,24700,31775,24706,31778,44],{},[29,31774,24699],{},[322,31776,24705],{"href":24703,"rel":31777},[2245],[29,31779,24709],{},[18,31781],{},[21,31783,24715],{"id":24714},[14,31785,24718,31786,24722,31788],{},[29,31787,24721],{},[322,31789,24726],{"href":24725},[21,31791,24730],{"id":24729},[14,31793,24733,31794,1098],{},[29,31795,5867],{},[14,31797,20384,31798,44],{},[29,31799,19129],{},[14,31801,68],{},[21,31803,24745],{"id":24744},[14,31805,24748,31806,24752,31808,7354],{},[90,31807,24751],{},[322,31809,7285],{"href":7353},[77,31811,31812],{},[80,31813,31814,31826],{},[83,31815,31816,88,31818,24765,31820,24768,31822,44],{},[29,31817,87],{},[90,31819,8895],{},[90,31821,24310],{},[29,31823,24771,31824,24775],{},[727,31825,24774],{},[83,31827,31828,88,31830,3731,31832],{},[29,31829,111],{},[90,31831,114],{},[80,31833,31834,31848,31862],{},[83,31835,31836,88,31838,24790,31840,24793,31842,401,31844,136,31846,44],{},[29,31837,121],{},[90,31839,6426],{},[90,31841,155],{},[90,31843,953],{},[29,31845,20958],{},[90,31847,24800],{},[83,31849,31850,88,31852,24790,31854,24793,31856,401,31858,136,31860,44],{},[29,31851,145],{},[90,31853,6426],{},[90,31855,155],{},[90,31857,953],{},[29,31859,20958],{},[90,31861,24800],{},[83,31863,31864,88,31866,24790,31868,24823],{},[29,31865,170],{},[90,31867,6449],{},[90,31869,155],{},[21,31871,24827],{"id":24826},[14,31873,24830,31874],{},[322,31875,24834],{"href":24833},[21,31877,317],{"id":316},[14,31879,320,31880,326],{},[322,31881,12697],{"href":324},[21,31883,330],{"id":329},[14,31885,333],{},[14,31887,483,31888,24849,31890],{},[322,31889,487],{"href":486},[322,31891,24853],{"href":24852},{"title":494,"searchDepth":495,"depth":495,"links":31893},[31894,31895,31896,31897,31898,31899],{"id":24714,"depth":498,"text":24715},{"id":24729,"depth":498,"text":24730},{"id":24744,"depth":498,"text":24745},{"id":24826,"depth":498,"text":24827},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"pinned":522,"read":13146,"level":16262,"video":24864,"templateId":4686,"type":513,"format":514,"intent_type":1754,"intent":7308,"tags":31901,"platfrom":31902},[829,830,1055,21214],[3288],{"title":24689,"description":24862},{"id":1540,"title":1541,"body":31905,"date":1748,"description":1749,"extension":506,"meta":32077,"navigation":522,"order":523,"path":1758,"seo":32080,"stem":1760,"__hash__":1761},{"type":8,"value":31906,"toc":32069},[31907,31909,31911,31913,31915,31919,31921,31927,31931,31933,31935,32025,32027,32029,32031,32037,32039,32041,32065],[11,31908],{},[14,31910,1548],{},[18,31912],{},[21,31914,24],{"id":23},[14,31916,27,31917,1557],{},[29,31918,31],{},[21,31920,1561],{"id":1560},[14,31922,1564,31923,55,31925,59],{},[29,31924,54],{},[29,31926,58],{},[14,31928,62,31929,44],{},[29,31930,65],{},[14,31932,68],{},[21,31934,1578],{"id":1577},[77,31936,31937],{},[80,31938,31939,31955],{},[83,31940,31941,88,31943,31945],{},[29,31942,87],{},[90,31944,92],{},[80,31946,31947,31951],{},[83,31948,31949,100],{},[90,31950,99],{},[83,31952,31953,1599],{},[90,31954,105],{},[83,31956,31957,88,31959,31961],{},[29,31958,111],{},[90,31960,114],{},[80,31962,31963,31977,32001],{},[83,31964,31965,88,31967,31969],{},[29,31966,121],{},[90,31968,124],{},[80,31970,31971],{},[83,31972,31973,1620,31975,1623],{},[90,31974,131],{},[90,31976,139],{},[83,31978,31979,88,31981,31983],{},[29,31980,145],{},[90,31982,1630],{},[80,31984,31985,31989,31993,31997],{},[83,31986,31987,1638],{},[90,31988,1637],{},[83,31990,31991,1644],{},[90,31992,1643],{},[83,31994,31995,1650],{},[90,31996,1649],{},[83,31998,31999,1644],{},[90,32000,1655],{},[83,32002,32003,88,32005,32007],{},[29,32004,170],{},[90,32006,281],{},[80,32008,32009,32013,32017,32021],{},[83,32010,32011,100],{},[90,32012,99],{},[83,32014,32015,1672],{},[90,32016,105],{},[83,32018,32019,1677],{},[90,32020,297],{},[83,32022,32023,1677],{},[90,32024,304],{},[21,32026,1685],{"id":1684},[14,32028,1688],{},[21,32030,317],{"id":316},[14,32032,320,32033,1695,32035,1230],{},[322,32034,325],{"href":324},[322,32036,1699],{"href":1698},[21,32038,330],{"id":329},[14,32040,333],{},[77,32042,32043],{},[80,32044,32045,32057],{},[83,32046,32047,32049,346,32051,1717,32053,1720,32055,1724],{},[29,32048,1712],{},[344,32050],{},[90,32052,349],{},[90,32054,353],{},[90,32056,1723],{},[83,32058,32059,32061,346,32063,1735],{},[29,32060,1729],{},[344,32062],{},[90,32064,1734],{},[14,32066,483,32067],{},[322,32068,487],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":32070},[32071,32072,32073,32074,32075,32076],{"id":23,"depth":498,"text":24},{"id":1560,"depth":498,"text":1561},{"id":1577,"depth":498,"text":1578},{"id":1684,"depth":498,"text":1685},{"id":316,"depth":498,"text":317},{"id":329,"depth":498,"text":330},{"logoFile":1751,"read":1046,"video":1752,"templateId":1753,"type":513,"format":514,"intent_type":1754,"intent":1050,"tags":32078,"platfrom":32079},[519,1056],[1757],{"title":1541,"description":1749},{"id":529,"title":530,"body":32082,"date":523,"description":825,"extension":506,"meta":32277,"navigation":522,"order":523,"path":834,"seo":32280,"stem":836,"__hash__":837},{"type":8,"value":32083,"toc":32266},[32084,32086,32088,32090,32092,32094,32096,32098,32118,32120,32122,32124,32126,32152,32154,32156,32158,32160,32180,32182,32184,32186,32200,32202,32204,32206,32208,32220,32222,32224,32226,32228,32240,32242,32244,32248,32252,32254,32256,32258,32260,32264],[11,32085],{},[14,32087,537],{},[14,32089,540],{},[18,32091],{},[21,32093,546],{"id":545},[11,32095],{},[14,32097,551],{},[77,32099,32100],{},[555,32101,32102,32108,32112],{},[83,32103,32104,562,32106,44],{},[29,32105,561],{},[322,32107,566],{"href":565},[83,32109,32110,572],{},[29,32111,571],{},[83,32113,32114,578,32116,44],{},[29,32115,577],{},[90,32117,581],{},[21,32119,585],{"id":584},[11,32121],{},[14,32123,590],{},[592,32125],{"src":594,"alt":595},[77,32127,32128],{},[555,32129,32130,32134,32140,32148],{},[83,32131,32132,605],{},[29,32133,604],{},[83,32135,32136,611,32138,615],{},[29,32137,610],{},[29,32139,614],{},[83,32141,32142,621,32144,401,32146,44],{},[29,32143,620],{},[29,32145,624],{},[29,32147,627],{},[83,32149,32150,633],{},[29,32151,632],{},[592,32153],{"src":636,"alt":637},[639,32155,642],{"id":641},[11,32157],{},[14,32159,647],{},[77,32161,32162],{},[555,32163,32164,32172,32176],{},[83,32165,32166,611,32168,660,32170,663],{},[29,32167,656],{},[29,32169,659],{},[29,32171,614],{},[83,32173,32174,669],{},[29,32175,668],{},[83,32177,32178,675],{},[29,32179,674],{},[639,32181,679],{"id":678},[11,32183],{},[14,32185,684],{},[77,32187,32188],{},[555,32189,32190,32194,32196],{},[83,32191,691,32192,695],{},[29,32193,694],{},[83,32195,698],{},[83,32197,701,32198,705],{},[29,32199,704],{},[592,32201],{"src":708,"alt":637},[639,32203,712],{"id":711},[11,32205],{},[14,32207,717],{},[719,32209,32210],{"className":721,"code":722,"language":723,"meta":494,"style":494},[90,32211,32212],{"__ignoreMap":494},[727,32213,32214,32216,32218],{"class":729,"line":730},[727,32215,734],{"class":733},[727,32217,738],{"class":737},[727,32219,741],{"class":737},[639,32221,745],{"id":744},[11,32223],{},[14,32225,750],{},[14,32227,753],{},[719,32229,32230],{"className":756,"code":757,"language":758,"meta":494,"style":494},[90,32231,32232],{"__ignoreMap":494},[727,32233,32234,32236,32238],{"class":729,"line":730},[727,32235,765],{"class":737},[727,32237,769],{"class":768},[727,32239,772],{"class":737},[21,32241,776],{"id":775},[11,32243],{},[14,32245,781,32246,785],{},[29,32247,784],{},[14,32249,788,32250,44],{},[322,32251,792],{"href":791},[21,32253,796],{"id":795},[11,32255],{},[14,32257,801],{},[11,32259],{},[14,32261,32262],{},[807,32263,809],{},[811,32265,813],{},{"title":494,"searchDepth":495,"depth":495,"links":32267},[32268,32269,32275,32276],{"id":545,"depth":498,"text":546},{"id":584,"depth":498,"text":585,"children":32270},[32271,32272,32273,32274],{"id":641,"depth":495,"text":642},{"id":678,"depth":495,"text":679},{"id":711,"depth":495,"text":712},{"id":744,"depth":495,"text":745},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"type":513,"format":77,"intent_type":515,"intent":827,"tags":32278,"platfrom":32279,"video":833},[829,830],[832],{"title":530,"description":825},{"id":1763,"title":1764,"body":32282,"date":523,"description":2224,"extension":506,"meta":32624,"navigation":522,"order":523,"path":2228,"seo":32627,"stem":2230,"__hash__":2231},{"type":8,"value":32283,"toc":32618},[32284,32286,32288,32290,32292,32312,32314,32316,32322,32340,32342,32600,32602,32604,32608,32610,32612,32616],[11,32285],{},[14,32287,1771],{},[21,32289,546],{"id":545},[14,32291,1776],{},[77,32293,32294],{},[555,32295,32296,32302,32306],{},[83,32297,32298,1785,32300,44],{},[29,32299,561],{},[322,32301,566],{"href":565},[83,32303,32304,1792],{},[29,32305,571],{},[83,32307,32308,1797,32310,44],{},[29,32309,577],{},[90,32311,581],{},[21,32313,1803],{"id":1802},[14,32315,1806],{},[14,32317,1809,32318,1813,32320,1817],{},[90,32319,1812],{},[90,32321,1816],{},[77,32323,32324],{},[80,32325,32326,32330,32334],{},[83,32327,32328,1827],{},[90,32329,1826],{},[83,32331,32332,1833],{},[90,32333,1832],{},[83,32335,32336,1839,32338,1842],{},[90,32337,1838],{},[90,32339,1838],{},[14,32341,1845],{},[719,32343,32344],{"className":1848,"code":1849,"language":1850,"meta":494,"style":494},[90,32345,32346,32352,32364,32374,32378,32430,32496,32500,32504,32520,32560,32570,32578,32588,32594],{"__ignoreMap":494},[727,32347,32348,32350],{"class":729,"line":730},[727,32349,1857],{"class":733},[727,32351,1860],{"class":737},[727,32353,32354,32356,32358,32360,32362],{"class":729,"line":498},[727,32355,1865],{"class":733},[727,32357,1868],{"class":737},[727,32359,1871],{"class":737},[727,32361,1874],{"class":737},[727,32363,1877],{"class":737},[727,32365,32366,32368,32370,32372],{"class":729,"line":495},[727,32367,1883],{"class":1882},[727,32369,1886],{"class":737},[727,32371,1889],{"class":737},[727,32373,1892],{"class":737},[727,32375,32376],{"class":729,"line":1895},[727,32377,1898],{"emptyLinePlaceholder":522},[727,32379,32380,32382,32384,32386,32388,32390,32392,32394,32396,32398,32400,32402,32404,32406,32408,32410,32412,32414,32416,32418,32420,32422,32424,32426,32428],{"class":729,"line":1901},[727,32381,1865],{"class":733},[727,32383,1906],{"class":737},[727,32385,1909],{"class":737},[727,32387,1912],{"class":737},[727,32389,1915],{"class":737},[727,32391,1918],{"class":737},[727,32393,1909],{"class":737},[727,32395,1923],{"class":737},[727,32397,1926],{"class":737},[727,32399,1889],{"class":737},[727,32401,1912],{"class":737},[727,32403,1933],{"class":737},[727,32405,1936],{"class":737},[727,32407,1939],{"class":737},[727,32409,1942],{"class":737},[727,32411,1945],{"class":737},[727,32413,1948],{"class":737},[727,32415,1912],{"class":737},[727,32417,1953],{"class":737},[727,32419,1956],{"class":737},[727,32421,1959],{"class":737},[727,32423,1962],{"class":737},[727,32425,1889],{"class":737},[727,32427,1967],{"class":737},[727,32429,1970],{"class":737},[727,32431,32432,32434,32436,32438,32440,32442,32444,32446,32448,32450,32452,32454,32456,32458,32460,32462,32464,32466,32468,32470,32472,32474,32476,32478,32480,32482,32484,32486,32488,32490,32492,32494],{"class":729,"line":1973},[727,32433,1883],{"class":1882},[727,32435,1978],{"class":737},[727,32437,1889],{"class":737},[727,32439,1983],{"class":737},[727,32441,1987],{"class":1986},[727,32443,1990],{"class":737},[727,32445,1987],{"class":1986},[727,32447,1995],{"class":737},[727,32449,1987],{"class":1986},[727,32451,1826],{"class":737},[727,32453,1987],{"class":1986},[727,32455,2004],{"class":737},[727,32457,1987],{"class":1986},[727,32459,2009],{"class":737},[727,32461,1987],{"class":1986},[727,32463,1995],{"class":737},[727,32465,1987],{"class":1986},[727,32467,1832],{"class":737},[727,32469,1987],{"class":1986},[727,32471,2004],{"class":737},[727,32473,1987],{"class":1986},[727,32475,1838],{"class":737},[727,32477,1987],{"class":1986},[727,32479,2030],{"class":737},[727,32481,1987],{"class":1986},[727,32483,2035],{"class":737},[727,32485,1987],{"class":1986},[727,32487,2004],{"class":737},[727,32489,1987],{"class":1986},[727,32491,2044],{"class":737},[727,32493,1987],{"class":1986},[727,32495,2049],{"class":737},[727,32497,32498],{"class":729,"line":2052},[727,32499,2055],{"class":768},[727,32501,32502],{"class":729,"line":2058},[727,32503,2061],{"class":733},[727,32505,32506,32508,32510,32512,32514,32516,32518],{"class":729,"line":2064},[727,32507,2067],{"class":733},[727,32509,2070],{"class":737},[727,32511,1912],{"class":737},[727,32513,2075],{"class":737},[727,32515,2078],{"class":737},[727,32517,2081],{"class":737},[727,32519,2084],{"class":737},[727,32521,32522,32524,32526,32528,32530,32532,32534,32536,32538,32540,32542,32544,32546,32548,32550,32552,32554,32556,32558],{"class":729,"line":2087},[727,32523,2090],{"class":1882},[727,32525,2093],{"class":737},[727,32527,1889],{"class":737},[727,32529,2098],{"class":737},[727,32531,2101],{"class":737},[727,32533,2104],{"class":737},[727,32535,2107],{"class":737},[727,32537,2110],{"class":768},[727,32539,2113],{"class":733},[727,32541,2116],{"class":737},[727,32543,2119],{"class":737},[727,32545,1886],{"class":737},[727,32547,2110],{"class":768},[727,32549,2126],{"class":733},[727,32551,2110],{"class":768},[727,32553,2113],{"class":733},[727,32555,2116],{"class":737},[727,32557,2119],{"class":737},[727,32559,2137],{"class":737},[727,32561,32562,32564,32566,32568],{"class":729,"line":2140},[727,32563,2143],{"class":1986},[727,32565,2146],{"class":737},[727,32567,2110],{"class":768},[727,32569,2151],{"class":733},[727,32571,32572,32574,32576],{"class":729,"line":2154},[727,32573,2157],{"class":733},[727,32575,2160],{"class":737},[727,32577,2163],{"class":737},[727,32579,32580,32582,32584,32586],{"class":729,"line":1529},[727,32581,2143],{"class":1986},[727,32583,2170],{"class":737},[727,32585,2110],{"class":768},[727,32587,2175],{"class":733},[727,32589,32590,32592],{"class":729,"line":2178},[727,32591,2181],{"class":1986},[727,32593,2184],{"class":768},[727,32595,32596,32598],{"class":729,"line":2187},[727,32597,2190],{"class":1986},[727,32599,1860],{"class":768},[21,32601,776],{"id":775},[14,32603,2197],{},[14,32605,2200,32606,44],{},[322,32607,2204],{"href":2203},[21,32609,796],{"id":795},[14,32611,2209],{},[14,32613,32614],{},[807,32615,2214],{},[811,32617,2217],{},{"title":494,"searchDepth":495,"depth":495,"links":32619},[32620,32621,32622,32623],{"id":545,"depth":498,"text":546},{"id":1802,"depth":498,"text":1803},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"type":513,"format":77,"intent_type":515,"intent":827,"tags":32625,"platfrom":32626},[829,830],[832],{"title":1764,"description":2224},{"id":2233,"title":2234,"body":32629,"date":523,"description":3357,"extension":506,"meta":33545,"navigation":522,"order":523,"path":3361,"seo":33548,"stem":3363,"__hash__":3364},{"type":8,"value":32630,"toc":33534},[32631,32633,32638,32640,32642,32644,32659,32661,32663,32665,32667,32673,32675,32719,32721,32937,32947,32955,32961,32963,32965,32967,33027,33029,33219,33227,33229,33231,33233,33277,33279,33479,33493,33495,33501,33503,33507,33509,33515,33517,33522,33524,33532],[11,32632],{},[14,32634,32635,2247],{},[322,32636,2246],{"href":2243,"rel":32637},[2245],[21,32639,546],{"id":545},[14,32641,2252],{},[14,32643,2255],{},[77,32645,32646],{},[555,32647,32648,32655],{},[83,32649,32650,2265,32652,2270],{},[29,32651,2264],{},[322,32653,2268],{"href":2268,"rel":32654},[2245],[83,32656,32657,2276],{},[29,32658,2275],{},[21,32660,2280],{"id":2279},[14,32662,2283],{},[639,32664,2287],{"id":2286},[14,32666,2290],{},[14,32668,2293,32669,2297,32671,2302],{},[322,32670,114],{"href":2296},[322,32672,2301],{"href":2300},[14,32674,2305],{},[719,32676,32677],{"className":756,"code":2308,"language":758,"meta":494,"style":494},[90,32678,32679,32691,32707],{"__ignoreMap":494},[727,32680,32681,32683,32685,32687,32689],{"class":729,"line":730},[727,32682,2315],{"class":1986},[727,32684,2318],{"class":1882},[727,32686,2321],{"class":1986},[727,32688,2324],{"class":737},[727,32690,2327],{"class":768},[727,32692,32693,32695,32697,32699,32701,32703,32705],{"class":729,"line":498},[727,32694,2315],{"class":1986},[727,32696,2334],{"class":1882},[727,32698,2321],{"class":1986},[727,32700,2339],{"class":737},[727,32702,2342],{"class":768},[727,32704,2345],{"class":737},[727,32706,2327],{"class":768},[727,32708,32709,32711,32713,32715,32717],{"class":729,"line":495},[727,32710,2315],{"class":1986},[727,32712,2354],{"class":1882},[727,32714,2321],{"class":1986},[727,32716,2359],{"class":737},[727,32718,2327],{"class":768},[14,32720,2364],{},[719,32722,32723],{"className":756,"code":2367,"language":758,"meta":494,"style":494},[90,32724,32725,32741,32747,32761,32769,32773,32787,32795,32799,32809,32819,32827,32831,32835,32839,32849,32861,32867,32871,32875,32891,32899,32907,32919,32923,32927,32931],{"__ignoreMap":494},[727,32726,32727,32729,32731,32733,32735,32737,32739],{"class":729,"line":730},[727,32728,2315],{"class":1986},[727,32730,2377],{"class":2376},[727,32732,2321],{"class":1986},[727,32734,2382],{"class":1986},[727,32736,2385],{"class":768},[727,32738,2388],{"class":1986},[727,32740,2391],{"class":768},[727,32742,32743,32745],{"class":729,"line":498},[727,32744,2396],{"class":1986},[727,32746,2391],{"class":768},[727,32748,32749,32751,32753,32755,32757,32759],{"class":729,"line":495},[727,32750,2403],{"class":1986},[727,32752,2093],{"class":1882},[727,32754,2321],{"class":1986},[727,32756,2410],{"class":1986},[727,32758,2413],{"class":2376},[727,32760,2416],{"class":768},[727,32762,32763,32765,32767],{"class":729,"line":1895},[727,32764,2421],{"class":768},[727,32766,2424],{"class":737},[727,32768,2427],{"class":768},[727,32770,32771],{"class":729,"line":1901},[727,32772,2432],{"class":768},[727,32774,32775,32777,32779,32781,32783,32785],{"class":729,"line":1973},[727,32776,2437],{"class":737},[727,32778,1995],{"class":768},[727,32780,2442],{"class":737},[727,32782,2445],{"class":768},[727,32784,2448],{"class":737},[727,32786,2427],{"class":768},[727,32788,32789,32791,32793],{"class":729,"line":2052},[727,32790,2455],{"class":737},[727,32792,1995],{"class":768},[727,32794,2460],{"class":737},[727,32796,32797],{"class":729,"line":2058},[727,32798,2465],{"class":768},[727,32800,32801,32803,32805,32807],{"class":729,"line":2064},[727,32802,2470],{"class":768},[727,32804,2473],{"class":1986},[727,32806,2476],{"class":2376},[727,32808,2479],{"class":768},[727,32810,32811,32813,32815,32817],{"class":729,"line":2087},[727,32812,2484],{"class":737},[727,32814,1995],{"class":768},[727,32816,2489],{"class":737},[727,32818,2427],{"class":768},[727,32820,32821,32823,32825],{"class":729,"line":2140},[727,32822,2496],{"class":737},[727,32824,1995],{"class":768},[727,32826,2501],{"class":737},[727,32828,32829],{"class":729,"line":2154},[727,32830,2506],{"class":768},[727,32832,32833],{"class":729,"line":1529},[727,32834,2511],{"class":768},[727,32836,32837],{"class":729,"line":2178},[727,32838,2516],{"class":768},[727,32840,32841,32843,32845,32847],{"class":729,"line":2187},[727,32842,2521],{"class":1986},[727,32844,2524],{"class":768},[727,32846,2527],{"class":1986},[727,32848,2530],{"class":768},[727,32850,32851,32853,32855,32857,32859],{"class":729,"line":2533},[727,32852,2536],{"class":768},[727,32854,2539],{"class":2376},[727,32856,2542],{"class":768},[727,32858,2545],{"class":737},[727,32860,2548],{"class":768},[727,32862,32863,32865],{"class":729,"line":2551},[727,32864,2554],{"class":1986},[727,32866,2327],{"class":768},[727,32868,32869],{"class":729,"line":2559},[727,32870,2562],{"class":768},[727,32872,32873],{"class":729,"line":2565},[727,32874,2516],{"class":768},[727,32876,32877,32879,32881,32883,32885,32887,32889],{"class":729,"line":2570},[727,32878,2403],{"class":1986},[727,32880,2575],{"class":1882},[727,32882,2321],{"class":1986},[727,32884,2410],{"class":1986},[727,32886,2582],{"class":768},[727,32888,2585],{"class":2376},[727,32890,2588],{"class":768},[727,32892,32893,32895,32897],{"class":729,"line":2591},[727,32894,2594],{"class":768},[727,32896,2597],{"class":2376},[727,32898,2600],{"class":768},[727,32900,32901,32903,32905],{"class":729,"line":2603},[727,32902,2606],{"class":768},[727,32904,2609],{"class":1986},[727,32906,2612],{"class":768},[727,32908,32909,32911,32913,32915,32917],{"class":729,"line":2615},[727,32910,2594],{"class":768},[727,32912,2539],{"class":2376},[727,32914,2542],{"class":768},[727,32916,2624],{"class":737},[727,32918,2627],{"class":768},[727,32920,32921],{"class":729,"line":2630},[727,32922,2633],{"class":768},[727,32924,32925],{"class":729,"line":2636},[727,32926,2639],{"class":768},[727,32928,32929],{"class":729,"line":2642},[727,32930,1898],{"emptyLinePlaceholder":522},[727,32932,32933,32935],{"class":729,"line":2647},[727,32934,2650],{"class":2376},[727,32936,2588],{"class":768},[14,32938,2655,32939,2659,32941,2663,32943,2667,32945,2671],{},[90,32940,2658],{},[90,32942,2662],{},[807,32944,2666],{},[322,32946,194],{"href":2670},[14,32948,2674,32949,2679,32951,2683,32953,2687],{},[322,32950,2678],{"href":2677},[90,32952,2682],{},[90,32954,2686],{},[14,32956,32957],{},[807,32958,2692,32959,2696],{},[322,32960,2695],{"href":1292},[639,32962,2700],{"id":2699},[14,32964,2703],{},[14,32966,2706],{},[719,32968,32969],{"className":756,"code":2709,"language":758,"meta":494,"style":494},[90,32970,32971,32983,32995,33007],{"__ignoreMap":494},[727,32972,32973,32975,32977,32979,32981],{"class":729,"line":730},[727,32974,2315],{"class":1986},[727,32976,2318],{"class":1882},[727,32978,2321],{"class":1986},[727,32980,2324],{"class":737},[727,32982,2327],{"class":768},[727,32984,32985,32987,32989,32991,32993],{"class":729,"line":498},[727,32986,2315],{"class":1986},[727,32988,2730],{"class":1882},[727,32990,2321],{"class":1986},[727,32992,2735],{"class":737},[727,32994,2327],{"class":768},[727,32996,32997,32999,33001,33003,33005],{"class":729,"line":495},[727,32998,2315],{"class":1986},[727,33000,2354],{"class":1882},[727,33002,2321],{"class":1986},[727,33004,2359],{"class":737},[727,33006,2327],{"class":768},[727,33008,33009,33011,33013,33015,33017,33019,33021,33023,33025],{"class":729,"line":1895},[727,33010,2315],{"class":1986},[727,33012,2334],{"class":1882},[727,33014,2321],{"class":1986},[727,33016,2339],{"class":737},[727,33018,2342],{"class":768},[727,33020,2764],{"class":737},[727,33022,2767],{"class":768},[727,33024,2345],{"class":737},[727,33026,2327],{"class":768},[14,33028,2774],{},[719,33030,33031],{"className":756,"code":2777,"language":758,"meta":494,"style":494},[90,33032,33033,33049,33055,33069,33077,33081,33095,33103,33107,33111,33115,33125,33137,33141,33145,33161,33165,33169,33179,33187,33199,33203,33207,33211],{"__ignoreMap":494},[727,33034,33035,33037,33039,33041,33043,33045,33047],{"class":729,"line":730},[727,33036,2315],{"class":1986},[727,33038,2786],{"class":2376},[727,33040,2321],{"class":1986},[727,33042,2382],{"class":1986},[727,33044,2385],{"class":768},[727,33046,2388],{"class":1986},[727,33048,2391],{"class":768},[727,33050,33051,33053],{"class":729,"line":498},[727,33052,2396],{"class":1986},[727,33054,2391],{"class":768},[727,33056,33057,33059,33061,33063,33065,33067],{"class":729,"line":495},[727,33058,2403],{"class":1986},[727,33060,2093],{"class":1882},[727,33062,2321],{"class":1986},[727,33064,2410],{"class":1986},[727,33066,2413],{"class":2376},[727,33068,2416],{"class":768},[727,33070,33071,33073,33075],{"class":729,"line":1895},[727,33072,2421],{"class":768},[727,33074,2823],{"class":737},[727,33076,2427],{"class":768},[727,33078,33079],{"class":729,"line":1901},[727,33080,2432],{"class":768},[727,33082,33083,33085,33087,33089,33091,33093],{"class":729,"line":1973},[727,33084,2437],{"class":737},[727,33086,1995],{"class":768},[727,33088,2442],{"class":737},[727,33090,2445],{"class":768},[727,33092,2448],{"class":737},[727,33094,2427],{"class":768},[727,33096,33097,33099,33101],{"class":729,"line":2052},[727,33098,2455],{"class":737},[727,33100,1995],{"class":768},[727,33102,2460],{"class":737},[727,33104,33105],{"class":729,"line":2058},[727,33106,2856],{"class":768},[727,33108,33109],{"class":729,"line":2064},[727,33110,2511],{"class":768},[727,33112,33113],{"class":729,"line":2087},[727,33114,2516],{"class":768},[727,33116,33117,33119,33121,33123],{"class":729,"line":2140},[727,33118,2521],{"class":1986},[727,33120,2524],{"class":768},[727,33122,2527],{"class":1986},[727,33124,2530],{"class":768},[727,33126,33127,33129,33131,33133,33135],{"class":729,"line":2154},[727,33128,2536],{"class":768},[727,33130,2539],{"class":2376},[727,33132,2542],{"class":768},[727,33134,2624],{"class":737},[727,33136,2887],{"class":768},[727,33138,33139],{"class":729,"line":1529},[727,33140,2562],{"class":768},[727,33142,33143],{"class":729,"line":2178},[727,33144,2516],{"class":768},[727,33146,33147,33149,33151,33153,33155,33157,33159],{"class":729,"line":2187},[727,33148,2403],{"class":1986},[727,33150,2575],{"class":1882},[727,33152,2321],{"class":1986},[727,33154,2410],{"class":1986},[727,33156,2582],{"class":768},[727,33158,2585],{"class":2376},[727,33160,2588],{"class":768},[727,33162,33163],{"class":729,"line":2533},[727,33164,1898],{"emptyLinePlaceholder":522},[727,33166,33167],{"class":729,"line":2551},[727,33168,2921],{"class":2920},[727,33170,33171,33173,33175,33177],{"class":729,"line":2559},[727,33172,2143],{"class":1986},[727,33174,2928],{"class":768},[727,33176,2931],{"class":2376},[727,33178,2934],{"class":768},[727,33180,33181,33183,33185],{"class":729,"line":2565},[727,33182,2606],{"class":768},[727,33184,2609],{"class":1986},[727,33186,2612],{"class":768},[727,33188,33189,33191,33193,33195,33197],{"class":729,"line":2570},[727,33190,2594],{"class":768},[727,33192,2539],{"class":2376},[727,33194,2542],{"class":768},[727,33196,2624],{"class":737},[727,33198,2955],{"class":768},[727,33200,33201],{"class":729,"line":2591},[727,33202,2633],{"class":768},[727,33204,33205],{"class":729,"line":2603},[727,33206,2639],{"class":768},[727,33208,33209],{"class":729,"line":2615},[727,33210,1898],{"emptyLinePlaceholder":522},[727,33212,33213,33215,33217],{"class":729,"line":2630},[727,33214,2972],{"class":1986},[727,33216,2786],{"class":2376},[727,33218,2588],{"class":768},[14,33220,2979,33221,2983,33223],{},[90,33222,2982],{},[807,33224,2986,33225,2991],{},[322,33226,2990],{"href":2989},[639,33228,2995],{"id":2994},[14,33230,2703],{},[14,33232,3000],{},[719,33234,33235],{"className":756,"code":3003,"language":758,"meta":494,"style":494},[90,33236,33237,33249,33261],{"__ignoreMap":494},[727,33238,33239,33241,33243,33245,33247],{"class":729,"line":730},[727,33240,2315],{"class":1986},[727,33242,2318],{"class":1882},[727,33244,2321],{"class":1986},[727,33246,2324],{"class":737},[727,33248,2327],{"class":768},[727,33250,33251,33253,33255,33257,33259],{"class":729,"line":498},[727,33252,2315],{"class":1986},[727,33254,2354],{"class":1882},[727,33256,2321],{"class":1986},[727,33258,2359],{"class":737},[727,33260,2327],{"class":768},[727,33262,33263,33265,33267,33269,33271,33273,33275],{"class":729,"line":495},[727,33264,2315],{"class":1986},[727,33266,2334],{"class":1882},[727,33268,2321],{"class":1986},[727,33270,2339],{"class":737},[727,33272,2342],{"class":768},[727,33274,2345],{"class":737},[727,33276,2327],{"class":768},[14,33278,2774],{},[719,33280,33281],{"className":756,"code":3050,"language":758,"meta":494,"style":494},[90,33282,33283,33299,33305,33319,33327,33331,33345,33353,33357,33361,33365,33375,33387,33391,33395,33411,33415,33419,33439,33447,33459,33463,33467,33471],{"__ignoreMap":494},[727,33284,33285,33287,33289,33291,33293,33295,33297],{"class":729,"line":730},[727,33286,2315],{"class":1986},[727,33288,2786],{"class":2376},[727,33290,2321],{"class":1986},[727,33292,2382],{"class":1986},[727,33294,2385],{"class":768},[727,33296,2388],{"class":1986},[727,33298,2391],{"class":768},[727,33300,33301,33303],{"class":729,"line":498},[727,33302,2396],{"class":1986},[727,33304,2391],{"class":768},[727,33306,33307,33309,33311,33313,33315,33317],{"class":729,"line":495},[727,33308,2403],{"class":1986},[727,33310,2093],{"class":1882},[727,33312,2321],{"class":1986},[727,33314,2410],{"class":1986},[727,33316,2413],{"class":2376},[727,33318,2416],{"class":768},[727,33320,33321,33323,33325],{"class":729,"line":1895},[727,33322,2421],{"class":768},[727,33324,2823],{"class":737},[727,33326,2427],{"class":768},[727,33328,33329],{"class":729,"line":1901},[727,33330,2432],{"class":768},[727,33332,33333,33335,33337,33339,33341,33343],{"class":729,"line":1973},[727,33334,2437],{"class":737},[727,33336,1995],{"class":768},[727,33338,2442],{"class":737},[727,33340,2445],{"class":768},[727,33342,2448],{"class":737},[727,33344,2427],{"class":768},[727,33346,33347,33349,33351],{"class":729,"line":2052},[727,33348,2455],{"class":737},[727,33350,1995],{"class":768},[727,33352,2460],{"class":737},[727,33354,33355],{"class":729,"line":2058},[727,33356,2856],{"class":768},[727,33358,33359],{"class":729,"line":2064},[727,33360,2511],{"class":768},[727,33362,33363],{"class":729,"line":2087},[727,33364,2516],{"class":768},[727,33366,33367,33369,33371,33373],{"class":729,"line":2140},[727,33368,2521],{"class":1986},[727,33370,2524],{"class":768},[727,33372,2527],{"class":1986},[727,33374,2530],{"class":768},[727,33376,33377,33379,33381,33383,33385],{"class":729,"line":2154},[727,33378,2536],{"class":768},[727,33380,2539],{"class":2376},[727,33382,2542],{"class":768},[727,33384,2624],{"class":737},[727,33386,2887],{"class":768},[727,33388,33389],{"class":729,"line":1529},[727,33390,2562],{"class":768},[727,33392,33393],{"class":729,"line":2178},[727,33394,2516],{"class":768},[727,33396,33397,33399,33401,33403,33405,33407,33409],{"class":729,"line":2187},[727,33398,2403],{"class":1986},[727,33400,2575],{"class":1882},[727,33402,2321],{"class":1986},[727,33404,2410],{"class":1986},[727,33406,2582],{"class":768},[727,33408,2585],{"class":2376},[727,33410,2588],{"class":768},[727,33412,33413],{"class":729,"line":2533},[727,33414,3185],{"class":768},[727,33416,33417],{"class":729,"line":2551},[727,33418,2921],{"class":2920},[727,33420,33421,33423,33425,33427,33429,33431,33433,33435,33437],{"class":729,"line":2559},[727,33422,2143],{"class":1986},[727,33424,3196],{"class":768},[727,33426,3199],{"class":2376},[727,33428,2542],{"class":768},[727,33430,3204],{"class":733},[727,33432,3207],{"class":1986},[727,33434,3210],{"class":768},[727,33436,2931],{"class":2376},[727,33438,3215],{"class":768},[727,33440,33441,33443,33445],{"class":729,"line":2565},[727,33442,2606],{"class":768},[727,33444,2609],{"class":1986},[727,33446,2612],{"class":768},[727,33448,33449,33451,33453,33455,33457],{"class":729,"line":2570},[727,33450,2594],{"class":768},[727,33452,2539],{"class":2376},[727,33454,2542],{"class":768},[727,33456,2624],{"class":737},[727,33458,2955],{"class":768},[727,33460,33461],{"class":729,"line":2591},[727,33462,2633],{"class":768},[727,33464,33465],{"class":729,"line":2603},[727,33466,2639],{"class":768},[727,33468,33469],{"class":729,"line":2615},[727,33470,1898],{"emptyLinePlaceholder":522},[727,33472,33473,33475,33477],{"class":729,"line":2630},[727,33474,2972],{"class":1986},[727,33476,2786],{"class":2376},[727,33478,2588],{"class":768},[14,33480,3258,33481,2004,33483,2004,33485,450,33487,3271,33489,3275,33491,3278],{},[90,33482,3261],{},[90,33484,3264],{},[90,33486,3267],{},[90,33488,3270],{},[90,33490,3274],{},[90,33492,2982],{},[21,33494,2678],{"id":3281},[14,33496,3284,33497,3289,33499,3294],{},[322,33498,3288],{"href":3287},[322,33500,3293],{"href":3292},[21,33502,776],{"id":775},[14,33504,3299,33505,1230],{},[322,33506,3303],{"href":3302},[14,33508,3306],{},[14,33510,3309,33511,450,33513,44],{},[322,33512,3313],{"href":3312},[322,33514,3316],{"href":2203},[21,33516,796],{"id":795},[14,33518,3321,33519],{},[322,33520,3326],{"href":3324,"rel":33521},[2245],[14,33523,3329],{},[14,33525,33526],{},[807,33527,33528,3337,33530,3342],{},[3335,33529,165],{},[322,33531,3341],{"href":3340},[811,33533,3345],{},{"title":494,"searchDepth":495,"depth":495,"links":33535},[33536,33537,33542,33543,33544],{"id":545,"depth":498,"text":546},{"id":2279,"depth":498,"text":2280,"children":33538},[33539,33540,33541],{"id":2286,"depth":495,"text":2287},{"id":2699,"depth":495,"text":2700},{"id":2994,"depth":495,"text":2995},{"id":3281,"depth":498,"text":2678},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"type":90,"format":77,"intent_type":515,"intent":827,"tags":33546,"platfrom":33547},[829,830],[2246],{"title":2234,"description":3357},{"id":3366,"title":3367,"body":33550,"date":523,"description":4020,"extension":506,"meta":34023,"navigation":522,"order":523,"path":3398,"seo":34026,"stem":4026,"__hash__":4027},{"type":8,"value":33551,"toc":34015},[33552,33554,33558,33561,33563,33569,33571,33573,33587,33589,33597,33603,33894,33896,33899,33901,33909,33911,33913,33931,33933,33941,33969,33973,33977,33979,33987,33995,34005],[11,33553],{},[14,33555,3374,33556,3379],{},[322,33557,3378],{"href":3377},[592,33559],{"src":3382,"className":33560,"alt":3385},[3384],[14,33562,3388],{},[14,33564,3391,33565,3289,33567,44],{},[322,33566,3395],{"href":3394},[322,33568,3399],{"href":3398},[21,33570,3402],{"id":545},[14,33572,3405],{},[555,33574,33575,33579,33583],{},[83,33576,33577,3413],{},[29,33578,3412],{},[83,33580,33581,3419],{},[29,33582,3418],{},[83,33584,33585,3425],{},[29,33586,3424],{},[21,33588,3429],{"id":3428},[14,33590,3432,33591,3436,33593,3440,33595,3444],{},[29,33592,3435],{},[29,33594,3439],{},[29,33596,3443],{},[14,33598,3447,33599,3451,33601],{},[322,33600,514],{"href":3450,"download":522},[322,33602,3455],{"href":3454},[77,33604,33605],{},[80,33606,33607,33623,33836,33866],{},[83,33608,33609,88,33611,33613],{},[29,33610,87],{},[90,33612,92],{},[80,33614,33615,33619],{},[83,33616,33617,3472],{},[90,33618,99],{},[83,33620,33621,3477],{},[90,33622,105],{},[83,33624,33625,88,33627,33629,33639],{},[29,33626,111],{},[90,33628,114],{},[80,33630,33631],{},[83,33632,33633,132,33635,3492,33637,3495],{},[90,33634,114],{},[90,33636,135],{},[90,33638,139],{},[80,33640,33641,33658,33684,33708,33732,33756,33776],{},[83,33642,33643,88,33645,33647],{},[29,33644,121],{},[90,33646,124],{},[80,33648,33649],{},[83,33650,33651,3510,33653,44],{},[90,33652,131],{},[29,33654,3513,33655,3513],{},[322,33656,3516],{"href":3516,"rel":33657},[2245],[83,33659,33660,88,33662,33664],{},[29,33661,145],{},[90,33663,3524],{},[80,33665,33666,33674],{},[83,33667,33668,132,33670,3533,33672,3537],{},[90,33669,155],{},[90,33671,155],{},[90,33673,3536],{},[83,33675,33676,3542,33678,3545,33680,3549,33682,3554],{},[90,33677,953],{},[90,33679,135],{},[90,33681,3548],{},[592,33683],{"src":3552,"alt":3553},[83,33685,33686,88,33688,33690],{},[29,33687,170],{},[90,33689,3524],{},[80,33691,33692,33700],{},[83,33693,33694,132,33696,3533,33698,3537],{},[90,33695,155],{},[90,33697,155],{},[90,33699,3571],{},[83,33701,33702,3542,33704,3545,33706,3580],{},[90,33703,953],{},[90,33705,135],{},[90,33707,3548],{},[83,33709,33710,88,33712,33714],{},[29,33711,213],{},[90,33713,3524],{},[80,33715,33716,33724],{},[83,33717,33718,132,33720,3533,33722,3537],{},[90,33719,155],{},[90,33721,155],{},[90,33723,3597],{},[83,33725,33726,3542,33728,3545,33730,3606],{},[90,33727,953],{},[90,33729,135],{},[90,33731,3548],{},[83,33733,33734,88,33736,33738],{},[29,33735,241],{},[90,33737,3524],{},[80,33739,33740,33748],{},[83,33741,33742,132,33744,3533,33746,3537],{},[90,33743,155],{},[90,33745,155],{},[90,33747,3623],{},[83,33749,33750,3542,33752,3545,33754,3632],{},[90,33751,953],{},[90,33753,135],{},[90,33755,3548],{},[83,33757,33758,88,33760,33762],{},[29,33759,278],{},[90,33761,3639],{},[80,33763,33764],{},[83,33765,33766,132,33768,3648,33770,3652,33772,3656,33774,44],{},[90,33767,155],{},[90,33769,155],{},[90,33771,3651],{},[90,33773,3655],{},[90,33775,3659],{},[83,33777,33778,88,33780,33782],{},[29,33779,1203],{},[90,33781,148],{},[80,33783,33784,33790,33800,33806,33810,33824,33828,33832],{},[83,33785,33786,132,33788,3674],{},[90,33787,155],{},[90,33789,155],{},[83,33791,3677,33792,3680,33794,3684,33796,3688,33798,3554],{},[90,33793,3548],{},[90,33795,3683],{},[90,33797,3687],{},[592,33799],{"src":3691,"alt":3692},[83,33801,3695,33802,3699,33804,3703],{},[90,33803,3698],{},[90,33805,3702],{},[83,33807,3706,33808,3710],{},[90,33809,3709],{},[83,33811,3713,33812,3717,33814,3720,33816,3724,33818,3728,33820,3731,33822,3554],{},[90,33813,3716],{},[90,33815,3698],{},[90,33817,3723],{},[90,33819,3727],{},[90,33821,3659],{},[592,33823],{"src":3734,"alt":3735},[83,33825,3738,33826,3703],{},[90,33827,3741],{},[83,33829,3744,33830,3748],{},[90,33831,3747],{},[83,33833,3751,33834,3755],{},[90,33835,3754],{},[83,33837,33838,88,33840,33842],{},[29,33839,3760],{},[90,33841,3303],{},[80,33843,33844,33848,33852,33860],{},[83,33845,33846,3769],{},[90,33847,99],{},[83,33849,33850,3775],{},[90,33851,3774],{},[83,33853,33854,132,33856,3782,33858,44],{},[90,33855,465],{},[90,33857,135],{},[90,33859,3785],{},[83,33861,33862,261,33864,3794],{},[90,33863,3790],{},[90,33865,3793],{},[83,33867,33868,88,33870,33872],{},[29,33869,3799],{},[90,33871,281],{},[80,33873,33874,33878,33882,33888],{},[83,33875,33876,3769],{},[90,33877,99],{},[83,33879,33880,3477],{},[90,33881,3774],{},[83,33883,33884,3817,33886,44],{},[90,33885,3816],{},[90,33887,165],{},[83,33889,33890,162,33892,44],{},[90,33891,3824],{},[90,33893,3827],{},[14,33895,3830],{},[592,33897],{"src":3833,"className":33898,"alt":3836},[3835],[21,33900,3840],{"id":3839},[14,33902,3843,33903,3847,33905,3851,33907,3854],{},[29,33904,3846],{},[29,33906,3850],{},[29,33908,3435],{},[592,33910],{"src":3857,"alt":3858},[21,33912,330],{"id":329},[77,33914,33915],{},[80,33916,33917,33923],{},[83,33918,33919,33921,3872],{},[29,33920,3869],{},[344,33922],{},[83,33924,33925,33927,346,33929,3883],{},[29,33926,3877],{},[344,33928],{},[90,33930,3882],{},[21,33932,3887],{"id":3886},[14,33934,3890,33935,3893,33937,3897,33939,3900],{},[29,33936,3435],{},[29,33938,3896],{},[29,33940,514],{},[77,33942,33943],{},[555,33944,33945,33951,33957,33963],{},[83,33946,33947,3910,33949,44],{},[29,33948,3909],{},[29,33950,3913],{},[83,33952,33953,3919,33955,3923],{},[29,33954,3918],{},[29,33956,3922],{},[83,33958,33959,3929,33961,3932],{},[29,33960,3928],{},[29,33962,1838],{},[83,33964,33965,3938,33967,44],{},[29,33966,3937],{},[29,33968,3913],{},[14,33970,3943,33971,3947],{},[29,33972,3946],{},[14,33974,3950,33975,44],{},[322,33976,3953],{"href":3450,"download":522},[21,33978,796],{"id":795},[14,33980,3958,33981,3962,33983,3965,33985,3968],{},[29,33982,3961],{},[29,33984,3716],{},[29,33986,381],{},[14,33988,3971,33989,3975,33991,3979,33993,3932],{},[29,33990,3974],{},[29,33992,3978],{},[29,33994,1838],{},[14,33996,3984,33997,3988,33999,3991,34001,44],{},[29,33998,3987],{},[29,34000,3896],{},[29,34002,34003],{},[322,34004,3997],{"href":3996},[14,34006,34007],{},[807,34008,4002,34009,4006,34011,3289,34013,4011],{},[29,34010,4005],{},[29,34012,3896],{},[29,34014,3435],{},{"title":494,"searchDepth":495,"depth":495,"links":34016},[34017,34018,34019,34020,34021,34022],{"id":545,"depth":498,"text":3402},{"id":3428,"depth":498,"text":3429},{"id":3839,"depth":498,"text":3840},{"id":329,"depth":498,"text":330},{"id":3886,"depth":498,"text":3887},{"id":795,"depth":498,"text":796},{"pinned":522,"type":513,"format":77,"intent_type":1049,"intent":4022,"tags":34024,"platfrom":34025},[519,1056],[3378],{"title":3367,"description":4020},{"id":4029,"title":4030,"body":34028,"date":523,"description":4910,"extension":506,"meta":34744,"navigation":522,"order":523,"path":4915,"seo":34747,"stem":4917,"__hash__":4918},{"type":8,"value":34029,"toc":34733},[34030,34032,34034,34036,34038,34043,34055,34059,34061,34067,34069,34075,34095,34105,34209,34211,34213,34219,34259,34263,34269,34377,34379,34399,34401,34409,34423,34425,34427,34719,34721,34725,34727,34731],[11,34031],{},[14,34033,4037],{},[14,34035,4040],{},[21,34037,546],{"id":545},[14,34039,4045,34040,4051],{},[322,34041,4050],{"href":4048,"rel":34042},[2245],[77,34044,34045],{},[555,34046,34047,34051],{},[83,34048,34049,4061],{},[29,34050,4060],{},[83,34052,34053,4067],{},[29,34054,4066],{},[14,34056,4070,34057,44],{},[322,34058,4073],{"href":993},[21,34060,4077],{"id":4076},[14,34062,4080,34063,4084,34065,4089],{},[322,34064,4083],{"href":2300},[322,34066,4088],{"href":4087},[639,34068,4093],{"id":4092},[14,34070,4096,34071,450,34073,4103],{},[90,34072,4099],{},[90,34074,4102],{},[719,34076,34077],{"className":756,"code":4106,"language":758,"meta":494,"style":494},[90,34078,34079,34083,34087,34091],{"__ignoreMap":494},[727,34080,34081],{"class":729,"line":730},[727,34082,4113],{},[727,34084,34085],{"class":729,"line":498},[727,34086,4118],{},[727,34088,34089],{"class":729,"line":495},[727,34090,4123],{},[727,34092,34093],{"class":729,"line":1895},[727,34094,2639],{},[14,34096,4130,34097,4133,34099,450,34101,4140,34103,4144],{},[90,34098,627],{},[90,34100,4136],{},[90,34102,4139],{},[90,34104,4143],{},[719,34106,34107],{"className":756,"code":4147,"language":758,"meta":494,"style":494},[90,34108,34109,34113,34117,34121,34125,34129,34133,34137,34141,34145,34149,34153,34157,34161,34165,34169,34173,34177,34181,34185,34189,34193,34197,34201,34205],{"__ignoreMap":494},[727,34110,34111],{"class":729,"line":730},[727,34112,4154],{},[727,34114,34115],{"class":729,"line":498},[727,34116,4159],{},[727,34118,34119],{"class":729,"line":495},[727,34120,1898],{"emptyLinePlaceholder":522},[727,34122,34123],{"class":729,"line":1895},[727,34124,4168],{},[727,34126,34127],{"class":729,"line":1901},[727,34128,4173],{},[727,34130,34131],{"class":729,"line":1973},[727,34132,4178],{},[727,34134,34135],{"class":729,"line":2052},[727,34136,4183],{},[727,34138,34139],{"class":729,"line":2058},[727,34140,4188],{},[727,34142,34143],{"class":729,"line":2064},[727,34144,4193],{},[727,34146,34147],{"class":729,"line":2087},[727,34148,4198],{},[727,34150,34151],{"class":729,"line":2140},[727,34152,4203],{},[727,34154,34155],{"class":729,"line":2154},[727,34156,1898],{"emptyLinePlaceholder":522},[727,34158,34159],{"class":729,"line":1529},[727,34160,4212],{},[727,34162,34163],{"class":729,"line":2178},[727,34164,4217],{},[727,34166,34167],{"class":729,"line":2187},[727,34168,1898],{"emptyLinePlaceholder":522},[727,34170,34171],{"class":729,"line":2533},[727,34172,4226],{},[727,34174,34175],{"class":729,"line":2551},[727,34176,4231],{},[727,34178,34179],{"class":729,"line":2559},[727,34180,1898],{"emptyLinePlaceholder":522},[727,34182,34183],{"class":729,"line":2565},[727,34184,4240],{},[727,34186,34187],{"class":729,"line":2570},[727,34188,4245],{},[727,34190,34191],{"class":729,"line":2591},[727,34192,4250],{},[727,34194,34195],{"class":729,"line":2603},[727,34196,4255],{},[727,34198,34199],{"class":729,"line":2615},[727,34200,4260],{},[727,34202,34203],{"class":729,"line":2630},[727,34204,2633],{},[727,34206,34207],{"class":729,"line":2636},[727,34208,2639],{},[14,34210,4271],{},[639,34212,4275],{"id":4274},[14,34214,4278,34215,450,34217,4283],{},[90,34216,4136],{},[90,34218,4139],{},[719,34220,34221],{"className":756,"code":4286,"language":758,"meta":494,"style":494},[90,34222,34223,34227,34231,34235,34239,34243,34247,34251,34255],{"__ignoreMap":494},[727,34224,34225],{"class":729,"line":730},[727,34226,4293],{},[727,34228,34229],{"class":729,"line":498},[727,34230,4298],{},[727,34232,34233],{"class":729,"line":495},[727,34234,4303],{},[727,34236,34237],{"class":729,"line":1895},[727,34238,4308],{},[727,34240,34241],{"class":729,"line":1901},[727,34242,4313],{},[727,34244,34245],{"class":729,"line":1973},[727,34246,4318],{},[727,34248,34249],{"class":729,"line":2052},[727,34250,4323],{},[727,34252,34253],{"class":729,"line":2058},[727,34254,2633],{},[727,34256,34257],{"class":729,"line":2064},[727,34258,2639],{},[14,34260,4334,34261,4338],{},[90,34262,4337],{},[14,34264,4341,34265,4345,34267,4349],{},[90,34266,4344],{},[90,34268,4348],{},[719,34270,34271],{"className":756,"code":4352,"language":758,"meta":494,"style":494},[90,34272,34273,34277,34281,34285,34289,34293,34297,34301,34305,34309,34313,34317,34321,34325,34329,34333,34337,34341,34345,34349,34353,34357,34361,34365,34369,34373],{"__ignoreMap":494},[727,34274,34275],{"class":729,"line":730},[727,34276,4359],{},[727,34278,34279],{"class":729,"line":498},[727,34280,1898],{"emptyLinePlaceholder":522},[727,34282,34283],{"class":729,"line":495},[727,34284,4368],{},[727,34286,34287],{"class":729,"line":1895},[727,34288,4373],{},[727,34290,34291],{"class":729,"line":1901},[727,34292,4378],{},[727,34294,34295],{"class":729,"line":1973},[727,34296,1898],{"emptyLinePlaceholder":522},[727,34298,34299],{"class":729,"line":2052},[727,34300,4173],{},[727,34302,34303],{"class":729,"line":2058},[727,34304,4391],{},[727,34306,34307],{"class":729,"line":2064},[727,34308,4396],{},[727,34310,34311],{"class":729,"line":2087},[727,34312,4401],{},[727,34314,34315],{"class":729,"line":2140},[727,34316,2432],{},[727,34318,34319],{"class":729,"line":2154},[727,34320,4410],{},[727,34322,34323],{"class":729,"line":1529},[727,34324,4415],{},[727,34326,34327],{"class":729,"line":2178},[727,34328,2465],{},[727,34330,34331],{"class":729,"line":2187},[727,34332,4424],{},[727,34334,34335],{"class":729,"line":2533},[727,34336,4203],{},[727,34338,34339],{"class":729,"line":2551},[727,34340,1898],{"emptyLinePlaceholder":522},[727,34342,34343],{"class":729,"line":2559},[727,34344,4226],{},[727,34346,34347],{"class":729,"line":2565},[727,34348,4231],{},[727,34350,34351],{"class":729,"line":2570},[727,34352,1898],{"emptyLinePlaceholder":522},[727,34354,34355],{"class":729,"line":2591},[727,34356,4240],{},[727,34358,34359],{"class":729,"line":2603},[727,34360,4453],{},[727,34362,34363],{"class":729,"line":2615},[727,34364,4255],{},[727,34366,34367],{"class":729,"line":2630},[727,34368,4260],{},[727,34370,34371],{"class":729,"line":2636},[727,34372,2633],{},[727,34374,34375],{"class":729,"line":2642},[727,34376,2639],{},[14,34378,4472],{},[719,34380,34381],{"className":756,"code":4475,"language":758,"meta":494,"style":494},[90,34382,34383,34387,34391,34395],{"__ignoreMap":494},[727,34384,34385],{"class":729,"line":730},[727,34386,4482],{},[727,34388,34389],{"class":729,"line":498},[727,34390,4487],{},[727,34392,34393],{"class":729,"line":495},[727,34394,1898],{"emptyLinePlaceholder":522},[727,34396,34397],{"class":729,"line":1895},[727,34398,4496],{},[639,34400,4500],{"id":4499},[14,34402,4503,34403,4506,34405,4510,34407,4513],{},[90,34404,4348],{},[90,34406,4509],{},[90,34408,2982],{},[80,34410,34411,34415,34419],{},[83,34412,34413,1230],{},[322,34414,4521],{"href":4520},[83,34416,34417,1230],{},[322,34418,4527],{"href":4526},[83,34420,34421,1230],{},[322,34422,4533],{"href":4532},[639,34424,4537],{"id":4536},[14,34426,4540],{},[719,34428,34429],{"className":756,"code":4543,"language":758,"meta":494,"style":494},[90,34430,34431,34435,34439,34443,34447,34451,34455,34459,34463,34467,34471,34475,34479,34483,34487,34491,34495,34499,34503,34507,34511,34515,34519,34523,34527,34531,34535,34539,34543,34547,34551,34555,34559,34563,34567,34571,34575,34579,34583,34587,34591,34595,34599,34603,34607,34611,34615,34619,34623,34627,34631,34635,34639,34643,34647,34651,34655,34659,34663,34667,34671,34675,34679,34683,34687,34691,34695,34699,34703,34707,34711,34715],{"__ignoreMap":494},[727,34432,34433],{"class":729,"line":730},[727,34434,4113],{},[727,34436,34437],{"class":729,"line":498},[727,34438,4554],{},[727,34440,34441],{"class":729,"line":495},[727,34442,4123],{},[727,34444,34445],{"class":729,"line":1895},[727,34446,2639],{},[727,34448,34449],{"class":729,"line":1901},[727,34450,1898],{"emptyLinePlaceholder":522},[727,34452,34453],{"class":729,"line":1973},[727,34454,4154],{},[727,34456,34457],{"class":729,"line":2052},[727,34458,4159],{},[727,34460,34461],{"class":729,"line":2058},[727,34462,1898],{"emptyLinePlaceholder":522},[727,34464,34465],{"class":729,"line":2064},[727,34466,4168],{},[727,34468,34469],{"class":729,"line":2087},[727,34470,4173],{},[727,34472,34473],{"class":729,"line":2140},[727,34474,4178],{},[727,34476,34477],{"class":729,"line":2154},[727,34478,4183],{},[727,34480,34481],{"class":729,"line":1529},[727,34482,4188],{},[727,34484,34485],{"class":729,"line":2178},[727,34486,4193],{},[727,34488,34489],{"class":729,"line":2187},[727,34490,4198],{},[727,34492,34493],{"class":729,"line":2533},[727,34494,4203],{},[727,34496,34497],{"class":729,"line":2551},[727,34498,1898],{"emptyLinePlaceholder":522},[727,34500,34501],{"class":729,"line":2559},[727,34502,4212],{},[727,34504,34505],{"class":729,"line":2565},[727,34506,4217],{},[727,34508,34509],{"class":729,"line":2570},[727,34510,1898],{"emptyLinePlaceholder":522},[727,34512,34513],{"class":729,"line":2591},[727,34514,4226],{},[727,34516,34517],{"class":729,"line":2603},[727,34518,4231],{},[727,34520,34521],{"class":729,"line":2615},[727,34522,1898],{"emptyLinePlaceholder":522},[727,34524,34525],{"class":729,"line":2630},[727,34526,4240],{},[727,34528,34529],{"class":729,"line":2636},[727,34530,4245],{},[727,34532,34533],{"class":729,"line":2642},[727,34534,4250],{},[727,34536,34537],{"class":729,"line":2647},[727,34538,4255],{},[727,34540,34541],{"class":729,"line":4657},[727,34542,4260],{},[727,34544,34545],{"class":729,"line":4662},[727,34546,2633],{},[727,34548,34549],{"class":729,"line":1316},[727,34550,2639],{},[727,34552,34553],{"class":729,"line":4671},[727,34554,1898],{"emptyLinePlaceholder":522},[727,34556,34557],{"class":729,"line":4676},[727,34558,4293],{},[727,34560,34561],{"class":729,"line":4681},[727,34562,4298],{},[727,34564,34565],{"class":729,"line":4686},[727,34566,4303],{},[727,34568,34569],{"class":729,"line":4691},[727,34570,4308],{},[727,34572,34573],{"class":729,"line":4696},[727,34574,4699],{},[727,34576,34577],{"class":729,"line":4702},[727,34578,4705],{},[727,34580,34581],{"class":729,"line":4708},[727,34582,4711],{},[727,34584,34585],{"class":729,"line":4714},[727,34586,2633],{},[727,34588,34589],{"class":729,"line":4719},[727,34590,2639],{},[727,34592,34593],{"class":729,"line":4724},[727,34594,1898],{"emptyLinePlaceholder":522},[727,34596,34597],{"class":729,"line":4729},[727,34598,4359],{},[727,34600,34601],{"class":729,"line":4734},[727,34602,1898],{"emptyLinePlaceholder":522},[727,34604,34605],{"class":729,"line":4739},[727,34606,4368],{},[727,34608,34609],{"class":729,"line":4744},[727,34610,4373],{},[727,34612,34613],{"class":729,"line":4749},[727,34614,4378],{},[727,34616,34617],{"class":729,"line":4754},[727,34618,1898],{"emptyLinePlaceholder":522},[727,34620,34621],{"class":729,"line":1753},[727,34622,4173],{},[727,34624,34625],{"class":729,"line":4763},[727,34626,4391],{},[727,34628,34629],{"class":729,"line":4768},[727,34630,4396],{},[727,34632,34633],{"class":729,"line":4773},[727,34634,4401],{},[727,34636,34637],{"class":729,"line":4778},[727,34638,2432],{},[727,34640,34641],{"class":729,"line":4783},[727,34642,4410],{},[727,34644,34645],{"class":729,"line":4788},[727,34646,4415],{},[727,34648,34649],{"class":729,"line":1048},[727,34650,2465],{},[727,34652,34653],{"class":729,"line":512},[727,34654,4424],{},[727,34656,34657],{"class":729,"line":4801},[727,34658,4203],{},[727,34660,34661],{"class":729,"line":4806},[727,34662,1898],{"emptyLinePlaceholder":522},[727,34664,34665],{"class":729,"line":4811},[727,34666,4226],{},[727,34668,34669],{"class":729,"line":4816},[727,34670,4231],{},[727,34672,34673],{"class":729,"line":4821},[727,34674,1898],{"emptyLinePlaceholder":522},[727,34676,34677],{"class":729,"line":4826},[727,34678,4240],{},[727,34680,34681],{"class":729,"line":4831},[727,34682,4453],{},[727,34684,34685],{"class":729,"line":4836},[727,34686,4255],{},[727,34688,34689],{"class":729,"line":4841},[727,34690,4844],{},[727,34692,34693],{"class":729,"line":4847},[727,34694,2633],{},[727,34696,34697],{"class":729,"line":4852},[727,34698,2639],{},[727,34700,34701],{"class":729,"line":4857},[727,34702,1898],{"emptyLinePlaceholder":522},[727,34704,34705],{"class":729,"line":4862},[727,34706,4482],{},[727,34708,34709],{"class":729,"line":4867},[727,34710,4487],{},[727,34712,34713],{"class":729,"line":4872},[727,34714,1898],{"emptyLinePlaceholder":522},[727,34716,34717],{"class":729,"line":4877},[727,34718,4496],{},[21,34720,776],{"id":775},[14,34722,4884,34723,4888],{},[322,34724,4887],{"href":2203},[21,34726,796],{"id":795},[14,34728,4893,34729,44],{},[322,34730,325],{"href":324},[811,34732,4898],{},{"title":494,"searchDepth":495,"depth":495,"links":34734},[34735,34736,34742,34743],{"id":545,"depth":498,"text":546},{"id":4076,"depth":498,"text":4077,"children":34737},[34738,34739,34740,34741],{"id":4092,"depth":495,"text":4093},{"id":4274,"depth":495,"text":4275},{"id":4499,"depth":495,"text":4500},{"id":4536,"depth":495,"text":4537},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"type":90,"format":77,"intent_type":1049,"intent":1050,"tags":34745,"platfrom":34746},[1052,1318],[4914],{"title":4030,"description":4910},{"id":4920,"title":4921,"body":34749,"date":523,"description":5124,"extension":506,"meta":34902,"navigation":522,"order":523,"path":5129,"seo":34905,"stem":5131,"__hash__":5132},{"type":8,"value":34750,"toc":34896},[34751,34753,34755,34757,34759,34761,34771,34861,34871,34877,34879,34887,34889,34894],[11,34752],{},[14,34754,4928],{},[21,34756,546],{"id":545},[14,34758,4933],{},[21,34760,4937],{"id":4936},[14,34762,4940,34763,4944,34765,4947,34767,4951,34769,4954],{},[322,34764,124],{"href":4943},[322,34766,2301],{"href":2300},[90,34768,4950],{},[90,34770,2009],{},[719,34772,34773],{"className":756,"code":4957,"language":758,"meta":494,"style":494},[90,34774,34775,34785,34789,34793,34811,34815,34819,34835,34843,34847,34851,34855],{"__ignoreMap":494},[727,34776,34777,34779,34781,34783],{"class":729,"line":730},[727,34778,4964],{"class":1986},[727,34780,4967],{"class":768},[727,34782,4970],{"class":1986},[727,34784,4973],{"class":768},[727,34786,34787],{"class":729,"line":498},[727,34788,1898],{"emptyLinePlaceholder":522},[727,34790,34791],{"class":729,"line":495},[727,34792,4982],{"class":2920},[727,34794,34795,34797,34799,34801,34803,34805,34807,34809],{"class":729,"line":1895},[727,34796,2315],{"class":1986},[727,34798,4989],{"class":1882},[727,34800,2321],{"class":1986},[727,34802,4994],{"class":768},[727,34804,4997],{"class":2376},[727,34806,2542],{"class":768},[727,34808,5002],{"class":737},[727,34810,5005],{"class":768},[727,34812,34813],{"class":729,"line":1901},[727,34814,1898],{"emptyLinePlaceholder":522},[727,34816,34817],{"class":729,"line":1973},[727,34818,5014],{"class":2920},[727,34820,34821,34823,34825,34827,34829,34831,34833],{"class":729,"line":2052},[727,34822,5019],{"class":768},[727,34824,5022],{"class":2376},[727,34826,5025],{"class":768},[727,34828,5028],{"class":733},[727,34830,5031],{"class":768},[727,34832,2388],{"class":1986},[727,34834,2391],{"class":768},[727,34836,34837,34839,34841],{"class":729,"line":2058},[727,34838,5040],{"class":768},[727,34840,5043],{"class":2376},[727,34842,5046],{"class":768},[727,34844,34845],{"class":729,"line":2064},[727,34846,5051],{"class":768},[727,34848,34849],{"class":729,"line":2087},[727,34850,1898],{"emptyLinePlaceholder":522},[727,34852,34853],{"class":729,"line":2140},[727,34854,5060],{"class":2920},[727,34856,34857,34859],{"class":729,"line":2154},[727,34858,2972],{"class":1986},[727,34860,5067],{"class":768},[14,34862,5070,34863,5074,34865,5080,34868,44],{},[90,34864,5073],{},[322,34866,5079],{"href":5077,"rel":34867},[2245],[322,34869,5084],{"href":5077,"rel":34870},[2245],[14,34872,5087,34873,5090,34875,1230],{},[90,34874,2982],{},[322,34876,3303],{"href":3302},[21,34878,776],{"id":775},[14,34880,5097,34881,5100,34883,5103,34885,5106],{},[322,34882,2990],{"href":2989},[322,34884,3303],{"href":3302},[90,34886,2982],{},[21,34888,796],{"id":795},[14,34890,5111,34891,44],{},[322,34892,3326],{"href":3324,"rel":34893},[2245],[811,34895,5117],{},{"title":494,"searchDepth":495,"depth":495,"links":34897},[34898,34899,34900,34901],{"id":545,"depth":498,"text":546},{"id":4936,"depth":498,"text":4937},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"type":90,"format":77,"intent_type":515,"intent":4022,"tags":34903,"platfrom":34904},[5127],[1757],{"title":4921,"description":5124},{"id":5134,"title":5135,"body":34907,"date":523,"description":5824,"extension":506,"meta":35444,"navigation":522,"order":523,"path":3394,"seo":35447,"stem":5829,"__hash__":5830},{"type":8,"value":34908,"toc":35435},[34909,34911,34919,34922,34928,34930,34936,34938,34940,34946,34970,34972,34974,34976,34982,35300,35302,35305,35307,35309,35319,35323,35341,35343,35345,35353,35391,35395,35399,35401,35403,35415,35423,35425],[11,34910],{},[14,34912,5142,34913,5147,34917,5151],{},[29,34914,34915],{},[322,34916,3378],{"href":3377},[29,34918,5150],{},[592,34920],{"src":5154,"className":34921,"alt":5156},[3384],[14,34923,5159,34924,5163,34926,5167],{},[29,34925,5162],{},[29,34927,5166],{},[14,34929,5170],{},[14,34931,5173,34932,3289,34934,44],{},[322,34933,3961],{"href":3398},[322,34935,5179],{"href":5178},[21,34937,546],{"id":545},[11,34939],{},[14,34941,5186,34942,5189,34944,5193],{},[29,34943,3913],{},[29,34945,5192],{},[77,34947,34948],{},[555,34949,34950,34956,34964],{},[83,34951,34952,5202,34954,5206],{},[29,34953,3412],{},[90,34955,5205],{},[83,34957,34958,3938,34960,5214,34962,44],{},[29,34959,3418],{},[29,34961,5213],{},[29,34963,3548],{},[83,34965,34966,5221,34968,5225],{},[29,34967,3424],{},[29,34969,5224],{},[21,34971,5229],{"id":5228},[11,34973],{},[14,34975,5234],{},[14,34977,3447,34978,3451,34980],{},[322,34979,514],{"href":5239,"download":522},[322,34981,3455],{"href":3454},[77,34983,34984],{},[80,34985,34986,35008,35024,35040,35064,35080,35106,35132,35146,35164,35194,35208,35226,35256,35284],{},[83,34987,34988,88,34990,34992],{},[29,34989,87],{},[90,34991,92],{},[80,34993,34994,34998,35002],{},[83,34995,34996,3472],{},[90,34997,99],{},[83,34999,35000,5262],{},[90,35001,105],{},[83,35003,35004,5268,35006,5271],{},[90,35005,5267],{},[90,35007,3827],{},[83,35009,35010,88,35012,35014],{},[29,35011,111],{},[90,35013,124],{},[80,35015,35016],{},[83,35017,35018,3510,35020,3731,35022,3554],{},[90,35019,131],{},[90,35021,5286],{},[592,35023],{"src":5289,"alt":5290},[83,35025,35026,88,35028,35030],{},[29,35027,3760],{},[90,35029,114],{},[80,35031,35032],{},[83,35033,35034,132,35036,3492,35038,5307],{},[90,35035,114],{},[90,35037,135],{},[90,35039,139],{},[83,35041,35042,88,35044,35046],{},[29,35043,3799],{},[90,35045,5314],{},[80,35047,35048,35056],{},[83,35049,35050,132,35052,3492,35054,5325],{},[90,35051,953],{},[90,35053,135],{},[90,35055,139],{},[83,35057,35058,5331,35060,5334,35062,3554],{},[90,35059,5330],{},[90,35061,3548],{},[592,35063],{"src":5337,"alt":5338},[83,35065,35066,88,35068,35070],{},[29,35067,5343],{},[90,35069,5346],{},[80,35071,35072],{},[83,35073,35074,5354,35076,5358,35078,44],{},[90,35075,5353],{},[90,35077,5357],{},[90,35079,5361],{},[83,35081,35082,88,35084,35086],{},[29,35083,5366],{},[90,35085,3639],{},[80,35087,35088,35096],{},[83,35089,35090,132,35092,5377,35094,5381],{},[90,35091,155],{},[90,35093,155],{},[90,35095,5380],{},[83,35097,35098,5386,35100,5389,35102,3656,35104,44],{},[90,35099,3651],{},[90,35101,3651],{},[90,35103,5392],{},[90,35105,3659],{},[83,35107,35108,88,35110,35112],{},[29,35109,5399],{},[90,35111,3639],{},[80,35113,35114,35126],{},[83,35115,35116,132,35118,3648,35120,5412,35122,3289,35124,44],{},[90,35117,155],{},[90,35119,155],{},[90,35121,3651],{},[90,35123,5415],{},[90,35125,5418],{},[83,35127,35128,5424,35130,3554],{},[90,35129,5423],{},[592,35131],{"src":5427,"alt":5428},[83,35133,35134,88,35136,35138],{},[29,35135,5433],{},[90,35137,2695],{},[80,35139,35140],{},[83,35141,35142,224,35144,5446],{},[90,35143,5442],{},[90,35145,5445],{},[83,35147,35148,88,35150,35152],{},[29,35149,5451],{},[90,35151,3639],{},[80,35153,35154],{},[83,35155,35156,132,35158,3648,35160,5412,35162,44],{},[90,35157,155],{},[90,35159,155],{},[90,35161,3651],{},[90,35163,5466],{},[83,35165,35166,88,35168,35170],{},[29,35167,5471],{},[90,35169,5474],{},[80,35171,35172,35186,35190],{},[83,35173,35174,132,35176,5483,35178,3652,35180,5488,35182,5492,35184,44],{},[90,35175,155],{},[90,35177,155],{},[90,35179,3651],{},[90,35181,5392],{},[90,35183,5491],{},[90,35185,3659],{},[83,35187,35188,5499],{},[90,35189,1637],{},[83,35191,35192,5504],{},[90,35193,1643],{},[83,35195,35196,88,35198,35200],{},[29,35197,5509],{},[90,35199,2695],{},[80,35201,35202],{},[83,35203,35204,224,35206,5521],{},[90,35205,5442],{},[90,35207,5520],{},[83,35209,35210,88,35212,35214],{},[29,35211,5526],{},[90,35213,5529],{},[80,35215,35216],{},[83,35217,35218,5537,35220,3492,35222,5543,35224,3554],{},[90,35219,5536],{},[90,35221,135],{},[90,35223,5542],{},[592,35225],{"src":5546,"alt":5547},[83,35227,35228,88,35230,35232],{},[29,35229,5552],{},[90,35231,3303],{},[80,35233,35234,35238,35242,35250],{},[83,35235,35236,3769],{},[90,35237,99],{},[83,35239,35240,5565],{},[90,35241,3774],{},[83,35243,35244,132,35246,3782,35248,44],{},[90,35245,465],{},[90,35247,135],{},[90,35249,5574],{},[83,35251,35252,261,35254,5581],{},[90,35253,3790],{},[90,35255,3793],{},[83,35257,35258,88,35260,35262],{},[29,35259,5586],{},[90,35261,281],{},[80,35263,35264,35268,35272,35278],{},[83,35265,35266,3769],{},[90,35267,99],{},[83,35269,35270,5599],{},[90,35271,3774],{},[83,35273,35274,3817,35276,44],{},[90,35275,3816],{},[90,35277,165],{},[83,35279,35280,162,35282,44],{},[90,35281,3824],{},[90,35283,3827],{},[83,35285,35286,88,35288,35290],{},[29,35287,5616],{},[90,35289,5619],{},[80,35291,35292,35296],{},[83,35293,35294,3769],{},[90,35295,5626],{},[83,35297,35298,5632],{},[90,35299,5631],{},[14,35301,5635],{},[592,35303],{"src":5638,"className":35304,"alt":5640},[3835],[21,35306,5644],{"id":5643},[11,35308],{},[14,35310,3843,35311,3847,35313,3851,35315,5655,35317,44],{},[29,35312,3378],{},[29,35314,3850],{},[29,35316,3435],{},[29,35318,5658],{},[639,35320,35321],{"id":5661},[29,35322,5664],{},[555,35324,35325,35331],{},[83,35326,35327,5672,35329,5676],{},[29,35328,5671],{},[29,35330,5675],{},[83,35332,35333,88,35335,5684,35337,5688,35339,44],{},[29,35334,5681],{},[29,35336,3395],{},[29,35338,5687],{},[29,35340,3882],{},[21,35342,5694],{"id":5693},[11,35344],{},[14,35346,3890,35347,3893,35349,3897,35351,3900],{},[29,35348,3435],{},[29,35350,3378],{},[29,35352,514],{},[555,35354,35355,35361,35369,35377,35385],{},[83,35356,35357,3910,35359,44],{},[29,35358,3909],{},[29,35360,3913],{},[83,35362,35363,5718,35365,5721,35367,44],{},[29,35364,5717],{},[29,35366,3922],{},[29,35368,5724],{},[83,35370,35371,5718,35373,450,35375,44],{},[29,35372,5729],{},[29,35374,5732],{},[29,35376,5735],{},[83,35378,35379,5741,35381,5745,35383,5749],{},[29,35380,5740],{},[29,35382,5744],{},[29,35384,5748],{},[83,35386,35387,3910,35389,44],{},[29,35388,5754],{},[29,35390,3913],{},[14,35392,3943,35393,3947],{},[29,35394,3946],{},[14,35396,3950,35397],{},[322,35398,5765],{"href":5239,"download":522},[21,35400,796],{"id":795},[11,35402],{},[14,35404,5772,35405,5775,35407,5779,35409,5783,35411,5787,35413,5791],{},[29,35406,3395],{},[29,35408,5778],{},[29,35410,5782],{},[29,35412,5786],{},[29,35414,5790],{},[14,35416,5794,35417,3991,35419,5801],{},[29,35418,3378],{},[29,35420,35421],{},[322,35422,3997],{"href":3996},[11,35424],{},[14,35426,35427],{},[807,35428,4002,35429,4006,35431,3289,35433,4011],{},[29,35430,5810],{},[29,35432,3378],{},[29,35434,3435],{},{"title":494,"searchDepth":495,"depth":495,"links":35436},[35437,35438,35439,35442,35443],{"id":545,"depth":498,"text":546},{"id":5228,"depth":498,"text":5229},{"id":5643,"depth":498,"text":5644,"children":35440},[35441],{"id":5661,"depth":495,"text":5664},{"id":5693,"depth":498,"text":5694},{"id":795,"depth":498,"text":796},{"type":513,"format":77,"intent_type":1049,"intent":4022,"tags":35445,"platfrom":35446},[519,1056],[3378],{"title":5135,"description":5824},{"id":6147,"title":6148,"body":35449,"date":523,"description":6560,"extension":506,"meta":35751,"navigation":522,"order":523,"path":6566,"seo":35754,"stem":6568,"__hash__":6569},{"type":8,"value":35450,"toc":35741},[35451,35453,35459,35461,35465,35467,35471,35485,35487,35493,35495,35497,35505,35515,35517,35523,35551,35565,35595,35597,35599,35603,35607,35609,35613,35665,35667,35727,35729,35731,35737],[11,35452],{},[14,35454,6155,35455,6159,35457,6163],{},[29,35456,6158],{},[29,35458,6162],{},[18,35460],{},[14,35462,6168,35463,6171],{},[322,35464,4073],{"href":993},[21,35466,6175],{"id":6174},[14,35468,6178,35469,6183],{},[322,35470,6182],{"href":6181},[77,35472,35473],{},[555,35474,35475,35477,35479,35481,35483],{},[83,35476,6190],{},[83,35478,6193],{},[83,35480,6196],{},[83,35482,6199],{},[83,35484,6202],{},[639,35486,6206],{"id":6205},[14,35488,6209,35489,6212,35491,6216],{},[322,35490,124],{"href":4943},[29,35492,6215],{},[639,35494,6220],{"id":6219},[14,35496,6223],{},[14,35498,5070,35499,6230,35501,3289,35503,6237],{},[322,35500,6229],{"href":6228},[29,35502,6233],{},[29,35504,6236],{},[14,35506,5070,35507,6243,35509,6247,35511,6252,35513,6256],{},[322,35508,148],{"href":6242},[29,35510,6246],{},[322,35512,6251],{"href":6250},[29,35514,6255],{},[639,35516,6260],{"id":6259},[14,35518,5070,35519,6265,35521,6270],{},[322,35520,6229],{"href":6228},[322,35522,6269],{"href":6268},[77,35524,35525],{},[80,35526,35527,35539],{},[83,35528,35529,88,35531,35533],{},[29,35530,87],{},[90,35532,6281],{},[80,35534,35535],{},[83,35536,35537,6289],{},[90,35538,6288],{},[83,35540,35541,88,35543,35545],{},[29,35542,111],{},[90,35544,6296],{},[80,35546,35547],{},[83,35548,35549,6304],{},[90,35550,6303],{},[14,35552,6307,35553,6310,35555,6313,35557,6317,35559,6320,35561,6323,35563,6326],{},[322,35554,148],{"href":6242},[29,35556,6255],{},[29,35558,6316],{},[322,35560,6269],{"href":6268},[29,35562,6316],{},[29,35564,6255],{},[77,35566,35567],{},[80,35568,35569,35581],{},[83,35570,35571,88,35573,35575],{},[29,35572,87],{},[90,35574,6281],{},[80,35576,35577],{},[83,35578,35579,6289],{},[90,35580,198],{},[83,35582,35583,88,35585,35587],{},[29,35584,111],{},[90,35586,6296],{},[80,35588,35589],{},[83,35590,35591,6355,35593,44],{},[90,35592,6303],{},[29,35594,6246],{},[592,35596],{"src":6360,"alt":6361},[639,35598,6365],{"id":6364},[14,35600,6368,35601,6372],{},[29,35602,6371],{},[14,35604,6375,35605,6379],{},[322,35606,3639],{"href":6378},[639,35608,6383],{"id":6382},[14,35610,6386,35611,6390],{},[29,35612,6389],{},[77,35614,35615],{},[80,35616,35617,35623,35629,35659],{},[83,35618,35619,88,35621,6401],{},[29,35620,87],{},[90,35622,124],{},[83,35624,35625,88,35627,6409],{},[29,35626,111],{},[90,35628,6408],{},[83,35630,35631,88,35633,6416,35635],{},[29,35632,3760],{},[90,35634,6269],{},[80,35636,35637,35645,35653],{},[83,35638,35639,88,35641,1995,35643,6430],{},[29,35640,6423],{},[90,35642,6426],{},[90,35644,6429],{},[83,35646,35647,88,35649,1995,35651,6441],{},[29,35648,6435],{},[90,35650,6426],{},[90,35652,6440],{},[83,35654,35655,88,35657,6450],{},[29,35656,6446],{},[90,35658,6449],{},[83,35660,35661,88,35663,6458],{},[29,35662,3799],{},[90,35664,6457],{},[14,35666,6461],{},[77,35668,35669],{},[80,35670,35671,35677,35721],{},[83,35672,35673,88,35675,6401],{},[29,35674,87],{},[90,35676,124],{},[83,35678,35679,88,35681,6478,35683],{},[29,35680,111],{},[90,35682,6251],{},[80,35684,35685,35691],{},[83,35686,35687,88,35689,6487],{},[29,35688,121],{},[90,35690,148],{},[83,35692,35693,88,35695,3731,35697],{},[29,35694,145],{},[90,35696,6494],{},[80,35698,35699,35707,35715],{},[83,35700,35701,88,35703,1995,35705,6430],{},[29,35702,170],{},[90,35704,6426],{},[90,35706,6429],{},[83,35708,35709,88,35711,1995,35713,6441],{},[29,35710,213],{},[90,35712,6426],{},[90,35714,6440],{},[83,35716,35717,88,35719,6450],{},[29,35718,241],{},[90,35720,6449],{},[83,35722,35723,88,35725,6526],{},[29,35724,3760],{},[90,35726,6525],{},[21,35728,796],{"id":795},[14,35730,6531],{},[14,35732,6534,35733,6537,35735,3342],{},[322,35734,4073],{"href":993},[322,35736,6541],{"href":6540},[14,35738,6544,35739,6549],{},[322,35740,6548],{"href":6547},{"title":494,"searchDepth":495,"depth":495,"links":35742},[35743,35750],{"id":6174,"depth":498,"text":6175,"children":35744},[35745,35746,35747,35748,35749],{"id":6205,"depth":495,"text":6206},{"id":6219,"depth":495,"text":6220},{"id":6259,"depth":495,"text":6260},{"id":6364,"depth":495,"text":6365},{"id":6382,"depth":495,"text":6383},{"id":795,"depth":498,"text":796},{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":1050,"tags":35752,"platfrom":35753,"video":6565},[6563],[1757],{"title":6148,"description":6560},{"id":6571,"title":6572,"body":35756,"date":523,"description":7023,"extension":506,"meta":36121,"navigation":522,"order":523,"path":7029,"seo":36124,"stem":7031,"__hash__":7032},{"type":8,"value":35757,"toc":36112},[35758,35760,35762,35764,35766,35768,35786,35788,35790,35794,35856,35858,35878,35880,35882,35884,35886,35890,36068,36072,36074,36076,36080,36096,36100,36104,36106,36108,36110],[11,35759],{},[14,35761,6579],{},[21,35763,546],{"id":545},[11,35765],{},[14,35767,551],{},[555,35769,35770,35776,35780],{},[83,35771,35772,1785,35774,44],{},[29,35773,561],{},[322,35775,566],{"href":565},[83,35777,35778,1792],{},[29,35779,571],{},[83,35781,35782,1797,35784,44],{},[29,35783,577],{},[90,35785,581],{},[21,35787,6607],{"id":6606},[11,35789],{},[14,35791,6612,35792,6617],{},[322,35793,6616],{"href":6615},[719,35795,35796],{"className":1848,"code":6620,"language":1850,"meta":494,"style":494},[90,35797,35798],{"__ignoreMap":494},[727,35799,35800,35802,35804,35806,35808,35810,35812,35814,35816,35818,35820,35822,35824,35826,35828,35830,35832,35834,35836,35838,35840,35842,35844,35846,35848,35850,35852,35854],{"class":729,"line":730},[727,35801,6627],{"class":733},[727,35803,6630],{"class":1882},[727,35805,2075],{"class":737},[727,35807,6635],{"class":737},[727,35809,6638],{"class":1882},[727,35811,6641],{"class":737},[727,35813,6644],{"class":1882},[727,35815,6647],{"class":737},[727,35817,1987],{"class":1986},[727,35819,1990],{"class":737},[727,35821,1987],{"class":1986},[727,35823,1995],{"class":737},[727,35825,1987],{"class":1986},[727,35827,6660],{"class":737},[727,35829,1987],{"class":1986},[727,35831,2004],{"class":737},[727,35833,1987],{"class":1986},[727,35835,2009],{"class":737},[727,35837,1987],{"class":1986},[727,35839,1995],{"class":737},[727,35841,1987],{"class":1986},[727,35843,1832],{"class":737},[727,35845,1987],{"class":1986},[727,35847,2004],{"class":737},[727,35849,1987],{"class":1986},[727,35851,1838],{"class":737},[727,35853,1987],{"class":1986},[727,35855,6689],{"class":737},[14,35857,6692],{},[80,35859,35860,35864,35868,35872],{},[83,35861,35862,6699],{},[90,35863,6627],{},[83,35865,35866,6705],{},[90,35867,6704],{},[83,35869,35870,6711],{},[90,35871,6710],{},[83,35873,35874,6717,35876,44],{},[90,35875,6716],{},[322,35877,6721],{"href":6720},[21,35879,6725],{"id":6724},[11,35881],{},[639,35883,6731],{"id":6730},[11,35885],{},[14,35887,6736,35888,6740],{},[90,35889,6739],{},[719,35891,35892],{"className":6743,"code":6744,"language":6745,"meta":494,"style":494},[90,35893,35894,35900,35904,35918,35936,35940,35956,35962,35970,35974,35994,36060,36064],{"__ignoreMap":494},[727,35895,35896,35898],{"class":729,"line":730},[727,35897,6752],{"class":733},[727,35899,6755],{"class":737},[727,35901,35902],{"class":729,"line":498},[727,35903,1898],{"emptyLinePlaceholder":522},[727,35905,35906,35908,35910,35912,35914,35916],{"class":729,"line":495},[727,35907,6764],{"class":733},[727,35909,6767],{"class":737},[727,35911,1912],{"class":737},[727,35913,6772],{"class":737},[727,35915,6775],{"class":737},[727,35917,6778],{"class":737},[727,35919,35920,35922,35924,35926,35928,35930,35932,35934],{"class":729,"line":1895},[727,35921,6783],{"class":1986},[727,35923,6786],{"class":768},[727,35925,6789],{"class":737},[727,35927,6792],{"class":768},[727,35929,6795],{"class":733},[727,35931,5031],{"class":768},[727,35933,6800],{"class":1986},[727,35935,6803],{"class":768},[727,35937,35938],{"class":729,"line":1901},[727,35939,1898],{"emptyLinePlaceholder":522},[727,35941,35942,35944,35946,35948,35950,35952,35954],{"class":729,"line":1973},[727,35943,6764],{"class":733},[727,35945,6814],{"class":737},[727,35947,6817],{"class":737},[727,35949,6820],{"class":737},[727,35951,6823],{"class":737},[727,35953,6826],{"class":737},[727,35955,6829],{"class":737},[727,35957,35958,35960],{"class":729,"line":2052},[727,35959,6834],{"class":1882},[727,35961,6837],{"class":737},[727,35963,35964,35966,35968],{"class":729,"line":2058},[727,35965,6834],{"class":1882},[727,35967,6844],{"class":737},[727,35969,6847],{"class":737},[727,35971,35972],{"class":729,"line":2064},[727,35973,1898],{"emptyLinePlaceholder":522},[727,35975,35976,35978,35980,35982,35984,35986,35988,35990,35992],{"class":729,"line":2087},[727,35977,6764],{"class":733},[727,35979,2070],{"class":737},[727,35981,6772],{"class":737},[727,35983,6775],{"class":737},[727,35985,1889],{"class":737},[727,35987,1912],{"class":737},[727,35989,6868],{"class":737},[727,35991,2081],{"class":737},[727,35993,6873],{"class":737},[727,35995,35996,35998,36000,36002,36004,36006,36008,36010,36012,36014,36016,36018,36020,36022,36024,36026,36028,36030,36032,36034,36036,36038,36040,36042,36044,36046,36048,36050,36052,36054,36056,36058],{"class":729,"line":2140},[727,35997,6627],{"class":733},[727,35999,6630],{"class":1882},[727,36001,2075],{"class":737},[727,36003,6884],{"class":737},[727,36005,6638],{"class":1882},[727,36007,6641],{"class":737},[727,36009,6644],{"class":1882},[727,36011,6647],{"class":737},[727,36013,1987],{"class":1986},[727,36015,1990],{"class":737},[727,36017,1987],{"class":1986},[727,36019,1995],{"class":737},[727,36021,1987],{"class":1986},[727,36023,6660],{"class":737},[727,36025,1987],{"class":1986},[727,36027,2004],{"class":737},[727,36029,1987],{"class":1986},[727,36031,2009],{"class":737},[727,36033,1987],{"class":1986},[727,36035,1995],{"class":737},[727,36037,1987],{"class":1986},[727,36039,1832],{"class":737},[727,36041,1987],{"class":1986},[727,36043,2004],{"class":737},[727,36045,1987],{"class":1986},[727,36047,1838],{"class":737},[727,36049,1987],{"class":1986},[727,36051,6933],{"class":737},[727,36053,1987],{"class":1986},[727,36055,6938],{"class":737},[727,36057,1987],{"class":1986},[727,36059,6943],{"class":737},[727,36061,36062],{"class":729,"line":2154},[727,36063,1898],{"emptyLinePlaceholder":522},[727,36065,36066],{"class":729,"line":1529},[727,36067,6952],{"class":733},[14,36069,6955,36070,6960],{},[322,36071,6959],{"href":6958},[21,36073,776],{"id":775},[11,36075],{},[14,36077,6967,36078,6971],{},[90,36079,6970],{},[719,36081,36082],{"className":1848,"code":6974,"language":1850,"meta":494,"style":494},[90,36083,36084],{"__ignoreMap":494},[727,36085,36086,36088,36090,36092,36094],{"class":729,"line":730},[727,36087,6981],{"class":768},[727,36089,6984],{"class":733},[727,36091,6987],{"class":1882},[727,36093,6990],{"class":733},[727,36095,2639],{"class":733},[14,36097,6995,36098,6998],{},[322,36099,792],{"href":791},[14,36101,36102],{},[807,36103,7003],{},[21,36105,796],{"id":795},[11,36107],{},[14,36109,7010],{},[811,36111,7013],{},{"title":494,"searchDepth":495,"depth":495,"links":36113},[36114,36115,36116,36119,36120],{"id":545,"depth":498,"text":546},{"id":6606,"depth":498,"text":6607},{"id":6724,"depth":498,"text":6725,"children":36117},[36118],{"id":6730,"depth":495,"text":6731},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"type":90,"format":77,"intent_type":515,"intent":827,"tags":36122,"platfrom":36123},[6627,7026,7027,6745],[1757],{"title":6572,"description":7023},{"id":7034,"title":7035,"body":36126,"date":523,"description":7306,"extension":506,"meta":36318,"navigation":522,"order":523,"path":7312,"seo":36321,"stem":7314,"__hash__":7315},{"type":8,"value":36127,"toc":36308},[36128,36130,36134,36138,36160,36162,36164,36166,36196,36198,36200,36208,36210,36212,36214,36240,36242,36244,36246,36254,36256,36258,36260,36270,36272,36274,36276,36286,36288,36290,36294,36296,36298],[11,36129],{},[14,36131,7042,36132,7046],{},[322,36133,3946],{"href":7045},[14,36135,7049,36136,7053],{},[322,36137,1055],{"href":7052},[555,36139,36140,36144,36148,36152,36156],{},[83,36141,36142],{},[322,36143,92],{"href":7060},[83,36145,36146],{},[322,36147,124],{"href":7065},[83,36149,36150],{},[322,36151,5314],{"href":7070},[83,36153,36154],{},[322,36155,7076],{"href":7075},[83,36157,36158],{},[322,36159,3639],{"href":7081},[21,36161,7085],{"id":7084},[11,36163],{},[14,36165,7090],{},[7092,36167,36168,36176],{},[7095,36169,36170],{},[7098,36171,36172,36174],{},[7101,36173,7103],{},[7101,36175,7106],{},[7108,36177,36178,36184,36190],{},[7098,36179,36180,36182],{},[7113,36181,2662],{},[7113,36183,7117],{},[7098,36185,36186,36188],{},[7113,36187,2662],{},[7113,36189,7117],{},[7098,36191,36192,36194],{},[7113,36193,2662],{},[7113,36195,7117],{},[21,36197,7133],{"id":7132},[11,36199],{},[14,36201,7138,36202,7142,36204,7146,36206,7150],{},[29,36203,7141],{},[29,36205,7145],{},[322,36207,7149],{"href":6181},[21,36209,7154],{"id":7153},[11,36211],{},[14,36213,7159],{},[77,36215,36216],{},[555,36217,36218,36224,36228,36234],{},[83,36219,36220,7168,36222,7172],{},[29,36221,99],{},[29,36223,7171],{},[83,36225,36226,7177],{},[29,36227,105],{},[83,36229,36230,7183,36232,44],{},[29,36231,7182],{},[29,36233,7186],{},[83,36235,36236,7191,36238,44],{},[29,36237,5267],{},[29,36239,7194],{},[14,36241,7197],{},[21,36243,7201],{"id":7200},[14,36245,7204],{},[77,36247,36248],{},[555,36249,36250],{},[83,36251,36252,7214],{},[29,36253,7213],{},[21,36255,7218],{"id":7217},[11,36257],{},[14,36259,7223],{},[77,36261,36262],{},[555,36263,36264],{},[83,36265,36266,1021,36268,7236],{},[29,36267,7232],{},[29,36269,7235],{},[21,36271,7240],{"id":7239},[11,36273],{},[14,36275,7245],{},[77,36277,36278],{},[555,36279,36280],{},[83,36281,36282,7254,36284,7258],{},[29,36283,155],{},[29,36285,7257],{},[21,36287,7262],{"id":7261},[11,36289],{},[14,36291,7267,36292,7270],{},[322,36293,7149],{"href":6181},[21,36295,796],{"id":795},[11,36297],{},[14,36299,7277,36300,7281,36302,7286,36304,7291,36306,7295],{},[322,36301,7280],{"href":2670},[322,36303,7285],{"href":7284},[322,36305,7290],{"href":7289},[322,36307,7294],{"href":7045},{"title":494,"searchDepth":495,"depth":495,"links":36309},[36310,36311,36312,36313,36314,36315,36316,36317],{"id":7084,"depth":498,"text":7085},{"id":7132,"depth":498,"text":7133},{"id":7153,"depth":498,"text":7154},{"id":7200,"depth":498,"text":7201},{"id":7217,"depth":498,"text":7218},{"id":7239,"depth":498,"text":7240},{"id":7261,"depth":498,"text":7262},{"id":795,"depth":498,"text":796},{"type":513,"format":514,"intent_type":1754,"intent":7308,"tags":36319,"platfrom":36320},[1055,1056],[7311],{"title":7035,"description":7306},{"id":7535,"title":7536,"body":36323,"date":523,"description":7652,"extension":506,"meta":36404,"navigation":522,"order":523,"path":7657,"seo":36407,"stem":7659,"__hash__":7660},{"type":8,"value":36324,"toc":36399},[36325,36327,36329,36331,36333,36337,36353,36355,36357,36359,36363,36381,36385,36387,36389],[11,36326],{},[14,36328,7543],{},[21,36330,7547],{"id":7546},[11,36332],{},[14,36334,5070,36335,7556],{},[322,36336,7555],{"href":7554},[77,36338,36339],{},[80,36340,36341,36345,36349],{},[83,36342,36343,7566],{},[29,36344,7565],{},[83,36346,36347,7571],{},[29,36348,3651],{},[83,36350,36351,7577],{},[29,36352,7576],{},[14,36354,7580],{},[21,36356,7584],{"id":7583},[11,36358],{},[14,36360,7589,36361,7593],{},[90,36362,7592],{},[80,36364,36365,36369,36373,36377],{},[83,36366,36367,7601],{},[322,36368,5314],{"href":7600},[83,36370,36371,7607],{},[322,36372,7606],{"href":3302},[83,36374,36375,7613],{},[322,36376,5474],{"href":7612},[83,36378,36379,7620],{},[322,36380,7619],{"href":7618},[14,36382,7623,36383,1230],{},[322,36384,7627],{"href":7626},[21,36386,7631],{"id":7630},[11,36388],{},[80,36390,36391,36395],{},[83,36392,36393],{},[322,36394,7640],{"href":2670},[83,36396,36397],{},[322,36398,7646],{"href":7645},{"title":494,"searchDepth":495,"depth":495,"links":36400},[36401,36402,36403],{"id":7546,"depth":498,"text":7547},{"id":7583,"depth":498,"text":7584},{"id":7630,"depth":498,"text":7631},{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":7308,"tags":36405,"platfrom":36406},[7655,7290],[7311],{"title":7536,"description":7652},{"id":7662,"title":7663,"body":36409,"date":523,"description":7872,"extension":506,"meta":36561,"navigation":522,"order":523,"path":7877,"seo":36564,"stem":7879,"__hash__":7880},{"type":8,"value":36410,"toc":36555},[36411,36413,36415,36417,36419,36421,36423,36439,36444,36446,36448,36454,36456,36496,36498,36516,36522,36524,36526,36528,36534,36536,36538,36542,36547,36549,36553],[11,36412],{},[14,36414,7670],{},[14,36416,7673],{},[21,36418,546],{"id":545},[11,36420],{},[14,36422,7680],{},[77,36424,36425],{},[555,36426,36427,36431,36435],{},[83,36428,36429,7690],{},[29,36430,7689],{},[83,36432,36433,7696],{},[29,36434,7695],{},[83,36436,36437,7702],{},[29,36438,7701],{},[14,36440,7705,36441,44],{},[322,36442,7710],{"href":7708,"rel":36443},[2245],[21,36445,7714],{"id":7713},[11,36447],{},[14,36449,7719,36450,7723,36452,7726],{},[322,36451,7722],{"href":494},[322,36453,6616],{"href":6615},[14,36455,7729],{},[719,36457,36458],{"className":7732,"code":7733,"language":2585,"meta":494,"style":494},[90,36459,36460,36464,36474,36484,36492],{"__ignoreMap":494},[727,36461,36462],{"class":729,"line":730},[727,36463,7740],{"class":768},[727,36465,36466,36468,36470,36472],{"class":729,"line":498},[727,36467,7746],{"class":7745},[727,36469,1995],{"class":768},[727,36471,7751],{"class":737},[727,36473,2427],{"class":768},[727,36475,36476,36478,36480,36482],{"class":729,"line":495},[727,36477,7758],{"class":7745},[727,36479,1995],{"class":768},[727,36481,7763],{"class":737},[727,36483,2427],{"class":768},[727,36485,36486,36488,36490],{"class":729,"line":1895},[727,36487,7770],{"class":7745},[727,36489,1995],{"class":768},[727,36491,7775],{"class":737},[727,36493,36494],{"class":729,"line":1901},[727,36495,2639],{"class":768},[14,36497,7782],{},[77,36499,36500],{},[80,36501,36502,36508,36512],{},[83,36503,36504,7792,36506,7796],{},[29,36505,7791],{},[322,36507,7795],{"href":2670},[83,36509,36510,7801],{},[29,36511,4099],{},[83,36513,36514,7807],{},[29,36515,7806],{},[14,36517,7810,36518,7813,36520,7817],{},[90,36519,7806],{},[90,36521,7816],{},[592,36523],{"src":7820,"alt":7821},[21,36525,776],{"id":775},[11,36527],{},[14,36529,7828,36530,7832,36532,7835],{},[322,36531,7831],{"href":791},[322,36533,4887],{"href":2203},[21,36535,796],{"id":795},[11,36537],{},[14,36539,7842,36540,7846],{},[322,36541,173],{"href":7845},[14,36543,7849,36544,7855],{},[322,36545,7854],{"href":7852,"rel":36546},[2245],[11,36548],{},[14,36550,36551],{},[807,36552,7862],{},[811,36554,7865],{},{"title":494,"searchDepth":495,"depth":495,"links":36556},[36557,36558,36559,36560],{"id":545,"depth":498,"text":546},{"id":7713,"depth":498,"text":7714},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"type":513,"format":77,"intent_type":1049,"intent":1050,"tags":36562,"platfrom":36563},[1052,1318],[7876],{"title":7663,"description":7872},{"id":7882,"title":7883,"body":36566,"date":523,"description":8107,"extension":506,"meta":36762,"navigation":522,"order":523,"path":8111,"seo":36765,"stem":8113,"__hash__":8114},{"type":8,"value":36567,"toc":36756},[36568,36570,36572,36576,36578,36580,36614,36616,36624,36744,36746,36748,36750],[11,36569],{},[14,36571,7890],{},[14,36573,7893,36574,7896],{},[322,36575,1055],{"href":7052},[21,36577,7085],{"id":7084},[14,36579,7901],{},[7092,36581,36582,36590],{},[7095,36583,36584],{},[7098,36585,36586,36588],{},[7101,36587,7103],{},[7101,36589,7106],{},[7108,36591,36592,36600,36606],{},[7098,36593,36594,36598],{},[7113,36595,36596],{},[322,36597,7921],{"href":7920},[7113,36599,7117],{},[7098,36601,36602,36604],{},[7113,36603,7928],{},[7113,36605,7117],{},[7098,36607,36608,36612],{},[7113,36609,36610],{},[322,36611,7938],{"href":7937},[7113,36613,7117],{},[21,36615,7133],{"id":7132},[14,36617,7138,36618,7142,36620,7146,36622,7150],{},[29,36619,7141],{},[29,36621,7145],{},[322,36623,7149],{"href":6181},[77,36625,36626],{},[80,36627,36628,36646],{},[83,36629,36630,88,36632,36634],{},[29,36631,87],{},[90,36633,92],{},[80,36635,36636,36642],{},[83,36637,36638,7967,36640,7970],{},[90,36639,99],{},[90,36641,99],{},[83,36643,36644,7975],{},[90,36645,105],{},[83,36647,36648,88,36650,36652,36662],{},[29,36649,111],{},[90,36651,114],{},[80,36653,36654],{},[83,36655,36656,132,36658,136,36660,44],{},[90,36657,114],{},[90,36659,194],{},[90,36661,139],{},[80,36663,36664,36676,36702,36718,36734],{},[83,36665,36666,88,36668,36670],{},[29,36667,121],{},[90,36669,124],{},[80,36671,36672],{},[83,36673,36674,8006],{},[90,36675,131],{},[83,36677,36678,88,36680,36682],{},[29,36679,145],{},[90,36681,5314],{},[80,36683,36684,36692],{},[83,36685,36686,132,36688,8021,36690,44],{},[90,36687,155],{},[90,36689,155],{},[90,36691,3659],{},[83,36693,36694,132,36696,136,36698,8032,36700,8035],{},[90,36695,953],{},[90,36697,194],{},[90,36699,139],{},[90,36701,3548],{},[83,36703,36704,88,36706,36708],{},[29,36705,170],{},[90,36707,5346],{},[80,36709,36710],{},[83,36711,36712,5354,36714,5483,36716,8053],{},[90,36713,5353],{},[90,36715,5357],{},[90,36717,8052],{},[83,36719,36720,88,36722,36724],{},[29,36721,213],{},[90,36723,3639],{},[80,36725,36726],{},[83,36727,36728,132,36730,8068,36732,44],{},[90,36729,155],{},[90,36731,155],{},[90,36733,3659],{},[83,36735,36736,88,36738,36740],{},[29,36737,241],{},[90,36739,8077],{},[80,36741,36742],{},[83,36743,8082],{},[21,36745,7262],{"id":7261},[14,36747,8087],{},[21,36749,796],{"id":795},[14,36751,8092,36752,8097,36754,8100],{},[322,36753,8096],{"href":8095},[322,36755,7285],{"href":6181},{"title":494,"searchDepth":495,"depth":495,"links":36757},[36758,36759,36760,36761],{"id":7084,"depth":498,"text":7085},{"id":7132,"depth":498,"text":7133},{"id":7261,"depth":498,"text":7262},{"id":795,"depth":498,"text":796},{"pinned":522,"type":513,"format":515,"intent_type":1049,"intent":7308,"tags":36763,"platfrom":36764},[1055],[1757],{"title":7883,"description":8107},{"id":8116,"title":8117,"body":36767,"date":523,"description":8124,"extension":506,"meta":36897,"navigation":522,"order":523,"path":8318,"seo":36900,"stem":8320,"__hash__":8321},{"type":8,"value":36768,"toc":36889},[36769,36771,36773,36775,36777,36779,36781,36823,36825,36827,36829,36831,36835,36861,36863,36865,36867,36871,36873,36875,36877,36879,36881,36883,36885,36887],[11,36770],{},[14,36772,8124],{},[14,36774,8127],{},[21,36776,8131],{"id":8130},[592,36778],{"src":8134,"alt":8135},[14,36780,8138],{},[77,36782,36783],{},[555,36784,36785,36789,36795,36807,36817],{},[83,36786,8145,36787,44],{},[90,36788,8148],{},[83,36790,8151,36791,8155,36793,44],{},[90,36792,8154],{},[90,36794,8158],{},[83,36796,701,36797,8164,36799],{},[90,36798,8163],{},[80,36800,36801,36803,36805],{},[83,36802,8169],{},[83,36804,8172],{},[83,36806,8175],{},[83,36808,8178,36809,8182,36811],{},[90,36810,8181],{},[80,36812,36813,36815],{},[83,36814,8187],{},[83,36816,6429],{},[83,36818,8192,36819,8196,36821,44],{},[90,36820,8195],{},[90,36822,8199],{},[14,36824,8202],{},[21,36826,8206],{"id":8205},[592,36828],{"src":8209,"alt":8135},[14,36830,8212],{},[14,36832,8215,36833,8219],{},[29,36834,8218],{},[77,36836,36837],{},[555,36838,36839,36843,36849,36859],{},[83,36840,8226,36841,8230],{},[90,36842,8229],{},[83,36844,8233,36845,8237,36847,44],{},[90,36846,8236],{},[90,36848,8240],{},[83,36850,8243,36851,8246,36853],{},[90,36852,8229],{},[80,36854,36855],{},[83,36856,8251,36857,8255],{},[90,36858,8254],{},[83,36860,8258],{},[14,36862,8261],{},[21,36864,8265],{"id":8264},[14,36866,8268],{},[14,36868,8271,36869,8275],{},[29,36870,8274],{},[21,36872,8279],{"id":8278},[14,36874,8282],{},[21,36876,8286],{"id":8285},[14,36878,8289],{},[14,36880,8292],{},[14,36882,8295],{},[14,36884,8298],{},[21,36886,796],{"id":795},[14,36888,8303],{},{"title":494,"searchDepth":495,"depth":495,"links":36890},[36891,36892,36893,36894,36895,36896],{"id":8130,"depth":498,"text":8131},{"id":8205,"depth":498,"text":8206},{"id":8264,"depth":498,"text":8265},{"id":8278,"depth":498,"text":8279},{"id":8285,"depth":498,"text":8286},{"id":795,"depth":498,"text":796},{"metaTitle":8313,"type":513,"format":77,"intent_type":515,"intent":8314,"tags":36898,"platfrom":36899},[8316],[1757],{"title":8117,"description":8124},{"id":8323,"title":8324,"body":36902,"date":523,"description":8741,"extension":506,"meta":37255,"navigation":522,"order":523,"path":8745,"seo":37258,"stem":8747,"__hash__":8748},{"type":8,"value":36903,"toc":37247},[36904,36906,36908,36910,36912,36914,36916,36940,36942,36966,36968,36970,37054,37056,37146,37148,37230,37232,37236,37238,37240,37245],[11,36905],{},[14,36907,8331],{},[21,36909,546],{"id":545},[14,36911,8336],{},[21,36913,8340],{"id":8339},[14,36915,8343],{},[77,36917,36918],{},[555,36919,36920,36926,36932],{},[83,36921,8350,36922,8355],{},[322,36923,36924],{"href":4943},[90,36925,124],{},[83,36927,8350,36928,8362],{},[322,36929,36930],{"href":2300},[90,36931,2301],{},[83,36933,8350,36934,8369,36938,8372],{},[322,36935,36936],{"href":3302},[90,36937,7606],{},[90,36939,2982],{},[14,36941,8375],{},[77,36943,36944],{},[555,36945,36946,36956,36964],{},[83,36947,8350,36948,8387,36952,8394],{},[322,36949,36950],{"href":8384},[90,36951,92],{},[322,36953,36954],{"href":8390},[90,36955,8393],{},[83,36957,8350,36958,8401,36962,8404],{},[322,36959,36960],{"href":2296},[90,36961,114],{},[90,36963,139],{},[83,36965,8407],{},[639,36967,8411],{"id":8410},[14,36969,8414],{},[719,36971,36972],{"className":756,"code":8417,"language":758,"meta":494,"style":494},[90,36973,36974,36982,36992,37004,37008,37044,37050],{"__ignoreMap":494},[727,36975,36976,36978,36980],{"class":729,"line":730},[727,36977,8424],{"class":1986},[727,36979,8427],{"class":2376},[727,36981,8430],{"class":768},[727,36983,36984,36986,36988,36990],{"class":729,"line":498},[727,36985,8435],{"class":1986},[727,36987,8438],{"class":768},[727,36989,4970],{"class":1986},[727,36991,8443],{"class":768},[727,36993,36994,36996,36998,37000,37002],{"class":729,"line":495},[727,36995,8448],{"class":768},[727,36997,4970],{"class":1986},[727,36999,8453],{"class":768},[727,37001,8456],{"class":2376},[727,37003,2588],{"class":768},[727,37005,37006],{"class":729,"line":1895},[727,37007,1898],{"emptyLinePlaceholder":522},[727,37009,37010,37012,37014,37016,37018,37020,37022,37024,37026,37028,37030,37032,37034,37036,37038,37040,37042],{"class":729,"line":1901},[727,37011,8467],{"class":768},[727,37013,4970],{"class":1986},[727,37015,8472],{"class":768},[727,37017,8475],{"class":2376},[727,37019,2542],{"class":768},[727,37021,8480],{"class":737},[727,37023,8483],{"class":1882},[727,37025,8486],{"class":1986},[727,37027,8489],{"class":737},[727,37029,8483],{"class":1882},[727,37031,8486],{"class":1986},[727,37033,8497],{"class":8496},[727,37035,8483],{"class":1882},[727,37037,8486],{"class":1986},[727,37039,8504],{"class":737},[727,37041,8507],{"class":1986},[727,37043,5005],{"class":768},[727,37045,37046,37048],{"class":729,"line":1973},[727,37047,8514],{"class":1986},[727,37049,8517],{"class":768},[727,37051,37052],{"class":729,"line":2052},[727,37053,2639],{"class":768},[14,37055,8524],{},[719,37057,37058],{"className":756,"code":8527,"language":758,"meta":494,"style":494},[90,37059,37060,37068,37078,37090,37094,37130,37142],{"__ignoreMap":494},[727,37061,37062,37064,37066],{"class":729,"line":730},[727,37063,8424],{"class":1986},[727,37065,8427],{"class":2376},[727,37067,8430],{"class":768},[727,37069,37070,37072,37074,37076],{"class":729,"line":498},[727,37071,8435],{"class":1986},[727,37073,8438],{"class":768},[727,37075,4970],{"class":1986},[727,37077,8443],{"class":768},[727,37079,37080,37082,37084,37086,37088],{"class":729,"line":495},[727,37081,8448],{"class":768},[727,37083,4970],{"class":1986},[727,37085,8453],{"class":768},[727,37087,8456],{"class":2376},[727,37089,2588],{"class":768},[727,37091,37092],{"class":729,"line":1895},[727,37093,1898],{"emptyLinePlaceholder":522},[727,37095,37096,37098,37100,37102,37104,37106,37108,37110,37112,37114,37116,37118,37120,37122,37124,37126,37128],{"class":729,"line":1901},[727,37097,8467],{"class":768},[727,37099,4970],{"class":1986},[727,37101,8472],{"class":768},[727,37103,8475],{"class":2376},[727,37105,2542],{"class":768},[727,37107,8480],{"class":737},[727,37109,8483],{"class":1882},[727,37111,8486],{"class":1986},[727,37113,8489],{"class":737},[727,37115,8483],{"class":1882},[727,37117,8486],{"class":1986},[727,37119,8497],{"class":8496},[727,37121,8483],{"class":1882},[727,37123,8486],{"class":1986},[727,37125,8504],{"class":737},[727,37127,8507],{"class":1986},[727,37129,5005],{"class":768},[727,37131,37132,37134,37136,37138,37140],{"class":729,"line":1973},[727,37133,8514],{"class":1986},[727,37135,8606],{"class":768},[727,37137,8609],{"class":1986},[727,37139,8612],{"class":2376},[727,37141,8615],{"class":768},[727,37143,37144],{"class":729,"line":2052},[727,37145,2639],{"class":768},[14,37147,8622],{},[719,37149,37150],{"className":756,"code":8625,"language":758,"meta":494,"style":494},[90,37151,37152,37160,37170,37182,37186,37190,37218,37226],{"__ignoreMap":494},[727,37153,37154,37156,37158],{"class":729,"line":730},[727,37155,8424],{"class":1986},[727,37157,8427],{"class":2376},[727,37159,8430],{"class":768},[727,37161,37162,37164,37166,37168],{"class":729,"line":498},[727,37163,8435],{"class":1986},[727,37165,8438],{"class":768},[727,37167,4970],{"class":1986},[727,37169,8443],{"class":768},[727,37171,37172,37174,37176,37178,37180],{"class":729,"line":495},[727,37173,8448],{"class":768},[727,37175,4970],{"class":1986},[727,37177,8453],{"class":768},[727,37179,8456],{"class":2376},[727,37181,2588],{"class":768},[727,37183,37184],{"class":729,"line":1895},[727,37185,1898],{"emptyLinePlaceholder":522},[727,37187,37188],{"class":729,"line":1901},[727,37189,8666],{"class":2920},[727,37191,37192,37194,37196,37198,37200,37202,37204,37206,37208,37210,37212,37214,37216],{"class":729,"line":1973},[727,37193,8467],{"class":768},[727,37195,4970],{"class":1986},[727,37197,8472],{"class":768},[727,37199,8475],{"class":2376},[727,37201,2542],{"class":768},[727,37203,8480],{"class":737},[727,37205,8483],{"class":1882},[727,37207,8486],{"class":1986},[727,37209,8687],{"class":737},[727,37211,44],{"class":1882},[727,37213,8692],{"class":737},[727,37215,8507],{"class":1986},[727,37217,5005],{"class":768},[727,37219,37220,37222,37224],{"class":729,"line":2052},[727,37221,8514],{"class":1986},[727,37223,8703],{"class":768},[727,37225,8706],{"class":2920},[727,37227,37228],{"class":729,"line":2058},[727,37229,2639],{"class":768},[21,37231,776],{"id":775},[14,37233,8715,37234,8718],{},[322,37235,2204],{"href":2203},[14,37237,8721],{},[21,37239,796],{"id":795},[14,37241,8726,37242,44],{},[322,37243,3326],{"href":3324,"rel":37244},[2245],[811,37246,8732],{},{"title":494,"searchDepth":495,"depth":495,"links":37248},[37249,37250,37253,37254],{"id":545,"depth":498,"text":546},{"id":8339,"depth":498,"text":8340,"children":37251},[37252],{"id":8410,"depth":495,"text":8411},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"type":513,"format":77,"intent_type":1754,"intent":4022,"tags":37256,"platfrom":37257},[519,1532],[1757],{"title":8324,"description":8741},{"id":8750,"title":8751,"body":37260,"date":523,"description":8942,"extension":506,"meta":37400,"navigation":522,"order":523,"path":8946,"seo":37403,"stem":8948,"__hash__":8949},{"type":8,"value":37261,"toc":37393},[37262,37264,37269,37271,37273,37275,37293,37299,37301,37305,37317,37319,37355,37362,37366,37370,37372,37378,37380,37384,37389],[11,37263],{},[14,37265,37266,8763],{},[322,37267,8762],{"href":8760,"rel":37268},[2245],[14,37270,8766],{},[21,37272,546],{"id":545},[14,37274,8771],{},[77,37276,37277],{},[80,37278,37279,37281,37283,37285,37289],{},[83,37280,8778],{},[83,37282,8781],{},[83,37284,8784],{},[83,37286,8787,37287],{},[3335,37288,165],{},[83,37290,8792,37291],{},[322,37292,8795],{"href":565},[14,37294,37295],{},[807,37296,37297,8802],{},[3335,37298,165],{},[21,37300,8806],{"id":8805},[14,37302,8809,37303,8812],{},[90,37304,5043],{},[77,37306,37307],{},[555,37308,37309,37311,37313,37315],{},[83,37310,8819],{},[83,37312,8822],{},[83,37314,8825],{},[83,37316,8828],{},[14,37318,8831],{},[77,37320,37321],{},[80,37322,37323,37333,37341,37349],{},[83,37324,37325,37327,8843,37329,37331],{},[29,37326,8840],{},[344,37328],{},[344,37330],{},[90,37332,8848],{},[83,37334,37335,37337,8856,37339,44],{},[29,37336,8853],{},[344,37338],{},[90,37340,8859],{},[83,37342,37343,37345,8867,37347,44],{},[29,37344,8864],{},[344,37346],{},[322,37348,7854],{"href":8870},[83,37350,37351,37353,8878],{},[29,37352,8875],{},[344,37354],{},[14,37356,37357,8884,37359,44],{},[3335,37358,8883],{},[322,37360,8889],{"href":8887,"rel":37361},[2245],[14,37363,8892,37364,8896],{},[322,37365,8895],{"href":6958},[8898,37367,37368],{},[14,37369,8902],{},[21,37371,776],{"id":775},[14,37373,8907,37374,8910,37376,8913],{},[322,37375,7831],{"href":791},[322,37377,4887],{"href":2203},[639,37379,796],{"id":795},[14,37381,8918,37382,8922],{},[322,37383,8921],{"href":324},[14,37385,8925,37386],{},[322,37387,3326],{"href":8928,"rel":37388},[2245],[14,37390,37391],{},[807,37392,8934],{},{"title":494,"searchDepth":495,"depth":495,"links":37394},[37395,37396,37397],{"id":545,"depth":498,"text":546},{"id":8805,"depth":498,"text":8806},{"id":775,"depth":498,"text":776,"children":37398},[37399],{"id":795,"depth":495,"text":796},{"type":513,"format":77,"intent_type":515,"intent":827,"tags":37401,"platfrom":37402},[829,830],[8762],{"title":8751,"description":8942},{"id":9277,"title":9278,"body":37405,"date":523,"description":9802,"extension":506,"meta":37821,"navigation":522,"order":523,"path":9807,"seo":37824,"stem":9809,"__hash__":9810},{"type":8,"value":37406,"toc":37811},[37407,37409,37415,37417,37419,37421,37441,37443,37445,37447,37449,37451,37453,37455,37481,37483,37485,37487,37489,37511,37759,37761,37763,37765,37767,37781,37783,37785,37787,37789,37801,37803,37805,37807,37809],[11,37408],{},[14,37410,9285,37411,9288,37413,9293],{},[322,37412,561],{"href":565},[322,37414,9292],{"href":9291},[21,37416,546],{"id":545},[11,37418],{},[14,37420,551],{},[77,37422,37423],{},[555,37424,37425,37431,37435],{},[83,37426,37427,562,37429,44],{},[29,37428,561],{},[322,37430,566],{"href":565},[83,37432,37433,572],{},[29,37434,571],{},[83,37436,37437,578,37439,44],{},[29,37438,577],{},[90,37440,581],{},[18,37442],{},[21,37444,9325],{"id":9324},[11,37446],{},[14,37448,9330],{},[639,37450,9334],{"id":9333},[11,37452],{},[14,37454,9339],{},[77,37456,37457],{},[555,37458,37459,37465,37471],{},[83,37460,37461],{},[29,37462,37463],{},[90,37464,8895],{},[83,37466,37467,9356],{},[29,37468,37469],{},[90,37470,124],{},[83,37472,37473,9363,37477,3492,37479,9370],{},[29,37474,37475],{},[90,37476,5314],{},[29,37478,9366],{},[29,37480,9369],{},[592,37482],{"src":9373,"alt":637},[639,37484,9377],{"id":9376},[11,37486],{},[14,37488,9382],{},[77,37490,37491],{},[555,37492,37493,37497,37501,37503,37507],{},[83,37494,37495,9392],{},[29,37496,9391],{},[83,37498,9395,37499,9399],{},[29,37500,9398],{},[83,37502,9402],{},[83,37504,9405,37505,44],{},[29,37506,9408],{},[83,37508,9411,37509,44],{},[29,37510,9414],{},[719,37512,37513],{"className":756,"code":9417,"language":758,"meta":494,"style":494},[90,37514,37515,37523,37537,37555,37571,37587,37591,37595,37605,37615,37625,37633,37637,37641,37651,37661,37671,37685,37689,37693,37699,37713,37725,37733,37751,37755],{"__ignoreMap":494},[727,37516,37517,37519,37521],{"class":729,"line":730},[727,37518,8424],{"class":1986},[727,37520,9426],{"class":2376},[727,37522,8430],{"class":768},[727,37524,37525,37527,37529,37531,37533,37535],{"class":729,"line":498},[727,37526,9433],{"class":1986},[727,37528,9436],{"class":768},[727,37530,4970],{"class":1986},[727,37532,9441],{"class":737},[727,37534,9444],{"class":768},[727,37536,9447],{"class":2920},[727,37538,37539,37541,37543,37545,37547,37549,37551,37553],{"class":729,"line":495},[727,37540,9433],{"class":1986},[727,37542,9454],{"class":768},[727,37544,4970],{"class":1986},[727,37546,9459],{"class":768},[727,37548,9462],{"class":2376},[727,37550,9465],{"class":768},[727,37552,9468],{"class":2376},[727,37554,2588],{"class":768},[727,37556,37557,37559,37561,37563,37565,37567,37569],{"class":729,"line":1895},[727,37558,9433],{"class":1986},[727,37560,9477],{"class":768},[727,37562,4970],{"class":1986},[727,37564,9482],{"class":768},[727,37566,9485],{"class":2376},[727,37568,9488],{"class":768},[727,37570,9491],{"class":2920},[727,37572,37573,37575,37577,37579,37581,37583,37585],{"class":729,"line":1901},[727,37574,9433],{"class":1986},[727,37576,9498],{"class":768},[727,37578,4970],{"class":1986},[727,37580,9503],{"class":768},[727,37582,9506],{"class":2376},[727,37584,9488],{"class":768},[727,37586,9511],{"class":2920},[727,37588,37589],{"class":729,"line":1973},[727,37590,1898],{"emptyLinePlaceholder":522},[727,37592,37593],{"class":729,"line":2052},[727,37594,9520],{"class":2920},[727,37596,37597,37599,37601,37603],{"class":729,"line":2058},[727,37598,9433],{"class":1986},[727,37600,9527],{"class":768},[727,37602,4970],{"class":1986},[727,37604,2391],{"class":768},[727,37606,37607,37609,37611,37613],{"class":729,"line":2064},[727,37608,9536],{"class":737},[727,37610,1995],{"class":768},[727,37612,9541],{"class":737},[727,37614,2427],{"class":768},[727,37616,37617,37619,37621,37623],{"class":729,"line":2087},[727,37618,9548],{"class":737},[727,37620,1995],{"class":768},[727,37622,9553],{"class":737},[727,37624,2427],{"class":768},[727,37626,37627,37629,37631],{"class":729,"line":2140},[727,37628,9560],{"class":737},[727,37630,9563],{"class":768},[727,37632,9566],{"class":2920},[727,37634,37635],{"class":729,"line":2154},[727,37636,9571],{"class":768},[727,37638,37639],{"class":729,"line":1529},[727,37640,3554],{"class":768},[727,37642,37643,37645,37647,37649],{"class":729,"line":2178},[727,37644,9433],{"class":1986},[727,37646,9582],{"class":768},[727,37648,4970],{"class":1986},[727,37650,2391],{"class":768},[727,37652,37653,37655,37657,37659],{"class":729,"line":2187},[727,37654,9591],{"class":737},[727,37656,1995],{"class":768},[727,37658,9596],{"class":737},[727,37660,2427],{"class":768},[727,37662,37663,37665,37667,37669],{"class":729,"line":2533},[727,37664,9603],{"class":737},[727,37666,1995],{"class":768},[727,37668,9608],{"class":737},[727,37670,2427],{"class":768},[727,37672,37673,37675,37677,37679,37681,37683],{"class":729,"line":2551},[727,37674,9615],{"class":737},[727,37676,1995],{"class":768},[727,37678,9620],{"class":1882},[727,37680,44],{"class":768},[727,37682,9625],{"class":2376},[727,37684,9628],{"class":768},[727,37686,37687],{"class":729,"line":2559},[727,37688,9571],{"class":768},[727,37690,37691],{"class":729,"line":2565},[727,37692,3554],{"class":768},[727,37694,37695,37697],{"class":729,"line":2570},[727,37696,9641],{"class":1986},[727,37698,2391],{"class":768},[727,37700,37701,37703,37705,37707,37709,37711],{"class":729,"line":2591},[727,37702,8435],{"class":1986},[727,37704,9650],{"class":768},[727,37706,4970],{"class":1986},[727,37708,9655],{"class":768},[727,37710,9658],{"class":2376},[727,37712,9661],{"class":768},[727,37714,37715,37717,37719,37721,37723],{"class":729,"line":2603},[727,37716,9666],{"class":768},[727,37718,2597],{"class":2376},[727,37720,9671],{"class":768},[727,37722,9674],{"class":2376},[727,37724,9677],{"class":768},[727,37726,37727,37729,37731],{"class":729,"line":2615},[727,37728,9682],{"class":768},[727,37730,2609],{"class":1986},[727,37732,2612],{"class":768},[727,37734,37735,37737,37739,37741,37743,37745,37747,37749],{"class":729,"line":2630},[727,37736,9666],{"class":768},[727,37738,2597],{"class":2376},[727,37740,2542],{"class":768},[727,37742,9697],{"class":737},[727,37744,9700],{"class":1986},[727,37746,9703],{"class":768},[727,37748,8456],{"class":2376},[727,37750,9677],{"class":768},[727,37752,37753],{"class":729,"line":2636},[727,37754,9712],{"class":768},[727,37756,37757],{"class":729,"line":2642},[727,37758,2639],{"class":768},[592,37760],{"src":9719,"alt":9720},[639,37762,9724],{"id":9723},[11,37764],{},[14,37766,9729],{},[77,37768,37769],{},[555,37770,37771,37773,37775,37779],{},[83,37772,9736],{},[83,37774,9739],{},[83,37776,9742,37777,9746],{},[90,37778,9745],{},[83,37780,9749],{},[14,37782,9752],{},[21,37784,776],{"id":775},[11,37786],{},[14,37788,9759],{},[77,37790,37791],{},[555,37792,37793,37797],{},[83,37794,9766,37795,9770],{},[29,37796,9769],{},[83,37798,9773,37799,9777],{},[29,37800,9776],{},[592,37802],{"src":9780,"alt":9781},[21,37804,796],{"id":795},[11,37806],{},[14,37808,9788],{},[811,37810,9791],{},{"title":494,"searchDepth":495,"depth":495,"links":37812},[37813,37814,37819,37820],{"id":545,"depth":498,"text":546},{"id":9324,"depth":498,"text":9325,"children":37815},[37816,37817,37818],{"id":9333,"depth":495,"text":9334},{"id":9376,"depth":495,"text":9377},{"id":9723,"depth":495,"text":9724},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":827,"tags":37822,"platfrom":37823,"video":9806},[829,830],[7311],{"title":9278,"description":9802},{"id":10108,"title":10109,"body":37826,"date":523,"description":10214,"extension":506,"meta":37904,"navigation":522,"order":523,"path":10219,"seo":37907,"stem":10221,"__hash__":10222},{"type":8,"value":37827,"toc":37900},[37828,37830,37832,37834,37836,37840,37878,37880,37882,37884,37888,37892,37898],[11,37829],{},[14,37831,10116],{},[21,37833,10120],{"id":10119},[11,37835],{},[14,37837,10125,37838,10129],{},[90,37839,10128],{},[719,37841,37842],{"className":756,"code":10132,"language":758,"meta":494,"style":494},[90,37843,37844,37864,37874],{"__ignoreMap":494},[727,37845,37846,37848,37850,37852,37854,37856,37858,37860,37862],{"class":729,"line":730},[727,37847,10139],{"class":768},[727,37849,1857],{"class":2376},[727,37851,2542],{"class":768},[727,37853,10146],{"class":737},[727,37855,2004],{"class":768},[727,37857,10151],{"class":1986},[727,37859,10154],{"class":733},[727,37861,3207],{"class":1986},[727,37863,2391],{"class":768},[727,37865,37866,37868,37870,37872],{"class":729,"line":498},[727,37867,10163],{"class":1986},[727,37869,10166],{"class":768},[727,37871,10169],{"class":2376},[727,37873,2588],{"class":768},[727,37875,37876],{"class":729,"line":495},[727,37877,5051],{"class":768},[21,37879,10179],{"id":10178},[11,37881],{},[14,37883,10184],{},[14,37885,10187,37886,44],{},[322,37887,10191],{"href":10190},[8898,37889,37890],{},[14,37891,10196],{},[14,37893,10199,37894,10202,37896,10206],{},[322,37895,3639],{"href":6378},[322,37897,10205],{"href":380},[811,37899,10209],{},{"title":494,"searchDepth":495,"depth":495,"links":37901},[37902,37903],{"id":10119,"depth":498,"text":10120},{"id":10178,"depth":498,"text":10179},{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":1050,"tags":37905,"platfrom":37906},[7290,10217],[1757],{"title":10109,"description":10214},{"id":10675,"title":10676,"body":37909,"date":523,"description":10801,"extension":506,"meta":37994,"navigation":522,"order":523,"path":10805,"seo":37997,"stem":10807,"__hash__":10808},{"type":8,"value":37910,"toc":37989},[37911,37913,37917,37923,37925,37929,37931,37935,37971,37975,37979,37981],[11,37912],{},[14,37914,10683,37915,10687],{},[322,37916,10686],{"href":7600},[14,37918,10690,37919,450,37921,10697],{},[29,37920,10693],{},[29,37922,10696],{},[21,37924,10701],{"id":10700},[14,37926,10704,37927,10707],{},[29,37928,10686],{},[21,37930,10711],{"id":10710},[14,37932,10714,37933,10717],{},[29,37934,10686],{},[77,37936,37937],{},[80,37938,37939,37953],{},[83,37940,37941,37943],{},[29,37942,10726],{},[80,37944,37945],{},[83,37946,37947,132,37949,10735,37951,44],{},[90,37948,155],{},[29,37950,7257],{},[29,37952,10738],{},[83,37954,37955,37957],{},[29,37956,10743],{},[80,37958,37959],{},[83,37960,37961,5354,37963,10753,37965,10757,37967,10761,37969,10765],{},[90,37962,5353],{},[29,37964,10752],{},[90,37966,10756],{},[90,37968,10760],{},[29,37970,10764],{},[14,37972,10768,37973,10773],{},[322,37974,10772],{"href":10771},[14,37976,10776,37977,10780],{},[29,37978,10779],{},[21,37980,796],{"id":795},[14,37982,10785,37983,10788,37985,10795],{},[29,37984,3639],{},[29,37986,37987],{},[322,37988,10794],{"href":10793},{"title":494,"searchDepth":495,"depth":495,"links":37990},[37991,37992,37993],{"id":10700,"depth":498,"text":10701},{"id":10710,"depth":498,"text":10711},{"id":795,"depth":498,"text":796},{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":7308,"tags":37995,"platfrom":37996},[1055],[1757],{"title":10676,"description":10801},{"id":10810,"title":10811,"body":37999,"date":523,"description":11173,"extension":506,"meta":38265,"navigation":522,"order":523,"path":11177,"seo":38268,"stem":11179,"__hash__":11180},{"type":8,"value":38000,"toc":38247},[38001,38003,38005,38007,38009,38011,38013,38017,38019,38021,38055,38057,38061,38063,38065,38073,38077,38079,38137,38139,38141,38143,38147,38149,38151,38155,38157,38159,38193,38195,38215,38217,38225,38227,38229,38243,38245],[11,38002],{},[14,38004,10818],{},[14,38006,10821],{},[21,38008,10825],{"id":10824},[14,38010,10828],{},[21,38012,10832],{"id":10831},[14,38014,5070,38015,10838],{},[90,38016,10837],{},[592,38018],{"src":10841,"alt":10842},[639,38020,10846],{"id":10845},[77,38022,38023],{},[80,38024,38025],{},[83,38026,38027,88,38029,38031],{},[29,38028,349],{},[90,38030,10837],{},[80,38032,38033,38037,38041],{},[83,38034,38035,10863],{},[29,38036,223],{},[83,38038,38039,10868],{},[29,38040,233],{},[83,38042,38043,10874,38045],{},[29,38044,10873],{},[80,38046,38047,38051],{},[83,38048,38049,10882],{},[90,38050,10881],{},[83,38052,38053,10888],{},[90,38054,10887],{},[639,38056,10892],{"id":10891},[14,38058,10895,38059,10898],{},[90,38060,10837],{},[21,38062,10902],{"id":10901},[592,38064],{"src":10905,"alt":10906},[14,38066,5070,38067,10911,38069,10914,38071,10918],{},[90,38068,114],{},[344,38070],{},[29,38072,10917],{},[14,38074,10921,38075,10924],{},[90,38076,114],{},[639,38078,10928],{"id":10927},[77,38080,38081],{},[80,38082,38083,38099,38111,38123],{},[83,38084,38085,88,38087,38089],{},[29,38086,349],{},[90,38088,114],{},[80,38090,38091,38095],{},[83,38092,38093,10945],{},[29,38094,114],{},[83,38096,38097,10951],{},[29,38098,10950],{},[83,38100,38101,88,38103,38105],{},[29,38102,10956],{},[90,38104,10959],{},[80,38106,38107],{},[83,38108,10964,38109,5983],{},[90,38110,10967],{},[83,38112,38113,88,38115,38117],{},[29,38114,10972],{},[90,38116,10975],{},[80,38118,38119],{},[83,38120,10980,38121,5983],{},[90,38122,7555],{},[83,38124,38125,38127],{},[29,38126,10987],{},[80,38128,38129,38133],{},[83,38130,10992,38131,1230],{},[90,38132,114],{},[83,38134,10997,38135,44],{},[29,38136,11000],{},[639,38138,11004],{"id":11003},[14,38140,11007],{},[639,38142,10892],{"id":11010},[14,38144,11013,38145,11017],{},[29,38146,11016],{},[21,38148,11021],{"id":11020},[592,38150],{"src":11024,"alt":11025},[14,38152,11028,38153,11032],{},[90,38154,11031],{},[14,38156,11035],{},[639,38158,11039],{"id":11038},[77,38160,38161],{},[80,38162,38163],{},[83,38164,38165,88,38167,38169],{},[29,38166,349],{},[90,38168,11031],{},[80,38170,38171,38177,38183,38187],{},[83,38172,38173,11056,38175,1230],{},[29,38174,610],{},[90,38176,11031],{},[83,38178,38179,11064,38181,11067],{},[29,38180,11063],{},[90,38182,135],{},[83,38184,38185,11073],{},[29,38186,11072],{},[83,38188,38189,11079,38191,11082],{},[29,38190,11078],{},[90,38192,2972],{},[639,38194,11086],{"id":11085},[719,38196,38197],{"className":756,"code":11089,"language":758,"meta":494,"style":494},[90,38198,38199,38203,38207,38211],{"__ignoreMap":494},[727,38200,38201],{"class":729,"line":730},[727,38202,11096],{},[727,38204,38205],{"class":729,"line":498},[727,38206,11101],{},[727,38208,38209],{"class":729,"line":495},[727,38210,1898],{"emptyLinePlaceholder":522},[727,38212,38213],{"class":729,"line":1895},[727,38214,11110],{},[639,38216,10892],{"id":11113},[80,38218,38219,38221,38223],{},[83,38220,11118],{},[83,38222,11121],{},[83,38224,11124],{},[21,38226,11128],{"id":11127},[14,38228,11131],{},[80,38230,38231,38235,38239],{},[83,38232,11136,38233,11139],{},[90,38234,10837],{},[83,38236,11142,38237,11139],{},[90,38238,114],{},[83,38240,11147,38241,11139],{},[90,38242,11031],{},[14,38244,11152],{},[811,38246,4898],{},{"title":494,"searchDepth":495,"depth":495,"links":38248},[38249,38250,38254,38259,38264],{"id":10824,"depth":498,"text":10825},{"id":10831,"depth":498,"text":10832,"children":38251},[38252,38253],{"id":10845,"depth":495,"text":10846},{"id":10891,"depth":495,"text":10892},{"id":10901,"depth":498,"text":10902,"children":38255},[38256,38257,38258],{"id":10927,"depth":495,"text":10928},{"id":11003,"depth":495,"text":11004},{"id":11010,"depth":495,"text":10892},{"id":11020,"depth":498,"text":11021,"children":38260},[38261,38262,38263],{"id":11038,"depth":495,"text":11039},{"id":11085,"depth":495,"text":11086},{"id":11113,"depth":495,"text":10892},{"id":11127,"depth":498,"text":11128},{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":827,"tags":38266,"platfrom":38267},[1838],[1757],{"title":10811,"description":11173},{"id":11182,"title":11183,"body":38270,"date":523,"description":11528,"extension":506,"meta":38552,"navigation":522,"order":523,"path":11535,"seo":38555,"stem":11537,"__hash__":11538},{"type":8,"value":38271,"toc":38547},[38272,38274,38278],[11,38273],{},[14,38275,11190,38276,11195],{},[322,38277,11194],{"href":11193},[11197,38279,38280,38282,38284,38314,38316,38325,38533,38541,38543],{},[21,38281,11202],{"id":11201},[14,38283,11205],{},[7092,38285,38286,38294],{},[7095,38287,38288],{},[7098,38289,38290,38292],{},[7101,38291,3548],{},[7101,38293,11216],{},[7108,38295,38296,38305],{},[7098,38297,38298,38303],{},[7113,38299,38300],{},[322,38301,11225],{"href":11225,"rel":38302},[2245],[7113,38304,11229],{},[7098,38306,38307,38312],{},[7113,38308,38309],{},[322,38310,11236],{"href":11236,"rel":38311},[2245],[7113,38313,11240],{},[21,38315,7133],{"id":7132},[14,38317,11245,38318,11250,38321,7142,38323,11256],{},[322,38319,3435],{"href":11248,"rel":38320},[2245],[29,38322,7141],{},[29,38324,11255],{},[77,38326,38327],{},[80,38328,38329,38357],{},[83,38330,38331,88,38333,38335],{},[29,38332,349],{},[90,38334,92],{},[80,38336,38337,38341,38345,38351],{},[83,38338,38339,100],{},[90,38340,99],{},[83,38342,38343,7975],{},[90,38344,105],{},[83,38346,38347,11281,38349,44],{},[90,38348,7182],{},[90,38350,7186],{},[83,38352,38353,11288,38355,44],{},[90,38354,5267],{},[90,38356,7194],{},[83,38358,38359,88,38361,38363,38373],{},[29,38360,908],{},[90,38362,114],{},[80,38364,38365],{},[83,38366,38367,132,38369,136,38371,44],{},[90,38368,114],{},[90,38370,194],{},[90,38372,139],{},[80,38374,38375,38389,38403,38505],{},[83,38376,38377,88,38379,38381],{},[29,38378,917],{},[90,38380,11315],{},[80,38382,38383],{},[83,38384,38385,132,38387,11324],{},[90,38386,131],{},[90,38388,194],{},[83,38390,38391,88,38393,38395],{},[29,38392,935],{},[90,38394,148],{},[80,38396,38397],{},[83,38398,38399,11337,38401,11342],{},[90,38400,155],{},[322,38402,11341],{"href":11340},[83,38404,38405,88,38407,38409,38427],{},[29,38406,943],{},[90,38408,11349],{},[80,38410,38411,38417,38423],{},[83,38412,38413,261,38415,44],{},[90,38414,6281],{},[90,38416,198],{},[83,38418,38419,11362,38421,11366],{},[90,38420,6296],{},[90,38422,11365],{},[83,38424,38425,11372],{},[90,38426,11371],{},[80,38428,38429,38447,38453,38471,38477,38493],{},[83,38430,38431,88,38433,38435],{},[29,38432,11379],{},[90,38434,11382],{},[80,38436,38437,38441],{},[83,38438,38439,11389],{},[90,38440,155],{},[83,38442,38443,162,38445,11397],{},[90,38444,11394],{},[90,38446,3651],{},[83,38448,38449,88,38451,10297],{},[29,38450,11402],{},[90,38452,11405],{},[83,38454,38455,88,38457,38459],{},[29,38456,11410],{},[90,38458,11413],{},[80,38460,38461,38465],{},[83,38462,38463,11420],{},[90,38464,155],{},[83,38466,38467,162,38469,11397],{},[90,38468,11394],{},[90,38470,3651],{},[83,38472,38473,88,38475,10297],{},[29,38474,11431],{},[90,38476,11434],{},[83,38478,38479,88,38481,38483],{},[29,38480,11439],{},[90,38482,11442],{},[80,38484,38485],{},[83,38486,38487,132,38489,11451,38491,11454],{},[90,38488,953],{},[90,38490,194],{},[90,38492,139],{},[83,38494,38495,88,38497,38499],{},[29,38496,11459],{},[90,38498,11462],{},[80,38500,38501],{},[83,38502,38503,11469],{},[90,38504,5357],{},[83,38506,38507,88,38509,38511],{},[29,38508,959],{},[90,38510,281],{},[80,38512,38513,38517,38521,38527],{},[83,38514,38515,100],{},[90,38516,99],{},[83,38518,38519,7975],{},[90,38520,105],{},[83,38522,38523,11491,38525,44],{},[90,38524,11490],{},[90,38526,165],{},[83,38528,38529,11491,38531,44],{},[90,38530,11498],{},[90,38532,165],{},[14,38534,11503,38535,401,38537,11509,38539,11513],{},[90,38536,11506],{},[90,38538,7194],{},[90,38540,11512],{},[21,38542,796],{"id":795},[14,38544,11518,38545,11522],{},[322,38546,11521],{"href":11193},{"title":494,"searchDepth":495,"depth":495,"links":38548},[38549,38550,38551],{"id":11201,"depth":498,"text":11202},{"id":7132,"depth":498,"text":7133},{"id":795,"depth":498,"text":796},{"pinned":522,"type":513,"format":77,"intent_type":11530,"intent":1050,"tags":38553,"platfrom":38554},[11532,1053],[11534],{"title":11183,"description":11528},{"id":11540,"title":11541,"body":38557,"date":523,"description":11548,"extension":506,"meta":38777,"navigation":522,"order":523,"path":11826,"seo":38780,"stem":11828,"__hash__":11829},{"type":8,"value":38558,"toc":38770},[38559,38561,38563,38565,38567,38569,38571,38573,38575,38577,38579,38587,38589,38593,38598,38603,38608,38613,38615,38617,38619,38741,38743,38745,38747,38749,38766,38768],[11,38560],{},[14,38562,11548],{},[14,38564,11551],{},[14,38566,11554],{},[21,38568,11558],{"id":11557},[14,38570,11561],{},[14,38572,11564],{},[592,38574],{"src":11567,"alt":11568},[21,38576,11572],{"id":11571},[14,38578,11575],{},[80,38580,38581,38583,38585],{},[83,38582,11580],{},[83,38584,11583],{},[83,38586,11586],{},[21,38588,11590],{"id":11589},[14,38590,11593,38591,11597],{},[322,38592,11596],{"href":494},[14,38594,11600,38595,11606],{},[322,38596,11605],{"href":11603,"rel":38597},[2245],[14,38599,11609,38600,11615],{},[322,38601,11614],{"href":11612,"rel":38602},[2245],[14,38604,11618,38605,11624],{},[322,38606,11623],{"href":11621,"rel":38607},[2245],[14,38609,11627,38610,11632],{},[322,38611,11631],{"href":11603,"rel":38612},[2245],[592,38614],{"src":11635,"alt":11636},[21,38616,11640],{"id":11639},[14,38618,11643],{},[77,38620,38621],{},[80,38622,38623,38649],{},[83,38624,38625,88,38627,38629],{},[29,38626,349],{},[90,38628,92],{},[80,38630,38631,38635,38639,38645],{},[83,38632,38633,100],{},[90,38634,99],{},[83,38636,38637,7975],{},[90,38638,105],{},[83,38640,38641,11281,38643,44],{},[90,38642,7182],{},[90,38644,7186],{},[83,38646,38647,11674],{},[90,38648,5267],{},[83,38650,38651,88,38653,38655,38665],{},[29,38652,908],{},[90,38654,114],{},[80,38656,38657],{},[83,38658,38659,132,38661,136,38663,44],{},[90,38660,114],{},[90,38662,194],{},[90,38664,139],{},[80,38666,38667,38687,38703],{},[83,38668,38669,88,38671,38673],{},[29,38670,917],{},[90,38672,11699],{},[80,38674,38675,38681],{},[83,38676,38677,11707,38679,44],{},[90,38678,11706],{},[90,38680,11710],{},[83,38682,38683,132,38685,11717],{},[90,38684,465],{},[90,38686,194],{},[83,38688,38689,88,38691,38693],{},[29,38690,935],{},[90,38692,11724],{},[80,38694,38695],{},[83,38696,38697,132,38699,11733,38701,1230],{},[90,38698,465],{},[90,38700,194],{},[90,38702,11699],{},[83,38704,38705,88,38707,38709,38719],{},[29,38706,943],{},[90,38708,11742],{},[80,38710,38711],{},[83,38712,38713,132,38715,11733,38717,1230],{},[90,38714,114],{},[90,38716,194],{},[90,38718,11724],{},[80,38720,38721],{},[83,38722,38723,88,38725,38727],{},[29,38724,11379],{},[90,38726,3639],{},[80,38728,38729,38733],{},[83,38730,38731,11767],{},[90,38732,155],{},[83,38734,38735,162,38737,11774,38739,11777],{},[90,38736,11394],{},[90,38738,3651],{},[90,38740,11724],{},[14,38742,11780],{},[21,38744,796],{"id":795},[14,38746,11785],{},[14,38748,11788],{},[80,38750,38751,38756,38761],{},[83,38752,38753],{},[322,38754,11796],{"href":11612,"rel":38755},[2245],[83,38757,38758],{},[322,38759,11802],{"href":11621,"rel":38760},[2245],[83,38762,38763],{},[322,38764,11808],{"href":11603,"rel":38765},[2245],[14,38767,11811],{},[14,38769,11814],{},{"title":494,"searchDepth":495,"depth":495,"links":38771},[38772,38773,38774,38775,38776],{"id":11557,"depth":498,"text":11558},{"id":11571,"depth":498,"text":11572},{"id":11589,"depth":498,"text":11590},{"id":11639,"depth":498,"text":11640},{"id":795,"depth":498,"text":796},{"pinned":522,"metaTitle":11823,"type":513,"format":77,"intent_type":1754,"intent":827,"tags":38778,"platfrom":38779},[1055],[1757],{"title":11541,"description":11548},{"id":11831,"title":11832,"body":38782,"date":523,"description":12117,"extension":506,"meta":39024,"navigation":522,"order":523,"path":12122,"seo":39027,"stem":12124,"__hash__":12125},{"type":8,"value":38783,"toc":39019},[38784,38786,38788,38802,38804,38806,38808,38836,38838,38840,38849,39007,39011,39013,39015],[11,38785],{},[592,38787],{"src":11839,"alt":11840},[14,38789,11843,38790,3893,38792,195,38794,11854,38796,11858,38798,11862,38800,11866],{},[322,38791,11847],{"href":11846},[29,38793,11850],{},[29,38795,11853],{},[29,38797,11857],{},[29,38799,11861],{},[322,38801,11808],{"href":11865},[21,38803,11202],{"id":11201},[11,38805],{},[14,38807,11873],{},[7092,38809,38810,38818],{},[7095,38811,38812],{},[7098,38813,38814,38816],{},[7101,38815,3548],{},[7101,38817,11216],{},[7108,38819,38820,38828],{},[7098,38821,38822,38826],{},[7113,38823,38824],{},[322,38825,11893],{"href":11892},[7113,38827,11896],{},[7098,38829,38830,38834],{},[7113,38831,38832],{},[322,38833,11904],{"href":11903},[7113,38835,11896],{},[21,38837,7133],{"id":7132},[11,38839],{},[14,38841,11245,38842,11250,38845,7142,38847,11256],{},[322,38843,3435],{"href":11915,"rel":38844},[2245],[29,38846,7141],{},[29,38848,11255],{},[77,38850,38851],{},[80,38852,38853,38881,38893],{},[83,38854,38855,88,38857,38859],{},[29,38856,349],{},[90,38858,92],{},[80,38860,38861,38865,38869,38875],{},[83,38862,38863,100],{},[90,38864,99],{},[83,38866,38867,7975],{},[90,38868,105],{},[83,38870,38871,11945,38873,44],{},[90,38872,7182],{},[90,38874,7186],{},[83,38876,38877,11952,38879,44],{},[90,38878,5267],{},[90,38880,7194],{},[83,38882,38883,88,38885,38887],{},[29,38884,908],{},[90,38886,11961],{},[80,38888,38889],{},[83,38890,38891,11968],{},[90,38892,131],{},[83,38894,38895,88,38897,38899,38909],{},[29,38896,9029],{},[90,38898,114],{},[80,38900,38901],{},[83,38902,38903,132,38905,136,38907,44],{},[90,38904,114],{},[90,38906,194],{},[90,38908,139],{},[80,38910,38911,38929,38943,38955,38967,38979],{},[83,38912,38913,88,38915,38917],{},[29,38914,9038],{},[90,38916,11993],{},[80,38918,38919,38923],{},[83,38920,38921,12000],{},[90,38922,155],{},[83,38924,38925,12005,38927,44],{},[90,38926,953],{},[90,38928,12008],{},[83,38930,38931,88,38933,38935],{},[29,38932,9046],{},[90,38934,12015],{},[80,38936,38937],{},[83,38938,38939,132,38941,12024],{},[90,38940,953],{},[90,38942,194],{},[83,38944,38945,88,38947,38949],{},[29,38946,9062],{},[90,38948,12031],{},[80,38950,38951],{},[83,38952,38953,12038],{},[90,38954,155],{},[83,38956,38957,88,38959,38961],{},[29,38958,9070],{},[90,38960,12045],{},[80,38962,38963],{},[83,38964,38965,12052],{},[90,38966,155],{},[83,38968,38969,88,38971,38973],{},[29,38970,12057],{},[90,38972,12060],{},[80,38974,38975],{},[83,38976,38977,12067],{},[90,38978,155],{},[83,38980,38981,88,38983,38985],{},[29,38982,9212],{},[90,38984,281],{},[80,38986,38987,38991,38995,39001],{},[83,38988,38989,100],{},[90,38990,99],{},[83,38992,38993,7975],{},[90,38994,105],{},[83,38996,38997,162,38999,44],{},[90,38998,11490],{},[90,39000,165],{},[83,39002,39003,162,39005,44],{},[90,39004,11498],{},[90,39006,165],{},[14,39008,12098,39009,12101],{},[90,39010,5267],{},[21,39012,796],{"id":795},[11,39014],{},[14,39016,12108,39017,44],{},[322,39018,12111],{"href":7289},{"title":494,"searchDepth":495,"depth":495,"links":39020},[39021,39022,39023],{"id":11201,"depth":498,"text":11202},{"id":7132,"depth":498,"text":7133},{"id":795,"depth":498,"text":796},{"type":513,"format":77,"intent_type":1049,"intent":827,"tags":39025,"platfrom":39026},[1055],[12121],{"title":11832,"description":12117},{"id":12127,"title":12128,"body":39029,"date":523,"description":12687,"extension":506,"meta":39471,"navigation":522,"order":523,"path":12691,"seo":39474,"stem":12693,"__hash__":12694},{"type":8,"value":39030,"toc":39460},[39031,39033,39038,39045,39047,39049,39069,39071,39073,39096,39098,39126,39128,39130,39132,39155,39157,39173,39175,39215,39217,39223,39227,39229,39231,39233,39238,39263,39265,39269,39271,39273,39310,39312,39404,39410,39450,39452,39454,39458],[11,39032],{},[14,39034,39035,12140],{},[322,39036,12139],{"href":12137,"rel":39037},[2245],[14,39039,12143,39040,12146,39042,12150],{},[322,39041,3341],{"href":3340},[322,39043,12139],{"href":12137,"rel":39044},[2245],[21,39046,546],{"id":545},[14,39048,551],{},[77,39050,39051],{},[555,39052,39053,39059,39063],{},[83,39054,39055,12163,39057,44],{},[29,39056,561],{},[322,39058,566],{"href":565},[83,39060,39061,12170],{},[29,39062,571],{},[83,39064,39065,12175,39067,44],{},[29,39066,577],{},[90,39068,581],{},[21,39070,12181],{"id":12180},[14,39072,12184],{},[77,39074,39075],{},[555,39076,39077,39084,39088,39092],{},[83,39078,39079,12194,39081,12199],{},[29,39080,12193],{},[322,39082,12198],{"href":12137,"rel":39083},[2245],[83,39085,39086,12205],{},[29,39087,12204],{},[83,39089,39090,12211],{},[29,39091,12210],{},[83,39093,39094,12216],{},[29,39095,620],{},[14,39097,12219],{},[77,39099,39100],{},[80,39101,39102,39108,39114,39120],{},[83,39103,39104,578,39106,44],{},[29,39105,3922],{},[90,39107,581],{},[83,39109,39110,162,39112,44],{},[29,39111,12234],{},[90,39113,627],{},[83,39115,39116,162,39118,44],{},[29,39117,12241],{},[90,39119,8859],{},[83,39121,39122,12248,39124,12252],{},[29,39123,632],{},[322,39125,12251],{"href":6720},[592,39127],{"src":12255,"alt":12256},[21,39129,12260],{"id":12259},[14,39131,12263],{},[77,39133,39134],{},[555,39135,39136,39143,39147,39151],{},[83,39137,39138,12194,39140,12199],{},[29,39139,12193],{},[322,39141,12198],{"href":12137,"rel":39142},[2245],[83,39144,39145,12279],{},[29,39146,12204],{},[83,39148,39149,12284],{},[29,39150,12210],{},[83,39152,39153,12290],{},[29,39154,12289],{},[14,39156,12293],{},[77,39158,39159],{},[555,39160,39161,39165,39169],{"start":1901},[83,39162,39163,12303],{},[29,39164,12302],{},[83,39166,39167,12309],{},[29,39168,12308],{},[83,39170,39171,12315],{},[29,39172,12314],{},[14,39174,12318],{},[719,39176,39177],{"className":7732,"code":12321,"language":2585,"meta":494,"style":494},[90,39178,39179,39183,39193,39203,39211],{"__ignoreMap":494},[727,39180,39181],{"class":729,"line":730},[727,39182,7740],{"class":768},[727,39184,39185,39187,39189,39191],{"class":729,"line":498},[727,39186,12332],{"class":7745},[727,39188,1995],{"class":768},[727,39190,12337],{"class":737},[727,39192,2427],{"class":768},[727,39194,39195,39197,39199,39201],{"class":729,"line":495},[727,39196,12344],{"class":7745},[727,39198,1995],{"class":768},[727,39200,12349],{"class":737},[727,39202,2427],{"class":768},[727,39204,39205,39207,39209],{"class":729,"line":1895},[727,39206,12356],{"class":7745},[727,39208,1995],{"class":768},[727,39210,12361],{"class":737},[727,39212,39213],{"class":729,"line":1901},[727,39214,2639],{"class":768},[21,39216,776],{"id":775},[14,39218,12370,39219,12375],{},[29,39220,39221],{},[322,39222,792],{"href":791},[14,39224,12378,39225,12381],{},[29,39226,784],{},[21,39228,6725],{"id":6724},[14,39230,12386],{},[639,39232,12390],{"id":12389},[14,39234,12393,39235,12399],{},[322,39236,12398],{"href":12396,"rel":39237},[2245],[77,39239,39240],{},[555,39241,39242,39249,39253,39259],{},[83,39243,39244,12194,39246,12199],{},[29,39245,12193],{},[322,39247,12198],{"href":12137,"rel":39248},[2245],[83,39250,39251,12415],{},[29,39252,12204],{},[83,39254,39255,12420,39257,44],{},[29,39256,12210],{},[322,39258,12181],{"href":12423},[83,39260,39261,12429],{},[29,39262,12428],{},[592,39264],{"src":12432,"alt":12256},[14,39266,12435,39267,44],{},[322,39268,12439],{"href":12438},[639,39270,12443],{"id":12442},[14,39272,12446],{},[77,39274,39275],{},[555,39276,39277,39284,39288,39292,39296,39302,39306],{},[83,39278,39279,12194,39281,12199],{},[29,39280,12193],{},[322,39282,12198],{"href":12137,"rel":39283},[2245],[83,39285,39286,12279],{},[29,39287,12204],{},[83,39289,39290,12466],{},[29,39291,12210],{},[83,39293,39294,12471],{},[29,39295,620],{},[83,39297,39298,12477,39300,12481],{},[29,39299,12476],{},[90,39301,12480],{},[83,39303,39304,12487],{},[29,39305,12486],{},[83,39307,39308,12492],{},[29,39309,12428],{},[14,39311,12495],{},[719,39313,39314],{"className":12498,"code":12499,"language":12500,"meta":494,"style":494},[90,39315,39316,39320,39336,39340,39344,39352,39356,39360],{"__ignoreMap":494},[727,39317,39318],{"class":729,"line":730},[727,39319,12507],{"class":2920},[727,39321,39322,39324,39326,39328,39330,39332,39334],{"class":729,"line":498},[727,39323,12512],{"class":1986},[727,39325,9527],{"class":768},[727,39327,4970],{"class":1986},[727,39329,12519],{"class":1882},[727,39331,44],{"class":768},[727,39333,12524],{"class":2376},[727,39335,12527],{"class":768},[727,39337,39338],{"class":729,"line":495},[727,39339,1898],{"emptyLinePlaceholder":522},[727,39341,39342],{"class":729,"line":1895},[727,39343,12536],{"class":2920},[727,39345,39346,39348,39350],{"class":729,"line":1901},[727,39347,12541],{"class":768},[727,39349,12544],{"class":2376},[727,39351,12547],{"class":768},[727,39353,39354],{"class":729,"line":1973},[727,39355,1898],{"emptyLinePlaceholder":522},[727,39357,39358],{"class":729,"line":2052},[727,39359,12556],{"class":2920},[727,39361,39362,39364,39366,39368,39370,39372,39374,39376,39378,39380,39382,39384,39386,39388,39390,39392,39394,39396,39398,39400,39402],{"class":729,"line":2058},[727,39363,12541],{"class":768},[727,39365,12563],{"class":2376},[727,39367,2542],{"class":768},[727,39369,12568],{"class":737},[727,39371,12571],{"class":768},[727,39373,44],{"class":737},[727,39375,12576],{"class":768},[727,39377,12579],{"class":737},[727,39379,12582],{"class":1986},[727,39381,12585],{"class":737},[727,39383,12571],{"class":768},[727,39385,44],{"class":737},[727,39387,12592],{"class":768},[727,39389,12579],{"class":737},[727,39391,12582],{"class":1986},[727,39393,12599],{"class":737},[727,39395,12571],{"class":768},[727,39397,44],{"class":737},[727,39399,12606],{"class":768},[727,39401,2448],{"class":737},[727,39403,12611],{"class":768},[14,39405,12614,39406,12618,39408,12622],{},[29,39407,12617],{},[90,39409,12621],{},[719,39411,39412],{"className":7732,"code":12321,"language":2585,"meta":494,"style":494},[90,39413,39414,39418,39428,39438,39446],{"__ignoreMap":494},[727,39415,39416],{"class":729,"line":730},[727,39417,7740],{"class":768},[727,39419,39420,39422,39424,39426],{"class":729,"line":498},[727,39421,12332],{"class":7745},[727,39423,1995],{"class":768},[727,39425,12337],{"class":737},[727,39427,2427],{"class":768},[727,39429,39430,39432,39434,39436],{"class":729,"line":495},[727,39431,12344],{"class":7745},[727,39433,1995],{"class":768},[727,39435,12349],{"class":737},[727,39437,2427],{"class":768},[727,39439,39440,39442,39444],{"class":729,"line":1895},[727,39441,12356],{"class":7745},[727,39443,1995],{"class":768},[727,39445,12361],{"class":737},[727,39447,39448],{"class":729,"line":1901},[727,39449,2639],{"class":768},[21,39451,796],{"id":795},[14,39453,12667],{},[14,39455,39456],{},[807,39457,12672],{},[811,39459,12675],{},{"title":494,"searchDepth":495,"depth":495,"links":39461},[39462,39463,39464,39465,39466,39470],{"id":545,"depth":498,"text":546},{"id":12180,"depth":498,"text":12181},{"id":12259,"depth":498,"text":12260},{"id":775,"depth":498,"text":776},{"id":6724,"depth":498,"text":6725,"children":39467},[39468,39469],{"id":12389,"depth":495,"text":12390},{"id":12442,"depth":495,"text":12443},{"id":795,"depth":498,"text":796},{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":827,"tags":39472,"platfrom":39473},[829,830],[12139],{"title":12128,"description":12687},{"id":12696,"title":12697,"body":39476,"date":523,"description":12760,"extension":506,"meta":39510,"navigation":522,"order":523,"path":324,"seo":39511,"stem":12763,"__hash__":12764},{"type":8,"value":39477,"toc":39508},[39478,39480,39482,39496,39498,39502,39505],[12701,39479],{"description":12703,"headline":12704},[12706,39481],{},[12709,39483,39484,39488,39492],{},[514,39485,39486],{"v-slot:ColOne":494},[12714,39487],{"link":12716,"shape":12717,"text":12718,"title":12719},[514,39489,39490],{"v-slot:ColTwo":494},[12714,39491],{"link":12724,"shape":12725,"text":12726,"title":12727},[514,39493,39494],{"v-slot:ColThree":494},[12714,39495],{"link":12732,"shape":12725,"text":12733,"title":12734},[12736,39497],{},[12739,39499,39500],{"bg":12741,"color":12742},[12744,39501],{"author":12746,"quote":12747},[12749,39503],{"className":39504},[12752,12753],[12755,39506],{"className":39507},[12752,12753],{"title":494,"searchDepth":495,"depth":495,"links":39509},[],{},{"title":12697,"description":12760},{"id":13873,"title":13874,"body":39513,"date":523,"description":14358,"extension":506,"meta":39896,"navigation":522,"order":523,"path":14366,"seo":39899,"stem":14368,"__hash__":14369},{"type":8,"value":39514,"toc":39888},[39515,39517,39519,39521,39523,39527,39529,39531,39540,39542,39544,39546,39554,39556,39564,39566,39568,39570,39582,39584,39586,39588,39590,39862,39864,39866,39868,39870,39872,39882,39884,39886],[11,39516],{},[14,39518,13881],{},[14,39520,13884],{},[14,39522,13887],{},[14,39524,13890,39525,13894],{},[29,39526,13893],{},[21,39528,13898],{"id":13897},[11,39530],{},[14,39532,13903,39533,39535,44],{},[344,39534],{},[29,39536,39537],{},[322,39538,13912],{"href":13910,"rel":39539},[2245],[14,39541,13915],{},[21,39543,13919],{"id":13918},[11,39545],{},[14,39547,13924,39548,13928,39550,450,39552,44],{},[29,39549,13927],{},[807,39551,13927],{},[807,39553,13933],{},[14,39555,13936],{},[80,39557,39558,39560,39562],{},[83,39559,13941],{},[83,39561,13944],{},[83,39563,13947],{},[14,39565,13950],{},[21,39567,13954],{"id":13953},[11,39569],{},[77,39571,39572],{},[555,39573,39574,39576,39578],{},[83,39575,13963],{},[83,39577,13966],{},[83,39579,13969,39580,13973],{},[29,39581,13972],{},[14,39583,13976],{},[21,39585,13980],{"id":13979},[11,39587],{},[14,39589,13985],{},[77,39591,39592],{},[80,39593,39594,39612,39624,39644,39666,39684,39704],{},[83,39595,39596,88,39598,39600],{},[29,39597,349],{},[90,39599,13996],{},[80,39601,39602,39608],{},[83,39603,39604,14003,39606,9482],{},[29,39605,99],{},[90,39607,13927],{},[83,39609,39610,14010],{},[29,39611,10950],{},[83,39613,39614,88,39616,39618],{},[29,39615,908],{},[90,39617,7555],{},[80,39619,39620],{},[83,39621,39622,14023],{},[29,39623,10950],{},[83,39625,39626,88,39628,39630],{},[29,39627,9029],{},[90,39629,13474],{},[80,39631,39632,39636,39640],{},[83,39633,39634,14036],{},[29,39635,3922],{},[83,39637,39638,14041],{},[29,39639,155],{},[83,39641,39642,14046],{},[29,39643,10950],{},[83,39645,39646,88,39648,39650],{},[29,39647,14051],{},[90,39649,3303],{},[80,39651,39652,39658,39662],{},[83,39653,39654,14003,39656,9482],{},[29,39655,99],{},[90,39657,13927],{},[83,39659,39660,14066],{},[29,39661,260],{},[83,39663,39664,14071],{},[29,39665,10950],{},[83,39667,39668,88,39670,39672],{},[29,39669,14076],{},[90,39671,92],{},[80,39673,39674,39680],{},[83,39675,39676,14003,39678,9482],{},[29,39677,99],{},[90,39679,13927],{},[83,39681,39682,14091],{},[29,39683,10950],{},[83,39685,39686,88,39688,39690],{},[29,39687,14096],{},[90,39689,14099],{},[80,39691,39692,39696,39700],{},[83,39693,39694,14106],{},[29,39695,465],{},[83,39697,39698,14112],{},[29,39699,14111],{},[83,39701,39702,14117],{},[29,39703,10950],{},[83,39705,39706,88,39708,39710,39720],{},[29,39707,14122],{},[90,39709,114],{},[80,39711,39712,39716],{},[83,39713,39714,14131],{},[29,39715,465],{},[83,39717,39718,14137],{},[29,39719,14136],{},[80,39721,39722,39738,39754,39778],{},[83,39723,39724,88,39726,39728],{},[29,39725,14144],{},[90,39727,124],{},[80,39729,39730,39734],{},[83,39731,39732,14153],{},[29,39733,131],{},[83,39735,39736,14158],{},[29,39737,10950],{},[83,39739,39740,88,39742,39744],{},[29,39741,14163],{},[90,39743,14166],{},[80,39745,39746,39750],{},[83,39747,39748,14173],{},[29,39749,155],{},[83,39751,39752,14178],{},[29,39753,10950],{},[83,39755,39756,88,39758,39760],{},[29,39757,14183],{},[90,39759,173],{},[80,39761,39762,39766,39774],{},[83,39763,39764,14193],{},[29,39765,14192],{},[83,39767,39768,14198,39770,3289,39772,44],{},[29,39769,186],{},[90,39771,14201],{},[90,39773,14204],{},[83,39775,39776,14209],{},[29,39777,10950],{},[83,39779,39780,88,39782,39784,39802],{},[29,39781,14214],{},[90,39783,14217],{},[80,39785,39786,39792,39798],{},[83,39787,39788,14224,39790],{},[29,39789,6281],{},[90,39791,14227],{},[83,39793,39794,14233,39796,14237],{},[29,39795,14232],{},[90,39797,14236],{},[83,39799,39800,14242],{},[29,39801,10950],{},[80,39803,39804,39824,39838],{},[83,39805,39806,88,39808,39810],{},[29,39807,14249],{},[90,39809,10837],{},[80,39811,39812,39816,39820],{},[83,39813,39814,14258],{},[29,39815,223],{},[83,39817,39818,14263],{},[29,39819,233],{},[83,39821,39822,14268],{},[29,39823,10950],{},[83,39825,39826,88,39828,88,39830,39832],{},[29,39827,14273],{},[90,39829,10837],{},[807,39831,14278],{},[80,39833,39834],{},[83,39835,39836,14285],{},[29,39837,10950],{},[83,39839,39840,88,39842,39844],{},[29,39841,14290],{},[90,39843,3303],{},[80,39845,39846,39852,39856],{},[83,39847,39848,14003,39850,9482],{},[29,39849,99],{},[90,39851,13933],{},[83,39853,39854,14305],{},[29,39855,260],{},[83,39857,39858,14310,39860,44],{},[29,39859,10950],{},[90,39861,14236],{},[592,39863],{"src":14315,"alt":14316},[21,39865,14320],{"id":14319},[11,39867],{},[14,39869,14325],{},[14,39871,14328],{},[80,39873,39874,39876,39878,39880],{},[83,39875,14333],{},[83,39877,14336],{},[83,39879,14339],{},[83,39881,14342],{},[21,39883,796],{"id":795},[11,39885],{},[14,39887,14349],{},{"title":494,"searchDepth":495,"depth":495,"links":39889},[39890,39891,39892,39893,39894,39895],{"id":13897,"depth":498,"text":13898},{"id":13918,"depth":498,"text":13919},{"id":13953,"depth":498,"text":13954},{"id":13979,"depth":498,"text":13980},{"id":14319,"depth":498,"text":14320},{"id":795,"depth":498,"text":796},{"pinned":522,"type":513,"format":77,"intent_type":11530,"intent":14360,"tags":39897,"platfrom":39898},[518,14362,14363,519,1055,1056],[14365],{"title":13874,"description":14358},{"id":14371,"title":14372,"body":39901,"date":523,"description":14506,"extension":506,"meta":40003,"navigation":522,"order":523,"path":10771,"seo":40006,"stem":14515,"__hash__":14516},{"type":8,"value":39902,"toc":39997},[39903,39905,39907,39911,39913,39915,39919,39921,39923,39989,39991,39993,39995],[11,39904],{},[14,39906,14379],{},[14,39908,14382,39909,14385],{},[29,39910,10696],{},[592,39912],{"src":14388,"alt":14389},[21,39914,14393],{"id":14392},[14,39916,14396,39917,14399],{},[29,39918,10696],{},[592,39920],{"src":14402,"alt":14403},[21,39922,14407],{"id":14406},[7092,39924,39925,39933],{},[7095,39926,39927],{},[7098,39928,39929,39931],{},[7101,39930,14416],{},[7101,39932,6725],{},[7108,39934,39935,39941,39947,39953,39959,39965,39971,39977,39983],{},[7098,39936,39937,39939],{},[7113,39938,14425],{},[7113,39940,14428],{},[7098,39942,39943,39945],{},[7113,39944,14433],{},[7113,39946,14436],{},[7098,39948,39949,39951],{},[7113,39950,5361],{},[7113,39952,14443],{},[7098,39954,39955,39957],{},[7113,39956,5361],{},[7113,39958,14450],{},[7098,39960,39961,39963],{},[7113,39962,5361],{},[7113,39964,14457],{},[7098,39966,39967,39969],{},[7113,39968,8052],{},[7113,39970,14464],{},[7098,39972,39973,39975],{},[7113,39974,8052],{},[7113,39976,14471],{},[7098,39978,39979,39981],{},[7113,39980,14476],{},[7113,39982,14479],{},[7098,39984,39985,39987],{},[7113,39986,14484],{},[7113,39988,14487],{},[21,39990,14491],{"id":14490},[14,39992,14494],{},[21,39994,796],{"id":795},[14,39996,14499],{},{"title":494,"searchDepth":495,"depth":495,"links":39998},[39999,40000,40001,40002],{"id":14392,"depth":498,"text":14393},{"id":14406,"depth":498,"text":14407},{"id":14490,"depth":498,"text":14491},{"id":795,"depth":498,"text":796},{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":1050,"tags":40004,"platfrom":40005},[7290,14509,734,14510,14511,14512],[1757],{"title":14372,"description":14506},{"id":14518,"title":14519,"body":40008,"date":523,"description":14683,"extension":506,"meta":40143,"navigation":522,"order":523,"path":14687,"seo":40146,"stem":14689,"__hash__":14690},{"type":8,"value":40009,"toc":40137},[40010,40012,40017,40019,40021,40023,40025,40045,40047,40049,40051,40053,40101,40103,40119,40121,40123,40125,40129,40131,40133,40135],[11,40011],{},[14,40013,40014,14531],{},[322,40015,14530],{"href":14528,"rel":40016},[2245],[21,40018,546],{"id":545},[11,40020],{},[14,40022,14538],{},[14,40024,14541],{},[77,40026,40027],{},[555,40028,40029,40035,40039],{},[83,40030,40031,562,40033,44],{},[29,40032,561],{},[322,40034,566],{"href":565},[83,40036,40037,14556],{},[29,40038,571],{},[83,40040,40041,578,40043,44],{},[29,40042,577],{},[90,40044,581],{},[21,40046,14566],{"id":14565},[11,40048],{},[14,40050,14571],{},[14,40052,14574],{},[77,40054,40055,40073,40093],{},[80,40056,40057,40063,40069],{},[83,40058,40059,14584,40061,14587],{},[29,40060,14583],{},[29,40062,7026],{},[83,40064,40065,14592,40067,44],{},[29,40066,12234],{},[90,40068,627],{},[83,40070,40071,14600],{},[29,40072,14599],{},[719,40074,40075],{"className":7732,"code":14603,"language":2585,"meta":494,"style":494},[90,40076,40077,40081,40089],{"__ignoreMap":494},[727,40078,40079],{"class":729,"line":730},[727,40080,7740],{"class":768},[727,40082,40083,40085,40087],{"class":729,"line":498},[727,40084,14614],{"class":7745},[727,40086,1995],{"class":768},[727,40088,14619],{"class":737},[727,40090,40091],{"class":729,"line":495},[727,40092,2639],{"class":768},[80,40094,40095],{},[83,40096,40097,14631,40099,44],{},[29,40098,14630],{},[322,40100,6721],{"href":6720},[14,40102,14636],{},[77,40104,40105],{},[555,40106,40107,40113],{},[83,40108,40109,611,40111,14647],{},[29,40110,8895],{},[322,40112,8895],{"href":6958},[83,40114,40115,14652,40117,14655],{},[29,40116,620],{},[90,40118,1838],{},[21,40120,776],{"id":775},[11,40122],{},[14,40124,14662],{},[14,40126,14665,40127,3342],{},[322,40128,4887],{"href":2203},[21,40130,796],{"id":795},[11,40132],{},[14,40134,14674],{},[811,40136,7865],{},{"title":494,"searchDepth":495,"depth":495,"links":40138},[40139,40140,40141,40142],{"id":545,"depth":498,"text":546},{"id":14565,"depth":498,"text":14566},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"type":513,"format":77,"intent_type":515,"intent":516,"tags":40144,"platfrom":40145},[829,830,518],[14530],{"title":14519,"description":14683},{"id":14692,"title":14693,"body":40148,"date":523,"description":14771,"extension":506,"meta":40208,"navigation":522,"order":523,"path":14776,"seo":40211,"stem":14778,"__hash__":14779},{"type":8,"value":40149,"toc":40204},[40150,40152,40154],[11,40151],{},[14,40153,14700],{},[11197,40155,40156,40158,40162,40198,40200,40202],{},[21,40157,14706],{"id":14705},[14,40159,14709,40160,14712],{},[90,40161,6426],{},[77,40163,40164],{},[555,40165,40166,40170,40184],{},[83,40167,40168,14721],{},[90,40169,5314],{},[83,40171,40172,14727,40174,13602,40176],{},[90,40173,14726],{},[90,40175,14726],{},[80,40177,40178],{},[83,40179,40180,14737,40182,44],{},[90,40181,14736],{},[90,40183,14740],{},[83,40185,40186,14745,40188],{},[90,40187,953],{},[80,40189,40190,40194],{},[83,40191,14750,40192,44],{},[90,40193,8052],{},[83,40195,14755,40196,14758],{},[90,40197,14740],{},[14,40199,14761],{},[21,40201,796],{"id":795},[14,40203,14766],{},{"title":494,"searchDepth":495,"depth":495,"links":40205},[40206,40207],{"id":14705,"depth":498,"text":14706},{"id":795,"depth":498,"text":796},{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":1050,"tags":40209,"platfrom":40210},[7290,14774,1055],[1757],{"title":14693,"description":14771},{"id":15078,"title":15079,"body":40213,"date":523,"description":15365,"extension":506,"meta":40457,"navigation":522,"order":523,"path":15370,"seo":40460,"stem":15372,"__hash__":15373},{"type":8,"value":40214,"toc":40450},[40215,40217,40223,40227,40231,40233,40235,40263,40265,40267,40298,40302,40304,40442,40444,40446],[11,40216],{},[14,40218,15086,40219,15089,40221,15092],{},[322,40220,9292],{"href":9291},[322,40222,11341],{"href":11340},[14,40224,40225,15098],{},[807,40226,15097],{},[14,40228,15101,40229,44],{},[322,40230,514],{"href":15104},[21,40232,15108],{"id":15107},[14,40234,15111],{},[77,40236,40237],{},[80,40238,40239,40243,40247,40251,40255,40259],{},[83,40240,40241,1230],{},[322,40242,92],{"href":8384},[83,40244,40245,1230],{},[322,40246,114],{"href":2296},[83,40248,40249,1230],{},[322,40250,124],{"href":4943},[83,40252,40253,1230],{},[322,40254,148],{"href":6242},[83,40256,40257,1230],{},[322,40258,3303],{"href":3302},[83,40260,40261,1230],{},[322,40262,15141],{"href":15140},[639,40264,15145],{"id":15144},[14,40266,15148],{},[7092,40268,40269,40275],{},[7095,40270,40271],{},[7098,40272,40273],{},[7101,40274,7103],{},[7108,40276,40277,40284,40291],{},[7098,40278,40279],{},[7113,40280,40281],{},[322,40282,15165],{"href":15165,"rel":40283},[2245],[7098,40285,40286],{},[7113,40287,40288],{},[322,40289,15165],{"href":15165,"rel":40290},[2245],[7098,40292,40293],{},[7113,40294,40295],{},[322,40296,15165],{"href":15165,"rel":40297},[2245],[14,40299,15183,40300,15186],{},[322,40301,6182],{"href":6181},[639,40303,15190],{"id":15189},[77,40305,40306],{},[80,40307,40308,40336],{},[83,40309,40310,88,40312,40314],{},[29,40311,87],{},[90,40313,92],{},[80,40315,40316,40320,40324,40330],{},[83,40317,40318,15207],{},[90,40319,99],{},[83,40321,40322,15212],{},[90,40323,105],{},[83,40325,40326,15217,40328,44],{},[90,40327,7182],{},[90,40329,7186],{},[83,40331,40332,15224,40334,44],{},[90,40333,5267],{},[90,40335,15227],{},[83,40337,40338,88,40340,40342,40352],{},[29,40339,111],{},[90,40341,114],{},[80,40343,40344],{},[83,40345,40346,132,40348,136,40350,44],{},[90,40347,465],{},[90,40349,194],{},[90,40351,139],{},[80,40353,40354,40372,40384,40414],{},[83,40355,40356,88,40358,40360],{},[29,40357,121],{},[90,40359,124],{},[80,40361,40362,40370],{},[83,40363,40364,132,40366,15260,40368,15263],{},[90,40365,131],{},[90,40367,194],{},[90,40369,139],{},[83,40371,15266],{},[83,40373,40374,88,40376,40378],{},[29,40375,145],{},[90,40377,148],{},[80,40379,40380],{},[83,40381,40382,15279],{},[90,40383,155],{},[83,40385,40386,88,40388,40390],{},[29,40387,170],{},[90,40389,3303],{},[80,40391,40392,40396,40400,40406],{},[83,40393,40394,15292],{},[90,40395,99],{},[83,40397,40398,15297],{},[90,40399,105],{},[83,40401,40402,261,40404,44],{},[90,40403,260],{},[90,40405,15304],{},[83,40407,40408,15310,40410,15313,40412,15317],{},[90,40409,15309],{},[90,40411,6013],{},[90,40413,15316],{},[83,40415,40416,88,40418,15324,40420],{},[29,40417,213],{},[90,40419,281],{},[80,40421,40422,40426,40430,40436],{},[83,40423,40424,15331],{},[90,40425,99],{},[83,40427,40428,15297],{},[90,40429,105],{},[83,40431,40432,162,40434,44],{},[90,40433,11490],{},[90,40435,165],{},[83,40437,40438,162,40440,44],{},[90,40439,11498],{},[90,40441,165],{},[21,40443,796],{"id":795},[11,40445],{},[14,40447,15354,40448,15357],{},[322,40449,8393],{"href":8390},{"title":494,"searchDepth":495,"depth":495,"links":40451},[40452,40456],{"id":15107,"depth":498,"text":15108,"children":40453},[40454,40455],{"id":15144,"depth":495,"text":15145},{"id":15189,"depth":495,"text":15190},{"id":795,"depth":498,"text":796},{"type":513,"format":77,"intent_type":1754,"intent":4022,"tags":40458,"platfrom":40459},[519,15368,1056],[1757],{"title":15079,"description":15365},{"id":15375,"title":15376,"body":40462,"date":523,"description":15950,"extension":506,"meta":40905,"navigation":522,"order":523,"path":15954,"seo":40908,"stem":15956,"__hash__":15957},{"type":8,"value":40463,"toc":40896},[40464,40466,40468,40471,40473,40475,40481,40483,40485,40493,40515,40517,40519,40527,40533,40769,40771,40774,40776,40778,40788,40790,40794,40814,40816,40818,40826,40854,40858,40862,40864,40866,40876,40884,40886],[11,40465],{},[14,40467,15383],{},[592,40469],{"src":15386,"className":40470,"alt":15388},[3384],[14,40472,15391],{},[14,40474,15394],{},[14,40476,5173,40477,3289,40479],{},[322,40478,3395],{"href":3394},[322,40480,3961],{"href":3398},[21,40482,3402],{"id":545},[11,40484],{},[14,40486,5186,40487,5189,40489,15412,40491,44],{},[29,40488,3913],{},[29,40490,15411],{},[29,40492,15415],{},[77,40494,40495],{},[555,40496,40497,40503,40509],{},[83,40498,40499,5202,40501,5206],{},[29,40500,3412],{},[90,40502,5205],{},[83,40504,40505,3938,40507,15432],{},[29,40506,3418],{},[29,40508,15411],{},[83,40510,40511,5221,40513,5225],{},[29,40512,3424],{},[29,40514,15439],{},[21,40516,15443],{"id":15442},[11,40518],{},[14,40520,3432,40521,3436,40523,3440,40525,3444],{},[29,40522,3435],{},[29,40524,3439],{},[29,40526,3443],{},[14,40528,3447,40529,15459,40531],{},[322,40530,514],{"href":15458,"download":522},[322,40532,3455],{"href":3454},[77,40534,40535],{},[555,40536,40537,40551,40565,40581,40603,40623,40651,40665,40707,40739],{},[83,40538,8350,40539,15470,40541],{},[29,40540,12820],{},[555,40542,40543,40547],{},[83,40544,40545,15478],{},[29,40546,15477],{},[83,40548,40549,15484],{},[29,40550,15483],{},[83,40552,8350,40553,1230,40555],{},[29,40554,15489],{},[555,40556,40557],{},[83,40558,40559,1021,40561,3492,40563,15503],{},[29,40560,15496],{},[29,40562,15499],{},[807,40564,15502],{},[83,40566,8350,40567,15509,40569,15512,40571],{},[29,40568,15508],{},[29,40570,5179],{},[555,40572,40573],{},[83,40574,40575,15520,40577,40579],{},[29,40576,15519],{},[344,40578],{},[90,40580,15525],{},[83,40582,15528,40583,15532,40585],{},[29,40584,15531],{},[555,40586,40587,40595],{},[83,40588,40589,1021,40591,3492,40593,15544],{},[29,40590,15539],{},[29,40592,15499],{},[29,40594,15502],{},[83,40596,40597,15550,40599,15554,40601,3554],{},[29,40598,15549],{},[29,40600,15553],{},[592,40602],{"src":15557,"alt":15558},[83,40604,8350,40605,15564,40607,40609],{},[29,40606,15563],{},[29,40608,5166],{},[555,40610,40611],{},[83,40612,40613,1021,40615,3648,40617,3652,40619,15583,40621],{},[29,40614,15573],{},[29,40616,15576],{},[29,40618,15579],{},[29,40620,15582],{},[29,40622,15586],{},[83,40624,15589,40625,15592,40627,3289,40629,40631],{},[29,40626,15563],{},[29,40628,15595],{},[29,40630,15598],{},[555,40632,40633,40645],{},[83,40634,40635,1021,40637,3648,40639,5412,40641,3289,40643,44],{},[29,40636,15573],{},[29,40638,15576],{},[29,40640,15579],{},[90,40642,15611],{},[90,40644,15614],{},[83,40646,40647,15620,40649,3554],{},[29,40648,15619],{},[592,40650],{"src":5427,"alt":15623},[83,40652,8350,40653,15629,40655],{},[29,40654,15628],{},[555,40656,40657],{},[83,40658,40659,15637,40661,15641,40663,15645],{},[29,40660,15636],{},[29,40662,15640],{},[29,40664,15644],{},[83,40666,8350,40667,15651,40669,15654,40671],{},[29,40668,15650],{},[29,40670,5179],{},[555,40672,40673,40681,40687,40695,40701],{},[83,40674,40675,1021,40677,15664,40679,44],{},[29,40676,15573],{},[29,40678,15663],{},[29,40680,15667],{},[83,40682,40683,6072,40685,15676],{},[29,40684,15672],{},[29,40686,15675],{},[83,40688,3695,40689,3699,40691,15685,40693,3554],{},[29,40690,15681],{},[29,40692,15684],{},[592,40694],{"src":15688,"alt":15689},[83,40696,40697,15695,40699,44],{},[29,40698,15694],{},[29,40700,15698],{},[83,40702,40703,15704,40705,3755],{},[29,40704,15703],{},[29,40706,3754],{},[83,40708,8350,40709,1230,40711],{},[29,40710,15711],{},[555,40712,40713,40719,40725,40733],{},[83,40714,40715,15718,40717],{},[29,40716,15477],{},[29,40718,15721],{},[83,40720,40721,15727,40723,44],{},[29,40722,15726],{},[29,40724,15730],{},[83,40726,40727,1021,40729,3782,40731,44],{},[29,40728,15735],{},[29,40730,15499],{},[29,40732,15740],{},[83,40734,40735,15746,40737,15750],{},[29,40736,15745],{},[29,40738,15749],{},[83,40740,8350,40741,15756,40743],{},[29,40742,15755],{},[555,40744,40745,40751,40757,40763],{},[83,40746,40747,15718,40749],{},[29,40748,15477],{},[29,40750,15721],{},[83,40752,40753,15769,40755,44],{},[29,40754,15726],{},[29,40756,3978],{},[83,40758,40759,15777,40761,44],{},[29,40760,15776],{},[29,40762,165],{},[83,40764,40765,15785,40767,44],{},[29,40766,15784],{},[29,40768,3827],{},[14,40770,15790],{},[592,40772],{"src":15793,"className":40773,"alt":5640},[3835],[21,40775,15798],{"id":15797},[11,40777],{},[14,40779,15803,40780,15807,40782,3851,40784,5655,40786,44],{},[322,40781,15806],{"href":3377},[29,40783,3850],{},[29,40785,3435],{},[29,40787,15814],{},[592,40789],{"src":15817,"alt":15818},[639,40791,40792],{"id":5661},[29,40793,5664],{},[555,40795,40796,40804],{},[83,40797,40798,15830,40800,15833,40802,44],{},[29,40799,15829],{},[29,40801,5675],{},[29,40803,15836],{},[83,40805,40806,88,40808,15843,40810,5688,40812,44],{},[29,40807,5681],{},[29,40809,5179],{},[29,40811,5687],{},[29,40813,15848],{},[21,40815,3887],{"id":3886},[11,40817],{},[14,40819,3890,40820,3893,40822,3897,40824,3900],{},[29,40821,3435],{},[29,40823,5179],{},[29,40825,514],{},[555,40827,40828,40834,40842,40848],{},[83,40829,40830,3910,40832,44],{},[29,40831,3909],{},[29,40833,3913],{},[83,40835,40836,3919,40838,5721,40840,15877],{},[29,40837,3918],{},[29,40839,3922],{},[29,40841,5179],{},[83,40843,40844,3929,40846,3932],{},[29,40845,3928],{},[29,40847,1838],{},[83,40849,40850,3910,40852,44],{},[29,40851,3937],{},[29,40853,3913],{},[14,40855,3943,40856,3947],{},[29,40857,3946],{},[14,40859,3950,40860],{},[322,40861,15899],{"href":15898,"download":522},[21,40863,796],{"id":795},[11,40865],{},[14,40867,15906,40868,15909,40870,15912,40872,15916,40874,15920],{},[29,40869,15814],{},[29,40871,5179],{},[29,40873,15915],{},[29,40875,15919],{},[14,40877,5794,40878,3991,40880,5801],{},[29,40879,3378],{},[29,40881,40882],{},[322,40883,3997],{"href":3996},[11,40885],{},[14,40887,40888],{},[807,40889,4002,40890,4006,40892,3289,40894,4011],{},[29,40891,4005],{},[29,40893,3378],{},[29,40895,3435],{},{"title":494,"searchDepth":495,"depth":495,"links":40897},[40898,40899,40900,40903,40904],{"id":545,"depth":498,"text":3402},{"id":15442,"depth":498,"text":15443},{"id":15797,"depth":498,"text":15798,"children":40901},[40902],{"id":5661,"depth":495,"text":5664},{"id":3886,"depth":498,"text":3887},{"id":795,"depth":498,"text":796},{"pinned":522,"type":513,"format":77,"intent_type":1049,"intent":4022,"tags":40906,"platfrom":40907},[519,1056],[3378],{"title":15376,"description":15950},{"id":16560,"title":16561,"body":40910,"date":523,"description":16572,"extension":506,"meta":40918,"navigation":522,"order":523,"path":12724,"seo":40919,"stem":16576,"__hash__":16577},{"type":8,"value":40911,"toc":40916},[40912,40914],[14,40913,16566],{},[16568,40915],{"intent":515},{"title":494,"searchDepth":495,"depth":495,"links":40917},[],{"layout":16574},{"title":16561,"description":16572},{"id":16579,"title":16580,"body":40921,"date":523,"description":18282,"extension":506,"meta":42416,"navigation":522,"order":523,"path":12438,"seo":42419,"stem":18290,"__hash__":18291},{"type":8,"value":40922,"toc":42405},[40923,40925,40927,40929,40931,40933,40935,40955,40957,40976,40978,41013,41015,41017,41019,41021,41023,41025,41031,41033,41035,41043,41069,41415,41417,41419,41427,41451,41845,41847,41849,41851,41873,42387,42389,42391,42399,42401,42403],[11,40924],{},[14,40926,16587],{},[18,40928],{},[14,40930,16592],{},[21,40932,546],{"id":545},[14,40934,551],{},[77,40936,40937],{},[555,40938,40939,40945,40949],{},[83,40940,40941,562,40943,44],{},[29,40942,561],{},[322,40944,566],{"href":565},[83,40946,40947,572],{},[29,40948,571],{},[83,40950,40951,1797,40953,44],{},[29,40952,577],{},[90,40954,581],{},[14,40956,16619],{},[77,40958,40959],{},[555,40960,40961,40972],{},[83,40962,40963,16629,40965,16635,40968,16639,40970,16643],{},[29,40964,16628],{},[322,40966,16634],{"href":16632,"rel":40967},[2245],[29,40969,16638],{},[29,40971,16642],{},[83,40973,40974,16649],{},[29,40975,16648],{},[14,40977,16652],{},[77,40979,40980],{},[555,40981,40982,40989,40995,40999,41005,41009],{},[83,40983,40984,16662,40986,16668],{},[29,40985,16661],{},[322,40987,16667],{"href":16665,"rel":40988},[2245],[83,40990,40991,16674,40993],{},[29,40992,16673],{},[29,40994,16677],{},[83,40996,40997,16682],{},[29,40998,2662],{},[83,41000,41001,16688,41003,44],{},[29,41002,16687],{},[29,41004,16691],{},[83,41006,41007,16697],{},[29,41008,16696],{},[83,41010,41011,16703],{},[29,41012,16702],{},[592,41014],{"src":16706,"alt":16707},[21,41016,16711],{"id":16710},[11,41018],{},[14,41020,16716],{},[639,41022,16720],{"id":16719},[11,41024],{},[14,41026,16725,41027,16731],{},[29,41028,41029],{},[322,41030,16730],{"href":2300},[639,41032,16735],{"id":16734},[11,41034],{},[14,41036,16740,41037,16743,41039,16747,41041,16751],{},[322,41038,3402],{"href":6615},[90,41040,16746],{},[29,41042,16750],{},[77,41044,41045],{},[555,41046,41047,41057,41063],{},[83,41048,41049,224,41051,2004,41053,16767,41055,16770],{},[29,41050,16760],{},[29,41052,16763],{},[29,41054,16766],{},[29,41056,16667],{},[83,41058,41059,16776,41061,16779],{},[29,41060,16775],{},[90,41062,16746],{},[83,41064,41065,16785,41067],{},[29,41066,16784],{},[807,41068,16788],{},[719,41070,41071],{"className":756,"code":16791,"language":758,"meta":494,"style":494},[90,41072,41073,41077,41091,41105,41119,41139,41143,41147,41157,41161,41173,41185,41197,41207,41211,41215,41219,41223,41237,41243,41257,41265,41269,41283,41291,41295,41307,41311,41315,41321,41337,41349,41357,41369,41373,41381,41393,41397,41401,41405,41409],{"__ignoreMap":494},[727,41074,41075],{"class":729,"line":730},[727,41076,16798],{"class":2920},[727,41078,41079,41081,41083,41085,41087,41089],{"class":729,"line":498},[727,41080,2315],{"class":1986},[727,41082,16805],{"class":1882},[727,41084,2321],{"class":1986},[727,41086,16810],{"class":737},[727,41088,9444],{"class":768},[727,41090,16815],{"class":2920},[727,41092,41093,41095,41097,41099,41101,41103],{"class":729,"line":495},[727,41094,2315],{"class":1986},[727,41096,16822],{"class":1882},[727,41098,2321],{"class":1986},[727,41100,16827],{"class":737},[727,41102,9444],{"class":768},[727,41104,16832],{"class":2920},[727,41106,41107,41109,41111,41113,41115,41117],{"class":729,"line":1895},[727,41108,2315],{"class":1986},[727,41110,16839],{"class":1882},[727,41112,2321],{"class":1986},[727,41114,16844],{"class":737},[727,41116,9444],{"class":768},[727,41118,16849],{"class":2920},[727,41120,41121,41123,41125,41127,41129,41131,41133,41135,41137],{"class":729,"line":1901},[727,41122,2315],{"class":1986},[727,41124,16856],{"class":1882},[727,41126,2321],{"class":1986},[727,41128,16861],{"class":737},[727,41130,16864],{"class":768},[727,41132,2764],{"class":737},[727,41134,16869],{"class":768},[727,41136,2448],{"class":737},[727,41138,2327],{"class":768},[727,41140,41141],{"class":729,"line":1973},[727,41142,1898],{"emptyLinePlaceholder":522},[727,41144,41145],{"class":729,"line":2052},[727,41146,16882],{"class":2920},[727,41148,41149,41151,41153,41155],{"class":729,"line":2058},[727,41150,2315],{"class":1986},[727,41152,16889],{"class":1882},[727,41154,2321],{"class":1986},[727,41156,2391],{"class":768},[727,41158,41159],{"class":729,"line":2064},[727,41160,16898],{"class":768},[727,41162,41163,41165,41167,41169,41171],{"class":729,"line":2087},[727,41164,16903],{"class":737},[727,41166,1995],{"class":768},[727,41168,16908],{"class":737},[727,41170,16911],{"class":768},[727,41172,16914],{"class":2920},[727,41174,41175,41177,41179,41181,41183],{"class":729,"line":2140},[727,41176,16919],{"class":737},[727,41178,1995],{"class":768},[727,41180,16924],{"class":737},[727,41182,16911],{"class":768},[727,41184,16929],{"class":2920},[727,41186,41187,41189,41191,41193,41195],{"class":729,"line":2154},[727,41188,16934],{"class":737},[727,41190,1995],{"class":768},[727,41192,16939],{"class":737},[727,41194,16942],{"class":768},[727,41196,16929],{"class":2920},[727,41198,41199,41201,41203,41205],{"class":729,"line":1529},[727,41200,16949],{"class":737},[727,41202,1995],{"class":768},[727,41204,16954],{"class":737},[727,41206,16957],{"class":2920},[727,41208,41209],{"class":729,"line":2178},[727,41210,9712],{"class":768},[727,41212,41213],{"class":729,"line":2187},[727,41214,16966],{"class":768},[727,41216,41217],{"class":729,"line":2533},[727,41218,1898],{"emptyLinePlaceholder":522},[727,41220,41221],{"class":729,"line":2551},[727,41222,16975],{"class":2920},[727,41224,41225,41227,41229,41231,41233,41235],{"class":729,"line":2559},[727,41226,10151],{"class":1986},[727,41228,16982],{"class":1986},[727,41230,16985],{"class":2376},[727,41232,2542],{"class":768},[727,41234,1838],{"class":733},[727,41236,16992],{"class":768},[727,41238,41239,41241],{"class":729,"line":2565},[727,41240,9641],{"class":1986},[727,41242,2391],{"class":768},[727,41244,41245,41247,41249,41251,41253,41255],{"class":729,"line":2570},[727,41246,17003],{"class":1986},[727,41248,2093],{"class":1882},[727,41250,2321],{"class":1986},[727,41252,2410],{"class":1986},[727,41254,2413],{"class":2376},[727,41256,17014],{"class":768},[727,41258,41259,41261,41263],{"class":729,"line":2591},[727,41260,17019],{"class":768},[727,41262,2424],{"class":737},[727,41264,2427],{"class":768},[727,41266,41267],{"class":729,"line":2603},[727,41268,17028],{"class":768},[727,41270,41271,41273,41275,41277,41279,41281],{"class":729,"line":2615},[727,41272,17033],{"class":737},[727,41274,1995],{"class":768},[727,41276,17038],{"class":737},[727,41278,17041],{"class":768},[727,41280,2448],{"class":737},[727,41282,2427],{"class":768},[727,41284,41285,41287,41289],{"class":729,"line":2630},[727,41286,17050],{"class":737},[727,41288,1995],{"class":768},[727,41290,17055],{"class":737},[727,41292,41293],{"class":729,"line":2636},[727,41294,17060],{"class":768},[727,41296,41297,41299,41301,41303,41305],{"class":729,"line":2642},[727,41298,17065],{"class":768},[727,41300,9620],{"class":1882},[727,41302,44],{"class":768},[727,41304,9625],{"class":2376},[727,41306,17074],{"class":768},[727,41308,41309],{"class":729,"line":2647},[727,41310,17079],{"class":768},[727,41312,41313],{"class":729,"line":4657},[727,41314,1898],{"emptyLinePlaceholder":522},[727,41316,41317,41319],{"class":729,"line":4662},[727,41318,17088],{"class":1986},[727,41320,17091],{"class":768},[727,41322,41323,41325,41327,41329,41331,41333,41335],{"class":729,"line":1316},[727,41324,17096],{"class":1986},[727,41326,17099],{"class":1882},[727,41328,2321],{"class":1986},[727,41330,2410],{"class":1986},[727,41332,2582],{"class":768},[727,41334,2585],{"class":2376},[727,41336,2588],{"class":768},[727,41338,41339,41341,41343,41345,41347],{"class":729,"line":4671},[727,41340,17114],{"class":768},[727,41342,2597],{"class":2376},[727,41344,2542],{"class":768},[727,41346,17121],{"class":737},[727,41348,17124],{"class":768},[727,41350,41351,41353,41355],{"class":729,"line":4676},[727,41352,2606],{"class":768},[727,41354,17131],{"class":1986},[727,41356,2391],{"class":768},[727,41358,41359,41361,41363,41365,41367],{"class":729,"line":4681},[727,41360,17114],{"class":768},[727,41362,2539],{"class":2376},[727,41364,2542],{"class":768},[727,41366,17144],{"class":737},[727,41368,17147],{"class":768},[727,41370,41371],{"class":729,"line":4686},[727,41372,2633],{"class":768},[727,41374,41375,41377,41379],{"class":729,"line":4691},[727,41376,9682],{"class":768},[727,41378,2609],{"class":1986},[727,41380,2612],{"class":768},[727,41382,41383,41385,41387,41389,41391],{"class":729,"line":4696},[727,41384,17164],{"class":768},[727,41386,2539],{"class":2376},[727,41388,2542],{"class":768},[727,41390,17171],{"class":737},[727,41392,2627],{"class":768},[727,41394,41395],{"class":729,"line":4702},[727,41396,9712],{"class":768},[727,41398,41399],{"class":729,"line":4708},[727,41400,2639],{"class":768},[727,41402,41403],{"class":729,"line":4714},[727,41404,1898],{"emptyLinePlaceholder":522},[727,41406,41407],{"class":729,"line":4719},[727,41408,17190],{"class":2920},[727,41410,41411,41413],{"class":729,"line":4724},[727,41412,17195],{"class":2376},[727,41414,17198],{"class":768},[639,41416,17202],{"id":17201},[11,41418],{},[14,41420,17207,41421,16743,41423,16747,41425,17214],{},[322,41422,3402],{"href":6615},[90,41424,16746],{},[29,41426,16750],{},[77,41428,41429],{},[555,41430,41431,41441,41447],{},[83,41432,41433,224,41435,2004,41437,16767,41439,16770],{},[29,41434,16760],{},[29,41436,16763],{},[29,41438,16766],{},[29,41440,16667],{},[83,41442,41443,17234,41445],{},[29,41444,17233],{},[807,41446,16788],{},[83,41448,41449,17241],{},[29,41450,16775],{},[719,41452,41453],{"className":756,"code":17244,"language":758,"meta":494,"style":494},[90,41454,41455,41459,41473,41487,41501,41521,41525,41529,41543,41547,41551,41573,41579,41583,41593,41603,41613,41623,41627,41631,41635,41639,41643,41657,41663,41677,41685,41689,41703,41711,41715,41727,41733,41737,41741,41745,41751,41767,41779,41787,41799,41803,41811,41823,41827,41831,41835,41839],{"__ignoreMap":494},[727,41456,41457],{"class":729,"line":730},[727,41458,16798],{"class":2920},[727,41460,41461,41463,41465,41467,41469,41471],{"class":729,"line":498},[727,41462,2315],{"class":1986},[727,41464,16805],{"class":1882},[727,41466,2321],{"class":1986},[727,41468,16810],{"class":737},[727,41470,9444],{"class":768},[727,41472,17265],{"class":2920},[727,41474,41475,41477,41479,41481,41483,41485],{"class":729,"line":495},[727,41476,2315],{"class":1986},[727,41478,16822],{"class":1882},[727,41480,2321],{"class":1986},[727,41482,16827],{"class":737},[727,41484,9444],{"class":768},[727,41486,16832],{"class":2920},[727,41488,41489,41491,41493,41495,41497,41499],{"class":729,"line":1895},[727,41490,2315],{"class":1986},[727,41492,16839],{"class":1882},[727,41494,2321],{"class":1986},[727,41496,16844],{"class":737},[727,41498,9444],{"class":768},[727,41500,16849],{"class":2920},[727,41502,41503,41505,41507,41509,41511,41513,41515,41517,41519],{"class":729,"line":1901},[727,41504,2315],{"class":1986},[727,41506,16856],{"class":1882},[727,41508,2321],{"class":1986},[727,41510,16861],{"class":737},[727,41512,16864],{"class":768},[727,41514,2764],{"class":737},[727,41516,16869],{"class":768},[727,41518,2448],{"class":737},[727,41520,2327],{"class":768},[727,41522,41523],{"class":729,"line":1973},[727,41524,1898],{"emptyLinePlaceholder":522},[727,41526,41527],{"class":729,"line":2052},[727,41528,17322],{"class":2920},[727,41530,41531,41533,41535,41537,41539,41541],{"class":729,"line":2058},[727,41532,2315],{"class":1986},[727,41534,17329],{"class":1882},[727,41536,2321],{"class":1986},[727,41538,17334],{"class":768},[727,41540,17337],{"class":1986},[727,41542,17340],{"class":768},[727,41544,41545],{"class":729,"line":2064},[727,41546,1898],{"emptyLinePlaceholder":522},[727,41548,41549],{"class":729,"line":2087},[727,41550,16882],{"class":2920},[727,41552,41553,41555,41557,41559,41561,41563,41565,41567,41569,41571],{"class":729,"line":2140},[727,41554,2315],{"class":1986},[727,41556,17355],{"class":1882},[727,41558,2321],{"class":1986},[727,41560,17360],{"class":768},[727,41562,3199],{"class":2376},[727,41564,5025],{"class":768},[727,41566,3204],{"class":733},[727,41568,5031],{"class":768},[727,41570,2388],{"class":1986},[727,41572,2391],{"class":768},[727,41574,41575,41577],{"class":729,"line":2154},[727,41576,17377],{"class":1986},[727,41578,2391],{"class":768},[727,41580,41581],{"class":729,"line":1529},[727,41582,17384],{"class":768},[727,41584,41585,41587,41589,41591],{"class":729,"line":2178},[727,41586,17389],{"class":737},[727,41588,17392],{"class":768},[727,41590,17395],{"class":1882},[727,41592,17398],{"class":768},[727,41594,41595,41597,41599,41601],{"class":729,"line":2187},[727,41596,17403],{"class":737},[727,41598,17392],{"class":768},[727,41600,165],{"class":1882},[727,41602,17398],{"class":768},[727,41604,41605,41607,41609,41611],{"class":729,"line":2533},[727,41606,17414],{"class":737},[727,41608,17392],{"class":768},[727,41610,8883],{"class":1882},[727,41612,17398],{"class":768},[727,41614,41615,41617,41619,41621],{"class":729,"line":2551},[727,41616,17425],{"class":737},[727,41618,17392],{"class":768},[727,41620,17430],{"class":1882},[727,41622,17433],{"class":768},[727,41624,41625],{"class":729,"line":2559},[727,41626,2633],{"class":768},[727,41628,41629],{"class":729,"line":2565},[727,41630,9571],{"class":768},[727,41632,41633],{"class":729,"line":2570},[727,41634,17446],{"class":768},[727,41636,41637],{"class":729,"line":2591},[727,41638,1898],{"emptyLinePlaceholder":522},[727,41640,41641],{"class":729,"line":2603},[727,41642,17455],{"class":2920},[727,41644,41645,41647,41649,41651,41653,41655],{"class":729,"line":2615},[727,41646,10151],{"class":1986},[727,41648,16982],{"class":1986},[727,41650,16985],{"class":2376},[727,41652,2542],{"class":768},[727,41654,17468],{"class":733},[727,41656,16992],{"class":768},[727,41658,41659,41661],{"class":729,"line":2630},[727,41660,9641],{"class":1986},[727,41662,2391],{"class":768},[727,41664,41665,41667,41669,41671,41673,41675],{"class":729,"line":2636},[727,41666,17003],{"class":1986},[727,41668,2093],{"class":1882},[727,41670,2321],{"class":1986},[727,41672,2410],{"class":1986},[727,41674,2413],{"class":2376},[727,41676,17014],{"class":768},[727,41678,41679,41681,41683],{"class":729,"line":2642},[727,41680,17019],{"class":768},[727,41682,2424],{"class":737},[727,41684,2427],{"class":768},[727,41686,41687],{"class":729,"line":2647},[727,41688,17028],{"class":768},[727,41690,41691,41693,41695,41697,41699,41701],{"class":729,"line":4657},[727,41692,17033],{"class":737},[727,41694,1995],{"class":768},[727,41696,17038],{"class":737},[727,41698,17041],{"class":768},[727,41700,2448],{"class":737},[727,41702,2427],{"class":768},[727,41704,41705,41707,41709],{"class":729,"line":4662},[727,41706,17050],{"class":737},[727,41708,1995],{"class":768},[727,41710,17055],{"class":737},[727,41712,41713],{"class":729,"line":1316},[727,41714,17060],{"class":768},[727,41716,41717,41719,41721,41723,41725],{"class":729,"line":4671},[727,41718,17065],{"class":768},[727,41720,9620],{"class":1882},[727,41722,44],{"class":768},[727,41724,9625],{"class":2376},[727,41726,2479],{"class":768},[727,41728,41729,41731],{"class":729,"line":4676},[727,41730,17545],{"class":768},[727,41732,17548],{"class":2920},[727,41734,41735],{"class":729,"line":4681},[727,41736,17553],{"class":768},[727,41738,41739],{"class":729,"line":4686},[727,41740,17079],{"class":768},[727,41742,41743],{"class":729,"line":4691},[727,41744,1898],{"emptyLinePlaceholder":522},[727,41746,41747,41749],{"class":729,"line":4696},[727,41748,17088],{"class":1986},[727,41750,17091],{"class":768},[727,41752,41753,41755,41757,41759,41761,41763,41765],{"class":729,"line":4702},[727,41754,17096],{"class":1986},[727,41756,17099],{"class":1882},[727,41758,2321],{"class":1986},[727,41760,2410],{"class":1986},[727,41762,2582],{"class":768},[727,41764,2585],{"class":2376},[727,41766,2588],{"class":768},[727,41768,41769,41771,41773,41775,41777],{"class":729,"line":4708},[727,41770,17114],{"class":768},[727,41772,2597],{"class":2376},[727,41774,2542],{"class":768},[727,41776,17594],{"class":737},[727,41778,17124],{"class":768},[727,41780,41781,41783,41785],{"class":729,"line":4714},[727,41782,2606],{"class":768},[727,41784,17131],{"class":1986},[727,41786,2391],{"class":768},[727,41788,41789,41791,41793,41795,41797],{"class":729,"line":4719},[727,41790,17114],{"class":768},[727,41792,2539],{"class":2376},[727,41794,2542],{"class":768},[727,41796,17615],{"class":737},[727,41798,17147],{"class":768},[727,41800,41801],{"class":729,"line":4724},[727,41802,2633],{"class":768},[727,41804,41805,41807,41809],{"class":729,"line":4729},[727,41806,9682],{"class":768},[727,41808,2609],{"class":1986},[727,41810,2612],{"class":768},[727,41812,41813,41815,41817,41819,41821],{"class":729,"line":4734},[727,41814,17164],{"class":768},[727,41816,2539],{"class":2376},[727,41818,2542],{"class":768},[727,41820,17171],{"class":737},[727,41822,2627],{"class":768},[727,41824,41825],{"class":729,"line":4739},[727,41826,9712],{"class":768},[727,41828,41829],{"class":729,"line":4744},[727,41830,2639],{"class":768},[727,41832,41833],{"class":729,"line":4749},[727,41834,1898],{"emptyLinePlaceholder":522},[727,41836,41837],{"class":729,"line":4754},[727,41838,17658],{"class":2920},[727,41840,41841,41843],{"class":729,"line":1753},[727,41842,17195],{"class":2376},[727,41844,17665],{"class":768},[639,41846,17669],{"id":17668},[11,41848],{},[14,41850,17674],{},[77,41852,41853],{},[555,41854,41855,41865,41869],{},[83,41856,41857,224,41859,2004,41861,16767,41863,16770],{},[29,41858,16760],{},[29,41860,16763],{},[29,41862,16766],{},[29,41864,16667],{},[83,41866,41867,17693],{},[29,41868,17233],{},[83,41870,41871,17699],{},[29,41872,17698],{},[719,41874,41875],{"className":756,"code":17702,"language":758,"meta":494,"style":494},[90,41876,41877,41881,41895,41909,41923,41943,41947,41951,41965,41969,41973,41995,42001,42005,42015,42025,42035,42045,42049,42053,42057,42061,42065,42079,42085,42099,42107,42111,42125,42133,42137,42149,42153,42157,42163,42179,42191,42199,42211,42215,42223,42235,42239,42243,42247,42251,42273,42301,42321,42355,42365,42369,42373,42377,42381],{"__ignoreMap":494},[727,41878,41879],{"class":729,"line":730},[727,41880,16798],{"class":2920},[727,41882,41883,41885,41887,41889,41891,41893],{"class":729,"line":498},[727,41884,2315],{"class":1986},[727,41886,16805],{"class":1882},[727,41888,2321],{"class":1986},[727,41890,16810],{"class":737},[727,41892,9444],{"class":768},[727,41894,16815],{"class":2920},[727,41896,41897,41899,41901,41903,41905,41907],{"class":729,"line":495},[727,41898,2315],{"class":1986},[727,41900,16822],{"class":1882},[727,41902,2321],{"class":1986},[727,41904,16827],{"class":737},[727,41906,9444],{"class":768},[727,41908,17737],{"class":2920},[727,41910,41911,41913,41915,41917,41919,41921],{"class":729,"line":1895},[727,41912,2315],{"class":1986},[727,41914,16839],{"class":1882},[727,41916,2321],{"class":1986},[727,41918,16844],{"class":737},[727,41920,9444],{"class":768},[727,41922,17752],{"class":2920},[727,41924,41925,41927,41929,41931,41933,41935,41937,41939,41941],{"class":729,"line":1901},[727,41926,2315],{"class":1986},[727,41928,16856],{"class":1882},[727,41930,2321],{"class":1986},[727,41932,16861],{"class":737},[727,41934,16864],{"class":768},[727,41936,2764],{"class":737},[727,41938,16869],{"class":768},[727,41940,2448],{"class":737},[727,41942,2327],{"class":768},[727,41944,41945],{"class":729,"line":1973},[727,41946,1898],{"emptyLinePlaceholder":522},[727,41948,41949],{"class":729,"line":2052},[727,41950,17322],{"class":2920},[727,41952,41953,41955,41957,41959,41961,41963],{"class":729,"line":2058},[727,41954,2315],{"class":1986},[727,41956,17329],{"class":1882},[727,41958,2321],{"class":1986},[727,41960,17334],{"class":768},[727,41962,17337],{"class":1986},[727,41964,17340],{"class":768},[727,41966,41967],{"class":729,"line":2064},[727,41968,1898],{"emptyLinePlaceholder":522},[727,41970,41971],{"class":729,"line":2087},[727,41972,16882],{"class":2920},[727,41974,41975,41977,41979,41981,41983,41985,41987,41989,41991,41993],{"class":729,"line":2140},[727,41976,2315],{"class":1986},[727,41978,17355],{"class":1882},[727,41980,2321],{"class":1986},[727,41982,17360],{"class":768},[727,41984,3199],{"class":2376},[727,41986,5025],{"class":768},[727,41988,3204],{"class":733},[727,41990,5031],{"class":768},[727,41992,2388],{"class":1986},[727,41994,2391],{"class":768},[727,41996,41997,41999],{"class":729,"line":2154},[727,41998,17377],{"class":1986},[727,42000,2391],{"class":768},[727,42002,42003],{"class":729,"line":1529},[727,42004,17384],{"class":768},[727,42006,42007,42009,42011,42013],{"class":729,"line":2178},[727,42008,17389],{"class":737},[727,42010,17392],{"class":768},[727,42012,17395],{"class":1882},[727,42014,17398],{"class":768},[727,42016,42017,42019,42021,42023],{"class":729,"line":2187},[727,42018,17403],{"class":737},[727,42020,17392],{"class":768},[727,42022,165],{"class":1882},[727,42024,17398],{"class":768},[727,42026,42027,42029,42031,42033],{"class":729,"line":2533},[727,42028,17414],{"class":737},[727,42030,17392],{"class":768},[727,42032,8883],{"class":1882},[727,42034,17398],{"class":768},[727,42036,42037,42039,42041,42043],{"class":729,"line":2551},[727,42038,17425],{"class":737},[727,42040,17392],{"class":768},[727,42042,17430],{"class":1882},[727,42044,17433],{"class":768},[727,42046,42047],{"class":729,"line":2559},[727,42048,2633],{"class":768},[727,42050,42051],{"class":729,"line":2565},[727,42052,9571],{"class":768},[727,42054,42055],{"class":729,"line":2570},[727,42056,17446],{"class":768},[727,42058,42059],{"class":729,"line":2591},[727,42060,1898],{"emptyLinePlaceholder":522},[727,42062,42063],{"class":729,"line":2603},[727,42064,17455],{"class":2920},[727,42066,42067,42069,42071,42073,42075,42077],{"class":729,"line":2615},[727,42068,10151],{"class":1986},[727,42070,16982],{"class":1986},[727,42072,16985],{"class":2376},[727,42074,2542],{"class":768},[727,42076,17468],{"class":733},[727,42078,16992],{"class":768},[727,42080,42081,42083],{"class":729,"line":2630},[727,42082,9641],{"class":1986},[727,42084,2391],{"class":768},[727,42086,42087,42089,42091,42093,42095,42097],{"class":729,"line":2636},[727,42088,17003],{"class":1986},[727,42090,2093],{"class":1882},[727,42092,2321],{"class":1986},[727,42094,2410],{"class":1986},[727,42096,2413],{"class":2376},[727,42098,17014],{"class":768},[727,42100,42101,42103,42105],{"class":729,"line":2642},[727,42102,17019],{"class":768},[727,42104,2424],{"class":737},[727,42106,2427],{"class":768},[727,42108,42109],{"class":729,"line":2647},[727,42110,17028],{"class":768},[727,42112,42113,42115,42117,42119,42121,42123],{"class":729,"line":4657},[727,42114,17033],{"class":737},[727,42116,1995],{"class":768},[727,42118,17038],{"class":737},[727,42120,17041],{"class":768},[727,42122,2448],{"class":737},[727,42124,2427],{"class":768},[727,42126,42127,42129,42131],{"class":729,"line":4662},[727,42128,17050],{"class":737},[727,42130,1995],{"class":768},[727,42132,17055],{"class":737},[727,42134,42135],{"class":729,"line":1316},[727,42136,17060],{"class":768},[727,42138,42139,42141,42143,42145,42147],{"class":729,"line":4671},[727,42140,17065],{"class":768},[727,42142,9620],{"class":1882},[727,42144,44],{"class":768},[727,42146,9625],{"class":2376},[727,42148,17979],{"class":768},[727,42150,42151],{"class":729,"line":4676},[727,42152,17079],{"class":768},[727,42154,42155],{"class":729,"line":4681},[727,42156,1898],{"emptyLinePlaceholder":522},[727,42158,42159,42161],{"class":729,"line":4686},[727,42160,17088],{"class":1986},[727,42162,17091],{"class":768},[727,42164,42165,42167,42169,42171,42173,42175,42177],{"class":729,"line":4691},[727,42166,17096],{"class":1986},[727,42168,17099],{"class":1882},[727,42170,2321],{"class":1986},[727,42172,2410],{"class":1986},[727,42174,2582],{"class":768},[727,42176,2585],{"class":2376},[727,42178,2588],{"class":768},[727,42180,42181,42183,42185,42187,42189],{"class":729,"line":4696},[727,42182,17114],{"class":768},[727,42184,2597],{"class":2376},[727,42186,2542],{"class":768},[727,42188,17594],{"class":737},[727,42190,17124],{"class":768},[727,42192,42193,42195,42197],{"class":729,"line":4702},[727,42194,2606],{"class":768},[727,42196,17131],{"class":1986},[727,42198,2391],{"class":768},[727,42200,42201,42203,42205,42207,42209],{"class":729,"line":4708},[727,42202,17114],{"class":768},[727,42204,2539],{"class":2376},[727,42206,2542],{"class":768},[727,42208,17615],{"class":737},[727,42210,17147],{"class":768},[727,42212,42213],{"class":729,"line":4714},[727,42214,2633],{"class":768},[727,42216,42217,42219,42221],{"class":729,"line":4719},[727,42218,9682],{"class":768},[727,42220,2609],{"class":1986},[727,42222,2612],{"class":768},[727,42224,42225,42227,42229,42231,42233],{"class":729,"line":4724},[727,42226,17164],{"class":768},[727,42228,2539],{"class":2376},[727,42230,2542],{"class":768},[727,42232,17171],{"class":737},[727,42234,2627],{"class":768},[727,42236,42237],{"class":729,"line":4729},[727,42238,9712],{"class":768},[727,42240,42241],{"class":729,"line":4734},[727,42242,2639],{"class":768},[727,42244,42245],{"class":729,"line":4739},[727,42246,1898],{"emptyLinePlaceholder":522},[727,42248,42249],{"class":729,"line":4744},[727,42250,18082],{"class":2920},[727,42252,42253,42255,42257,42259,42261,42263,42265,42267,42269,42271],{"class":729,"line":4749},[727,42254,10151],{"class":1986},[727,42256,16982],{"class":1986},[727,42258,18091],{"class":2376},[727,42260,2542],{"class":768},[727,42262,17468],{"class":733},[727,42264,2004],{"class":768},[727,42266,18100],{"class":733},[727,42268,2321],{"class":1986},[727,42270,18105],{"class":1882},[727,42272,16992],{"class":768},[727,42274,42275,42277,42279,42281,42283,42285,42287,42289,42291,42293,42295,42297,42299],{"class":729,"line":4754},[727,42276,18112],{"class":1986},[727,42278,2524],{"class":768},[727,42280,12512],{"class":1986},[727,42282,18119],{"class":768},[727,42284,4970],{"class":1986},[727,42286,18124],{"class":1882},[727,42288,18127],{"class":768},[727,42290,18130],{"class":1986},[727,42292,18133],{"class":768},[727,42294,18136],{"class":1882},[727,42296,18127],{"class":768},[727,42298,18141],{"class":1986},[727,42300,18144],{"class":768},[727,42302,42303,42305,42307,42309,42311,42313,42315,42317,42319],{"class":729,"line":1753},[727,42304,17003],{"class":1986},[727,42306,18151],{"class":1882},[727,42308,2321],{"class":1986},[727,42310,18133],{"class":768},[727,42312,18158],{"class":2376},[727,42314,18161],{"class":768},[727,42316,8486],{"class":1986},[727,42318,18166],{"class":768},[727,42320,18169],{"class":2920},[727,42322,42323,42325,42327,42329,42331,42333,42335,42337,42339,42341,42343,42345,42347,42349,42351,42353],{"class":729,"line":4763},[727,42324,17164],{"class":768},[727,42326,2597],{"class":2376},[727,42328,2542],{"class":768},[727,42330,18180],{"class":737},[727,42332,18183],{"class":768},[727,42334,44],{"class":737},[727,42336,18188],{"class":2376},[727,42338,2542],{"class":737},[727,42340,18193],{"class":768},[727,42342,18196],{"class":1986},[727,42344,18199],{"class":768},[727,42346,5031],{"class":737},[727,42348,8486],{"class":1986},[727,42350,18206],{"class":1882},[727,42352,2448],{"class":737},[727,42354,5005],{"class":768},[727,42356,42357,42359,42361,42363],{"class":729,"line":4768},[727,42358,10163],{"class":1986},[727,42360,16985],{"class":2376},[727,42362,18219],{"class":768},[727,42364,18222],{"class":2920},[727,42366,42367],{"class":729,"line":4773},[727,42368,9712],{"class":768},[727,42370,42371],{"class":729,"line":4778},[727,42372,2639],{"class":768},[727,42374,42375],{"class":729,"line":4783},[727,42376,1898],{"emptyLinePlaceholder":522},[727,42378,42379],{"class":729,"line":4788},[727,42380,18239],{"class":2920},[727,42382,42383,42385],{"class":729,"line":1048},[727,42384,18244],{"class":2376},[727,42386,17665],{"class":768},[21,42388,776],{"id":775},[14,42390,18251],{},[555,42392,42393,42395,42397],{},[83,42394,18256],{},[83,42396,18259],{},[83,42398,18262],{},[21,42400,796],{"id":795},[14,42402,18267],{},[811,42404,18270],{},{"title":494,"searchDepth":495,"depth":495,"links":42406},[42407,42408,42414,42415],{"id":545,"depth":498,"text":546},{"id":16710,"depth":498,"text":16711,"children":42409},[42410,42411,42412,42413],{"id":16719,"depth":495,"text":16720},{"id":16734,"depth":495,"text":16735},{"id":17201,"depth":495,"text":17202},{"id":17668,"depth":495,"text":17669},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"type":513,"format":77,"intent_type":515,"intent":827,"tags":42417,"platfrom":42418,"video":18288},[829,830,18285],[18287],{"title":16580,"description":18282},{"id":18293,"title":18294,"body":42421,"date":523,"description":18476,"extension":506,"meta":42558,"navigation":522,"order":523,"path":18481,"seo":42561,"stem":18483,"__hash__":18484},{"type":8,"value":42422,"toc":42549},[42423,42425,42427,42431,42433,42435,42437,42457,42459,42461,42463,42479,42481,42497,42499,42503,42517,42519,42521,42523,42525,42529,42531,42535,42543,42545,42547],[11,42424],{},[14,42426,18301],{},[14,42428,18304,42429,12252],{},[322,42430,18308],{"href":18307},[18,42432],{},[21,42434,546],{"id":545},[14,42436,551],{},[77,42438,42439],{},[555,42440,42441,42447,42451],{},[83,42442,42443,562,42445,44],{},[29,42444,561],{},[322,42446,566],{"href":565},[83,42448,42449,572],{},[29,42450,571],{},[83,42452,42453,578,42455,44],{},[29,42454,577],{},[90,42456,581],{},[21,42458,18338],{"id":18337},[14,42460,18341],{},[592,42462],{"src":18344,"alt":18345},[77,42464,42465],{},[555,42466,42467,42471,42475],{},[83,42468,42469,18355],{},[29,42470,18354],{},[83,42472,42473,18361],{},[29,42474,18360],{},[83,42476,42477,18367],{},[29,42478,18366],{},[592,42480],{"src":18370,"alt":18371},[77,42482,42483],{},[555,42484,42485,42489,42493],{},[83,42486,42487,18380],{},[29,42488,8187],{},[83,42490,42491,18385],{},[29,42492,11394],{},[83,42494,42495,18390],{},[29,42496,3293],{},[592,42498],{"src":18393,"alt":18394},[14,42500,18397,42501,18401],{},[322,42502,7722],{"href":18400},[77,42504,42505],{},[555,42506,42507,42511],{},[83,42508,42509,18410],{},[29,42510,577],{},[83,42512,42513,18415,42515,18418],{},[29,42514,11394],{},[90,42516,198],{},[592,42518],{"src":18421,"alt":18422},[21,42520,12734],{"id":18425},[14,42522,18428],{},[639,42524,18432],{"id":18431},[14,42526,18435,42527,18439],{},[322,42528,18338],{"href":18438},[21,42530,776],{"id":775},[14,42532,18444,42533,18447],{},[29,42534,3850],{},[77,42536,42537],{},[555,42538,42539,42541],{},[83,42540,18454],{},[83,42542,18457],{},[592,42544],{"src":18460,"alt":18461},[21,42546,796],{"id":795},[14,42548,18466],{},{"title":494,"searchDepth":495,"depth":495,"links":42550},[42551,42552,42553,42556,42557],{"id":545,"depth":498,"text":546},{"id":18337,"depth":498,"text":18338},{"id":18425,"depth":498,"text":12734,"children":42554},[42555],{"id":18431,"depth":495,"text":18432},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":827,"tags":42559,"platfrom":42560,"video":18480},[829,830,18285],[3293],{"title":18294,"description":18476},{"id":18486,"title":18487,"body":42563,"date":523,"description":18762,"extension":506,"meta":42809,"navigation":522,"order":523,"path":18768,"seo":42812,"stem":18770,"__hash__":18771},{"type":8,"value":42564,"toc":42804},[42565,42567,42573,42575,42577,42601,42603,42612,42798,42800],[11,42566],{},[14,42568,18494,42569,18499,42571,44],{},[322,42570,18498],{"href":18497},[322,42572,18502],{"href":6181},[21,42574,11202],{"id":11201},[14,42576,18507],{},[7092,42578,42579,42587],{},[7095,42580,42581],{},[7098,42582,42583,42585],{},[7101,42584,3548],{},[7101,42586,11216],{},[7108,42588,42589,42595],{},[7098,42590,42591,42593],{},[7113,42592,18524],{},[7113,42594,18527],{},[7098,42596,42597,42599],{},[7113,42598,18532],{},[7113,42600,18527],{},[21,42602,7133],{"id":7132},[14,42604,11245,42605,11250,42608,7142,42610,11256],{},[322,42606,3435],{"href":18541,"rel":42607},[2245],[29,42609,7141],{},[29,42611,11255],{},[77,42613,42614],{},[80,42615,42616,42644],{},[83,42617,42618,88,42620,42622],{},[29,42619,87],{},[90,42621,92],{},[80,42623,42624,42628,42632,42638],{},[83,42625,42626,16362],{},[90,42627,99],{},[83,42629,42630,7975],{},[90,42631,105],{},[83,42633,42634,162,42636,44],{},[90,42635,7182],{},[90,42637,7186],{},[83,42639,42640,162,42642,44],{},[90,42641,5267],{},[90,42643,7194],{},[83,42645,42646,88,42648,42650,42660],{},[29,42647,111],{},[90,42649,114],{},[80,42651,42652],{},[83,42653,42654,132,42656,136,42658,44],{},[90,42655,465],{},[90,42657,194],{},[90,42659,139],{},[80,42661,42662,42676,42702,42720,42746,42770],{},[83,42663,42664,88,42666,42668],{},[29,42665,121],{},[90,42667,18603],{},[80,42669,42670],{},[83,42671,42672,224,42674,44],{},[90,42673,131],{},[90,42675,18612],{},[83,42677,42678,88,42680,42682],{},[29,42679,145],{},[90,42681,18619],{},[80,42683,42684,42694],{},[83,42685,42686,132,42688,18628,42690,18632,42692,44],{},[90,42687,155],{},[90,42689,155],{},[90,42691,18631],{},[90,42693,3659],{},[83,42695,42696,162,42698,3652,42700,44],{},[90,42697,11394],{},[90,42699,15579],{},[90,42701,18643],{},[83,42703,42704,88,42706,42708],{},[29,42705,170],{},[90,42707,18650],{},[80,42709,42710],{},[83,42711,42712,132,42714,18659,42716,15909,42718,44],{},[90,42713,953],{},[90,42715,194],{},[90,42717,3548],{},[90,42719,139],{},[83,42721,42722,88,42724,42726],{},[29,42723,213],{},[90,42725,18670],{},[80,42727,42728,42736],{},[83,42729,42730,132,42732,18679,42734,44],{},[90,42731,155],{},[90,42733,155],{},[90,42735,3659],{},[83,42737,42738,132,42740,18659,42742,15909,42744,44],{},[90,42739,1189],{},[90,42741,194],{},[90,42743,11216],{},[90,42745,139],{},[83,42747,42748,88,42750,42752],{},[29,42749,241],{},[90,42751,9962],{},[80,42753,42754,42762],{},[83,42755,42756,132,42758,18628,42760,18708],{},[90,42757,155],{},[90,42759,155],{},[90,42761,18631],{},[83,42763,42764,162,42766,3652,42768,44],{},[90,42765,11394],{},[90,42767,15579],{},[90,42769,18643],{},[83,42771,42772,88,42774,42776],{},[29,42773,278],{},[90,42775,281],{},[80,42777,42778,42782,42786,42792],{},[83,42779,42780,18729],{},[90,42781,99],{},[83,42783,42784,18734],{},[90,42785,105],{},[83,42787,42788,162,42790,44],{},[90,42789,11490],{},[90,42791,165],{},[83,42793,42794,162,42796,44],{},[90,42795,11498],{},[90,42797,165],{},[21,42799,796],{"id":795},[14,42801,18751,42802,18756],{},[322,42803,18755],{"href":18754},{"title":494,"searchDepth":495,"depth":495,"links":42805},[42806,42807,42808],{"id":11201,"depth":498,"text":11202},{"id":7132,"depth":498,"text":7133},{"id":795,"depth":498,"text":796},{"type":513,"format":77,"intent_type":1049,"intent":1050,"tags":42810,"platfrom":42811},[1318,11532],[18766,18767],{"title":18487,"description":18762},{"id":18773,"title":18774,"body":42814,"date":523,"description":19079,"extension":506,"meta":43055,"navigation":522,"order":523,"path":19085,"seo":43058,"stem":19087,"__hash__":19088},{"type":8,"value":42815,"toc":43045},[42816,42818,42820,42822,42824,42826,42846,42848,42850,42852,42857,42873,42877,42915,42917,42919,42924,42945,42949,42977,42979,42984,43017,43019,43021,43023,43035,43037,43039,43041],[11,42817],{},[14,42819,18781],{},[14,42821,18784],{},[21,42823,546],{"id":545},[14,42825,551],{},[77,42827,42828],{},[555,42829,42830,42836,42840],{},[83,42831,42832,562,42834,44],{},[29,42833,561],{},[322,42835,566],{"href":565},[83,42837,42838,572],{},[29,42839,571],{},[83,42841,42842,578,42844,44],{},[29,42843,577],{},[90,42845,581],{},[21,42847,18812],{"id":18811},[14,42849,18815],{},[639,42851,18819],{"id":18818},[14,42853,18822,42854,18828],{},[322,42855,18827],{"href":18825,"rel":42856},[2245],[77,42858,42859],{},[555,42860,42861,42865,42869],{},[83,42862,42863,18838],{},[29,42864,18837],{},[83,42866,42867,18843],{},[29,42868,620],{},[83,42870,42871,18849],{},[29,42872,18848],{},[14,42874,18852,42875,18856],{},[807,42876,18855],{},[77,42878,42879],{},[555,42880,42881,42887,42893,42899,42905,42911],{},[83,42882,42883,578,42885,44],{},[29,42884,3922],{},[90,42886,581],{},[83,42888,42889,162,42891,44],{},[29,42890,12234],{},[90,42892,627],{},[83,42894,42895,162,42897,44],{},[29,42896,18877],{},[90,42898,8859],{},[83,42900,42901,162,42903,44],{},[29,42902,12241],{},[90,42904,8859],{},[83,42906,42907,18890,42909,12252],{},[29,42908,632],{},[322,42910,12251],{"href":6720},[83,42912,42913,18898],{},[29,42914,18897],{},[592,42916],{"src":18901,"alt":18902},[639,42918,18906],{"id":18905},[14,42920,18909,42921,18914],{},[322,42922,18827],{"href":18912,"rel":42923},[2245],[77,42925,42926],{},[555,42927,42928,42935,42939],{},[83,42929,42930,18924,42932,18928],{},[29,42931,18923],{},[322,42933,18827],{"href":18912,"rel":42934},[2245],[83,42936,42937,18934],{},[29,42938,18933],{},[83,42940,42941,18940,42943,18944],{},[29,42942,18939],{},[807,42944,18943],{},[14,42946,18852,42947,18856],{},[807,42948,18943],{},[77,42950,42951],{},[555,42952,42953,42959,42965,42971],{},[83,42954,42955,578,42957,44],{},[29,42956,3922],{},[90,42958,581],{},[83,42960,42961,162,42963,44],{},[29,42962,12234],{},[90,42964,627],{},[83,42966,42967,162,42969,44],{},[29,42968,14599],{},[90,42970,18971],{},[83,42972,42973,18890,42975,12252],{},[29,42974,632],{},[322,42976,12251],{"href":6720},[21,42978,18981],{"id":18980},[14,42980,18984,42981,18988],{},[322,42982,18827],{"href":18912,"rel":42983},[2245],[77,42985,42986],{},[555,42987,42988,42995,42999,43005,43009,43013],{},[83,42989,42990,18924,42992,18928],{},[29,42991,18923],{},[322,42993,18827],{"href":18912,"rel":42994},[2245],[83,42996,42997,19004],{},[29,42998,18933],{},[83,43000,43001,19009,43003,19013],{},[29,43002,620],{},[807,43004,19012],{},[83,43006,43007,19019],{},[29,43008,19018],{},[83,43010,43011,19025],{},[29,43012,19024],{},[83,43014,43015,19030],{},[29,43016,12302],{},[592,43018],{"src":19033,"alt":19034},[21,43020,776],{"id":775},[14,43022,19039],{},[77,43024,43025],{},[555,43026,43027,43031],{},[83,43028,43029,19049],{},[29,43030,19048],{},[83,43032,43033,19055],{},[29,43034,19054],{},[14,43036,19058],{},[21,43038,796],{"id":795},[14,43040,19063],{},[14,43042,43043],{},[807,43044,19068],{},{"title":494,"searchDepth":495,"depth":495,"links":43046},[43047,43048,43052,43053,43054],{"id":545,"depth":498,"text":546},{"id":18811,"depth":498,"text":18812,"children":43049},[43050,43051],{"id":18818,"depth":495,"text":18819},{"id":18905,"depth":495,"text":18906},{"id":18980,"depth":498,"text":18981},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"type":513,"format":77,"intent_type":515,"intent":827,"tags":43056,"platfrom":43057},[829,830,18285],[19083,19084],{"title":18774,"description":19079},{"id":19697,"title":19698,"body":43060,"date":523,"description":19962,"extension":506,"meta":43296,"navigation":522,"order":523,"path":19967,"seo":43299,"stem":19969,"__hash__":19970},{"type":8,"value":43061,"toc":43290},[43062,43064,43072,43074,43080,43082,43084,43114,43116,43282,43284,43286],[11,43063],{},[14,43065,19705,43066,19709,43068,19713,43070,19718],{},[322,43067,521],{"href":19708},[322,43069,19712],{"href":6142},[322,43071,19717],{"href":19716},[21,43073,7133],{"id":7132},[14,43075,7138,43076,7142,43078,11256],{},[29,43077,7141],{},[29,43079,7145],{},[21,43081,7085],{"id":7084},[14,43083,19731],{},[7092,43085,43086,43094],{},[7095,43087,43088],{},[7098,43089,43090,43092],{},[7101,43091,7103],{},[7101,43093,7106],{},[7108,43095,43096,43102,43108],{},[7098,43097,43098,43100],{},[7113,43099,19748],{},[7113,43101,11896],{},[7098,43103,43104,43106],{},[7113,43105,19748],{},[7113,43107,11896],{},[7098,43109,43110,43112],{},[7113,43111,19748],{},[7113,43113,11896],{},[21,43115,19766],{"id":19765},[77,43117,43118],{},[80,43119,43120,43148,43164,43180,43200,43224,43254],{},[83,43121,43122,88,43124,43126],{},[29,43123,87],{},[90,43125,92],{},[80,43127,43128,43132,43136,43142],{},[83,43129,43130,100],{},[90,43131,99],{},[83,43133,43134,7975],{},[90,43135,105],{},[83,43137,43138,162,43140,44],{},[90,43139,7182],{},[90,43141,7186],{},[83,43143,43144,162,43146,44],{},[90,43145,5267],{},[90,43147,7194],{},[83,43149,43150,88,43152,43154],{},[29,43151,111],{},[90,43153,114],{},[80,43155,43156],{},[83,43157,43158,132,43160,19814,43162,44],{},[90,43159,19811],{},[90,43161,1004],{},[90,43163,139],{},[83,43165,43166,88,43168,43170],{},[29,43167,121],{},[90,43169,124],{},[80,43171,43172],{},[83,43173,43174,132,43176,136,43178,44],{},[90,43175,131],{},[90,43177,1004],{},[90,43179,139],{},[83,43181,43182,88,43184,43186],{},[29,43183,145],{},[90,43185,148],{},[80,43187,43188,43192],{},[83,43189,43190,19845],{},[90,43191,155],{},[83,43193,43194,162,43196,19854,43198,44],{},[90,43195,19850],{},[90,43197,19853],{},[322,43199,19857],{"href":19499},[83,43201,43202,88,43204,43206],{},[29,43203,170],{},[90,43205,5962],{},[80,43207,43208,43212,43218],{},[83,43209,43210,181],{},[90,43211,180],{},[83,43213,43214,224,43216,44],{},[90,43215,465],{},[90,43217,198],{},[83,43219,43220,19880,43222,44],{},[90,43221,204],{},[90,43223,19883],{},[83,43225,43226,88,43228,43230],{},[29,43227,213],{},[90,43229,3303],{},[80,43231,43232,43236,43240,43248],{},[83,43233,43234,19896],{},[90,43235,99],{},[83,43237,43238,19901],{},[90,43239,105],{},[83,43241,43242,132,43244,3492,43246,44],{},[90,43243,465],{},[90,43245,1004],{},[90,43247,19910],{},[83,43249,43250,162,43252,44],{},[90,43251,15309],{},[90,43253,6013],{},[83,43255,43256,88,43258,43260],{},[29,43257,241],{},[90,43259,281],{},[80,43261,43262,43266,43270,43276],{},[83,43263,43264,19929],{},[90,43265,99],{},[83,43267,43268,18734],{},[90,43269,105],{},[83,43271,43272,162,43274,44],{},[90,43273,11490],{},[90,43275,165],{},[83,43277,43278,162,43280,44],{},[90,43279,11498],{},[90,43281,165],{},[21,43283,796],{"id":795},[11,43285],{},[14,43287,19952,43288,19955],{},[322,43289,521],{"href":19708},{"title":494,"searchDepth":495,"depth":495,"links":43291},[43292,43293,43294,43295],{"id":7132,"depth":498,"text":7133},{"id":7084,"depth":498,"text":7085},{"id":19765,"depth":498,"text":19766},{"id":795,"depth":498,"text":796},{"pinned":522,"type":513,"format":514,"intent_type":1754,"intent":516,"tags":43297,"platfrom":43298},[519,518,19965],[1757,521],{"title":19698,"description":19962},{"id":20239,"title":20240,"body":43301,"date":523,"description":20334,"extension":506,"meta":43379,"navigation":522,"order":523,"path":20339,"seo":43382,"stem":20341,"__hash__":20342},{"type":8,"value":43302,"toc":43375},[43303,43305,43309,43311,43313,43319,43369,43371,43373],[11,43304],{},[14,43306,20247,43307,20252],{},[322,43308,20251],{"href":20250},[21,43310,7133],{"id":7132},[11,43312],{},[14,43314,7138,43315,20261,43317,11256],{},[29,43316,7141],{},[29,43318,20264],{},[77,43320,43321],{},[80,43322,43323,43349],{},[83,43324,43325,88,43327,43329],{},[29,43326,349],{},[90,43328,13474],{},[80,43330,43331,43335,43339,43345],{},[83,43332,43333,20281],{},[90,43334,3922],{},[83,43336,43337,20286],{},[90,43338,155],{},[83,43340,43341,20291,43343,20295],{},[90,43342,16039],{},[29,43344,20294],{},[83,43346,43347,20300],{},[90,43348,13489],{},[83,43350,43351,88,43353,43355],{},[29,43352,908],{},[90,43354,20307],{},[80,43356,43357,43365],{},[83,43358,43359,132,43361,19814,43363,44],{},[90,43360,20307],{},[29,43362,194],{},[29,43364,19910],{},[83,43366,43367,20322],{},[90,43368,1643],{},[21,43370,796],{"id":795},[11,43372],{},[14,43374,20329],{},{"title":494,"searchDepth":495,"depth":495,"links":43376},[43377,43378],{"id":7132,"depth":498,"text":7133},{"id":795,"depth":498,"text":796},{"pinned":522,"type":513,"format":77,"intent_type":1754,"intent":4022,"tags":43380,"platfrom":43381},[519,20337],[1757],{"title":20240,"description":20334},{"id":20827,"title":20828,"body":43384,"date":523,"description":21211,"extension":506,"meta":43655,"navigation":522,"order":523,"path":21216,"seo":43658,"stem":21218,"__hash__":21219},{"type":8,"value":43385,"toc":43644},[43386,43388,43393,43395,43397,43405,43407,43409,43411,43443,43445,43447,43479,43481,43483,43485,43487,43489,43519,43527,43534,43538,43540,43542,43546,43548,43550,43552,43554,43556,43558,43560,43600,43602,43636,43638,43640,43642],[11,43387],{},[14,43389,43390,20840],{},[322,43391,20839],{"href":20837,"rel":43392},[2245],[21,43394,546],{"id":545},[11,43396],{},[14,43398,20847,43399,20853,43402,20857],{},[322,43400,20852],{"href":20850,"rel":43401},[2245],[322,43403,20839],{"href":20837,"rel":43404},[2245],[21,43406,20861],{"id":20860},[11,43408],{},[14,43410,20866],{},[77,43412,43413],{},[555,43414,43415,43419,43423,43427,43431,43435,43439],{},[83,43416,43417,20876],{},[29,43418,20875],{},[83,43420,43421,20882],{},[29,43422,20881],{},[83,43424,43425,20888],{},[29,43426,20887],{},[83,43428,43429,20894],{},[29,43430,20893],{},[83,43432,43433,20900],{},[29,43434,20899],{},[83,43436,43437,20905],{},[29,43438,12289],{},[83,43440,43441,20911],{},[29,43442,20910],{},[592,43444],{"src":20914,"alt":20915},[14,43446,20918],{},[77,43448,43449],{},[80,43450,43451],{},[83,43452,43453,611,43455,20929,43457],{},[90,43454,7722],{},[322,43456,7722],{"href":18400},[80,43458,43459,43465],{},[83,43460,43461,20936,43463,20940],{},[90,43462,577],{},[29,43464,20939],{},[83,43466,43467,20945,43469],{},[90,43468,16510],{},[80,43470,43471,43475],{},[83,43472,20950,43473,44],{},[29,43474,20953],{},[83,43476,6209,43477,20959],{},[29,43478,20958],{},[592,43480],{"src":20962,"alt":20963},[639,43482,20967],{"id":20966},[11,43484],{},[14,43486,20972],{},[14,43488,20975],{},[77,43490,43491],{},[555,43492,43493,43497,43503,43507,43513],{},[83,43494,43495,20985],{},[29,43496,20984],{},[83,43498,43499,20991,43501,44],{},[29,43500,20990],{},[29,43502,20994],{},[83,43504,43505,21000],{},[29,43506,20999],{},[83,43508,43509,21006,43511,44],{},[29,43510,21005],{},[29,43512,21009],{},[83,43514,43515,20936,43517,21017],{},[29,43516,21014],{},[29,43518,20910],{},[14,43520,43521,21022,43523,21026,43525,44],{},[807,43522,15097],{},[322,43524,8218],{"href":21025},[322,43526,3313],{"href":3312},[14,43528,21031,43529,21034,43531,21040],{},[322,43530,7722],{"href":18400},[322,43532,21039],{"href":21037,"rel":43533},[2245],[14,43535,21043,43536,12252],{},[322,43537,21047],{"href":21046},[21,43539,776],{"id":775},[11,43541],{},[14,43543,21054,43544,21058],{},[322,43545,21057],{"href":486},[14,43547,21061],{},[21,43549,6725],{"id":6724},[11,43551],{},[14,43553,21068],{},[639,43555,21072],{"id":21071},[11,43557],{},[14,43559,21077],{},[77,43561,43562],{},[555,43563,43564,43568,43572,43576,43580,43584,43588,43592,43596],{},[83,43565,43566,21087],{},[29,43567,21086],{},[83,43569,43570,21093],{},[29,43571,21092],{},[83,43573,43574,21099],{},[29,43575,21098],{},[83,43577,43578,21105],{},[29,43579,21104],{},[83,43581,43582,21111],{},[29,43583,21110],{},[83,43585,43586,21117],{},[29,43587,21116],{},[83,43589,43590,21123],{},[29,43591,21122],{},[83,43593,43594,21129],{},[29,43595,21128],{},[83,43597,43598,21135],{},[29,43599,21134],{},[14,43601,21138],{},[77,43603,43604],{},[555,43605,43606,43610,43616,43622,43628,43632],{},[83,43607,43608,21148],{},[29,43609,21147],{},[83,43611,43612,21154,43614,21157],{},[29,43613,21153],{},[322,43615,7555],{"href":7554},[83,43617,43618,21163,43620,21167],{},[29,43619,21162],{},[322,43621,9391],{"href":21166},[83,43623,43624,21173,43626,21176],{},[29,43625,21172],{},[322,43627,7722],{"href":18400},[83,43629,43630,21182],{},[29,43631,21181],{},[83,43633,43634,21188],{},[29,43635,21187],{},[592,43637],{"src":21191,"alt":21192},[21,43639,796],{"id":795},[11,43641],{},[14,43643,21199],{},{"title":494,"searchDepth":495,"depth":495,"links":43645},[43646,43647,43650,43651,43654],{"id":545,"depth":498,"text":546},{"id":20860,"depth":498,"text":20861,"children":43648},[43649],{"id":20966,"depth":495,"text":20967},{"id":775,"depth":498,"text":776},{"id":6724,"depth":498,"text":6725,"children":43652},[43653],{"id":21071,"depth":495,"text":21072},{"id":795,"depth":498,"text":796},{"type":513,"format":514,"intent_type":515,"intent":827,"tags":43656,"platfrom":43657},[829,830,21214],[20852],{"title":20828,"description":21211},{"id":21221,"title":21222,"body":43660,"date":523,"description":22498,"extension":506,"meta":44789,"navigation":522,"order":523,"path":22503,"seo":44792,"stem":22505,"__hash__":22506},{"type":8,"value":43661,"toc":44779},[43662,43664,43669,43671,43673,43675,43702,43704,43706,43708,43710,43712,43714,43716,43720,43770,43772,43886,43890,44086,44090,44100,44104,44360,44364,44374,44376,44378,44382,44384,44416,44420,44431,44433,44611,44615,44713,44721,44723,44725,44729,44735,44737,44755,44757,44759,44761,44765,44767,44769,44771,44773,44775,44777],[11,43663],{},[14,43665,43666,21234],{},[322,43667,21233],{"href":21231,"rel":43668},[2245],[21,43670,546],{"id":545},[11,43672],{},[14,43674,21241],{},[77,43676,43677],{},[555,43678,43679,43683,43690,43696],{},[83,43680,43681],{},[29,43682,21250],{},[83,43684,43685,1995,43687],{},[29,43686,21255],{},[322,43688,21260],{"href":21258,"rel":43689},[2245],[83,43691,43692,21266,43694],{},[29,43693,21265],{},[29,43695,21269],{},[83,43697,43698,21266,43700],{},[29,43699,21274],{},[29,43701,21277],{},[14,43703,21280],{},[21,43705,21284],{"id":21283},[11,43707],{},[14,43709,21289],{},[639,43711,21293],{"id":21292},[11,43713],{},[14,43715,21298],{},[14,43717,21301,43718,21304],{},[322,43719,2301],{"href":2300},[719,43721,43722],{"className":756,"code":21307,"language":758,"meta":494,"style":494},[90,43723,43724,43728,43746,43758],{"__ignoreMap":494},[727,43725,43726],{"class":729,"line":730},[727,43727,21314],{"class":2920},[727,43729,43730,43732,43734,43736,43738,43740,43742,43744],{"class":729,"line":498},[727,43731,2315],{"class":1986},[727,43733,21321],{"class":1882},[727,43735,2321],{"class":1986},[727,43737,21326],{"class":768},[727,43739,17337],{"class":1986},[727,43741,21331],{"class":768},[727,43743,17337],{"class":1986},[727,43745,17340],{"class":768},[727,43747,43748,43750,43752,43754,43756],{"class":729,"line":495},[727,43749,2315],{"class":1986},[727,43751,21342],{"class":1882},[727,43753,2321],{"class":1986},[727,43755,21347],{"class":737},[727,43757,2327],{"class":768},[727,43759,43760,43762,43764,43766,43768],{"class":729,"line":1895},[727,43761,2315],{"class":1986},[727,43763,21356],{"class":1882},[727,43765,2321],{"class":1986},[727,43767,21361],{"class":737},[727,43769,2327],{"class":768},[14,43771,21366],{},[719,43773,43774],{"className":756,"code":21369,"language":758,"meta":494,"style":494},[90,43775,43776,43794,43804,43832,43836,43868,43872,43876,43882],{"__ignoreMap":494},[727,43777,43778,43780,43782,43784,43786,43788,43790,43792],{"class":729,"line":730},[727,43779,2315],{"class":1986},[727,43781,21378],{"class":2376},[727,43783,2321],{"class":1986},[727,43785,2524],{"class":768},[727,43787,1838],{"class":733},[727,43789,5031],{"class":768},[727,43791,2388],{"class":1986},[727,43793,2391],{"class":768},[727,43795,43796,43798,43800,43802],{"class":729,"line":498},[727,43797,17003],{"class":1986},[727,43799,21397],{"class":1882},[727,43801,2321],{"class":1986},[727,43803,4973],{"class":768},[727,43805,43806,43808,43810,43812,43814,43816,43818,43820,43822,43824,43826,43828,43830],{"class":729,"line":495},[727,43807,21406],{"class":1986},[727,43809,2524],{"class":768},[727,43811,4964],{"class":1986},[727,43813,18119],{"class":768},[727,43815,4970],{"class":1986},[727,43817,18124],{"class":1882},[727,43819,18127],{"class":768},[727,43821,18130],{"class":1986},[727,43823,21423],{"class":768},[727,43825,18136],{"class":1882},[727,43827,21428],{"class":768},[727,43829,21431],{"class":1986},[727,43831,16992],{"class":768},[727,43833,43834],{"class":729,"line":1895},[727,43835,21438],{"class":2920},[727,43837,43838,43840,43842,43844,43846,43848,43850,43852,43854,43856,43858,43860,43862,43864,43866],{"class":729,"line":1901},[727,43839,21443],{"class":768},[727,43841,5043],{"class":2376},[727,43843,21448],{"class":768},[727,43845,21451],{"class":737},[727,43847,21454],{"class":768},[727,43849,17395],{"class":1882},[727,43851,21459],{"class":768},[727,43853,21462],{"class":737},[727,43855,21454],{"class":768},[727,43857,165],{"class":1882},[727,43859,21459],{"class":768},[727,43861,21471],{"class":737},[727,43863,21454],{"class":768},[727,43865,8883],{"class":1882},[727,43867,21478],{"class":768},[727,43869,43870],{"class":729,"line":1973},[727,43871,2633],{"class":768},[727,43873,43874],{"class":729,"line":2052},[727,43875,3554],{"class":768},[727,43877,43878,43880],{"class":729,"line":2058},[727,43879,17377],{"class":1986},[727,43881,21493],{"class":768},[727,43883,43884],{"class":729,"line":2064},[727,43885,2639],{"class":768},[14,43887,21500,43888,21504],{},[90,43889,21503],{},[719,43891,43892],{"className":756,"code":21507,"language":758,"meta":494,"style":494},[90,43893,43894,43910,43916,43930,43938,43942,43948,43962,43970,43974,43990,43994,43998,44008,44020,44026,44030,44034,44050,44058,44066,44078,44082],{"__ignoreMap":494},[727,43895,43896,43898,43900,43902,43904,43906,43908],{"class":729,"line":730},[727,43897,2315],{"class":1986},[727,43899,21516],{"class":2376},[727,43901,2321],{"class":1986},[727,43903,2382],{"class":1986},[727,43905,2385],{"class":768},[727,43907,2388],{"class":1986},[727,43909,2391],{"class":768},[727,43911,43912,43914],{"class":729,"line":498},[727,43913,2396],{"class":1986},[727,43915,2391],{"class":768},[727,43917,43918,43920,43922,43924,43926,43928],{"class":729,"line":495},[727,43919,2403],{"class":1986},[727,43921,2093],{"class":1882},[727,43923,2321],{"class":1986},[727,43925,2410],{"class":1986},[727,43927,2413],{"class":2376},[727,43929,21547],{"class":768},[727,43931,43932,43934,43936],{"class":729,"line":1895},[727,43933,2421],{"class":768},[727,43935,2424],{"class":737},[727,43937,2427],{"class":768},[727,43939,43940],{"class":729,"line":1901},[727,43941,2432],{"class":768},[727,43943,43944,43946],{"class":729,"line":1973},[727,43945,21564],{"class":737},[727,43947,21567],{"class":768},[727,43949,43950,43952,43954,43956,43958,43960],{"class":729,"line":2052},[727,43951,21572],{"class":737},[727,43953,1995],{"class":768},[727,43955,17038],{"class":737},[727,43957,21579],{"class":768},[727,43959,2448],{"class":737},[727,43961,2427],{"class":768},[727,43963,43964,43966,43968],{"class":729,"line":2058},[727,43965,21588],{"class":737},[727,43967,1995],{"class":768},[727,43969,17055],{"class":737},[727,43971,43972],{"class":729,"line":2064},[727,43973,2465],{"class":768},[727,43975,43976,43978,43980,43982,43984,43986,43988],{"class":729,"line":2087},[727,43977,2470],{"class":768},[727,43979,9620],{"class":1882},[727,43981,44],{"class":768},[727,43983,9625],{"class":2376},[727,43985,2542],{"class":768},[727,43987,21611],{"class":2376},[727,43989,21614],{"class":768},[727,43991,43992],{"class":729,"line":2140},[727,43993,2511],{"class":768},[727,43995,43996],{"class":729,"line":2154},[727,43997,21623],{"class":768},[727,43999,44000,44002,44004,44006],{"class":729,"line":1529},[727,44001,2521],{"class":1986},[727,44003,2524],{"class":768},[727,44005,2527],{"class":1986},[727,44007,2530],{"class":768},[727,44009,44010,44012,44014,44016,44018],{"class":729,"line":2178},[727,44011,2536],{"class":768},[727,44013,2539],{"class":2376},[727,44015,2542],{"class":768},[727,44017,2545],{"class":737},[727,44019,2887],{"class":768},[727,44021,44022,44024],{"class":729,"line":2187},[727,44023,2554],{"class":1986},[727,44025,2327],{"class":768},[727,44027,44028],{"class":729,"line":2533},[727,44029,2562],{"class":768},[727,44031,44032],{"class":729,"line":2551},[727,44033,2516],{"class":768},[727,44035,44036,44038,44040,44042,44044,44046,44048],{"class":729,"line":2559},[727,44037,2403],{"class":1986},[727,44039,2575],{"class":1882},[727,44041,2321],{"class":1986},[727,44043,2410],{"class":1986},[727,44045,2582],{"class":768},[727,44047,2585],{"class":2376},[727,44049,2588],{"class":768},[727,44051,44052,44054,44056],{"class":729,"line":2565},[727,44053,2594],{"class":768},[727,44055,2597],{"class":2376},[727,44057,2600],{"class":768},[727,44059,44060,44062,44064],{"class":729,"line":2570},[727,44061,2606],{"class":768},[727,44063,2609],{"class":1986},[727,44065,2612],{"class":768},[727,44067,44068,44070,44072,44074,44076],{"class":729,"line":2591},[727,44069,2594],{"class":768},[727,44071,2539],{"class":2376},[727,44073,2542],{"class":768},[727,44075,2624],{"class":737},[727,44077,2627],{"class":768},[727,44079,44080],{"class":729,"line":2603},[727,44081,2633],{"class":768},[727,44083,44084],{"class":729,"line":2615},[727,44085,2639],{"class":768},[14,44087,21714,44088,21718],{},[90,44089,21717],{},[719,44091,44092],{"className":756,"code":21721,"language":758,"meta":494,"style":494},[90,44093,44094],{"__ignoreMap":494},[727,44095,44096,44098],{"class":729,"line":730},[727,44097,21717],{"class":2376},[727,44099,2588],{"class":768},[14,44101,21732,44102,21735],{},[90,44103,21717],{},[719,44105,44106],{"className":756,"code":21738,"language":758,"meta":494,"style":494},[90,44107,44108,44112,44124,44128,44144,44172,44178,44192,44200,44204,44210,44224,44232,44236,44260,44264,44268,44278,44290,44296,44300,44304,44320,44328,44336,44348,44352,44356],{"__ignoreMap":494},[727,44109,44110],{"class":729,"line":730},[727,44111,21745],{"class":2920},[727,44113,44114,44116,44118,44120,44122],{"class":729,"line":498},[727,44115,2315],{"class":1986},[727,44117,18199],{"class":1882},[727,44119,2321],{"class":1986},[727,44121,18105],{"class":1882},[727,44123,2327],{"class":768},[727,44125,44126],{"class":729,"line":495},[727,44127,1898],{"emptyLinePlaceholder":522},[727,44129,44130,44132,44134,44136,44138,44140,44142],{"class":729,"line":1895},[727,44131,2315],{"class":1986},[727,44133,21516],{"class":2376},[727,44135,2321],{"class":1986},[727,44137,2382],{"class":1986},[727,44139,2385],{"class":768},[727,44141,2388],{"class":1986},[727,44143,2391],{"class":768},[727,44145,44146,44148,44150,44152,44154,44156,44158,44160,44162,44164,44166,44168,44170],{"class":729,"line":1901},[727,44147,21406],{"class":1986},[727,44149,2524],{"class":768},[727,44151,4964],{"class":1986},[727,44153,18119],{"class":768},[727,44155,4970],{"class":1986},[727,44157,18124],{"class":1882},[727,44159,18127],{"class":768},[727,44161,18130],{"class":1986},[727,44163,21798],{"class":768},[727,44165,18136],{"class":1882},[727,44167,18127],{"class":768},[727,44169,18141],{"class":1986},[727,44171,18144],{"class":768},[727,44173,44174,44176],{"class":729,"line":1973},[727,44175,21811],{"class":1986},[727,44177,2391],{"class":768},[727,44179,44180,44182,44184,44186,44188,44190],{"class":729,"line":2052},[727,44181,21818],{"class":1986},[727,44183,2093],{"class":1882},[727,44185,2321],{"class":1986},[727,44187,2410],{"class":1986},[727,44189,2413],{"class":2376},[727,44191,21547],{"class":768},[727,44193,44194,44196,44198],{"class":729,"line":2058},[727,44195,21833],{"class":768},[727,44197,2424],{"class":737},[727,44199,2427],{"class":768},[727,44201,44202],{"class":729,"line":2064},[727,44203,21842],{"class":768},[727,44205,44206,44208],{"class":729,"line":2087},[727,44207,21847],{"class":737},[727,44209,21567],{"class":768},[727,44211,44212,44214,44216,44218,44220,44222],{"class":729,"line":2140},[727,44213,21854],{"class":737},[727,44215,1995],{"class":768},[727,44217,17038],{"class":737},[727,44219,21579],{"class":768},[727,44221,2448],{"class":737},[727,44223,2427],{"class":768},[727,44225,44226,44228,44230],{"class":729,"line":2154},[727,44227,21869],{"class":737},[727,44229,1995],{"class":768},[727,44231,17055],{"class":737},[727,44233,44234],{"class":729,"line":1529},[727,44235,21878],{"class":768},[727,44237,44238,44240,44242,44244,44246,44248,44250,44252,44254,44256,44258],{"class":729,"line":2178},[727,44239,21883],{"class":768},[727,44241,9620],{"class":1882},[727,44243,44],{"class":768},[727,44245,9625],{"class":2376},[727,44247,2542],{"class":768},[727,44249,21611],{"class":2376},[727,44251,21896],{"class":768},[727,44253,18158],{"class":2376},[727,44255,18161],{"class":768},[727,44257,8486],{"class":1986},[727,44259,21905],{"class":768},[727,44261,44262],{"class":729,"line":2187},[727,44263,21910],{"class":768},[727,44265,44266],{"class":729,"line":2533},[727,44267,21623],{"class":768},[727,44269,44270,44272,44274,44276],{"class":729,"line":2551},[727,44271,21919],{"class":1986},[727,44273,2524],{"class":768},[727,44275,2527],{"class":1986},[727,44277,2530],{"class":768},[727,44279,44280,44282,44284,44286,44288],{"class":729,"line":2559},[727,44281,21930],{"class":768},[727,44283,2539],{"class":2376},[727,44285,2542],{"class":768},[727,44287,2545],{"class":737},[727,44289,2887],{"class":768},[727,44291,44292,44294],{"class":729,"line":2565},[727,44293,21943],{"class":1986},[727,44295,2327],{"class":768},[727,44297,44298],{"class":729,"line":2570},[727,44299,2856],{"class":768},[727,44301,44302],{"class":729,"line":2591},[727,44303,2516],{"class":768},[727,44305,44306,44308,44310,44312,44314,44316,44318],{"class":729,"line":2603},[727,44307,21818],{"class":1986},[727,44309,2575],{"class":1882},[727,44311,2321],{"class":1986},[727,44313,2410],{"class":1986},[727,44315,2582],{"class":768},[727,44317,2585],{"class":2376},[727,44319,2588],{"class":768},[727,44321,44322,44324,44326],{"class":729,"line":2615},[727,44323,2536],{"class":768},[727,44325,2597],{"class":2376},[727,44327,2600],{"class":768},[727,44329,44330,44332,44334],{"class":729,"line":2630},[727,44331,21982],{"class":768},[727,44333,2609],{"class":1986},[727,44335,21987],{"class":768},[727,44337,44338,44340,44342,44344,44346],{"class":729,"line":2636},[727,44339,2536],{"class":768},[727,44341,2597],{"class":2376},[727,44343,2542],{"class":768},[727,44345,2624],{"class":737},[727,44347,22000],{"class":768},[727,44349,44350],{"class":729,"line":2642},[727,44351,2562],{"class":768},[727,44353,44354],{"class":729,"line":2647},[727,44355,2633],{"class":768},[727,44357,44358],{"class":729,"line":4657},[727,44359,2639],{"class":768},[14,44361,22015,44362,21718],{},[90,44363,21717],{},[719,44365,44366],{"className":756,"code":21721,"language":758,"meta":494,"style":494},[90,44367,44368],{"__ignoreMap":494},[727,44369,44370,44372],{"class":729,"line":730},[727,44371,21717],{"class":2376},[727,44373,2588],{"class":768},[639,44375,22031],{"id":22030},[11,44377],{},[14,44379,22036,44380,14647],{},[322,44381,2301],{"href":2300},[14,44383,22041],{},[719,44385,44386],{"className":756,"code":22044,"language":758,"meta":494,"style":494},[90,44387,44388,44392,44404],{"__ignoreMap":494},[727,44389,44390],{"class":729,"line":730},[727,44391,22051],{"class":2920},[727,44393,44394,44396,44398,44400,44402],{"class":729,"line":498},[727,44395,2315],{"class":1986},[727,44397,21342],{"class":1882},[727,44399,2321],{"class":1986},[727,44401,21347],{"class":737},[727,44403,2327],{"class":768},[727,44405,44406,44408,44410,44412,44414],{"class":729,"line":495},[727,44407,2315],{"class":1986},[727,44409,21356],{"class":1882},[727,44411,2321],{"class":1986},[727,44413,21361],{"class":737},[727,44415,2327],{"class":768},[14,44417,22078,44418,22082],{},[90,44419,22081],{},[80,44421,44422,44424,44426],{},[83,44423,22087],{},[83,44425,22090],{},[83,44427,22093,44428,44],{},[322,44429,22098],{"href":22096,"rel":44430},[2245],[14,44432,22101],{},[719,44434,44435],{"className":756,"code":22104,"language":758,"meta":494,"style":494},[90,44436,44437,44453,44459,44473,44477,44483,44495,44499,44503,44507,44517,44529,44535,44539,44543,44559,44565,44573,44585,44589,44593,44597],{"__ignoreMap":494},[727,44438,44439,44441,44443,44445,44447,44449,44451],{"class":729,"line":730},[727,44440,2315],{"class":1986},[727,44442,22113],{"class":2376},[727,44444,2321],{"class":1986},[727,44446,2382],{"class":1986},[727,44448,2385],{"class":768},[727,44450,2388],{"class":1986},[727,44452,2391],{"class":768},[727,44454,44455,44457],{"class":729,"line":498},[727,44456,2396],{"class":1986},[727,44458,2391],{"class":768},[727,44460,44461,44463,44465,44467,44469,44471],{"class":729,"line":495},[727,44462,17096],{"class":1986},[727,44464,2093],{"class":1882},[727,44466,2321],{"class":1986},[727,44468,2410],{"class":1986},[727,44470,2413],{"class":2376},[727,44472,21547],{"class":768},[727,44474,44475],{"class":729,"line":1895},[727,44476,22148],{"class":768},[727,44478,44479,44481],{"class":729,"line":1901},[727,44480,22153],{"class":737},[727,44482,21567],{"class":768},[727,44484,44485,44487,44489,44491,44493],{"class":729,"line":1973},[727,44486,22160],{"class":737},[727,44488,1995],{"class":768},[727,44490,17038],{"class":737},[727,44492,21579],{"class":768},[727,44494,22169],{"class":737},[727,44496,44497],{"class":729,"line":2052},[727,44498,2562],{"class":768},[727,44500,44501],{"class":729,"line":2058},[727,44502,22178],{"class":768},[727,44504,44505],{"class":729,"line":2064},[727,44506,3185],{"class":768},[727,44508,44509,44511,44513,44515],{"class":729,"line":2087},[727,44510,22187],{"class":1986},[727,44512,2524],{"class":768},[727,44514,2527],{"class":1986},[727,44516,2530],{"class":768},[727,44518,44519,44521,44523,44525,44527],{"class":729,"line":2140},[727,44520,2594],{"class":768},[727,44522,2539],{"class":2376},[727,44524,2542],{"class":768},[727,44526,2624],{"class":737},[727,44528,5005],{"class":768},[727,44530,44531,44533],{"class":729,"line":2154},[727,44532,2143],{"class":1986},[727,44534,2327],{"class":768},[727,44536,44537],{"class":729,"line":1529},[727,44538,22216],{"class":768},[727,44540,44541],{"class":729,"line":2178},[727,44542,2516],{"class":768},[727,44544,44545,44547,44549,44551,44553,44555,44557],{"class":729,"line":2187},[727,44546,17096],{"class":1986},[727,44548,2575],{"class":1882},[727,44550,2321],{"class":1986},[727,44552,2410],{"class":1986},[727,44554,2582],{"class":768},[727,44556,2585],{"class":2376},[727,44558,2588],{"class":768},[727,44560,44561,44563],{"class":729,"line":2533},[727,44562,22241],{"class":1986},[727,44564,22244],{"class":768},[727,44566,44567,44569,44571],{"class":729,"line":2551},[727,44568,2606],{"class":768},[727,44570,2609],{"class":1986},[727,44572,22253],{"class":768},[727,44574,44575,44577,44579,44581,44583],{"class":729,"line":2559},[727,44576,17114],{"class":768},[727,44578,2539],{"class":2376},[727,44580,2542],{"class":768},[727,44582,2624],{"class":737},[727,44584,22000],{"class":768},[727,44586,44587],{"class":729,"line":2565},[727,44588,2633],{"class":768},[727,44590,44591],{"class":729,"line":2570},[727,44592,2639],{"class":768},[727,44594,44595],{"class":729,"line":2591},[727,44596,1898],{"emptyLinePlaceholder":522},[727,44598,44599,44601,44603,44605,44607,44609],{"class":729,"line":2603},[727,44600,2315],{"class":1986},[727,44602,22284],{"class":1882},[727,44604,2321],{"class":1986},[727,44606,2410],{"class":1986},[727,44608,22113],{"class":2376},[727,44610,2588],{"class":768},[14,44612,5070,44613,22297],{},[90,44614,1838],{},[719,44616,44617],{"className":756,"code":22300,"language":758,"meta":494,"style":494},[90,44618,44619,44633,44643,44671,44683,44687,44691,44697,44701,44705],{"__ignoreMap":494},[727,44620,44621,44623,44625,44627,44629,44631],{"class":729,"line":730},[727,44622,2315],{"class":1986},[727,44624,21378],{"class":2376},[727,44626,2321],{"class":1986},[727,44628,2385],{"class":768},[727,44630,2388],{"class":1986},[727,44632,2391],{"class":768},[727,44634,44635,44637,44639,44641],{"class":729,"line":498},[727,44636,22321],{"class":1986},[727,44638,21397],{"class":1882},[727,44640,2321],{"class":1986},[727,44642,4973],{"class":768},[727,44644,44645,44647,44649,44651,44653,44655,44657,44659,44661,44663,44665,44667,44669],{"class":729,"line":495},[727,44646,18112],{"class":1986},[727,44648,2524],{"class":768},[727,44650,4964],{"class":1986},[727,44652,18119],{"class":768},[727,44654,4970],{"class":1986},[727,44656,18124],{"class":1882},[727,44658,18127],{"class":768},[727,44660,18130],{"class":1986},[727,44662,21423],{"class":768},[727,44664,18136],{"class":1882},[727,44666,21428],{"class":768},[727,44668,21431],{"class":1986},[727,44670,16992],{"class":768},[727,44672,44673,44675,44677,44679,44681],{"class":729,"line":1895},[727,44674,22360],{"class":768},[727,44676,5043],{"class":2376},[727,44678,22365],{"class":768},[727,44680,2931],{"class":2376},[727,44682,22370],{"class":768},[727,44684,44685],{"class":729,"line":1901},[727,44686,9712],{"class":768},[727,44688,44689],{"class":729,"line":1973},[727,44690,3554],{"class":768},[727,44692,44693,44695],{"class":729,"line":2052},[727,44694,17377],{"class":1986},[727,44696,21493],{"class":768},[727,44698,44699],{"class":729,"line":2058},[727,44700,2639],{"class":768},[727,44702,44703],{"class":729,"line":2064},[727,44704,1898],{"emptyLinePlaceholder":522},[727,44706,44707,44709,44711],{"class":729,"line":2087},[727,44708,2972],{"class":1986},[727,44710,21378],{"class":2376},[727,44712,2588],{"class":768},[14,44714,22403,44715,22406,44717,22410,44719,22413],{},[90,44716,2982],{},[322,44718,22409],{"href":2670},[322,44720,114],{"href":2296},[21,44722,22417],{"id":22416},[11,44724],{},[14,44726,22422,44727,3342],{},[322,44728,3341],{"href":3340},[14,44730,21301,44731,22429,44733,44],{},[322,44732,8895],{"href":6958},[322,44734,8895],{"href":6958},[14,44736,22434],{},[77,44738,44739],{},[555,44740,44741,44745,44751],{},[83,44742,44743,22444],{},[29,44744,22443],{},[83,44746,44747,22450,44749,44],{},[29,44748,22449],{},[90,44750,581],{},[83,44752,44753,22458],{},[29,44754,22457],{},[14,44756,22461],{},[21,44758,776],{"id":775},[11,44760],{},[14,44762,22468,44763,1230],{},[322,44764,3303],{"href":3302},[14,44766,3306],{},[21,44768,796],{"id":795},[11,44770],{},[14,44772,22479],{},[11,44774],{},[14,44776,22484],{},[811,44778,22487],{},{"title":494,"searchDepth":495,"depth":495,"links":44780},[44781,44782,44786,44787,44788],{"id":545,"depth":498,"text":546},{"id":21283,"depth":498,"text":21284,"children":44783},[44784,44785],{"id":21292,"depth":495,"text":21293},{"id":22030,"depth":495,"text":22031},{"id":22416,"depth":498,"text":22417},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"type":90,"format":77,"intent_type":22500,"intent":827,"tags":44790,"platfrom":44791},[829,830,21214],[21233],{"title":21222,"description":22498},{"id":22508,"title":22509,"body":44794,"date":523,"description":22876,"extension":506,"meta":45092,"navigation":522,"order":523,"path":22880,"seo":45095,"stem":22882,"__hash__":22883},{"type":8,"value":44795,"toc":45081},[44796,44798,44803,44805,44807,44824,44829,44831,44833,44835,44840,44844,44846,44848,44850,44866,44896,44900,44902,44904,44920,44994,44998,45002,45004,45006,45008,45024,45054,45058,45060,45062,45067,45071,45073,45075,45079],[11,44797],{},[14,44799,44800,22521],{},[322,44801,22520],{"href":22518,"rel":44802},[2245],[21,44804,546],{"id":545},[14,44806,21241],{},[77,44808,44809],{},[555,44810,44811,44813,44815,44817,44822],{},[83,44812,22532],{},[83,44814,22535],{},[83,44816,22538],{},[83,44818,22541,44819,22547],{},[322,44820,22546],{"href":22544,"rel":44821},[2245],[83,44823,22550],{},[14,44825,22553,44826,12252],{},[322,44827,22558],{"href":22556,"rel":44828},[2245],[21,44830,22562],{"id":22561},[14,44832,22565],{},[639,44834,22569],{"id":22568},[14,44836,22572,44837,22578],{},[322,44838,22577],{"href":22575,"rel":44839},[2245],[14,44841,22581,44842,44],{},[90,44843,22584],{},[14,44845,22587],{},[639,44847,22591],{"id":22590},[14,44849,22594],{},[77,44851,44852],{},[555,44853,44854,44858,44862],{},[83,44855,8350,44856,14647],{},[322,44857,7722],{"href":18400},[83,44859,22605,44860,22608],{},[90,44861,577],{},[83,44863,22611,44864,22614],{},[90,44865,16510],{},[719,44867,44868],{"className":7732,"code":22617,"language":2585,"meta":494,"style":494},[90,44869,44870,44874,44884,44892],{"__ignoreMap":494},[727,44871,44872],{"class":729,"line":730},[727,44873,7740],{"class":768},[727,44875,44876,44878,44880,44882],{"class":729,"line":498},[727,44877,9548],{"class":7745},[727,44879,1995],{"class":768},[727,44881,22632],{"class":737},[727,44883,2427],{"class":768},[727,44885,44886,44888,44890],{"class":729,"line":495},[727,44887,22639],{"class":7745},[727,44889,1995],{"class":768},[727,44891,22644],{"class":737},[727,44893,44894],{"class":729,"line":1895},[727,44895,2639],{"class":768},[14,44897,22651,44898,12252],{},[322,44899,7795],{"href":2670},[639,44901,22657],{"id":22656},[14,44903,22660],{},[77,44905,44906],{},[555,44907,44908,44912,44916],{},[83,44909,8350,44910,14647],{},[322,44911,7722],{"href":18400},[83,44913,22605,44914,22608],{},[90,44915,577],{},[83,44917,22611,44918,22614],{},[90,44919,16510],{},[719,44921,44922],{"className":7732,"code":22679,"language":2585,"meta":494,"style":494},[90,44923,44924,44928,44934,44938,44948,44956,44960,44964,44974,44982,44986,44990],{"__ignoreMap":494},[727,44925,44926],{"class":729,"line":730},[727,44927,7740],{"class":768},[727,44929,44930,44932],{"class":729,"line":498},[727,44931,22690],{"class":7745},[727,44933,22693],{"class":768},[727,44935,44936],{"class":729,"line":495},[727,44937,22698],{"class":768},[727,44939,44940,44942,44944,44946],{"class":729,"line":1895},[727,44941,22703],{"class":7745},[727,44943,1995],{"class":768},[727,44945,22632],{"class":737},[727,44947,2427],{"class":768},[727,44949,44950,44952,44954],{"class":729,"line":1901},[727,44951,22714],{"class":7745},[727,44953,1995],{"class":768},[727,44955,22644],{"class":737},[727,44957,44958],{"class":729,"line":1973},[727,44959,22723],{"class":768},[727,44961,44962],{"class":729,"line":2052},[727,44963,22698],{"class":768},[727,44965,44966,44968,44970,44972],{"class":729,"line":2058},[727,44967,22703],{"class":7745},[727,44969,1995],{"class":768},[727,44971,22736],{"class":737},[727,44973,2427],{"class":768},[727,44975,44976,44978,44980],{"class":729,"line":2064},[727,44977,22714],{"class":7745},[727,44979,1995],{"class":768},[727,44981,22644],{"class":737},[727,44983,44984],{"class":729,"line":2087},[727,44985,2562],{"class":768},[727,44987,44988],{"class":729,"line":2140},[727,44989,22755],{"class":768},[727,44991,44992],{"class":729,"line":2154},[727,44993,2639],{"class":768},[14,44995,5070,44996,22765],{},[90,44997,22764],{},[14,44999,22651,45000,12252],{},[322,45001,7795],{"href":2670},[639,45003,22773],{"id":22772},[14,45005,22776],{},[14,45007,22779],{},[77,45009,45010],{},[555,45011,45012,45016,45020],{},[83,45013,8350,45014,14647],{},[322,45015,7722],{"href":18400},[83,45017,22605,45018,22608],{},[29,45019,577],{},[83,45021,22611,45022,22614],{},[29,45023,16510],{},[719,45025,45026],{"className":7732,"code":22798,"language":2585,"meta":494,"style":494},[90,45027,45028,45032,45042,45050],{"__ignoreMap":494},[727,45029,45030],{"class":729,"line":730},[727,45031,7740],{"class":768},[727,45033,45034,45036,45038,45040],{"class":729,"line":498},[727,45035,22809],{"class":7745},[727,45037,1995],{"class":768},[727,45039,22814],{"class":737},[727,45041,2427],{"class":768},[727,45043,45044,45046,45048],{"class":729,"line":495},[727,45045,9548],{"class":7745},[727,45047,1995],{"class":768},[727,45049,22825],{"class":737},[727,45051,45052],{"class":729,"line":1895},[727,45053,2639],{"class":768},[14,45055,22651,45056,12252],{},[322,45057,7795],{"href":2670},[21,45059,776],{"id":775},[14,45061,22838],{},[14,45063,22841,45064,22845],{},[322,45065,22546],{"href":22544,"rel":45066},[2245],[14,45068,22848,45069],{},[322,45070,22851],{"href":3312},[21,45072,796],{"id":795},[14,45074,22856],{},[14,45076,45077,22862],{},[807,45078,22861],{},[811,45080,7865],{},{"title":494,"searchDepth":495,"depth":495,"links":45082},[45083,45084,45090,45091],{"id":545,"depth":498,"text":546},{"id":22561,"depth":498,"text":22562,"children":45085},[45086,45087,45088,45089],{"id":22568,"depth":495,"text":22569},{"id":22590,"depth":495,"text":22591},{"id":22656,"depth":495,"text":22657},{"id":22772,"depth":495,"text":22773},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"type":90,"format":77,"intent_type":515,"intent":827,"tags":45093,"platfrom":45094},[829,830,21214],[22520],{"title":22509,"description":22876},{"id":22885,"title":22886,"body":45097,"date":523,"description":23107,"extension":506,"meta":45273,"navigation":522,"order":523,"path":23112,"seo":45276,"stem":23114,"__hash__":23115},{"type":8,"value":45098,"toc":45269},[45099,45101,45105,45107,45117,45129,45131,45133,45135,45137,45159,45161,45163,45174,45180],[11,45100],{},[14,45102,5070,45103,22896],{},[29,45104,22895],{},[14,45106,22899],{},[77,45108,45109],{},[555,45110,45111,45115],{},[83,45112,22906,45113,22910],{},[29,45114,22909],{},[83,45116,22913],{},[14,45118,3950,45119,450,45123,22928,45127],{},[29,45120,45121],{},[322,45122,22921],{"href":22920,"download":522},[29,45124,45125],{},[322,45126,22927],{"href":22926,"download":522},[322,45128,22931],{"href":3454},[592,45130],{"src":22934,"alt":22935},[21,45132,546],{"id":545},[11,45134],{},[14,45136,22942],{},[77,45138,45139],{},[80,45140,45141,45147,45151,45155],{},[83,45142,45143,22952,45145,5206],{},[29,45144,22951],{},[90,45146,5205],{},[83,45148,45149,22960],{},[29,45150,22959],{},[83,45152,45153,22966],{},[29,45154,22965],{},[83,45156,45157,22972],{},[29,45158,22971],{},[21,45160,22976],{"id":22975},[11,45162],{},[14,45164,22981,45165,22987,45168,3436,45170,22992,45172,22995],{},[322,45166,22986],{"href":22984,"rel":45167},[2245],[29,45169,3435],{},[29,45171,3439],{},[29,45173,3443],{},[14,45175,3447,45176,3451,45178],{},[322,45177,514],{"href":22920,"download":522},[322,45179,3455],{"href":3454},[77,45181,45182],{},[80,45183,45184,45200,45217],{},[83,45185,45186,88,45188,45190],{},[29,45187,87],{},[90,45189,92],{},[80,45191,45192,45196],{},[83,45193,45194,23018],{},[90,45195,99],{},[83,45197,45198,7975],{},[90,45199,105],{},[83,45201,45202,88,45204,45206],{},[29,45203,111],{},[90,45205,124],{},[80,45207,45208],{},[83,45209,45210,23035,45212,3731,45215,3554],{},[90,45211,131],{},[322,45213,3922],{"href":22984,"rel":45214},[2245],[592,45216],{"src":23041,"alt":23042},[83,45218,45219,88,45221,45223,45231],{},[29,45220,3760],{},[90,45222,114],{},[80,45224,45225],{},[83,45226,45227,23055,45229,23058],{},[90,45228,114],{},[90,45230,139],{},[80,45232,45233,45253,45265],{},[83,45234,45235,88,45237,45239],{},[29,45236,6423],{},[90,45238,6426],{},[80,45240,45241,45247],{},[83,45242,45243,23055,45245,23075],{},[90,45244,953],{},[90,45246,139],{},[83,45248,45249,23080,45251,3554],{},[90,45250,5330],{},[592,45252],{"src":23083,"alt":23084},[83,45254,45255,88,45257,45259],{},[29,45256,6435],{},[90,45258,14950],{},[80,45260,45261],{},[83,45262,45263,23097],{},[90,45264,5353],{},[83,45266,45267,23102],{},[29,45268,6446],{},{"title":494,"searchDepth":495,"depth":495,"links":45270},[45271,45272],{"id":545,"depth":498,"text":546},{"id":22975,"depth":498,"text":22976},{"pinned":522,"type":513,"format":77,"intent_type":1049,"intent":8314,"tags":45274,"platfrom":45275},[519,23110,12881],[7311],{"title":22886,"description":23107},{"id":23570,"title":23571,"body":45278,"date":523,"description":23581,"extension":506,"meta":45286,"navigation":522,"order":523,"path":12732,"seo":45287,"stem":23584,"__hash__":23585},{"type":8,"value":45279,"toc":45284},[45280,45282],[14,45281,23576],{},[16568,45283],{"intent":1049},{"title":494,"searchDepth":495,"depth":495,"links":45285},[],{"layout":16574},{"title":23571,"description":23581},{"id":23870,"title":23871,"body":45289,"date":523,"description":24379,"extension":506,"meta":45734,"navigation":522,"order":523,"path":24383,"seo":45737,"stem":24385,"__hash__":24386},{"type":8,"value":45290,"toc":45724},[45291,45293,45297,45299,45301,45321,45323,45325,45327,45339,45341,45345,45357,45361,45363,45365,45375,45381,45647,45654,45658,45660,45662,45680,45682,45686,45688,45690,45692,45694,45708,45710,45717,45722],[11,45292],{},[14,45294,23878,45295,23882],{},[322,45296,8921],{"href":23881},[21,45298,546],{"id":545},[14,45300,23887],{},[77,45302,45303],{},[80,45304,45305,45311,45315],{},[83,45306,45307,562,45309,44],{},[90,45308,561],{},[322,45310,566],{"href":565},[83,45312,45313,572],{},[90,45314,571],{},[83,45316,45317,578,45319,44],{},[90,45318,577],{},[90,45320,581],{},[14,45322,23910],{},[21,45324,23914],{"id":23913},[14,45326,23917],{},[77,45328,45329],{},[555,45330,45331,45335],{},[83,45332,45333,23926],{},[90,45334,577],{},[83,45336,45337,23931],{},[90,45338,16510],{},[639,45340,23935],{"id":23934},[14,45342,5070,45343,23940],{},[322,45344,7722],{"href":18400},[77,45346,45347],{},[555,45348,45349,45353,45355],{},[83,45350,8350,45351,1230],{},[322,45352,7722],{"href":18400},[83,45354,23951],{},[83,45356,23954],{},[14,45358,23957,45359,12399],{},[322,45360,7640],{"href":2670},[639,45362,11031],{"id":23962},[14,45364,23965],{},[555,45366,45367,45369,45371,45373],{},[83,45368,23970],{},[83,45370,23973],{},[83,45372,23976],{},[83,45374,23979],{},[14,45376,21301,45377,23984,45379,23987],{},[322,45378,2301],{"href":2300},[90,45380,9658],{},[719,45382,45383],{"className":756,"code":23990,"language":758,"meta":494,"style":494},[90,45384,45385,45397,45409,45419,45425,45447,45451,45455,45471,45477,45491,45499,45503,45509,45523,45531,45535,45551,45555,45559,45569,45581,45587,45591,45595,45611,45619,45627,45639,45643],{"__ignoreMap":494},[727,45386,45387,45389,45391,45393,45395],{"class":729,"line":730},[727,45388,2315],{"class":1986},[727,45390,23999],{"class":1882},[727,45392,2321],{"class":1986},[727,45394,24004],{"class":737},[727,45396,2327],{"class":768},[727,45398,45399,45401,45403,45405,45407],{"class":729,"line":498},[727,45400,2315],{"class":1986},[727,45402,24013],{"class":1882},[727,45404,2321],{"class":1986},[727,45406,24018],{"class":737},[727,45408,2327],{"class":768},[727,45410,45411,45413,45415,45417],{"class":729,"line":495},[727,45412,2315],{"class":1986},[727,45414,22284],{"class":1882},[727,45416,2321],{"class":1986},[727,45418,2391],{"class":768},[727,45420,45421,45423],{"class":729,"line":1895},[727,45422,9536],{"class":737},[727,45424,24037],{"class":768},[727,45426,45427,45429,45431,45433,45435,45437,45439,45441,45443,45445],{"class":729,"line":1901},[727,45428,9560],{"class":737},[727,45430,2030],{"class":768},[727,45432,165],{"class":1882},[727,45434,2004],{"class":768},[727,45436,8883],{"class":1882},[727,45438,24052],{"class":768},[727,45440,17430],{"class":1882},[727,45442,2004],{"class":768},[727,45444,24059],{"class":1882},[727,45446,24062],{"class":768},[727,45448,45449],{"class":729,"line":1973},[727,45450,16966],{"class":768},[727,45452,45453],{"class":729,"line":2052},[727,45454,1898],{"emptyLinePlaceholder":522},[727,45456,45457,45459,45461,45463,45465,45467,45469],{"class":729,"line":2058},[727,45458,2315],{"class":1986},[727,45460,24077],{"class":2376},[727,45462,2321],{"class":1986},[727,45464,2382],{"class":1986},[727,45466,2385],{"class":768},[727,45468,2388],{"class":1986},[727,45470,2391],{"class":768},[727,45472,45473,45475],{"class":729,"line":2064},[727,45474,2396],{"class":1986},[727,45476,2391],{"class":768},[727,45478,45479,45481,45483,45485,45487,45489],{"class":729,"line":2087},[727,45480,2403],{"class":1986},[727,45482,2093],{"class":1882},[727,45484,2321],{"class":1986},[727,45486,2410],{"class":1986},[727,45488,2413],{"class":2376},[727,45490,24108],{"class":768},[727,45492,45493,45495,45497],{"class":729,"line":2140},[727,45494,2421],{"class":768},[727,45496,2424],{"class":737},[727,45498,2427],{"class":768},[727,45500,45501],{"class":729,"line":2154},[727,45502,2432],{"class":768},[727,45504,45505,45507],{"class":729,"line":1529},[727,45506,21564],{"class":737},[727,45508,24037],{"class":768},[727,45510,45511,45513,45515,45517,45519,45521],{"class":729,"line":2178},[727,45512,24131],{"class":737},[727,45514,1995],{"class":768},[727,45516,17038],{"class":737},[727,45518,24138],{"class":768},[727,45520,2448],{"class":737},[727,45522,2427],{"class":768},[727,45524,45525,45527,45529],{"class":729,"line":2187},[727,45526,24147],{"class":737},[727,45528,1995],{"class":768},[727,45530,17055],{"class":737},[727,45532,45533],{"class":729,"line":2533},[727,45534,2465],{"class":768},[727,45536,45537,45539,45541,45543,45545,45547,45549],{"class":729,"line":2551},[727,45538,2470],{"class":768},[727,45540,9620],{"class":1882},[727,45542,44],{"class":768},[727,45544,9625],{"class":2376},[727,45546,2542],{"class":768},[727,45548,21611],{"class":2376},[727,45550,24172],{"class":768},[727,45552,45553],{"class":729,"line":2559},[727,45554,2511],{"class":768},[727,45556,45557],{"class":729,"line":2565},[727,45558,21623],{"class":768},[727,45560,45561,45563,45565,45567],{"class":729,"line":2570},[727,45562,2521],{"class":1986},[727,45564,2524],{"class":768},[727,45566,2527],{"class":1986},[727,45568,2530],{"class":768},[727,45570,45571,45573,45575,45577,45579],{"class":729,"line":2591},[727,45572,2536],{"class":768},[727,45574,2539],{"class":2376},[727,45576,2542],{"class":768},[727,45578,2545],{"class":737},[727,45580,2887],{"class":768},[727,45582,45583,45585],{"class":729,"line":2603},[727,45584,2554],{"class":1986},[727,45586,2327],{"class":768},[727,45588,45589],{"class":729,"line":2615},[727,45590,2562],{"class":768},[727,45592,45593],{"class":729,"line":2630},[727,45594,2516],{"class":768},[727,45596,45597,45599,45601,45603,45605,45607,45609],{"class":729,"line":2636},[727,45598,2403],{"class":1986},[727,45600,2575],{"class":1882},[727,45602,2321],{"class":1986},[727,45604,2410],{"class":1986},[727,45606,2582],{"class":768},[727,45608,2585],{"class":2376},[727,45610,2588],{"class":768},[727,45612,45613,45615,45617],{"class":729,"line":2642},[727,45614,2594],{"class":768},[727,45616,2597],{"class":2376},[727,45618,2600],{"class":768},[727,45620,45621,45623,45625],{"class":729,"line":2647},[727,45622,2606],{"class":768},[727,45624,2609],{"class":1986},[727,45626,2612],{"class":768},[727,45628,45629,45631,45633,45635,45637],{"class":729,"line":4657},[727,45630,2594],{"class":768},[727,45632,2539],{"class":2376},[727,45634,2542],{"class":768},[727,45636,2624],{"class":737},[727,45638,2627],{"class":768},[727,45640,45641],{"class":729,"line":4662},[727,45642,2633],{"class":768},[727,45644,45645],{"class":729,"line":1316},[727,45646,2639],{"class":768},[14,45648,24271,45649,24274,45651,12252],{},[90,45650,9658],{},[322,45652,24279],{"href":24277,"rel":45653},[2245],[14,45655,23957,45656,12399],{},[322,45657,7640],{"href":2670},[21,45659,24287],{"id":24286},[14,45661,24290],{},[77,45663,45664],{},[80,45665,45666,45674],{},[83,45667,45668,88,45670,611,45672,1230],{},[29,45669,87],{},[90,45671,24301],{},[322,45673,24301],{"href":6958},[83,45675,45676,88,45678,24311],{},[29,45677,111],{},[90,45679,24310],{},[14,45681,24314],{},[14,45683,45684],{},[807,45685,24319],{},[21,45687,776],{"id":775},[14,45689,24324],{},[14,45691,24327],{},[14,45693,24330],{},[80,45695,45696,45700,45704],{},[83,45697,45698],{},[322,45699,3313],{"href":3312},[83,45701,45702],{},[322,45703,3316],{"href":2203},[83,45705,45706],{},[322,45707,24346],{"href":24345},[21,45709,796],{"id":795},[14,45711,24351,45712,24355,45714,44],{},[322,45713,21233],{"href":24354},[322,45715,24359],{"href":3324,"rel":45716},[2245],[14,45718,24362,45719,44],{},[322,45720,24359],{"href":3324,"rel":45721},[2245],[811,45723,24368],{},{"title":494,"searchDepth":495,"depth":495,"links":45725},[45726,45727,45731,45732,45733],{"id":545,"depth":498,"text":546},{"id":23913,"depth":498,"text":23914,"children":45728},[45729,45730],{"id":23934,"depth":495,"text":23935},{"id":23962,"depth":495,"text":11031},{"id":24286,"depth":498,"text":24287},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"type":513,"format":514,"intent_type":515,"intent":827,"tags":45735,"platfrom":45736},[829,830],[1757],{"title":23871,"description":24379},{"id":24388,"title":24389,"body":45739,"date":523,"description":24399,"extension":506,"meta":45747,"navigation":522,"order":523,"path":12716,"seo":45748,"stem":24402,"__hash__":24403},{"type":8,"value":45740,"toc":45745},[45741,45743],[14,45742,24394],{},[16568,45744],{"intent":1754},{"title":494,"searchDepth":495,"depth":495,"links":45746},[],{"layout":16574},{"title":24389,"description":24399},{"id":24872,"title":24873,"body":45750,"date":523,"description":25144,"extension":506,"meta":45984,"navigation":522,"order":523,"path":25148,"seo":45987,"stem":25150,"__hash__":25151},{"type":8,"value":45751,"toc":45975},[45752,45754,45761,45763,45765,45767,45773,45775,45795,45799,45801,45803,45805,45807,45809,45811,45813,45831,45833,45841,45843,45855,45857,45889,45891,45893,45895,45897,45899,45919,45921,45939,45941,45943,45945,45947,45949,45951,45965,45967,45969,45971,45973],[11,45753],{},[14,45755,45756,24885,45759,24888],{},[322,45757,24884],{"href":24882,"rel":45758},[2245],[322,45760,3288],{"href":3287},[21,45762,546],{"id":545},[11,45764],{},[14,45766,21241],{},[555,45768,45769,45771],{},[83,45770,24899],{},[83,45772,24902],{},[14,45774,24905],{},[77,45776,45777],{},[555,45778,45779,45785,45789],{},[83,45780,45781,1785,45783,44],{},[29,45782,561],{},[322,45784,566],{"href":565},[83,45786,45787,1792],{},[29,45788,571],{},[83,45790,45791,1797,45793,44],{},[29,45792,577],{},[90,45794,581],{},[14,45796,45797],{},[807,45798,24930],{},[21,45800,24934],{"id":24933},[11,45802],{},[14,45804,24939],{},[639,45806,24943],{"id":24942},[11,45808],{},[14,45810,24948],{},[14,45812,24951],{},[77,45814,45815],{},[555,45816,45817,45821,45825],{},[83,45818,45819,24960],{},[29,45820,24459],{},[83,45822,45823,24466],{},[29,45824,24465],{},[83,45826,45827,24471,45829,24474],{},[29,45828,7722],{},[322,45830,7722],{"href":18400},[14,45832,24477],{},[77,45834,45835],{},[80,45836,45837,45839],{},[83,45838,24484],{},[83,45840,24487],{},[14,45842,24983],{},[77,45844,45845],{},[555,45846,45847,45851],{},[83,45848,45849,24500],{},[29,45850,24499],{},[83,45852,45853,24505],{},[29,45854,620],{},[14,45856,24508],{},[77,45858,45859],{},[555,45860,45861,45865,45869,45873,45877,45881,45885],{},[83,45862,45863,24518],{},[29,45864,24517],{},[83,45866,45867,24524],{},[29,45868,24523],{},[83,45870,45871,24529],{},[29,45872,14192],{},[83,45874,45875,24535],{},[29,45876,24534],{},[83,45878,45879,24541],{},[29,45880,24540],{},[83,45882,45883,24547],{},[29,45884,24546],{},[83,45886,45887,24552],{},[29,45888,12428],{},[592,45890],{"src":24555,"alt":24556},[14,45892,25034],{},[639,45894,25038],{"id":25037},[11,45896],{},[14,45898,25043],{},[77,45900,45901],{},[555,45902,45903,45907,45911,45915],{},[83,45904,45905,25052],{},[29,45906,24499],{},[83,45908,45909,25057],{},[29,45910,620],{},[83,45912,45913,25062],{},[29,45914,24499],{},[83,45916,45917,25067],{},[29,45918,620],{},[14,45920,25070],{},[77,45922,45923],{},[555,45924,45925,45929,45935],{},[83,45926,45927,25080],{},[29,45928,25079],{},[83,45930,45931,25086,45933,1230],{},[29,45932,25085],{},[322,45934,8895],{"href":6958},[83,45936,45937,25093],{},[29,45938,620],{},[14,45940,25096],{},[21,45942,776],{"id":775},[11,45944],{},[14,45946,25103],{},[14,45948,25106],{},[14,45950,24330],{},[80,45952,45953,45957,45961],{},[83,45954,45955],{},[322,45956,3313],{"href":3312},[83,45958,45959],{},[322,45960,3316],{"href":2203},[83,45962,45963],{},[322,45964,24346],{"href":24345},[21,45966,796],{"id":795},[11,45968],{},[14,45970,25129],{},[11,45972],{},[14,45974,25134],{},{"title":494,"searchDepth":495,"depth":495,"links":45976},[45977,45978,45982,45983],{"id":545,"depth":498,"text":546},{"id":24933,"depth":498,"text":24934,"children":45979},[45980,45981],{"id":24942,"depth":495,"text":24943},{"id":25037,"depth":495,"text":25038},{"id":775,"depth":498,"text":776},{"id":795,"depth":498,"text":796},{"pinned":522,"type":513,"format":77,"intent_type":515,"intent":827,"tags":45985,"platfrom":45986},[829,830,1055,21214],[3288,24884],{"title":24873,"description":25144},{"id":24405,"title":24406,"body":45989,"date":523,"description":24678,"extension":506,"meta":46197,"navigation":522,"order":523,"path":24683,"seo":46200,"stem":24685,"__hash__":24686},{"type":8,"value":45990,"toc":46187},[45991,45993,45995,45997,45999,46001,46003,46023,46025,46027,46029,46047,46049,46057,46059,46071,46073,46105,46107,46109,46111,46113,46117,46119,46121,46123,46125,46127,46147,46151,46153,46155,46159,46179,46181,46183,46185],[11,45992],{},[14,45994,24413],{},[18,45996],{},[21,45998,546],{"id":545},[11,46000],{},[14,46002,551],{},[77,46004,46005],{},[555,46006,46007,46013,46017],{},[83,46008,46009,1785,46011,44],{},[29,46010,561],{},[322,46012,566],{"href":565},[83,46014,46015,1792],{},[29,46016,571],{},[83,46018,46019,1797,46021,44],{},[29,46020,577],{},[90,46022,581],{},[21,46024,24445],{"id":24444},[11,46026],{},[14,46028,24450],{},[77,46030,46031],{},[555,46032,46033,46037,46041],{},[83,46034,46035,24460],{},[29,46036,24459],{},[83,46038,46039,24466],{},[29,46040,24465],{},[83,46042,46043,24471,46045,24474],{},[29,46044,7722],{},[322,46046,7722],{"href":18400},[14,46048,24477],{},[77,46050,46051],{},[80,46052,46053,46055],{},[83,46054,24484],{},[83,46056,24487],{},[14,46058,24490],{},[77,46060,46061],{},[555,46062,46063,46067],{},[83,46064,46065,24500],{},[29,46066,24499],{},[83,46068,46069,24505],{},[29,46070,620],{},[14,46072,24508],{},[77,46074,46075],{},[555,46076,46077,46081,46085,46089,46093,46097,46101],{},[83,46078,46079,24518],{},[29,46080,24517],{},[83,46082,46083,24524],{},[29,46084,24523],{},[83,46086,46087,24529],{},[29,46088,14192],{},[83,46090,46091,24535],{},[29,46092,24534],{},[83,46094,46095,24541],{},[29,46096,24540],{},[83,46098,46099,24547],{},[29,46100,24546],{},[83,46102,46103,24552],{},[29,46104,12428],{},[592,46106],{"src":24555,"alt":24556},[21,46108,776],{"id":775},[11,46110],{},[14,46112,24563],{},[14,46114,24566,46115,24570],{},[322,46116,24569],{"href":791},[21,46118,6725],{"id":6724},[11,46120],{},[639,46122,24578],{"id":24577},[11,46124],{},[14,46126,24583],{},[77,46128,46129],{},[555,46130,46131,46139],{},[83,46132,46133,24593,46135,24597,46137,1230],{},[29,46134,24592],{},[322,46136,24596],{"href":19716},[322,46138,24601],{"href":24600},[83,46140,46141,24606,46143,24609,46145,20734],{},[29,46142,7722],{},[322,46144,7722],{"href":18400},[90,46146,198],{},[14,46148,24614,46149,24618],{},[322,46150,24445],{"href":24617},[639,46152,24622],{"id":24621},[11,46154],{},[14,46156,24627,46157,24631],{},[322,46158,24445],{"href":24630},[77,46160,46161],{},[555,46162,46163,46167,46171,46175],{},[83,46164,46165,24641],{},[29,46166,24640],{},[83,46168,46169,24646],{},[29,46170,24517],{},[83,46172,46173,24652],{},[29,46174,24651],{},[83,46176,46177,24657],{},[29,46178,620],{},[14,46180,24660],{},[21,46182,796],{"id":795},[11,46184],{},[14,46186,24667],{},{"title":494,"searchDepth":495,"depth":495,"links":46188},[46189,46190,46191,46192,46196],{"id":545,"depth":498,"text":546},{"id":24444,"depth":498,"text":24445},{"id":775,"depth":498,"text":776},{"id":6724,"depth":498,"text":6725,"children":46193},[46194,46195],{"id":24577,"depth":495,"text":24578},{"id":24621,"depth":495,"text":24622},{"id":795,"depth":498,"text":796},{"video":24680,"type":513,"format":77,"intent_type":515,"intent":827,"tags":46198,"platfrom":46199},[829,830,1055,21214],[3288],{"title":24406,"description":24678},[46202,46746,46958,48079,48218,48376,50566,50715,51186,51674,51900,52982,53427,54003,54203,54374,55129,55276,55828,56167,56898,57255,57480,58403,59068,59402,59651,59757,60088,60631,61775,61928,62169,62740,63142,63513,63956,64222,64493,64828,65139,65405,65719,66058,66328,66705,67080,67401,67781,68152,68540,68872,69083,69370,69653,70062,70407,70698,71009,71434,71596,71863,72242,72542,72979,75735,76103,76416,76673,77293,77839,78173,78478,78873,79045,79436,79616,80003],{"id":46203,"title":46204,"author":46205,"body":46206,"date":46723,"description":46724,"draft":26250,"extension":506,"meta":46725,"navigation":522,"path":46739,"seo":46740,"stem":46741,"__hash__":46742,"pinned":-1,"category":46743,"type":46744,"tool":46745},"blog\u002Fblog\u002Fhow-to-instagram-dm-with-a-bot.md","How to automate Instagram DMs with a bot? (updated 2025-26)","Alex Barlow",{"type":8,"value":46207,"toc":46691},[46208,46216,46222,46229,46231,46235,46238,46241,46244,46248,46251,46259,46263,46266,46269,46273,46276,46280,46283,46292,46296,46299,46308,46311,46313,46316,46320,46323,46327,46330,46340,46344,46347,46355,46359,46363,46366,46370,46374,46387,46395,46399,46403,46412,46416,46427,46431,46437,46441,46450,46464,46468,46478,46483,46487,46491,46499,46504,46508,46517,46534,46537,46541,46549,46553,46557,46567,46575,46579,46584,46588,46597,46602,46606,46610,46620,46626,46630,46636,46640,46643,46646,46649,46652,46655,46659,46666,46669,46675,46679,46682],[14,46209,46210,46211],{},"Want to boost engagement or share offers with your followers? You can now automate Instagram DMs without writing a single line of code using a bot. We’ve just updated and tested the template, so you can get set up and ",[322,46212,46215],{"href":46213,"rel":46214},"https:\u002F\u002Fwww.axiom.ai\u002Frecipes\u002Finstagram-dm-like",[2245],"start automating DMs with a single click.",[14,46217,46218,46219],{},"In this guide, you'll learn how to make a bot that automates direct messages on Instagram without a single line of code. What's more, you'll pick up skills that empower you to automate just about anything on the web. How awesome is that? ",[29,46220,46221],{},"🚀",[14,46223,46224,46225],{},"Read on if you want to learn or just dive in and install the ",[322,46226,46228],{"href":46213,"rel":46227},[2245],"updated template.",[18,46230],{},[21,46232,46234],{"id":46233},"why-would-you-build-a-bot-to-automate-instagram-direct-messages","Why would you build a bot to automate Instagram direct messages?",[14,46236,46237],{},"Wouldn't it be great if you could sit back and let your computer do all your work for you? Well, now you can! Get all the engagement of a personal DM while expending all the effort of falling asleep in your chair.",[14,46239,46240],{},"Let’s be real though, there’s a bit of a learning curve to setting up a bot. Even so, we reckon it’s worth it. One member of our community put it like this: “If you don’t have a bit of time to invest this is not for you if you do this is the best thing you will ever encounter LEGIT!”.",[14,46242,46243],{},"If you’ve used a tool like Zapier before, then you should find it no sweat to program a bot for Instagram without coding. This guide takes you through the steps for creating a bot that will automate your most tedious Instagram tasks!",[21,46245,46247],{"id":46246},"what-exactly-is-a-insta-dm-bot","What exactly is a Insta DM bot?",[14,46249,46250],{},"A bot is like a robot's software cousin. A bot, like a physical robot, requires instructions to understand how to do the job. In this case, you'll give the bot a set of instructions instructing it in the ancient art of automating Instagram direct messages.",[14,46252,46253,46254,46258],{},"Check out our ",[322,46255,46257],{"href":46256},"\u002Fblog\u002Fwhat-is-a-bot","blog on what are bots"," to learn more.",[21,46260,46262],{"id":46261},"how-are-instagram-bots-made","How are Instagram bots made?",[14,46264,46265],{},"With axiom.ai's no-code bot builder, you can create bots for Instagram direct messages without having to code. Use a simple point and click interface to create as many bots as you want!",[14,46267,46268],{},"If you follow the steps below, you'll have a working bot by the end of this article.",[21,46270,46272],{"id":46271},"how-do-bots-automate-dms-on-instagram","How do bots automate DMs on Instagram?",[14,46274,46275],{},"Your bot will automate the same web actions you use to send an Instagram DM. Bots operate in the same manner as humans: opening a browser window, visiting a user's profile, and clicking the DM button.",[21,46277,46279],{"id":46278},"will-my-instagram-account-get-blocked-if-i-automate-dms","Will my Instagram account get blocked if I automate DMs?",[14,46281,46282],{},"It could if you’re not careful and respectful! Instagram limits direct messaging, so if you created an army of bots automating Instagram 24\u002F7, you would be blocked.",[14,46284,46285,46286,46291],{},"We believe that bots should be used responsibly and should not be used to spam websites or degrade the experiences of other users. To avoid being blocked,\n",[322,46287,46290],{"href":46288,"rel":46289},"https:\u002F\u002Fthepreviewapp.com\u002Finstagram-limitsl",[2245],"familiarise yourself with Instagram's rate limits "," and do not exceed them. Don't use Axiom to take advantage of the system!",[21,46293,46295],{"id":46294},"lets-learn-how-to-build-an-instagram-dm-bot","Let’s learn how to build an Instagram DM bot!",[639,46297,46298],{"id":13897},"Install Axiom in your chrome browser",[14,46300,46301,46302,44],{},"If you haven’t yet installed Axiom, and created an account please goto the chrome store and ",[29,46303,46304],{},[322,46305,46307],{"href":13910,"rel":46306},[2245],"install Axiom now",[14,46309,46310],{},"By the way, we give all new users 2 hours of runtime. This means you can build and run this bot a few times on us 🙂 ",[639,46312,13919],{"id":13918},[14,46314,46315],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering the shortcut 'sheet.new', presuming you already have an account. Name your sheet something like 'Instagram DM’ then add profile links.",[639,46317,46319],{"id":46318},"launch-instagram-and-open-axiomai","Launch Instagram and open axiom.ai",[14,46321,46322],{},"First, open your Chrome browser and log into Instagram. Then launch Axiom and click the '+ New Automation' button. You'll now begin combining steps to create your Instagram automation.",[639,46324,46326],{"id":46325},"click-add-the-first-step-to-start-or-why-not-use-a-insta-template","Click 'Add the first step' to start, or why not use a Insta template?",[14,46328,46329],{},"To build your bot from scratch, click on 'Add the first step'. This will open the Step Finder, so you can start adding steps to your bot.",[14,46331,46332,46333,46336],{},"Follow this link to use the ",[322,46334,46335],{"href":11193},"automate DMs template.",[592,46337],{"src":46338,"alt":46339},"\u002Fblog\u002Fadd-first-step.png","Add first step - build a bot to automate Instagram posting",[639,46341,46343],{"id":46342},"_1-add-your-first-step-read-data-from-a-google-sheet","1. Add your first step, ‘Read data from a Google Sheet’",[14,46345,46346],{},"Using the Step Finder search for ‘Read data from a Google Sheet’ and click on it. The step will be added to Axiom for you to configure.",[555,46348,46349,46352],{},[83,46350,46351],{},"In the field called 'Spreadsheet', you can search for the Google Sheet you created by name. Once found, click on it to select.",[83,46353,46354],{},"For 'Sheet name' click on the drop-down and select the tab containing the Instagram profile links",[592,46356],{"src":46357,"alt":46358},"\u002Fblog\u002Fgooglesheet-insta-dm.png","Read data from a Google Sheet to automate Instagram",[639,46360,46362],{"id":46361},"_2-add-a-loop-through-data-step","2. Add a ‘Loop through data’ step",[14,46364,46365],{},"Click the 'Add a new step' button below the ‘read’ step. Using the Step Finder click on 'Loop through data' to add the step.",[592,46367],{"src":46368,"alt":46369},"\u002Fblog\u002Floop-step-finder.png","Add a loop through data step from axiom.ai's step finder",[639,46371,46373],{"id":46372},"_21-add-go-to-page-step","2.1. Add ‘Go to page’ step",[14,46375,9766,46376,46379,46380,46383,46384,46386],{},[29,46377,46378],{},"'Add sub-step'"," button ",[29,46381,46382],{},"inside the 'Loop through data’"," step. Using the Step Finder search for ",[29,46385,15508],{}," and click to add.",[555,46388,46389],{},[83,46390,46391,46392,46394],{},"Enter URL - Click 'Insert data', select ",[727,46393,139],{}," choosing the column with the Instagram profile links",[592,46396],{"src":46397,"alt":46398},"\u002Fblog\u002Fgo-to-page-loop.png","Add a go to page from axiom.ai's step finder",[639,46400,46402],{"id":46401},"_22-add-get-data-from-bots-current-page-step","2.2 Add ‘Get data from bot's current page’ step",[14,46404,9766,46405,46379,46407,46383,46409,46386],{},[29,46406,46378],{},[29,46408,46382],{},[29,46410,46411],{},"'Get data from bot's current page'",[592,46413],{"src":46414,"alt":46415},"\u002Fblog\u002Finsta-scrape-message.png","Using the selector tool on an Instagram profile page choose the column containg the header and posts",[555,46417,46418,46421,46424],{},[83,46419,46420],{},"On an Instagram profile page - Click 'Select' and highlight column with the header and post in it, see image above",[83,46422,46423],{},"Max Results - Set to one",[83,46425,46426],{},"Configure scraper - # of attempts when results not found set to one",[592,46428],{"src":46429,"alt":46430},"\u002Fblog\u002Finsta-scrape-message-settings.png","setting up your get data step with axiom.ai sending DMs on Instagram",[14,46432,46433,46434],{},"Tried the ",[322,46435,46436],{"href":11193},"automate DMs template?",[639,46438,46440],{"id":46439},"_23-add-an-if-condition-step","2.3 Add an ‘IF condition’ step",[14,46442,9766,46443,46379,46445,46383,46447,46386],{},[29,46444,46378],{},[29,46446,46382],{},[29,46448,46449],{},"'If condition'",[555,46451,46452,46458,46461],{},[83,46453,46454,46455],{},"Set 'Data to check' - Select ",[727,46456,46457],{},"Scrape data",[83,46459,46460],{},"Condition to check - Using words enter 'Message' into the input field",[83,46462,46463],{},"Reverse condition - True",[639,46465,46467],{"id":46466},"_231-add-a-click-element-step","2.3.1 Add a 'Click Element' step",[14,46469,9766,46470,46379,46472,46383,46475,46386],{},[29,46471,46378],{},[29,46473,46474],{},"inside the 'If Condition’",[29,46476,46477],{},"'Click Element'",[555,46479,46480],{},[83,46481,46482],{},"On an Instagram profile page - Click 'Select' and highlight the 'Message' button",[592,46484],{"src":46485,"alt":46486},"\u002Fblog\u002Fmessage-button.png","Select the message button on the Instrgarm profile page",[639,46488,46490],{"id":46489},"_232-add-a-wait-step","2.3.2 Add a 'Wait' step",[14,46492,9766,46493,46379,46495,46383,46497,46386],{},[29,46494,46378],{},[29,46496,46474],{},[29,46498,15628],{},[555,46500,46501],{},[83,46502,46503],{},"Set a time in milliseconds - Enter 1000",[639,46505,46507],{"id":46506},"_233-add-a-click-element-step","2.3.3 Add a 'Click Element' step",[14,46509,9766,46510,46379,46512,46383,46514,46516],{},[29,46511,46378],{},[29,46513,46474],{},[29,46515,46477],{}," and click to add. This step is to close the pop up that only appears when you run the automation.",[555,46518,46519,46522,46525,46528,46531],{},[83,46520,46521],{},"Click 'Select'",[83,46523,46524],{},"Next, click 'Custom' in the toolbar",[83,46526,46527],{},"Tick, 'Use element text instead of html'",[83,46529,46530],{},"Input 'Not Now' and press complete",[83,46532,46533],{},"Tick, Optional click",[592,46535],{"src":46536,"alt":46486},"\u002Fblog\u002Fnot-now-click.png",[639,46538,46540],{"id":46539},"_234-add-a-wait-step","2.3.4 Add a 'Wait' step",[14,46542,9766,46543,46379,46545,46383,46547,46386],{},[29,46544,46378],{},[29,46546,46474],{},[29,46548,15628],{},[555,46550,46551],{},[83,46552,46503],{},[639,46554,46556],{"id":46555},"_235-add-a-enter-text-step","2.3.5 Add a 'Enter Text' step",[14,46558,9766,46559,46379,46561,46383,46563,46566],{},[29,46560,46378],{},[29,46562,46474],{},[29,46564,46565],{},"'Enter Text'"," and click to add. No need to select the input as the cursor is positioned in the input when the Instagram DM page loads.",[555,46568,46569],{},[83,46570,46571,46572,46574],{},"Text - Click 'Insert data' select ",[727,46573,139],{}," choosing the column with the message you wish to send",[592,46576],{"src":46577,"alt":46578},"\u002Fblog\u002Finsta-enter0text.png","Enter the message you wish the DM",[14,46580,46581,46582],{},"Stuck? Have you tried the ",[322,46583,46335],{"href":11193},[639,46585,46587],{"id":46586},"_235-add-a-press-keys-step","2.3.5 Add a 'Press Key(s)' step",[14,46589,9766,46590,46379,46592,46383,46594,46386],{},[29,46591,46378],{},[29,46593,46474],{},[29,46595,46596],{},"'Press Key(s)'",[555,46598,46599],{},[83,46600,46601],{},"Key - Click 'Record' and press Return",[592,46603],{"src":46604,"alt":46605},"\u002Fblog\u002Fkeypress-send-message.png","Record 'Enter' keypress to submit your Instagram DM",[639,46607,46609],{"id":46608},"_24-add-a-delete-rows-from-a-google-sheet-step","2.4 Add a 'Delete rows from a Google Sheet' step",[14,46611,9766,46612,46379,46615,46383,46618,46386],{},[29,46613,46614],{},"'Add step'",[29,46616,46617],{},"inside the 'loop step’",[29,46619,15755],{},[555,46621,46622,46624],{},[83,46623,46351],{},[83,46625,46354],{},[592,46627],{"src":46628,"alt":46629},"\u002Fblog\u002Fdelete-rows-insta.png","delete the row that has just been processed",[14,46631,46632,46633],{},"Well done! The bot is ready to test ",[29,46634,46635],{},"👍",[21,46637,46639],{"id":46638},"try-sending-a-dm-on-instagram-to-see-if-its-working-the-way-you-want","Try sending a DM on Instagram to see if it’s working the way you want",[14,46641,46642],{},"Before you do a test run, make sure you’ve disabled the sub-step ‘Key press’ to stop the DM’s from being sent. If not, do that now.",[14,46644,46645],{},"It's best practice to test every bot to check it’s production-ready. With the ‘Post’ button disabled, you can do a test run that will not send a post.",[14,46647,46648],{},"We recommend test running your bot with the desktop app, but you can also do it in the cloud.",[14,46650,46651],{},"Make sure that you confirm your message is successfully entered and the logic is working as you expect.",[14,46653,46654],{},"Go ahead and click ‘run’. Get ready for some magic.",[639,46656,46658],{"id":46657},"fix-any-issues-with-your-automation","Fix any issues with your automation",[14,46660,46661,46662,46665],{},"If you experience any issue with the bot not clicking buttons, try re-selecting the button or text input or follow this link to use the ",[322,46663,46664],{"href":11193},"New one-click setup automate DMs template.","To change the selection, move the cursor slowly over the object and re-select.",[14,46667,46668],{},"The 'Click' step also has a handy feature that allows you to select the button by the text, which can resolve many issues. Just click the “Use element text” button and see if that helps you out.",[14,46670,46671,46672],{},"Don't forget we have excellent customer support. If you need help, get in touch. ",[322,46673,46674],{"href":486},"(\u002Fcustomer-support)",[21,46676,46678],{"id":46677},"conclusion","Conclusion",[14,46680,46681],{},"You have learned how to use an Instagram direct message bot, sure, but you also have the knowledge to do so much more! Now that you have used an 'Interact' step, automated clicks and key presses, you can build a bot to automate virtually any web app. Remember those jumps steps too - with those in your pocket you’ll be a bot master in no time. Go you!",[46683,46684,46686,46687],"h4",{"id":46685},"if-you-are-interested-in-automating-instagram-you-may-want-to-see-these-guides","If you are interested in automating Instagram you may want to see these ",[322,46688,46690],{"href":46689},"\u002Fguides?search=instagram","guides.",{"title":494,"searchDepth":495,"depth":495,"links":46692},[46693,46694,46695,46696,46697,46698,46716,46719],{"id":46233,"depth":498,"text":46234},{"id":46246,"depth":498,"text":46247},{"id":46261,"depth":498,"text":46262},{"id":46271,"depth":498,"text":46272},{"id":46278,"depth":498,"text":46279},{"id":46294,"depth":498,"text":46295,"children":46699},[46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715],{"id":13897,"depth":495,"text":46298},{"id":13918,"depth":495,"text":13919},{"id":46318,"depth":495,"text":46319},{"id":46325,"depth":495,"text":46326},{"id":46342,"depth":495,"text":46343},{"id":46361,"depth":495,"text":46362},{"id":46372,"depth":495,"text":46373},{"id":46401,"depth":495,"text":46402},{"id":46439,"depth":495,"text":46440},{"id":46466,"depth":495,"text":46467},{"id":46489,"depth":495,"text":46490},{"id":46506,"depth":495,"text":46507},{"id":46539,"depth":495,"text":46540},{"id":46555,"depth":495,"text":46556},{"id":46586,"depth":495,"text":46587},{"id":46608,"depth":495,"text":46609},{"id":46638,"depth":498,"text":46639,"children":46717},[46718],{"id":46657,"depth":495,"text":46658},{"id":46677,"depth":498,"text":46678,"children":46720},[46721],{"id":46685,"depth":1895,"text":46722},"If you are interested in automating Instagram you may want to see these guides.","2025-11-06","Learn how to automate Instagram DMs with a Google Sheet and a bot. Start from blank and make your own bot or use our one-click setup bot.",{"read":46726,"type":513,"tool":46727,"category":46729,"tags":46731,"reddit":46732,"location":46733,"featuredimg":46734,"landingimg":46735,"summary":46736,"video":46737,"metaTitle":46738},"5 min read",[46728],"No-code tool",[46730],"Social media automation",[1053,12880],"https:\u002F\u002Fwww.reddit.com\u002Fr\u002Faxiom_ai\u002Fcomments\u002F1dvz7ce\u002Fquickly_automate_instagram_dms_with_axiomais\u002F","London","\u002Fblog\u002Fzapier-axiom.ai.jpg","\u002Fblog\u002Finsta-dm-icon.jpg","Learn in minutes how to build a bot without code to automate sending Instagram direct messages.","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FXPxv5v8qapc?rel=0","How to automate Instagram DM with a bot? | Axiom Academy","\u002Fblog\u002Fhow-to-instagram-dm-with-a-bot",{"title":46204,"description":46724},"blog\u002Fhow-to-instagram-dm-with-a-bot","xY1Qygq2vcG9wpPN4HNFFebHE3BIS2OZcxM9sx3kTCk",[46730],[513],[46728],{"id":46747,"title":46748,"author":46205,"body":46749,"date":46723,"description":494,"draft":26250,"extension":506,"meta":46942,"navigation":522,"path":46951,"seo":46952,"stem":46953,"__hash__":46954,"pinned":-1,"category":46955,"type":46956,"tool":46957},"blog\u002Fblog\u002Fnew-product-launch.md","New tool: run code in remote Chrome browsers, right from your IDE",{"type":8,"value":46750,"toc":46934},[46751,46753,46756,46765,46769,46773,46776,46779,46783,46786,46790,46793,46796,46842,46846,46854,46890,46903,46907,46910,46913,46916,46920,46928,46931],[18,46752],{},[14,46754,46755],{},"Are you a developer building automations, web scrapers or testing web apps? Would it help if you could launch your code across multiple Chrome browsers remotely?",[14,46757,46758,46759,46764],{},"After creating the best no-code browser automation tool, we want to do it again! This time, we're building a tool designed for devs. One that works with your stack, built from the ground up on our battle-tested infrastructure. The MVP is now ",[322,46760,46763],{"href":46761,"rel":46762},"https:\u002F\u002Fcode.axiom.ai\u002F",[2245],"ready to use",". As we did with our no-code tool, we want your input to help shape it.",[592,46766],{"src":46767,"alt":46768},"\u002Fblog\u002Fcode-app.webp","axiom.ai's new Code Dashboard web app",[21,46770,46772],{"id":46771},"running-browser-automations-at-scale-is-hard","Running browser automations at scale is hard",[14,46774,46775],{},"You don't need us to tell you that running scripts at scale in the browser is hard. Bot blocking platforms like Heroku or Cloudflare exist to stop your web scraper in its tracks. Then come the memory issues. You can whizz through hundreds of Wikipedia pages, but hit a site full of animations and you'll max out Chrome's memory and crash your server in an instant.",[14,46777,46778],{},"The browser environment is still the wild west. Our goal is to tame it for developers and non-coders alike.",[21,46780,46782],{"id":46781},"who-is-this-tool-for","Who is this tool for?",[14,46784,46785],{},"The tool is raw. We haven’t focused on packing it with features before shipping. If you’re a developer working in the browser, creating web automations, web scrapers, or testing apps, and you’re interested in using a tool that will be built closely with your feedback, it’s worth trying. If you’re looking for an endpoint to run code in a remote browser, this tool is for you.",[21,46787,46789],{"id":46788},"is-the-tool-production-ready","Is the tool production ready?",[14,46791,46792],{},"Yes, the MVP is live, tested, and working. You can sign up for a free account and get 30 minutes of runtime to try the tool. Is it production ready? It’s early days, but yes. The infrastructure is battle tested on our No-Code Tool. Our support team is hands on and ready to help tailor the product to your use case and requirements.",[14,46794,46795],{},"The tool has shipped with this base set of features:",[80,46797,46798,46816,46829],{},[83,46799,46800,46803],{},[29,46801,46802],{},"Code Dashboard",[80,46804,46805,46808,46811,46814],{},[83,46806,46807],{},"Web app",[83,46809,46810],{},"User account",[83,46812,46813],{},"Live editor to run scripts and watch them execute in a browser",[83,46815,7831],{},[83,46817,46818,46821],{},[29,46819,46820],{},"Infrastruture",[80,46822,46823,46826],{},[83,46824,46825],{},"Private servers",[83,46827,46828],{},"Concurrency",[83,46830,46831,46834],{},[29,46832,46833],{},"Api",[80,46835,46836,46839],{},[83,46837,46838],{},"Trigger runs",[83,46840,46841],{},"Run status",[21,46843,46845],{"id":46844},"how-to-use-the-new-tool","How to use the new tool",[14,46847,46848,46849,46853],{},"You can run your scripts from your IDE with just one line of code. You’ll need an account and an API key, which you can generate in the app. Existing Axiom users can try the ",[322,46850,46852],{"href":46761,"rel":46851},[2245],"tool"," too.",[719,46855,46858],{"className":46856,"code":46857,"language":23962,"meta":494,"style":494},"language-javascript shiki shiki-themes github-light-default github-dark-default","const browser = await puppeteer.connect({\n    browserWSEndpoint: \"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=[HIDDEN_KEY]\"\n});\n",[90,46859,46860,46878,46886],{"__ignoreMap":494},[727,46861,46862,46864,46867,46869,46871,46874,46876],{"class":729,"line":730},[727,46863,2315],{"class":1986},[727,46865,46866],{"class":1882}," browser",[727,46868,2321],{"class":1986},[727,46870,2410],{"class":1986},[727,46872,46873],{"class":768}," puppeteer.",[727,46875,19377],{"class":2376},[727,46877,2479],{"class":768},[727,46879,46880,46883],{"class":729,"line":498},[727,46881,46882],{"class":768},"    browserWSEndpoint: ",[727,46884,46885],{"class":737},"\"wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=[HIDDEN_KEY]\"\n",[727,46887,46888],{"class":729,"line":495},[727,46889,17446],{"class":768},[14,46891,46892,46893,450,46898,44],{},"I’ve been experimenting with the tool myself, running simple bots to ",[322,46894,46897],{"href":46895,"rel":46896},"https:\u002F\u002Faxiom.ai\u002Fblog\u002Fcode-a-puppeteer-web-scraper",[2245],"scrape data",[322,46899,46902],{"href":46900,"rel":46901},"https:\u002F\u002Faxiom.ai\u002Fblog\u002Fuse-puppeteer-to-submit-a-form",[2245],"fill in forms",[21,46904,46906],{"id":46905},"whats-next-api-mcp-or-ai","What’s next: API, MCP, or AI?",[14,46908,46909],{},"Over the coming weeks, we'll iterate quickly and ship new features across both our no-code and code tools. The first major release will be an API update that exposes our steps in the API, allowing them to be triggered directly.",[14,46911,46912],{},"We're also exploring how AI can help, experimenting with AI recovery for selectors and AI assisted bot building. We're continuing to optimise infrastructure, including rolling out our MCP server. Debugging is another big focus for us. How can we better understand and resolve the errors you encounter?",[14,46914,46915],{},"And of course, your input matters. We'll keep iterating with your feedback as we build.",[21,46917,46919],{"id":46918},"wrapping-up-try-the-tool-tell-us-what-you-think","Wrapping up - Try the tool tell us what you think!",[14,46921,46922,46923,46927],{},"Try our ",[322,46924,46926],{"href":46761,"rel":46925},[2245],"new tool",". All new users get 30 minutes of runtime. You can of course use our no-code tool with the same account. It’s raw but useable, and we’re actively developing it with your input, just as we did with our no-code tool.",[14,46929,46930],{},"We’re running an agile process that feeds your ideas directly into our idea board, where we scope and score them by effort and impact. Our approach is simple: build the simplest version first, then iterate. It’s a process that has served us well with our no-code users.",[811,46932,46933],{},"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":494,"searchDepth":495,"depth":495,"links":46935},[46936,46937,46938,46939,46940,46941],{"id":46771,"depth":498,"text":46772},{"id":46781,"depth":498,"text":46782},{"id":46788,"depth":498,"text":46789},{"id":46844,"depth":498,"text":46845},{"id":46905,"depth":498,"text":46906},{"id":46918,"depth":498,"text":46919},{"read":46943,"tags":46944,"category":46946,"location":46733,"featuredimg":46948,"landingimg":46949,"summary":46950},"1 min read",[3974,46945],"guest posts",[46947,90],"browser automation","\u002Fblog\u002Fcloud-code-runner.webp","\u002Fblog\u002Fcloud-code-runner-sq.webp","Run code in remote Chrome browsers from your IDE, built on Axiom’s battle tested No-Code Tool.","\u002Fblog\u002Fnew-product-launch",{"title":46748,"description":494},"blog\u002Fnew-product-launch","2lW-K2g09Dqrc4XyRp7XVDUEuyyPZ1DWWbdgTMVoga0",[46947,90],[],[],{"id":46959,"title":46960,"author":46205,"body":46961,"date":48063,"description":48064,"draft":26250,"extension":506,"meta":48065,"navigation":522,"path":48072,"seo":48073,"stem":48074,"__hash__":48075,"pinned":-1,"category":48076,"type":48077,"tool":48078},"blog\u002Fblog\u002Fuse-puppeteer-to-submit-a-form.md","Can I ( A no-coder) use Puppeteer to submit a form",{"type":8,"value":46962,"toc":48044},[46963,46972,46974,46977,46989,46992,46995,46999,47007,47015,47019,47028,47032,47035,47042,47046,47049,47186,47190,47193,47196,47200,47203,47209,47213,47220,47225,47228,47258,47268,47272,47278,47283,47285,47315,47321,47325,47330,47335,47337,47357,47360,47391,47395,47401,47406,47408,47428,47432,47438,47443,47445,47467,47476,47480,47483,47596,47600,47603,47627,47634,47862,47866,47869,47884,47887,47891,47895,47898,47999,48003,48011,48020,48029,48038,48041],[14,46964,46965,46966,46971],{},"I can ",[322,46967,46970],{"href":46968,"rel":46969},"https:\u002F\u002Faxiom.ai\u002Fblog\u002Fhow-to-automate-data-entry",[2245],"automate data entry"," and form submission without writing a single line of code. I'm a no-code automation expert. I build workflows without touching JavaScript.",[18,46973],{},[14,46975,46976],{},"This week, it’s time to shake things up. Axiom has just released a new tool that lets you run multiple Puppeteer scripts concurrently in Chrome browsers directly from the command line.",[14,46978,46979,46980,46984,46985,46988],{},"Now's the perfect time to level up and learn some Puppeteer. Following on from coding a ",[322,46981,46983],{"href":46895,"rel":46982},[2245],"simple web scraper",", I'm now going to automate a web form with code. If you’re a Puppeteer expert, give our ",[322,46986,46926],{"href":46761,"rel":46987},[2245]," a spin.",[14,46990,46991],{},"Why I’m not saying “use AI” when everyone else is hyping it: LLMs just aren’t suited to this. They’re costly, error-prone, and bad for the planet. Code or no-code is faster and cleaner. Use LLMs to learn, but not for repetitive tasks.",[14,46993,46994],{},"If you’re learning like me, Hi I’m Alex Barlow, co-founder of Axiom. Let’s dive in.",[21,46996,46998],{"id":46997},"how-do-i-automate-forms-without-code","How do I automate forms without code?",[14,47000,47001,47002,47006],{},"I first select the source of my data, usually a Google Sheet or webhook. I look at the web form, then add the necessary steps in the ",[322,47003,46728],{"href":47004,"rel":47005},"https:\u002F\u002Faxiom.ai\u002Fno-code-builder",[2245]," to create my workflow. Before I can test the bot, I need to select the elements and connect the data, and I'm done.",[14,47008,47009,47010,47014],{},"My no-code experience will be useful here. I’m betting that many of the same ",[322,47011,7285],{"href":47012,"rel":47013},"https:\u002F\u002Faxiom.ai\u002Fsteps",[2245]," we have in Axiom map directly to methods in Puppeteer.",[21,47016,47018],{"id":47017},"why-puppeeter-and-not-playwright","Why Puppeeter and not Playwright?",[14,47020,47021,47022,47027],{},"We’ve built a tool that runs code remotely in Chrome browsers using ",[322,47023,47026],{"href":47024,"rel":47025},"https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fdevtools\u002Fprotocol-monitor#:~:text=CDP%20commands%20directly.-,Overview,Inspect%20CDP%20messages",[2245],"CDP"," a WebSocket-based API that enables programmatic interaction with Chrome and Chromium-based browsers, and I want to learn how to use it. I have extensive knowledge of browser automation, but I'm not familiar with coding bots. If I am to work with the team in developing the tool, I need to learn. The new tool can also run Playwright, but I am choosing Puppeteer becuase our no-code tool extends it.",[21,47029,47031],{"id":47030},"tools-i-will-use-including-an-ai","Tools I will use, including an AI",[14,47033,47034],{},"I will be using an AI, probably ChatGPT or Claude, to help me learn how to script Puppeteer automations. AI is a great learning tool and helps me avoid bugging our CTO with stupid questions. I will also be using Cusor to script and run my automation.",[14,47036,47037,47038],{},"Finally, I will be running the script with Axiom's new ",[322,47039,47041],{"href":46761,"rel":47040},[2245],"endpoint for browser automation.",[21,47043,47045],{"id":47044},"get-setting-up-with-axiom","Get setting up with Axiom",[14,47047,47048],{},"An Axiom account is required to run code in our cloud. It's free to try; all new accounts get 30 minutes of runtime. No credit card required. We do not share user information with third parties or send marketing emails.\nThis example code shows you how to connect to the service and open a window. I will use it as a starting point for coding my bot.",[719,47050,47052],{"className":756,"code":47051,"language":758,"meta":494,"style":494},"const browser = await puppeteer.connect({\n        \u002F\u002F\u002F Insert my axiom API Key here\n    browserWSEndpoint: \" Insert Api key\"\n});\nconst page = await browser.newPage()\n\u002F\u002F\u002F Set window size\nawait page.setViewport({ width: 1960, height: 1080 });\n\u002F\u002F\u002F Insert URL of webform I wish to automate\nawait page.goto(\"URl\")\n\n\nawait page.close()\nawait browser.close()\n",[90,47053,47054,47070,47075,47082,47086,47106,47111,47136,47141,47157,47161,47165,47176],{"__ignoreMap":494},[727,47055,47056,47058,47060,47062,47064,47066,47068],{"class":729,"line":730},[727,47057,2315],{"class":1986},[727,47059,46866],{"class":1882},[727,47061,2321],{"class":1986},[727,47063,2410],{"class":1986},[727,47065,46873],{"class":768},[727,47067,19377],{"class":2376},[727,47069,2479],{"class":768},[727,47071,47072],{"class":729,"line":498},[727,47073,47074],{"class":2920},"        \u002F\u002F\u002F Insert my axiom API Key here\n",[727,47076,47077,47079],{"class":729,"line":495},[727,47078,46882],{"class":768},[727,47080,47081],{"class":737},"\" Insert Api key\"\n",[727,47083,47084],{"class":729,"line":1895},[727,47085,17446],{"class":768},[727,47087,47088,47090,47093,47095,47097,47100,47103],{"class":729,"line":1901},[727,47089,2315],{"class":1986},[727,47091,47092],{"class":1882}," page",[727,47094,2321],{"class":1986},[727,47096,2410],{"class":1986},[727,47098,47099],{"class":768}," browser.",[727,47101,47102],{"class":2376},"newPage",[727,47104,47105],{"class":768},"()\n",[727,47107,47108],{"class":729,"line":1973},[727,47109,47110],{"class":2920},"\u002F\u002F\u002F Set window size\n",[727,47112,47113,47116,47118,47121,47124,47127,47130,47133],{"class":729,"line":2052},[727,47114,47115],{"class":1986},"await",[727,47117,16668],{"class":768},[727,47119,47120],{"class":2376},"setViewport",[727,47122,47123],{"class":768},"({ width: ",[727,47125,47126],{"class":1882},"1960",[727,47128,47129],{"class":768},", height: ",[727,47131,47132],{"class":1882},"1080",[727,47134,47135],{"class":768}," });\n",[727,47137,47138],{"class":729,"line":2058},[727,47139,47140],{"class":2920},"\u002F\u002F\u002F Insert URL of webform I wish to automate\n",[727,47142,47143,47145,47147,47150,47152,47155],{"class":729,"line":2064},[727,47144,47115],{"class":1986},[727,47146,16668],{"class":768},[727,47148,47149],{"class":2376},"goto",[727,47151,2542],{"class":768},[727,47153,47154],{"class":737},"\"URl\"",[727,47156,12611],{"class":768},[727,47158,47159],{"class":729,"line":2087},[727,47160,1898],{"emptyLinePlaceholder":522},[727,47162,47163],{"class":729,"line":2140},[727,47164,1898],{"emptyLinePlaceholder":522},[727,47166,47167,47169,47171,47174],{"class":729,"line":2154},[727,47168,47115],{"class":1986},[727,47170,16668],{"class":768},[727,47172,47173],{"class":2376},"close",[727,47175,47105],{"class":768},[727,47177,47178,47180,47182,47184],{"class":729,"line":1529},[727,47179,47115],{"class":1986},[727,47181,47099],{"class":768},[727,47183,47173],{"class":2376},[727,47185,47105],{"class":768},[21,47187,47189],{"id":47188},"what-puppeteer-commands-should-i-use","What puppeteer commands should I use?",[14,47191,47192],{},"Off the bat, I could be lazy and ask an LLM to write the code for me. But I want to learn. So instead, I’m using generative AI to research Puppeteer commands.",[14,47194,47195],{},"The first thing I learned was about Puppeteer's Page class and the methods it provides for interacting with an open browser tab, such as navigating to URLs, clicking elements, typing text, and taking screenshots — all the good stuff we browser automators like.",[21,47197,47199],{"id":47198},"what-does-await-mean","What does \"await\" mean?",[14,47201,47202],{},"In the course of my research, I learned that Puppeteer’s methods are asynchronous. That means they start an action and move on without waiting for it to finish. When we interact with a web page, we do things synchronously — we click, wait, then move to the next step. So imagine the chaos if a script tried to fill in every form field at once!",[14,47204,47205,47206,47208],{},"I found that these asynchronous methods return a promise — “I’ll let you know when this is done.” The ",[90,47207,47115],{}," tells JavaScript to wait for that promise before running the next line. It stops the script from firing off everything in one mad rush, making the automation more human-like.",[639,47210,47212],{"id":47211},"how-to-input-text-into-a-field-using-puppeteer","How to input text into a field using puppeteer",[14,47214,47215,47216,47219],{},"To enter text into a field, I use the ",[90,47217,47218],{},"type"," method. This method works like saying:",[8898,47221,47222],{},[14,47223,47224],{},"“On this page (the current tab), type this text into the element that matches this selector.”",[14,47226,47227],{},"For example:",[719,47229,47231],{"className":756,"code":47230,"language":758,"meta":494,"style":494},"\u002F\u002F Types text into an input\nawait page.type('#username', 'myUser');\n",[90,47232,47233,47238],{"__ignoreMap":494},[727,47234,47235],{"class":729,"line":730},[727,47236,47237],{"class":2920},"\u002F\u002F Types text into an input\n",[727,47239,47240,47242,47244,47246,47248,47251,47253,47256],{"class":729,"line":498},[727,47241,47115],{"class":1986},[727,47243,16668],{"class":768},[727,47245,47218],{"class":2376},[727,47247,2542],{"class":768},[727,47249,47250],{"class":737},"'#username'",[727,47252,2004],{"class":768},[727,47254,47255],{"class":737},"'myUser'",[727,47257,5005],{"class":768},[14,47259,47260,47261,47264,47265,47267],{},"I also learnt you can use another method ",[90,47262,47263],{},"fill"," which is faster but ",[90,47266,47218],{}," is more human as it simulates key strokes.",[639,47269,47271],{"id":47270},"how-to-automate-a-sleect-list-using-puppeteer","How to automate a sleect list using puppeteer",[14,47273,47274,47275,47219],{},"To chose an option from a select list, I use the ",[90,47276,47277],{},"select",[8898,47279,47280],{},[14,47281,47282],{},"“On this page (the current tab), select X on the element that matches this selector.”",[14,47284,47227],{},[719,47286,47288],{"className":756,"code":47287,"language":758,"meta":494,"style":494},"\u002F\u002F Select an option by its value attribute\nawait page.select('#mySelect', 'optionValue');\n",[90,47289,47290,47295],{"__ignoreMap":494},[727,47291,47292],{"class":729,"line":730},[727,47293,47294],{"class":2920},"\u002F\u002F Select an option by its value attribute\n",[727,47296,47297,47299,47301,47303,47305,47308,47310,47313],{"class":729,"line":498},[727,47298,47115],{"class":1986},[727,47300,16668],{"class":768},[727,47302,47277],{"class":2376},[727,47304,2542],{"class":768},[727,47306,47307],{"class":737},"'#mySelect'",[727,47309,2004],{"class":768},[727,47311,47312],{"class":737},"'optionValue'",[727,47314,5005],{"class":768},[14,47316,47317,47320],{},[90,47318,47319],{},"optionValue"," is th evalue you want to select.",[639,47322,47324],{"id":47323},"how-to-click-an-element-using-puppeteer","How to click an element using puppeteer",[14,47326,47327,47328,47219],{},"To click an element like a link, I use the ",[90,47329,13865],{},[8898,47331,47332],{},[14,47333,47334],{},"“On this page (the current tab), select and click element that matches this selector.”",[14,47336,47227],{},[719,47338,47340],{"className":756,"code":47339,"language":758,"meta":494,"style":494},"await page.click('#loginButton');\n\n",[90,47341,47342],{"__ignoreMap":494},[727,47343,47344,47346,47348,47350,47352,47355],{"class":729,"line":730},[727,47345,47115],{"class":1986},[727,47347,16668],{"class":768},[727,47349,13865],{"class":2376},[727,47351,2542],{"class":768},[727,47353,47354],{"class":737},"'#loginButton'",[727,47356,5005],{"class":768},[14,47358,47359],{},"You could also try co-ordinates, see example:",[719,47361,47363],{"className":756,"code":47362,"language":758,"meta":494,"style":494},"await page.click('#loginButton', { offset: { x: 10, y: 5 } });\n",[90,47364,47365],{"__ignoreMap":494},[727,47366,47367,47369,47371,47373,47375,47377,47380,47382,47385,47388],{"class":729,"line":730},[727,47368,47115],{"class":1986},[727,47370,16668],{"class":768},[727,47372,13865],{"class":2376},[727,47374,2542],{"class":768},[727,47376,47354],{"class":737},[727,47378,47379],{"class":768},", { offset: { x: ",[727,47381,3827],{"class":1882},[727,47383,47384],{"class":768},", y: ",[727,47386,47387],{"class":1882},"5",[727,47389,47390],{"class":768}," } });\n",[639,47392,47394],{"id":47393},"how-to-select-radio-button-using-puppeteer","How to select radio button using puppeteer",[14,47396,47397,47398,47400],{},"To click a radio, I use the ",[90,47399,13865],{}," method again. This method works like saying:",[8898,47402,47403],{},[14,47404,47405],{},"“On this page (the current tab), select and click radio that matches this selector.”",[14,47407,47227],{},[719,47409,47411],{"className":756,"code":47410,"language":758,"meta":494,"style":494},"await page.click('input[type=radio][value=cat]');\n",[90,47412,47413],{"__ignoreMap":494},[727,47414,47415,47417,47419,47421,47423,47426],{"class":729,"line":730},[727,47416,47115],{"class":1986},[727,47418,16668],{"class":768},[727,47420,13865],{"class":2376},[727,47422,2542],{"class":768},[727,47424,47425],{"class":737},"'input[type=radio][value=cat]'",[727,47427,5005],{"class":768},[639,47429,47431],{"id":47430},"last-but-not-least-how-to-use-a-keypress-to-automate-website-actions","Last but not least, How to use a keypress to automate website actions",[14,47433,47434,47435,47219],{},"To replicate keyboard actions, I can use the ",[90,47436,47437],{},"keypress",[8898,47439,47440],{},[14,47441,47442],{},"“On this page (the current tab), press this key.”",[14,47444,47227],{},[719,47446,47448],{"className":756,"code":47447,"language":758,"meta":494,"style":494},"await page.keyboard.press('Enter');\n",[90,47449,47450],{"__ignoreMap":494},[727,47451,47452,47454,47457,47460,47462,47465],{"class":729,"line":730},[727,47453,47115],{"class":1986},[727,47455,47456],{"class":768}," page.keyboard.",[727,47458,47459],{"class":2376},"press",[727,47461,2542],{"class":768},[727,47463,47464],{"class":737},"'Enter'",[727,47466,5005],{"class":768},[14,47468,47469,47470,47475],{},"Typically, I use the no-code ",[322,47471,47474],{"href":47472,"rel":47473},"https:\u002F\u002Faxiom.ai\u002Fdocs\u002Fguides\u002Fgeneral\u002Fweb-actions\u002Fkeyboard-short-cuts",[2245],"keypress step"," in Axiom to submit forms or tab between elements. I can, of course, do the same with code.",[21,47477,47479],{"id":47478},"coding-the-bot","Coding the bot",[14,47481,47482],{},"First up, I’ll insert my API key and the URL of the web form I’ll automate, in this case a demo page.",[719,47484,47486],{"className":756,"code":47485,"language":758,"meta":494,"style":494},"const browser = await puppeteer.connect({\n        \u002F\u002F\u002F Insert my axiom API Key here\n    browserWSEndpoint: \"eyJ1c2VyX2lkIjoxOTUzNzMsInRva2VuIjoiMTk1MzczNDZhMTA4OWIwYmQzZWRmNyJ9\"\n});\nconst page = await browser.newPage()\nawait page.setViewport({ width: 1960, height: 1080 });\n\u002F\u002F\u002F Insert URL of webform I wish to automate\nawait page.goto(\"https:\u002F\u002Faxiom.ai\u002Fdemo\u002Fwebform\u002F\")\n\nawait page.close()\nawait browser.close()\n",[90,47487,47488,47504,47508,47515,47519,47535,47553,47557,47572,47576,47586],{"__ignoreMap":494},[727,47489,47490,47492,47494,47496,47498,47500,47502],{"class":729,"line":730},[727,47491,2315],{"class":1986},[727,47493,46866],{"class":1882},[727,47495,2321],{"class":1986},[727,47497,2410],{"class":1986},[727,47499,46873],{"class":768},[727,47501,19377],{"class":2376},[727,47503,2479],{"class":768},[727,47505,47506],{"class":729,"line":498},[727,47507,47074],{"class":2920},[727,47509,47510,47512],{"class":729,"line":495},[727,47511,46882],{"class":768},[727,47513,47514],{"class":737},"\"eyJ1c2VyX2lkIjoxOTUzNzMsInRva2VuIjoiMTk1MzczNDZhMTA4OWIwYmQzZWRmNyJ9\"\n",[727,47516,47517],{"class":729,"line":1895},[727,47518,17446],{"class":768},[727,47520,47521,47523,47525,47527,47529,47531,47533],{"class":729,"line":1901},[727,47522,2315],{"class":1986},[727,47524,47092],{"class":1882},[727,47526,2321],{"class":1986},[727,47528,2410],{"class":1986},[727,47530,47099],{"class":768},[727,47532,47102],{"class":2376},[727,47534,47105],{"class":768},[727,47536,47537,47539,47541,47543,47545,47547,47549,47551],{"class":729,"line":1973},[727,47538,47115],{"class":1986},[727,47540,16668],{"class":768},[727,47542,47120],{"class":2376},[727,47544,47123],{"class":768},[727,47546,47126],{"class":1882},[727,47548,47129],{"class":768},[727,47550,47132],{"class":1882},[727,47552,47135],{"class":768},[727,47554,47555],{"class":729,"line":2052},[727,47556,47140],{"class":2920},[727,47558,47559,47561,47563,47565,47567,47570],{"class":729,"line":2058},[727,47560,47115],{"class":1986},[727,47562,16668],{"class":768},[727,47564,47149],{"class":2376},[727,47566,2542],{"class":768},[727,47568,47569],{"class":737},"\"https:\u002F\u002Faxiom.ai\u002Fdemo\u002Fwebform\u002F\"",[727,47571,12611],{"class":768},[727,47573,47574],{"class":729,"line":2064},[727,47575,1898],{"emptyLinePlaceholder":522},[727,47577,47578,47580,47582,47584],{"class":729,"line":2087},[727,47579,47115],{"class":1986},[727,47581,16668],{"class":768},[727,47583,47173],{"class":2376},[727,47585,47105],{"class":768},[727,47587,47588,47590,47592,47594],{"class":729,"line":2140},[727,47589,47115],{"class":1986},[727,47591,47099],{"class":768},[727,47593,47173],{"class":2376},[727,47595,47105],{"class":768},[21,47597,47599],{"id":47598},"selecting-puppeteer-methods-to-automate-the-form","Selecting Puppeteer methods to automate the form",[14,47601,47602],{},"Now into uncharted water I have done this without code using Axiom, just never with code. Looking at the form I see I will need:",[555,47604,47605,47610,47615,47621],{},[83,47606,5070,47607,47609],{},[90,47608,47218],{}," method to submit name and email",[83,47611,5070,47612,47614],{},[90,47613,155],{}," method to select an option on \"How did you find us\" select list",[83,47616,47617,47618,47620],{},"A ",[90,47619,13865],{}," method to select a radio",[83,47622,47623,47624,47626],{},"Finally, A ",[90,47625,13865],{}," method to click submit",[14,47628,47629,47630,47633],{},"I add five lines of code. For each one, I also need a ",[90,47631,47632],{},"CSS selector",". To work out my selectors, I use Chrome Inspector, a tool I’m familiar with and use a lot when building no-code automations.",[719,47635,47637],{"className":756,"code":47636,"language":758,"meta":494,"style":494},"const browser = await puppeteer.connect({\n        \u002F\u002F\u002F Insert my axiom API Key here\n    browserWSEndpoint: \"eyJ1c2VyX2lkIjoxOTUzNzMsInRva2VuIjoiMTk1MzczNDZhMTA4OWIwYmQzZWRmNyJ9\"\n});\nconst page = await browser.newPage()\n\u002F\u002F\u002F Set window size\nawait page.setViewport({ width: 1960, height: 1080 });\n\u002F\u002F\u002F Insert URL of webform I wish to automate\nawait page.goto(\"https:\u002F\u002Faxiom.ai\u002Fdemo\u002Fwebform\u002F\")\n\u002F\u002F Enter name added css selector\nawait page.type('#name', 'myUser');\n\u002F\u002F Enter email added css selector\nawait page.type('#email', 'myUser');\n\u002F\u002F Select list added css selector and value\nawait page.select('#howFound', 'Referral');\n\u002F\u002F Radio added css selector\nawait page.click('#optInYes');\n\u002F\u002F Submit form added css selector\nawait page.click('.submit-btn');\n\nawait page.close()\nawait browser.close()\n",[90,47638,47639,47655,47659,47665,47669,47685,47689,47707,47711,47725,47730,47749,47754,47773,47778,47798,47803,47818,47823,47838,47842,47852],{"__ignoreMap":494},[727,47640,47641,47643,47645,47647,47649,47651,47653],{"class":729,"line":730},[727,47642,2315],{"class":1986},[727,47644,46866],{"class":1882},[727,47646,2321],{"class":1986},[727,47648,2410],{"class":1986},[727,47650,46873],{"class":768},[727,47652,19377],{"class":2376},[727,47654,2479],{"class":768},[727,47656,47657],{"class":729,"line":498},[727,47658,47074],{"class":2920},[727,47660,47661,47663],{"class":729,"line":495},[727,47662,46882],{"class":768},[727,47664,47514],{"class":737},[727,47666,47667],{"class":729,"line":1895},[727,47668,17446],{"class":768},[727,47670,47671,47673,47675,47677,47679,47681,47683],{"class":729,"line":1901},[727,47672,2315],{"class":1986},[727,47674,47092],{"class":1882},[727,47676,2321],{"class":1986},[727,47678,2410],{"class":1986},[727,47680,47099],{"class":768},[727,47682,47102],{"class":2376},[727,47684,47105],{"class":768},[727,47686,47687],{"class":729,"line":1973},[727,47688,47110],{"class":2920},[727,47690,47691,47693,47695,47697,47699,47701,47703,47705],{"class":729,"line":2052},[727,47692,47115],{"class":1986},[727,47694,16668],{"class":768},[727,47696,47120],{"class":2376},[727,47698,47123],{"class":768},[727,47700,47126],{"class":1882},[727,47702,47129],{"class":768},[727,47704,47132],{"class":1882},[727,47706,47135],{"class":768},[727,47708,47709],{"class":729,"line":2058},[727,47710,47140],{"class":2920},[727,47712,47713,47715,47717,47719,47721,47723],{"class":729,"line":2064},[727,47714,47115],{"class":1986},[727,47716,16668],{"class":768},[727,47718,47149],{"class":2376},[727,47720,2542],{"class":768},[727,47722,47569],{"class":737},[727,47724,12611],{"class":768},[727,47726,47727],{"class":729,"line":2087},[727,47728,47729],{"class":2920},"\u002F\u002F Enter name added css selector\n",[727,47731,47732,47734,47736,47738,47740,47743,47745,47747],{"class":729,"line":2140},[727,47733,47115],{"class":1986},[727,47735,16668],{"class":768},[727,47737,47218],{"class":2376},[727,47739,2542],{"class":768},[727,47741,47742],{"class":737},"'#name'",[727,47744,2004],{"class":768},[727,47746,47255],{"class":737},[727,47748,5005],{"class":768},[727,47750,47751],{"class":729,"line":2154},[727,47752,47753],{"class":2920},"\u002F\u002F Enter email added css selector\n",[727,47755,47756,47758,47760,47762,47764,47767,47769,47771],{"class":729,"line":1529},[727,47757,47115],{"class":1986},[727,47759,16668],{"class":768},[727,47761,47218],{"class":2376},[727,47763,2542],{"class":768},[727,47765,47766],{"class":737},"'#email'",[727,47768,2004],{"class":768},[727,47770,47255],{"class":737},[727,47772,5005],{"class":768},[727,47774,47775],{"class":729,"line":2178},[727,47776,47777],{"class":2920},"\u002F\u002F Select list added css selector and value\n",[727,47779,47780,47782,47784,47786,47788,47791,47793,47796],{"class":729,"line":2187},[727,47781,47115],{"class":1986},[727,47783,16668],{"class":768},[727,47785,47277],{"class":2376},[727,47787,2542],{"class":768},[727,47789,47790],{"class":737},"'#howFound'",[727,47792,2004],{"class":768},[727,47794,47795],{"class":737},"'Referral'",[727,47797,5005],{"class":768},[727,47799,47800],{"class":729,"line":2533},[727,47801,47802],{"class":2920},"\u002F\u002F Radio added css selector\n",[727,47804,47805,47807,47809,47811,47813,47816],{"class":729,"line":2551},[727,47806,47115],{"class":1986},[727,47808,16668],{"class":768},[727,47810,13865],{"class":2376},[727,47812,2542],{"class":768},[727,47814,47815],{"class":737},"'#optInYes'",[727,47817,5005],{"class":768},[727,47819,47820],{"class":729,"line":2559},[727,47821,47822],{"class":2920},"\u002F\u002F Submit form added css selector\n",[727,47824,47825,47827,47829,47831,47833,47836],{"class":729,"line":2565},[727,47826,47115],{"class":1986},[727,47828,16668],{"class":768},[727,47830,13865],{"class":2376},[727,47832,2542],{"class":768},[727,47834,47835],{"class":737},"'.submit-btn'",[727,47837,5005],{"class":768},[727,47839,47840],{"class":729,"line":2570},[727,47841,1898],{"emptyLinePlaceholder":522},[727,47843,47844,47846,47848,47850],{"class":729,"line":2591},[727,47845,47115],{"class":1986},[727,47847,16668],{"class":768},[727,47849,47173],{"class":2376},[727,47851,47105],{"class":768},[727,47853,47854,47856,47858,47860],{"class":729,"line":2603},[727,47855,47115],{"class":1986},[727,47857,47099],{"class":768},[727,47859,47173],{"class":2376},[727,47861,47105],{"class":768},[21,47863,47865],{"id":47864},"testing-and-running-the-puppeteer-script","Testing and running the Puppeteer script",[14,47867,47868],{},"There are two ways to test my bot.",[555,47870,47871,47877],{},[83,47872,47873,47874,44],{},"Run the script from console or in cursor by simply entering ",[90,47875,47876],{},"node form-entry-bot.js",[83,47878,47879,47880,44],{},"Alternaticaley I can run the script inside the tools \"Live editor\" feature which is found in the ",[322,47881,47883],{"href":46761,"rel":47882},[2245],"code dashboard web app",[14,47885,47886],{},"Each method has pros and cons. From the command line, you can’t watch the run, but you do get feedback on the run state, errors, and other details. In the Live editor, a preview opens so you can watch the run — as shown in the screenshot below.",[592,47888],{"src":47889,"alt":47890},"\u002Fblog\u002Fpuppeteer-playground.webp","axiom.ai Live editor for running scripts",[21,47892,47894],{"id":47893},"minnor-tweak-to-the-code","Minnor tweak to the code",[14,47896,47897],{},"I tested the script in the desktop Live editor. The click on the submit button wasn’t visible on the page, so I added a line of code to scroll. The page also closed too quickly, so I added a wait to keep it open. Other than that, it worked perfectly.",[719,47899,47901],{"className":756,"code":47900,"language":758,"meta":494,"style":494},"await page.evaluate(() => {\n    document.querySelector('.submit-btn').scrollIntoView();\n});\n\u002F\u002F Submit form\nawait page.click('.submit-btn');\n\n\u002F\u002F Wait to see the result\nawait new Promise(resolve => setTimeout(resolve, 5000));\n",[90,47902,47903,47919,47938,47942,47947,47961,47965,47970],{"__ignoreMap":494},[727,47904,47905,47907,47909,47912,47915,47917],{"class":729,"line":730},[727,47906,47115],{"class":1986},[727,47908,16668],{"class":768},[727,47910,47911],{"class":2376},"evaluate",[727,47913,47914],{"class":768},"(() ",[727,47916,2388],{"class":1986},[727,47918,2391],{"class":768},[727,47920,47921,47924,47927,47929,47931,47933,47936],{"class":729,"line":498},[727,47922,47923],{"class":768},"    document.",[727,47925,47926],{"class":2376},"querySelector",[727,47928,2542],{"class":768},[727,47930,47835],{"class":737},[727,47932,5983],{"class":768},[727,47934,47935],{"class":2376},"scrollIntoView",[727,47937,2588],{"class":768},[727,47939,47940],{"class":729,"line":495},[727,47941,17446],{"class":768},[727,47943,47944],{"class":729,"line":1895},[727,47945,47946],{"class":2920},"\u002F\u002F Submit form\n",[727,47948,47949,47951,47953,47955,47957,47959],{"class":729,"line":1901},[727,47950,47115],{"class":1986},[727,47952,16668],{"class":768},[727,47954,13865],{"class":2376},[727,47956,2542],{"class":768},[727,47958,47835],{"class":737},[727,47960,5005],{"class":768},[727,47962,47963],{"class":729,"line":1973},[727,47964,1898],{"emptyLinePlaceholder":522},[727,47966,47967],{"class":729,"line":2052},[727,47968,47969],{"class":2920},"\u002F\u002F Wait to see the result\n",[727,47971,47972,47974,47977,47980,47982,47985,47987,47990,47993,47996],{"class":729,"line":2058},[727,47973,47115],{"class":1986},[727,47975,47976],{"class":1986}," new",[727,47978,47979],{"class":1882}," Promise",[727,47981,2542],{"class":768},[727,47983,47984],{"class":733},"resolve",[727,47986,3207],{"class":1986},[727,47988,47989],{"class":2376}," setTimeout",[727,47991,47992],{"class":768},"(resolve, ",[727,47994,47995],{"class":1882},"5000",[727,47997,47998],{"class":768},"));\n",[21,48000,48002],{"id":48001},"wrapping-up-yes-a-no-coder-can-learn-puppeteer-and-automate-a-form-but-should-you","Wrapping up — yes, a no-coder can learn Puppeteer and automate a form, but should you?",[14,48004,48005,48006,48010],{},"I've been using Puppeteer for years without really understanding much about the underlying code through Axiom's ",[322,48007,48009],{"href":47004,"rel":48008},[2245],"no-code tool",". One customer even said it's 85% faster than writing your own Puppeteer script.",[14,48012,48013,48014,48016,48017,48019],{},"I've really enjoyed digging deeper into code, even though I've only scratched the surface. It's been good to learn about the ",[90,48015,3261],{}," class and methods such as ",[90,48018,13865],{},". The process I went through, using AI for help, working in a tool like Cursor, and having an endpoint to test my scripts, made it easy to get up and running. No wrestling with NPM, which can be a real pain.",[14,48021,48022,48023,48025,48026,48028],{},"I also learned about ",[90,48024,47115],{},", and that the ",[90,48027,3261],{}," methods in Puppeteer return a promise when they are completed.",[14,48030,48031,48032,48037],{},"As a no-coder, I can now ",[322,48033,48036],{"href":48034,"rel":48035},"https:\u002F\u002Faxiom.ai\u002Fdocs\u002Ftutorials\u002Fwebforms",[2245],"automate forms"," with or without using Puppeteer. So which would I choose? I’ll be honest, I’d choose lazy every time. It's just quicker and easier to use the No-code tool. Even if I were a proficient coder, I'd still pick no-code. That said, I've really enjoyed learning more about how Puppeteer works, so I'll keep digging deeper and trying new things.",[14,48039,48040],{},"Next, I might learn how to loop methods with code, a feature I use in the no-code tool all the time. That's going to be fun 😃",[811,48042,48043],{},"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);}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}",{"title":494,"searchDepth":495,"depth":495,"links":48045},[48046,48047,48048,48049,48050,48051,48058,48059,48060,48061,48062],{"id":46997,"depth":498,"text":46998},{"id":47017,"depth":498,"text":47018},{"id":47030,"depth":498,"text":47031},{"id":47044,"depth":498,"text":47045},{"id":47188,"depth":498,"text":47189},{"id":47198,"depth":498,"text":47199,"children":48052},[48053,48054,48055,48056,48057],{"id":47211,"depth":495,"text":47212},{"id":47270,"depth":495,"text":47271},{"id":47323,"depth":495,"text":47324},{"id":47393,"depth":495,"text":47394},{"id":47430,"depth":495,"text":47431},{"id":47478,"depth":498,"text":47479},{"id":47598,"depth":498,"text":47599},{"id":47864,"depth":498,"text":47865},{"id":47893,"depth":498,"text":47894},{"id":48001,"depth":498,"text":48002},"2025-10-16","I can automate data entry and form submission without writing a single line of code. I'm a no-code automation expert. I build workflows without touching JavaScript.",{"read":46726,"tags":48066,"category":48068,"location":46733,"featuredimg":48069,"landingimg":48070,"summary":48071,"video":523},[1055,48067],"web form",[46947],"\u002Fblog\u002Fform-flat-puppeteer.webp","\u002Fblog\u002Fform-flat-puppeteer-sq.webp","A no-coder’s guide to using Puppeteer to automate a web form, learn core methods like click, type, and select, and run scripts easily with Axiom’s new code dashboard.","\u002Fblog\u002Fuse-puppeteer-to-submit-a-form",{"title":46960,"description":48064},"blog\u002Fuse-puppeteer-to-submit-a-form","alUVrX2Gr-KB0b4hMdgtjCUWlAkM9hffeMs6yjmz9lA",[46947],[],[],{"id":48080,"title":48081,"author":48082,"body":48083,"date":48200,"description":48201,"draft":26250,"extension":506,"meta":48202,"navigation":522,"path":48211,"seo":48212,"stem":48213,"__hash__":48214,"pinned":-1,"category":48215,"type":48216,"tool":48217},"blog\u002Fblog\u002Fpuppeteer-web-scraper.md","Can a no coder build a web scraper with Puppeteer?","Karl Jones",{"type":8,"value":48084,"toc":48192},[48085,48088,48091,48094,48100,48103,48108,48111,48118,48121,48125,48128,48135,48141,48145,48148,48155,48164,48167,48171,48174,48180,48183,48187,48189],[14,48086,48087],{},"While axiom.ai automations can be triggered manually, there are methods of automatically triggering these, or even just manually triggering them from a third-party service. This allows for your automations to be included in a larger workflow, or include other services in your current workflow. In this article, we are going to discuss triggering your automations from third-party services such as IFTTT, Make, Zapier, Power Automate and Supabase - we have additional guides for all of these services if you wish to take a deeper dive, check out the sections below for more details.",[18,48089],{"alt":48090},"5 Methods of Triggering an Automation via Third-party Services",[21,48092,12139],{"id":48093},"ifttt",[14,48095,48096,48099],{},[322,48097,12139],{"href":12137,"rel":48098},[2245]," (If This Then That) is a web-based service that automates tasks by connecting apps, devices, and services through simple conditional statements called \"applets.\" These applets can include triggers for your automations, including sending information over that can be used later in your automations. Your applets can also be triggered directly from your automations. You may find that you already have an established library of IFTTT applets that could benefit from integrating with axiom.ai.",[14,48101,48102],{},"Personally, I found this helpful with managing my homes energy usage. As a member of Octopus Energy, my energy prices change throughout the day depending on how much \"clean\" energy is being produced on the grid here in the UK. I make use of the \"Agile Octopus\" integration within IFTTT to trigger an axiom.ai automation anytime the price of energy drops below 10p\u002FkWh so I can be notified and turn on all of my power hungry appliances!",[14,48104,48105,48106],{},"Guide: ",[322,48107,12128],{"href":12691},[21,48109,3293],{"id":48110},"make",[14,48112,48113,48117],{},[322,48114,3293],{"href":48115,"rel":48116},"https:\u002F\u002Fmake.com",[2245]," (formerly Integromat) is a visual platform for building and automating workflows by connecting apps, services, and devices through customizable integrations and logic-based scenarios. These workflows offer powerful options when it comes to allowing logic to be introduced to your workflows, similar to the logic steps that are offered within axiom.ai.",[14,48119,48120],{},"We have seen some pretty inventive automations created to make use of Make workflows come through our Support team, including the automation of Telegram messages or even the automation of their Etsy store.",[14,48122,48105,48123],{},[322,48124,18294],{"href":18481},[21,48126,18827],{"id":48127},"power-automate",[14,48129,48130,48134],{},[322,48131,18827],{"href":48132,"rel":48133},"https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fpower-platform\u002Fproducts\u002Fpower-automate",[2245]," is a Microsoft platform that enables users to create automated workflows between apps and services to streamline tasks, integrate systems, and improve productivity. It can be useful for a wide variety of tasks, from simple social media automation to reporting on system stats and system monitoring. Something to note when it comes to Power Automate is that there are two versions: the desktop version that can be used to access system resources, and the online version that is more of an automation platform. It would be best to review the platforms to determine which one suits your needs best. The online version is cross platform, which has it's benefits, but has more limited functionality.",[14,48136,48137,48138,48140],{},"An interesting use case for this may be to report the status of a system that has been designated a server - for example, if you'd like to trigger an automation to run when a server hits a certain memory threshold, you could do this by setting up a Power Automate workflow on that server that then triggers your axiom.ai automation. You could then have your automation send an email, or send a message along to Slack - check out our ",[322,48139,20852],{"href":21216}," guide for details on how to integrate Slack.",[14,48142,48105,48143],{},[322,48144,18774],{"href":19085},[21,48146,3288],{"id":48147},"zapier",[14,48149,48150,48154],{},[322,48151,3288],{"href":48152,"rel":48153},"https:\u002F\u002Fzapier.com",[2245]," is an automation platform that connects apps and services, enabling users to create workflows called \"Zaps\" that perform tasks automatically based on triggers and actions. Zapier has a massive library of over 1,000 integrations that can be integrated into your Zaps - and guess what one of those integrations is? You guessed right (I hope) - axiom.ai! You can search for axiom.ai right in your Zapier library and get started pretty quickly.",[14,48156,48157,48158,48161,48162,48140],{},"Internally, we use this integration quite a bit. To help manage our ",[322,48159,24359],{"href":3324,"rel":48160},[2245]," we have a Zap that detects when new Reddit posts are made within our community. When a new post is made in the community it will trigger the Zap, that will then trigger the axiom.ai automation which sends the data onto a Slack workflow which drops a message in our \"#reddit-new-posts\" channel, ready for our Support team to review! Check out our ",[322,48163,20852],{"href":21216},[592,48165],{"src":48166},"\u002Fblog\u002F5-methods-of-triggering-via-third-party-zapier-flowchart.png",[14,48168,48105,48169],{},[322,48170,24406],{"href":24683},[21,48172,21233],{"id":48173},"supabase",[14,48175,48176,48179],{},[322,48177,21233],{"href":21231,"rel":48178},[2245]," is an open-source backend-as-a-service platform that provides developers with tools like a Postgres database, authentication, and real-time APIs to build scalable applications. As a backend-as-a-service platform it helps you store data at scale - combined with your axiom.ai automations, it can really help you store the data that you are working with. For example, if you wish to store large amounts of data that you have scraped, Supabase can be useful for storing that data. This can be a great alternative to Google Sheets as it provides a better platform to manage data at scale, plus your data can be exported to be used in your favourite spreadsheet software, if required.",[14,48181,48182],{},"As a Firebase alternative, we've seen instances where this data has been fed into a Supabase database to then be used to power other website through their Postgres database offerings. As a developer myself with plenty of experience with Firebase, Supabase offers a great alternative that when combined with your axiom.ai automations could offer quite a lot of opportunities.",[14,48184,48105,48185],{},[322,48186,21222],{"href":22503},[21,48188,796],{"id":795},[14,48190,48191],{},"All of the services above offer various advantages when used with axiom.ai to power up your automations. Even if you are not passing data to your axiom.ai automations, the simple act of triggering them from a third-party service can give you the ability add additional features to your workflows - from something as simple as notifications, to triggering completely separate workflows using logic steps within any of the apps above.",{"title":494,"searchDepth":495,"depth":495,"links":48193},[48194,48195,48196,48197,48198,48199],{"id":48093,"depth":498,"text":12139},{"id":48110,"depth":498,"text":3293},{"id":48127,"depth":498,"text":18827},{"id":48147,"depth":498,"text":3288},{"id":48173,"depth":498,"text":21233},{"id":795,"depth":498,"text":796},"2025-09-18","Learn five methods of triggering an axiom.ai automation using a third-party service",{"read":48203,"type":513,"tool":48204,"category":48206,"tags":48208,"location":46733,"featuredimg":48209,"landingimg":48210,"summary":48201,"video":523,"metaTitle":48090},"4 min read",[48205],"no-code runner",[48207],"Web scraping",[12139,48110,19083,48147,48173],"\u002Fblog\u002F5-triggers.webp","\u002Fblog\u002F5-triggers-sq.webp","\u002Fblog\u002Fpuppeteer-web-scraper",{"title":48081,"description":48201},"blog\u002Fpuppeteer-web-scraper","ywLTmlrHDX_8v7rAdKB2m0TtTX89jWN50Yofb5LSLV0",[48207],[513],[48205],{"id":48219,"title":48220,"author":48082,"body":48221,"date":48359,"description":48360,"draft":26250,"extension":506,"meta":48361,"navigation":522,"path":48369,"seo":48370,"stem":48371,"__hash__":48372,"pinned":-1,"category":48373,"type":48374,"tool":48375},"blog\u002Fblog\u002Fmastering-the-multi-selector-tool.md","Mastering the Multi-selector Tool",{"type":8,"value":48222,"toc":48350},[48223,48235,48239,48242,48245,48249,48252,48255,48258,48262,48265,48282,48285,48289,48292,48304,48307,48311,48314,48318,48321,48324,48335,48342,48344,48347],[14,48224,5070,48225,48229,48230,48234],{},[322,48226,3435],{"href":48227,"rel":48228},"https:\u002F\u002Faxiom.ai\u002F",[2245]," Selector tool allows you to select elements from a page to make use of within your automation. For example, when using the ",[322,48231,5314],{"href":48232,"rel":48233},"https:\u002F\u002Faxiom.ai\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fenter-text",[2245]," step this will allow you to select the text field that you want to enter text into. There are two versions of this tool depending on which step you are using it in. We are primarily discussing the Multi-Selector tool within this article, but it’s still important to know about the Single-Selector tool.",[21,48236,48238],{"id":48237},"single-selector-tool","Single-Selector tool",[14,48240,48241],{},"The Single-Selector tool will allow you to select a single target within the step that you have initiated the tool from. For example, this tool will open when selecting your target for the “Enter text” step, or the “Click element” step - steps where only a single target is used.",[14,48243,48244],{},"This tool will allow you to also use advanced features such as custom selectors, or using the text of an element as a selector. Setting custom selectors allows you to target more complex elements that the standard selector tool may not recognise.",[21,48246,48248],{"id":48247},"multi-selector-tool","Multi-Selector tool",[14,48250,48251],{},"The Multi-Selector tool operates similar to the Single-Selector tool, but has a lot more functionality. This tool allows you to define multiple patterns of selectors to allow the step to identify a wider range of data from the page and multiple different sets of data. We’re going to dive into the features of this tool, and then we are going to give you some tips on really mastering the tool. This tool mostly appears within steps that are designed to scrape data from a webpage.",[14,48253,48254],{},"This tool will appear when you are using steps such as the “Get data from bot’s current page” step where you may wish to scrape multiple pieces of data from a webpage.",[14,48256,48257],{},"There are two key concepts to understand about the tool before making use of it: data types and columns. These two concepts make up the structure of the tool and understanding them ensures that you have the ability to select the elements you need to extract the data that fits your requirements.",[21,48259,48261],{"id":48260},"data-types","Data types",[14,48263,48264],{},"Selecting the correct data type is one of the first things that you will need to do when creating a new column of data. These data types will determine what data will be targeted by the automation. The data types available within the tool are:",[80,48266,48267,48270,48273,48276,48279],{},[83,48268,48269],{},"Text, the text of the element.",[83,48271,48272],{},"HTML, the HTML of the element.",[83,48274,48275],{},"Link, the URL behind the element.",[83,48277,48278],{},"Image, the image within the element.",[83,48280,48281],{},"Custom selector, a custom CSS selector.",[14,48283,48284],{},"Most data types are pretty self explanatory, the custom selector option being the outlier here - this allows you to write custom CSS selectors for more complex HTML elements that you may wish to use within your automation.",[21,48286,48288],{"id":48287},"columns","Columns",[14,48290,48291],{},"One of the best features of the Multi-Selector tool is to be able to select multiple pieces of data. Within the tool itself, you will see the “Add column +” button once you have a data type set for the column before it. This allows you to collect multiple columns of data and output it for use within future steps of your automation.",[14,48293,48294,48295,3289,48299,44],{},"For example, you would use separate columns if you were scraping a news website and wanted to grab the headline, the sub-heading and the news story itself. When output, this would include the information in separate columns ready to use or write to another service such as ",[322,48296,9292],{"href":48297,"rel":48298},"https:\u002F\u002Faxiom.ai\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fgoogle-sheets",[2245],[322,48300,48303],{"href":48301,"rel":48302},"https:\u002F\u002Faxiom.ai\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fexcel",[2245],"Microsoft Excel",[14,48305,48306],{},"You can mix and match your data types across different columns - Column A may be set to extract text from a page, where Column B may be set to extract a link from the page. This can be useful for extracting lists of links from a page.",[21,48308,48310],{"id":48309},"selecting-elements","Selecting elements",[14,48312,48313],{},"Understanding how to select elements with the Multi-Selector tool is very important - you can think of them as patterns. When you have the column selected, click on the element within the page that you want to select. Select another element that matches the first and the tool will automatically match any other elements on the page that match the same pattern.",[21,48315,48317],{"id":48316},"using-the-tool","Using the tool",[14,48319,48320],{},"To get started with the tool, it’s important to understand the data that you are looking to extract. Let’s use a Google Search page as an example.",[14,48322,48323],{},"There are three pieces of information that we want to get from each result that is on this page: the result title, the result description and the URL to the result. Consider each of these pieces of information as a column of data within the Multi-Selector tool. We can create three columns that can be set up as follows:",[555,48325,48326,48329,48332],{},[83,48327,48328],{},"Column A: Set to “text”, select the result titles",[83,48330,48331],{},"Column B: Set to “text”, select the result description",[83,48333,48334],{},"Column C: Set to “link”, select the result titles - this title contains the link to the result page",[14,48336,48337,48338,1230],{},"Once the automation is run this will output a list of results containing the data items that we are looking for - you can write these to a Google Sheet using the ",[322,48339,3303],{"href":48340,"rel":48341},"https:\u002F\u002Faxiom.ai\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fwrite-data-to-a-google-sheet-step",[2245],[21,48343,796],{"id":795},[14,48345,48346],{},"Understanding the basic features of the Multi-Selector tool allows you to take advantage of the tool in order to be sure that the elements that you are targeting with your automation are the correct targets.",[14,48348,48349],{},"By setting different data types within the columns that you have created, this allows you to target different data from elements depending on your needs. Setting the column to “text” will allow you to grab the text from the element, but setting this to “link” will allow you to get a URL from the same element.",{"title":494,"searchDepth":495,"depth":495,"links":48351},[48352,48353,48354,48355,48356,48357,48358],{"id":48237,"depth":498,"text":48238},{"id":48247,"depth":498,"text":48248},{"id":48260,"depth":498,"text":48261},{"id":48287,"depth":498,"text":48288},{"id":48309,"depth":498,"text":48310},{"id":48316,"depth":498,"text":48317},{"id":795,"depth":498,"text":796},"2025-09-10","The axiom.ai Selector tool allows you to select elements from a page to make use of within your automation. For example, when using the Enter text step this will allow you to select the text field that you want to enter text into. There are two versions of this tool depending on which step you are using it in. We are primarily discussing the Multi-Selector tool within this article, but it’s still important to know about the Single-Selector tool.",{"read":46726,"type":513,"tool":48362,"category":48363,"tags":48364,"location":46733,"featuredimg":48367,"landingimg":48368},[46728],[48207],[48365,48366],"css selectors","selector tool","\u002Fblog\u002Fcustom-selectors-post.webp","\u002Fblog\u002Fgroup-selectors-box.webp","\u002Fblog\u002Fmastering-the-multi-selector-tool",{"title":48220,"description":48360},"blog\u002Fmastering-the-multi-selector-tool","sqWjwBaI4bVZRL-SY0Nor8UOhIG_sL_-z65QrtfnE28",[48207],[513],[46728],{"id":48377,"title":48378,"author":48082,"body":48379,"date":50546,"description":50547,"draft":26250,"extension":506,"meta":50548,"navigation":522,"path":50559,"seo":50560,"stem":50561,"__hash__":50562,"pinned":-1,"category":50563,"type":50564,"tool":50565},"blog\u002Fblog\u002Fwriting-tests-with-llms.md","Writing Tests With LLMs",{"type":8,"value":48380,"toc":50536},[48381,48384,48388,48391,48694,48698,48701,48712,48715,48720,48723,48727,48730,48738,48741,48745,48755,49040,49044,49050,49402,49413,49415,49418,49421,49425,49428,50533],[14,48382,48383],{},"Large-language models (LLMs) are fantastic at writing code, this means that you can take full advantage of them when you are building out your projects. LLMs such as ChatGPT, Gemini, Claude or Le Chat are great at helping you write code - not to mention Cursor or Github Copilot that are specifically designed to help you with code. Whether you are following a standard project timeline or a test-driven development framework, writing tests is essential to ensure that your scripts work as you expect them to.",[21,48385,48387],{"id":48386},"writing-the-script","Writing the script",[14,48389,48390],{},"We're not going to be looking at writing scripts in this article, but we are going to introduce a script that we are going to use to ask an LLM to help us write tests for. We're going to stick with JavaScript for this article, and we are going to be using Gemini, but this will work for all LLMs. We're going to use a snippet that uses Puppeteer to fills a string into the Google search bar, this will connect to an external browser, go to Google.com, and then fill in the text before closing the browser session.",[719,48392,48394],{"className":756,"code":48393,"language":758,"meta":494,"style":494},"import puppeteer from 'puppeteer-core'\n\nconst start = async () => {\n  console.log('start')\n  const browser = await puppeteer.connect({\n    browserWSEndpoint: '\u003CENDPOINT>',\n  })\n  console.log('browser connected')\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 on the page\n    await page.locator('aria\u002FSearch').fill('Testing axiom.ai')\n\n    await new Promise((resolve) => {\n      setTimeout(() => {\n        resolve()\n      }, 5000)\n    })\n\n    await page.close()\n    await browser.close()\n    console.log('browser closed')\n  } catch (e) {\n    alert(e.message)\n    await browser.close()\n  }\n}\n\nstart()\n",[90,48395,48396,48410,48414,48431,48445,48461,48470,48475,48488,48494,48510,48525,48529,48534,48559,48563,48581,48592,48599,48608,48613,48617,48627,48637,48650,48658,48666,48676,48680,48684,48688],{"__ignoreMap":494},[727,48397,48398,48401,48404,48407],{"class":729,"line":730},[727,48399,48400],{"class":1986},"import",[727,48402,48403],{"class":768}," puppeteer ",[727,48405,48406],{"class":1986},"from",[727,48408,48409],{"class":737}," 'puppeteer-core'\n",[727,48411,48412],{"class":729,"line":498},[727,48413,1898],{"emptyLinePlaceholder":522},[727,48415,48416,48418,48421,48423,48425,48427,48429],{"class":729,"line":495},[727,48417,2315],{"class":1986},[727,48419,48420],{"class":2376}," start",[727,48422,2321],{"class":1986},[727,48424,2382],{"class":1986},[727,48426,2385],{"class":768},[727,48428,2388],{"class":1986},[727,48430,2391],{"class":768},[727,48432,48433,48436,48438,48440,48443],{"class":729,"line":1895},[727,48434,48435],{"class":768},"  console.",[727,48437,2597],{"class":2376},[727,48439,2542],{"class":768},[727,48441,48442],{"class":737},"'start'",[727,48444,12611],{"class":768},[727,48446,48447,48449,48451,48453,48455,48457,48459],{"class":729,"line":1901},[727,48448,22321],{"class":1986},[727,48450,46866],{"class":1882},[727,48452,2321],{"class":1986},[727,48454,2410],{"class":1986},[727,48456,46873],{"class":768},[727,48458,19377],{"class":2376},[727,48460,2479],{"class":768},[727,48462,48463,48465,48468],{"class":729,"line":1973},[727,48464,46882],{"class":768},[727,48466,48467],{"class":737},"'\u003CENDPOINT>'",[727,48469,2427],{"class":768},[727,48471,48472],{"class":729,"line":2052},[727,48473,48474],{"class":768},"  })\n",[727,48476,48477,48479,48481,48483,48486],{"class":729,"line":2058},[727,48478,48435],{"class":768},[727,48480,2597],{"class":2376},[727,48482,2542],{"class":768},[727,48484,48485],{"class":737},"'browser connected'",[727,48487,12611],{"class":768},[727,48489,48490,48492],{"class":729,"line":2064},[727,48491,9641],{"class":1986},[727,48493,2391],{"class":768},[727,48495,48496,48498,48500,48502,48504,48506,48508],{"class":729,"line":2087},[727,48497,17003],{"class":1986},[727,48499,47092],{"class":1882},[727,48501,2321],{"class":1986},[727,48503,2410],{"class":1986},[727,48505,47099],{"class":768},[727,48507,47102],{"class":2376},[727,48509,47105],{"class":768},[727,48511,48512,48514,48516,48518,48520,48523],{"class":729,"line":2140},[727,48513,10163],{"class":1986},[727,48515,16668],{"class":768},[727,48517,47149],{"class":2376},[727,48519,2542],{"class":768},[727,48521,48522],{"class":737},"'https:\u002F\u002Fgoogle.com\u002F'",[727,48524,12611],{"class":768},[727,48526,48527],{"class":729,"line":2154},[727,48528,1898],{"emptyLinePlaceholder":522},[727,48530,48531],{"class":729,"line":1529},[727,48532,48533],{"class":2920},"    \u002F\u002F Locate the search bar on the page\n",[727,48535,48536,48538,48540,48543,48545,48548,48550,48552,48554,48557],{"class":729,"line":2178},[727,48537,10163],{"class":1986},[727,48539,16668],{"class":768},[727,48541,48542],{"class":2376},"locator",[727,48544,2542],{"class":768},[727,48546,48547],{"class":737},"'aria\u002FSearch'",[727,48549,5983],{"class":768},[727,48551,47263],{"class":2376},[727,48553,2542],{"class":768},[727,48555,48556],{"class":737},"'Testing axiom.ai'",[727,48558,12611],{"class":768},[727,48560,48561],{"class":729,"line":2187},[727,48562,1898],{"emptyLinePlaceholder":522},[727,48564,48565,48567,48569,48571,48573,48575,48577,48579],{"class":729,"line":2533},[727,48566,10163],{"class":1986},[727,48568,47976],{"class":1986},[727,48570,47979],{"class":1882},[727,48572,5025],{"class":768},[727,48574,47984],{"class":733},[727,48576,5031],{"class":768},[727,48578,2388],{"class":1986},[727,48580,2391],{"class":768},[727,48582,48583,48586,48588,48590],{"class":729,"line":2551},[727,48584,48585],{"class":2376},"      setTimeout",[727,48587,47914],{"class":768},[727,48589,2388],{"class":1986},[727,48591,2391],{"class":768},[727,48593,48594,48597],{"class":729,"line":2559},[727,48595,48596],{"class":2376},"        resolve",[727,48598,47105],{"class":768},[727,48600,48601,48604,48606],{"class":729,"line":2565},[727,48602,48603],{"class":768},"      }, ",[727,48605,47995],{"class":1882},[727,48607,12611],{"class":768},[727,48609,48610],{"class":729,"line":2570},[727,48611,48612],{"class":768},"    })\n",[727,48614,48615],{"class":729,"line":2591},[727,48616,1898],{"emptyLinePlaceholder":522},[727,48618,48619,48621,48623,48625],{"class":729,"line":2603},[727,48620,10163],{"class":1986},[727,48622,16668],{"class":768},[727,48624,47173],{"class":2376},[727,48626,47105],{"class":768},[727,48628,48629,48631,48633,48635],{"class":729,"line":2615},[727,48630,10163],{"class":1986},[727,48632,47099],{"class":768},[727,48634,47173],{"class":2376},[727,48636,47105],{"class":768},[727,48638,48639,48641,48643,48645,48648],{"class":729,"line":2630},[727,48640,17164],{"class":768},[727,48642,2597],{"class":2376},[727,48644,2542],{"class":768},[727,48646,48647],{"class":737},"'browser closed'",[727,48649,12611],{"class":768},[727,48651,48652,48654,48656],{"class":729,"line":2636},[727,48653,9682],{"class":768},[727,48655,2609],{"class":1986},[727,48657,21987],{"class":768},[727,48659,48660,48663],{"class":729,"line":2642},[727,48661,48662],{"class":2376},"    alert",[727,48664,48665],{"class":768},"(e.message)\n",[727,48667,48668,48670,48672,48674],{"class":729,"line":2647},[727,48669,10163],{"class":1986},[727,48671,47099],{"class":768},[727,48673,47173],{"class":2376},[727,48675,47105],{"class":768},[727,48677,48678],{"class":729,"line":4657},[727,48679,9712],{"class":768},[727,48681,48682],{"class":729,"line":4662},[727,48683,2639],{"class":768},[727,48685,48686],{"class":729,"line":1316},[727,48687,1898],{"emptyLinePlaceholder":522},[727,48689,48690,48692],{"class":729,"line":4671},[727,48691,5876],{"class":2376},[727,48693,47105],{"class":768},[21,48695,48697],{"id":48696},"prompting-the-llm","Prompting the LLM",[14,48699,48700],{},"There are a few things that the LLM will assume when you give it code to write tests from - for example, if you copy in JavaScript code, it's going to assume that you are going to want JavaScript output. However, being specific even where it may seem redundant is recommended to increase your chances of getting a right answer from the beginning. Recommended things to mention in your prompt:",[80,48702,48703,48706,48709],{},[83,48704,48705],{},"The programming language you are using",[83,48707,48708],{},"The testing framework that you want to use",[83,48710,48711],{},"Any area of the code that you want it to specifically concentrate on",[14,48713,48714],{},"We used the following prompt when prompting the LLM to generate the tests:",[8898,48716,48717],{},[14,48718,48719],{},"Generate Jest unit tests in JavaScript using the following script:",[14,48721,48722],{},"Followed by the code that we included above.",[21,48724,48726],{"id":48725},"the-result","The result",[14,48728,48729],{},"Gemini provided us with two tests that can be run to test the code, including the set up before and after the tests run. These tests include:",[80,48731,48732,48735],{},[83,48733,48734],{},"should successfully navigate and fill the search bar",[83,48736,48737],{},"should handle connection errors gracefully",[14,48739,48740],{},"We're going to break down the code into smaller segments, but the full code can be found at the end of the article",[639,48742,48744],{"id":48743},"the-setup","The setup",[14,48746,48747,48748,450,48751,48754],{},"Step one within the tests is to set up the ",[90,48749,48750],{},"beforeEach",[90,48752,48753],{},"afterEach"," functions within your tests - these functions are called before and after each test is run within the script. These steps can be used to set up mock objects to test your code against. IN this instance we need to set up a mock page, browser, puppeteer instance and timers.",[719,48756,48758],{"className":756,"code":48757,"language":758,"meta":494,"style":494},"let mockPage\nlet mockBrowser\nlet mockPuppeteer\nlet mockLocator\n\nbeforeEach(() => {\n  \u002F\u002F Mock the locator first\n  mockLocator = {\n    fill: jest.fn().mockResolvedValue(),\n  }\n\n  \u002F\u002F Mock the page object and its methods\n  mockPage = {\n    goto: jest.fn().mockResolvedValue(),\n    locator: jest.fn().mockResolvedValue(mockLocator), \u002F\u002F Return the mock locator\n    close: jest.fn().mockResolvedValue(),\n  }\n\n  \u002F\u002F Mock the browser object and its methods\n  mockBrowser = {\n    newPage: jest.fn().mockResolvedValue(mockPage),\n    close: jest.fn().mockResolvedValue(),\n  }\n\n  \u002F\u002F Mock the Puppeteer module itself\n  mockPuppeteer = {\n    connect: jest.fn().mockResolvedValue(mockBrowser),\n  }\n\n  \u002F\u002F Mock the global setTimeout to prevent the test from waiting 5 seconds.\n  jest.useFakeTimers()\n})\n\nafterEach(() => {\n  \u002F\u002F Restore the timers after each test\n  jest.useRealTimers()\n})\n",[90,48759,48760,48767,48774,48781,48788,48792,48802,48807,48816,48832,48836,48840,48845,48854,48867,48884,48897,48901,48905,48910,48919,48933,48945,48949,48953,48958,48967,48981,48985,48989,48994,49004,49008,49012,49022,49027,49036],{"__ignoreMap":494},[727,48761,48762,48764],{"class":729,"line":730},[727,48763,12512],{"class":1986},[727,48765,48766],{"class":768}," mockPage\n",[727,48768,48769,48771],{"class":729,"line":498},[727,48770,12512],{"class":1986},[727,48772,48773],{"class":768}," mockBrowser\n",[727,48775,48776,48778],{"class":729,"line":495},[727,48777,12512],{"class":1986},[727,48779,48780],{"class":768}," mockPuppeteer\n",[727,48782,48783,48785],{"class":729,"line":1895},[727,48784,12512],{"class":1986},[727,48786,48787],{"class":768}," mockLocator\n",[727,48789,48790],{"class":729,"line":1901},[727,48791,1898],{"emptyLinePlaceholder":522},[727,48793,48794,48796,48798,48800],{"class":729,"line":1973},[727,48795,48750],{"class":2376},[727,48797,47914],{"class":768},[727,48799,2388],{"class":1986},[727,48801,2391],{"class":768},[727,48803,48804],{"class":729,"line":2052},[727,48805,48806],{"class":2920},"  \u002F\u002F Mock the locator first\n",[727,48808,48809,48812,48814],{"class":729,"line":2058},[727,48810,48811],{"class":768},"  mockLocator ",[727,48813,4970],{"class":1986},[727,48815,2391],{"class":768},[727,48817,48818,48821,48824,48826,48829],{"class":729,"line":2064},[727,48819,48820],{"class":768},"    fill: jest.",[727,48822,48823],{"class":2376},"fn",[727,48825,9465],{"class":768},[727,48827,48828],{"class":2376},"mockResolvedValue",[727,48830,48831],{"class":768},"(),\n",[727,48833,48834],{"class":729,"line":2087},[727,48835,9712],{"class":768},[727,48837,48838],{"class":729,"line":2140},[727,48839,1898],{"emptyLinePlaceholder":522},[727,48841,48842],{"class":729,"line":2154},[727,48843,48844],{"class":2920},"  \u002F\u002F Mock the page object and its methods\n",[727,48846,48847,48850,48852],{"class":729,"line":1529},[727,48848,48849],{"class":768},"  mockPage ",[727,48851,4970],{"class":1986},[727,48853,2391],{"class":768},[727,48855,48856,48859,48861,48863,48865],{"class":729,"line":2178},[727,48857,48858],{"class":768},"    goto: jest.",[727,48860,48823],{"class":2376},[727,48862,9465],{"class":768},[727,48864,48828],{"class":2376},[727,48866,48831],{"class":768},[727,48868,48869,48872,48874,48876,48878,48881],{"class":729,"line":2187},[727,48870,48871],{"class":768},"    locator: jest.",[727,48873,48823],{"class":2376},[727,48875,9465],{"class":768},[727,48877,48828],{"class":2376},[727,48879,48880],{"class":768},"(mockLocator), ",[727,48882,48883],{"class":2920},"\u002F\u002F Return the mock locator\n",[727,48885,48886,48889,48891,48893,48895],{"class":729,"line":2533},[727,48887,48888],{"class":768},"    close: jest.",[727,48890,48823],{"class":2376},[727,48892,9465],{"class":768},[727,48894,48828],{"class":2376},[727,48896,48831],{"class":768},[727,48898,48899],{"class":729,"line":2551},[727,48900,9712],{"class":768},[727,48902,48903],{"class":729,"line":2559},[727,48904,1898],{"emptyLinePlaceholder":522},[727,48906,48907],{"class":729,"line":2565},[727,48908,48909],{"class":2920},"  \u002F\u002F Mock the browser object and its methods\n",[727,48911,48912,48915,48917],{"class":729,"line":2570},[727,48913,48914],{"class":768},"  mockBrowser ",[727,48916,4970],{"class":1986},[727,48918,2391],{"class":768},[727,48920,48921,48924,48926,48928,48930],{"class":729,"line":2591},[727,48922,48923],{"class":768},"    newPage: jest.",[727,48925,48823],{"class":2376},[727,48927,9465],{"class":768},[727,48929,48828],{"class":2376},[727,48931,48932],{"class":768},"(mockPage),\n",[727,48934,48935,48937,48939,48941,48943],{"class":729,"line":2603},[727,48936,48888],{"class":768},[727,48938,48823],{"class":2376},[727,48940,9465],{"class":768},[727,48942,48828],{"class":2376},[727,48944,48831],{"class":768},[727,48946,48947],{"class":729,"line":2615},[727,48948,9712],{"class":768},[727,48950,48951],{"class":729,"line":2630},[727,48952,1898],{"emptyLinePlaceholder":522},[727,48954,48955],{"class":729,"line":2636},[727,48956,48957],{"class":2920},"  \u002F\u002F Mock the Puppeteer module itself\n",[727,48959,48960,48963,48965],{"class":729,"line":2642},[727,48961,48962],{"class":768},"  mockPuppeteer ",[727,48964,4970],{"class":1986},[727,48966,2391],{"class":768},[727,48968,48969,48972,48974,48976,48978],{"class":729,"line":2647},[727,48970,48971],{"class":768},"    connect: jest.",[727,48973,48823],{"class":2376},[727,48975,9465],{"class":768},[727,48977,48828],{"class":2376},[727,48979,48980],{"class":768},"(mockBrowser),\n",[727,48982,48983],{"class":729,"line":4657},[727,48984,9712],{"class":768},[727,48986,48987],{"class":729,"line":4662},[727,48988,1898],{"emptyLinePlaceholder":522},[727,48990,48991],{"class":729,"line":1316},[727,48992,48993],{"class":2920},"  \u002F\u002F Mock the global setTimeout to prevent the test from waiting 5 seconds.\n",[727,48995,48996,48999,49002],{"class":729,"line":4671},[727,48997,48998],{"class":768},"  jest.",[727,49000,49001],{"class":2376},"useFakeTimers",[727,49003,47105],{"class":768},[727,49005,49006],{"class":729,"line":4676},[727,49007,5051],{"class":768},[727,49009,49010],{"class":729,"line":4681},[727,49011,1898],{"emptyLinePlaceholder":522},[727,49013,49014,49016,49018,49020],{"class":729,"line":4686},[727,49015,48753],{"class":2376},[727,49017,47914],{"class":768},[727,49019,2388],{"class":1986},[727,49021,2391],{"class":768},[727,49023,49024],{"class":729,"line":4691},[727,49025,49026],{"class":2920},"  \u002F\u002F Restore the timers after each test\n",[727,49028,49029,49031,49034],{"class":729,"line":4696},[727,49030,48998],{"class":768},[727,49032,49033],{"class":2376},"useRealTimers",[727,49035,47105],{"class":768},[727,49037,49038],{"class":729,"line":4702},[727,49039,5051],{"class":768},[21,49041,49043],{"id":49042},"the-tests","The tests",[14,49045,49046,49047,49049],{},"We're going to look at one of the two tests generated, the one that tests the main functionality of the script that we are testing - whether or not it fills in the Google search bar. In this case we are testing to confirm that the ",[90,49048,47263],{}," command has been called successfully:",[719,49051,49053],{"className":756,"code":49052,"language":758,"meta":494,"style":494},"test('should successfully navigate and fill the search bar', async () => {\n  \u002F\u002F Wrap the logic in a mock for the global alert function if needed, but since\n  \u002F\u002F the original `alert()` is not standard for Node.js, we should change it to `throw`.\n  try {\n    \u002F\u002F Run the main automation function with our mocked puppeteer.\n    await runAutomation(mockPuppeteer)\n\n    \u002F\u002F Fast-forward time to skip the setTimeout call.\n    jest.advanceTimersByTime(5000)\n\n    \u002F\u002F Assertions to check if the correct methods were called.\n    \u002F\u002F Check that the script connected to the browser.\n    expect(mockPuppeteer.connect).toHaveBeenCalledTimes(1)\n    expect(mockPuppeteer.connect).toHaveBeenCalledWith(\n      expect.objectContaining({\n        browserWSEndpoint: expect.any(String), \u002F\u002F We don't need to check the full string\n      })\n    )\n\n    \u002F\u002F Check that a new page was opened.\n    expect(mockBrowser.newPage).toHaveBeenCalledTimes(1)\n\n    \u002F\u002F Check that it navigated to the correct URL.\n    expect(mockPage.goto).toHaveBeenCalledTimes(1)\n    expect(mockPage.goto).toHaveBeenCalledWith('https:\u002F\u002Fgoogle.com\u002F')\n\n    \u002F\u002F Check that it located the search bar.\n    expect(mockPage.locator).toHaveBeenCalledWith('aria\u002FSearch')\n\n    \u002F\u002F Check that it filled the search bar with the correct text.\n    expect(mockLocator.fill).toHaveBeenCalledTimes(1)\n    expect(mockLocator.fill).toHaveBeenCalledWith('Testing axiom.ai')\n\n    \u002F\u002F Check that the page and browser were closed correctly.\n    expect(mockPage.close).toHaveBeenCalledTimes(1)\n    expect(mockBrowser.close).toHaveBeenCalledTimes(1)\n  } catch (e) {\n    \u002F\u002F If an error is thrown, the test will fail.\n    \u002F\u002F This is how we test the happy path.\n    throw e\n  }\n})\n",[90,49054,49055,49075,49080,49085,49091,49096,49106,49110,49115,49129,49133,49138,49143,49160,49172,49182,49196,49200,49205,49209,49214,49229,49233,49238,49253,49267,49271,49276,49291,49295,49300,49315,49329,49333,49338,49353,49368,49376,49381,49386,49394,49398],{"__ignoreMap":494},[727,49056,49057,49060,49062,49065,49067,49069,49071,49073],{"class":729,"line":730},[727,49058,49059],{"class":2376},"test",[727,49061,2542],{"class":768},[727,49063,49064],{"class":737},"'should successfully navigate and fill the search bar'",[727,49066,2004],{"class":768},[727,49068,10151],{"class":1986},[727,49070,2385],{"class":768},[727,49072,2388],{"class":1986},[727,49074,2391],{"class":768},[727,49076,49077],{"class":729,"line":498},[727,49078,49079],{"class":2920},"  \u002F\u002F Wrap the logic in a mock for the global alert function if needed, but since\n",[727,49081,49082],{"class":729,"line":495},[727,49083,49084],{"class":2920},"  \u002F\u002F the original `alert()` is not standard for Node.js, we should change it to `throw`.\n",[727,49086,49087,49089],{"class":729,"line":1895},[727,49088,9641],{"class":1986},[727,49090,2391],{"class":768},[727,49092,49093],{"class":729,"line":1901},[727,49094,49095],{"class":2920},"    \u002F\u002F Run the main automation function with our mocked puppeteer.\n",[727,49097,49098,49100,49103],{"class":729,"line":1973},[727,49099,10163],{"class":1986},[727,49101,49102],{"class":2376}," runAutomation",[727,49104,49105],{"class":768},"(mockPuppeteer)\n",[727,49107,49108],{"class":729,"line":2052},[727,49109,1898],{"emptyLinePlaceholder":522},[727,49111,49112],{"class":729,"line":2058},[727,49113,49114],{"class":2920},"    \u002F\u002F Fast-forward time to skip the setTimeout call.\n",[727,49116,49117,49120,49123,49125,49127],{"class":729,"line":2064},[727,49118,49119],{"class":768},"    jest.",[727,49121,49122],{"class":2376},"advanceTimersByTime",[727,49124,2542],{"class":768},[727,49126,47995],{"class":1882},[727,49128,12611],{"class":768},[727,49130,49131],{"class":729,"line":2087},[727,49132,1898],{"emptyLinePlaceholder":522},[727,49134,49135],{"class":729,"line":2140},[727,49136,49137],{"class":2920},"    \u002F\u002F Assertions to check if the correct methods were called.\n",[727,49139,49140],{"class":729,"line":2154},[727,49141,49142],{"class":2920},"    \u002F\u002F Check that the script connected to the browser.\n",[727,49144,49145,49148,49151,49154,49156,49158],{"class":729,"line":1529},[727,49146,49147],{"class":2376},"    expect",[727,49149,49150],{"class":768},"(mockPuppeteer.connect).",[727,49152,49153],{"class":2376},"toHaveBeenCalledTimes",[727,49155,2542],{"class":768},[727,49157,165],{"class":1882},[727,49159,12611],{"class":768},[727,49161,49162,49164,49166,49169],{"class":729,"line":2178},[727,49163,49147],{"class":2376},[727,49165,49150],{"class":768},[727,49167,49168],{"class":2376},"toHaveBeenCalledWith",[727,49170,49171],{"class":768},"(\n",[727,49173,49174,49177,49180],{"class":729,"line":2187},[727,49175,49176],{"class":768},"      expect.",[727,49178,49179],{"class":2376},"objectContaining",[727,49181,2479],{"class":768},[727,49183,49184,49187,49190,49193],{"class":729,"line":2533},[727,49185,49186],{"class":768},"        browserWSEndpoint: expect.",[727,49188,49189],{"class":2376},"any",[727,49191,49192],{"class":768},"(String), ",[727,49194,49195],{"class":2920},"\u002F\u002F We don't need to check the full string\n",[727,49197,49198],{"class":729,"line":2551},[727,49199,17553],{"class":768},[727,49201,49202],{"class":729,"line":2559},[727,49203,49204],{"class":768},"    )\n",[727,49206,49207],{"class":729,"line":2565},[727,49208,1898],{"emptyLinePlaceholder":522},[727,49210,49211],{"class":729,"line":2570},[727,49212,49213],{"class":2920},"    \u002F\u002F Check that a new page was opened.\n",[727,49215,49216,49218,49221,49223,49225,49227],{"class":729,"line":2591},[727,49217,49147],{"class":2376},[727,49219,49220],{"class":768},"(mockBrowser.newPage).",[727,49222,49153],{"class":2376},[727,49224,2542],{"class":768},[727,49226,165],{"class":1882},[727,49228,12611],{"class":768},[727,49230,49231],{"class":729,"line":2603},[727,49232,1898],{"emptyLinePlaceholder":522},[727,49234,49235],{"class":729,"line":2615},[727,49236,49237],{"class":2920},"    \u002F\u002F Check that it navigated to the correct URL.\n",[727,49239,49240,49242,49245,49247,49249,49251],{"class":729,"line":2630},[727,49241,49147],{"class":2376},[727,49243,49244],{"class":768},"(mockPage.goto).",[727,49246,49153],{"class":2376},[727,49248,2542],{"class":768},[727,49250,165],{"class":1882},[727,49252,12611],{"class":768},[727,49254,49255,49257,49259,49261,49263,49265],{"class":729,"line":2636},[727,49256,49147],{"class":2376},[727,49258,49244],{"class":768},[727,49260,49168],{"class":2376},[727,49262,2542],{"class":768},[727,49264,48522],{"class":737},[727,49266,12611],{"class":768},[727,49268,49269],{"class":729,"line":2642},[727,49270,1898],{"emptyLinePlaceholder":522},[727,49272,49273],{"class":729,"line":2647},[727,49274,49275],{"class":2920},"    \u002F\u002F Check that it located the search bar.\n",[727,49277,49278,49280,49283,49285,49287,49289],{"class":729,"line":4657},[727,49279,49147],{"class":2376},[727,49281,49282],{"class":768},"(mockPage.locator).",[727,49284,49168],{"class":2376},[727,49286,2542],{"class":768},[727,49288,48547],{"class":737},[727,49290,12611],{"class":768},[727,49292,49293],{"class":729,"line":4662},[727,49294,1898],{"emptyLinePlaceholder":522},[727,49296,49297],{"class":729,"line":1316},[727,49298,49299],{"class":2920},"    \u002F\u002F Check that it filled the search bar with the correct text.\n",[727,49301,49302,49304,49307,49309,49311,49313],{"class":729,"line":4671},[727,49303,49147],{"class":2376},[727,49305,49306],{"class":768},"(mockLocator.fill).",[727,49308,49153],{"class":2376},[727,49310,2542],{"class":768},[727,49312,165],{"class":1882},[727,49314,12611],{"class":768},[727,49316,49317,49319,49321,49323,49325,49327],{"class":729,"line":4676},[727,49318,49147],{"class":2376},[727,49320,49306],{"class":768},[727,49322,49168],{"class":2376},[727,49324,2542],{"class":768},[727,49326,48556],{"class":737},[727,49328,12611],{"class":768},[727,49330,49331],{"class":729,"line":4681},[727,49332,1898],{"emptyLinePlaceholder":522},[727,49334,49335],{"class":729,"line":4686},[727,49336,49337],{"class":2920},"    \u002F\u002F Check that the page and browser were closed correctly.\n",[727,49339,49340,49342,49345,49347,49349,49351],{"class":729,"line":4691},[727,49341,49147],{"class":2376},[727,49343,49344],{"class":768},"(mockPage.close).",[727,49346,49153],{"class":2376},[727,49348,2542],{"class":768},[727,49350,165],{"class":1882},[727,49352,12611],{"class":768},[727,49354,49355,49357,49360,49362,49364,49366],{"class":729,"line":4696},[727,49356,49147],{"class":2376},[727,49358,49359],{"class":768},"(mockBrowser.close).",[727,49361,49153],{"class":2376},[727,49363,2542],{"class":768},[727,49365,165],{"class":1882},[727,49367,12611],{"class":768},[727,49369,49370,49372,49374],{"class":729,"line":4702},[727,49371,9682],{"class":768},[727,49373,2609],{"class":1986},[727,49375,21987],{"class":768},[727,49377,49378],{"class":729,"line":4708},[727,49379,49380],{"class":2920},"    \u002F\u002F If an error is thrown, the test will fail.\n",[727,49382,49383],{"class":729,"line":4714},[727,49384,49385],{"class":2920},"    \u002F\u002F This is how we test the happy path.\n",[727,49387,49388,49391],{"class":729,"line":4719},[727,49389,49390],{"class":1986},"    throw",[727,49392,49393],{"class":768}," e\n",[727,49395,49396],{"class":729,"line":4724},[727,49397,9712],{"class":768},[727,49399,49400],{"class":729,"line":4729},[727,49401,5051],{"class":768},[14,49403,49404,49405,49408,49409,49412],{},"As you can see from the script above, this essentially mimics the actions of the original script - using the mock objects to fill in the gaps of the puppeteer instance that does not exist within the scripts. We can see that the script is testing to confirm that the specific functions that we called in the original script are also being called successfully within the test scripts, such as ",[90,49406,49407],{},"mockPage.locator"," to locate the searchbar, or ",[90,49410,49411],{},"mockLocator.fill"," to fill the text into the search bar once it's been found.",[21,49414,796],{"id":795},[14,49416,49417],{},"While the tests and the script above are very basic, the idea remains, allowing LLMs to take a review your code and then output testing scripts for them can speed up development time rapidly. We do still recommend that you have an understanding of the tests that are being output by these LLMs as they can make mistakes and assumptions about the code that you should be able to highlight or manually modify yourself. Even if you decide against using the code that has been generated, this can be used as inspiration when it comes to writing your own code manually.",[14,49419,49420],{},"For junior developers, this can be an extremely helpful learning exercise to understand the structure of the tests within your language of choice, meaning that you can develop your skills to be able to include tests within your projects.",[21,49422,49424],{"id":49423},"full-code","Full code",[14,49426,49427],{},"The following is the full code provided by Gemini, this has not extensively been tested so we would recommend testing before blindly coping this into your code.",[719,49429,49431],{"className":756,"code":49430,"language":758,"meta":494,"style":494},"const start = async () => {\n  console.log('start')\n  const browser = await puppeteer.connect({\n    browserWSEndpoint: '\u003CENDPOINT>',\n  })\n  console.log('browser connected')\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 on the page\n    await page.locator('aria\u002FSearch').fill('Testing axiom.ai')\n\n    await new Promise((resolve) => {\n      setTimeout(() => {\n        resolve()\n      }, 5000)\n    })\n\n    await page.close()\n    await browser.close()\n    console.log('browser closed')\n  } catch (e) {\n    alert(e.message)\n    await browser.close()\n  }\n}\n\n\u002F\u002F We will use Jest to run these tests.\n\u002F\u002F This is the beginning of our test suite.\ndescribe('Puppeteer Automation Script', () => {\n  \u002F\u002F Before each test, we'll set up our mocks.\n  let mockPage\n  let mockBrowser\n  let mockPuppeteer\n  let mockLocator\n\n  beforeEach(() => {\n    \u002F\u002F Mock the locator first\n    mockLocator = {\n      fill: jest.fn().mockResolvedValue(),\n    }\n\n    \u002F\u002F Mock the page object and its methods\n    mockPage = {\n      goto: jest.fn().mockResolvedValue(),\n      locator: jest.fn().mockResolvedValue(mockLocator), \u002F\u002F Return the mock locator\n      close: jest.fn().mockResolvedValue(),\n    }\n\n    \u002F\u002F Mock the browser object and its methods\n    mockBrowser = {\n      newPage: jest.fn().mockResolvedValue(mockPage),\n      close: jest.fn().mockResolvedValue(),\n    }\n\n    \u002F\u002F Mock the Puppeteer module itself\n    mockPuppeteer = {\n      connect: jest.fn().mockResolvedValue(mockBrowser),\n    }\n\n    \u002F\u002F Mock the global setTimeout to prevent the test from waiting 5 seconds.\n    jest.useFakeTimers()\n  })\n\n  afterEach(() => {\n    \u002F\u002F Restore the timers after each test\n    jest.useRealTimers()\n  })\n\n  test('should successfully navigate and fill the search bar', async () => {\n    \u002F\u002F Wrap the logic in a mock for the global alert function if needed, but since\n    \u002F\u002F the original `alert()` is not standard for Node.js, we should change it to `throw`.\n    try {\n      \u002F\u002F Run the main automation function with our mocked puppeteer.\n      await runAutomation(mockPuppeteer)\n\n      \u002F\u002F Fast-forward time to skip the setTimeout call.\n      jest.advanceTimersByTime(5000)\n\n      \u002F\u002F Assertions to check if the correct methods were called.\n      \u002F\u002F Check that the script connected to the browser.\n      expect(mockPuppeteer.connect).toHaveBeenCalledTimes(1)\n      expect(mockPuppeteer.connect).toHaveBeenCalledWith(\n        expect.objectContaining({\n          browserWSEndpoint: expect.any(String), \u002F\u002F We don't need to check the full string\n        })\n      )\n\n      \u002F\u002F Check that a new page was opened.\n      expect(mockBrowser.newPage).toHaveBeenCalledTimes(1)\n\n      \u002F\u002F Check that it navigated to the correct URL.\n      expect(mockPage.goto).toHaveBeenCalledTimes(1)\n      expect(mockPage.goto).toHaveBeenCalledWith('https:\u002F\u002Fgoogle.com\u002F')\n\n      \u002F\u002F Check that it located the search bar.\n      expect(mockPage.locator).toHaveBeenCalledWith('aria\u002FSearch')\n\n      \u002F\u002F Check that it filled the search bar with the correct text.\n      expect(mockLocator.fill).toHaveBeenCalledTimes(1)\n      expect(mockLocator.fill).toHaveBeenCalledWith('Testing axiom.ai')\n\n      \u002F\u002F Check that the page and browser were closed correctly.\n      expect(mockPage.close).toHaveBeenCalledTimes(1)\n      expect(mockBrowser.close).toHaveBeenCalledTimes(1)\n    } catch (e) {\n      \u002F\u002F If an error is thrown, the test will fail.\n      \u002F\u002F This is how we test the happy path.\n      throw e\n    }\n  })\n\n  test('should handle connection errors gracefully', async () => {\n    \u002F\u002F Mock a connection error.\n    mockPuppeteer.connect.mockRejectedValue(new Error('Connection Failed'))\n\n    \u002F\u002F Use a spy to see if browser.close was called.\n    const mockBrowserCloseSpy = jest.spyOn(mockBrowser, 'close')\n\n    \u002F\u002F Expect the function to throw an error, since we've replaced the alert().\n    await expect(runAutomation(mockPuppeteer)).rejects.toThrow(\n      'Connection Failed'\n    )\n\n    \u002F\u002F Even on failure, the browser should attempt to close.\n    expect(mockBrowserCloseSpy).toHaveBeenCalledTimes(1)\n  })\n})\n",[90,49432,49433,49449,49461,49477,49485,49489,49501,49507,49523,49537,49541,49545,49567,49571,49589,49599,49605,49613,49617,49621,49631,49641,49653,49661,49667,49677,49681,49685,49689,49694,49699,49716,49721,49728,49734,49740,49746,49750,49761,49766,49775,49788,49792,49796,49801,49810,49823,49838,49851,49855,49859,49864,49873,49886,49898,49902,49906,49911,49920,49933,49937,49941,49946,49954,49958,49962,49973,49978,49986,49990,49994,50013,50018,50024,50031,50037,50047,50052,50058,50072,50077,50083,50089,50105,50116,50126,50138,50143,50149,50154,50160,50175,50180,50186,50201,50216,50221,50227,50242,50247,50253,50268,50283,50288,50294,50309,50324,50333,50339,50345,50353,50358,50363,50368,50388,50394,50418,50423,50429,50453,50458,50464,50485,50491,50496,50501,50507,50523,50528],{"__ignoreMap":494},[727,49434,49435,49437,49439,49441,49443,49445,49447],{"class":729,"line":730},[727,49436,2315],{"class":1986},[727,49438,48420],{"class":2376},[727,49440,2321],{"class":1986},[727,49442,2382],{"class":1986},[727,49444,2385],{"class":768},[727,49446,2388],{"class":1986},[727,49448,2391],{"class":768},[727,49450,49451,49453,49455,49457,49459],{"class":729,"line":498},[727,49452,48435],{"class":768},[727,49454,2597],{"class":2376},[727,49456,2542],{"class":768},[727,49458,48442],{"class":737},[727,49460,12611],{"class":768},[727,49462,49463,49465,49467,49469,49471,49473,49475],{"class":729,"line":495},[727,49464,22321],{"class":1986},[727,49466,46866],{"class":1882},[727,49468,2321],{"class":1986},[727,49470,2410],{"class":1986},[727,49472,46873],{"class":768},[727,49474,19377],{"class":2376},[727,49476,2479],{"class":768},[727,49478,49479,49481,49483],{"class":729,"line":1895},[727,49480,46882],{"class":768},[727,49482,48467],{"class":737},[727,49484,2427],{"class":768},[727,49486,49487],{"class":729,"line":1901},[727,49488,48474],{"class":768},[727,49490,49491,49493,49495,49497,49499],{"class":729,"line":1973},[727,49492,48435],{"class":768},[727,49494,2597],{"class":2376},[727,49496,2542],{"class":768},[727,49498,48485],{"class":737},[727,49500,12611],{"class":768},[727,49502,49503,49505],{"class":729,"line":2052},[727,49504,9641],{"class":1986},[727,49506,2391],{"class":768},[727,49508,49509,49511,49513,49515,49517,49519,49521],{"class":729,"line":2058},[727,49510,17003],{"class":1986},[727,49512,47092],{"class":1882},[727,49514,2321],{"class":1986},[727,49516,2410],{"class":1986},[727,49518,47099],{"class":768},[727,49520,47102],{"class":2376},[727,49522,47105],{"class":768},[727,49524,49525,49527,49529,49531,49533,49535],{"class":729,"line":2064},[727,49526,10163],{"class":1986},[727,49528,16668],{"class":768},[727,49530,47149],{"class":2376},[727,49532,2542],{"class":768},[727,49534,48522],{"class":737},[727,49536,12611],{"class":768},[727,49538,49539],{"class":729,"line":2087},[727,49540,1898],{"emptyLinePlaceholder":522},[727,49542,49543],{"class":729,"line":2140},[727,49544,48533],{"class":2920},[727,49546,49547,49549,49551,49553,49555,49557,49559,49561,49563,49565],{"class":729,"line":2154},[727,49548,10163],{"class":1986},[727,49550,16668],{"class":768},[727,49552,48542],{"class":2376},[727,49554,2542],{"class":768},[727,49556,48547],{"class":737},[727,49558,5983],{"class":768},[727,49560,47263],{"class":2376},[727,49562,2542],{"class":768},[727,49564,48556],{"class":737},[727,49566,12611],{"class":768},[727,49568,49569],{"class":729,"line":1529},[727,49570,1898],{"emptyLinePlaceholder":522},[727,49572,49573,49575,49577,49579,49581,49583,49585,49587],{"class":729,"line":2178},[727,49574,10163],{"class":1986},[727,49576,47976],{"class":1986},[727,49578,47979],{"class":1882},[727,49580,5025],{"class":768},[727,49582,47984],{"class":733},[727,49584,5031],{"class":768},[727,49586,2388],{"class":1986},[727,49588,2391],{"class":768},[727,49590,49591,49593,49595,49597],{"class":729,"line":2187},[727,49592,48585],{"class":2376},[727,49594,47914],{"class":768},[727,49596,2388],{"class":1986},[727,49598,2391],{"class":768},[727,49600,49601,49603],{"class":729,"line":2533},[727,49602,48596],{"class":2376},[727,49604,47105],{"class":768},[727,49606,49607,49609,49611],{"class":729,"line":2551},[727,49608,48603],{"class":768},[727,49610,47995],{"class":1882},[727,49612,12611],{"class":768},[727,49614,49615],{"class":729,"line":2559},[727,49616,48612],{"class":768},[727,49618,49619],{"class":729,"line":2565},[727,49620,1898],{"emptyLinePlaceholder":522},[727,49622,49623,49625,49627,49629],{"class":729,"line":2570},[727,49624,10163],{"class":1986},[727,49626,16668],{"class":768},[727,49628,47173],{"class":2376},[727,49630,47105],{"class":768},[727,49632,49633,49635,49637,49639],{"class":729,"line":2591},[727,49634,10163],{"class":1986},[727,49636,47099],{"class":768},[727,49638,47173],{"class":2376},[727,49640,47105],{"class":768},[727,49642,49643,49645,49647,49649,49651],{"class":729,"line":2603},[727,49644,17164],{"class":768},[727,49646,2597],{"class":2376},[727,49648,2542],{"class":768},[727,49650,48647],{"class":737},[727,49652,12611],{"class":768},[727,49654,49655,49657,49659],{"class":729,"line":2615},[727,49656,9682],{"class":768},[727,49658,2609],{"class":1986},[727,49660,21987],{"class":768},[727,49662,49663,49665],{"class":729,"line":2630},[727,49664,48662],{"class":2376},[727,49666,48665],{"class":768},[727,49668,49669,49671,49673,49675],{"class":729,"line":2636},[727,49670,10163],{"class":1986},[727,49672,47099],{"class":768},[727,49674,47173],{"class":2376},[727,49676,47105],{"class":768},[727,49678,49679],{"class":729,"line":2642},[727,49680,9712],{"class":768},[727,49682,49683],{"class":729,"line":2647},[727,49684,2639],{"class":768},[727,49686,49687],{"class":729,"line":4657},[727,49688,1898],{"emptyLinePlaceholder":522},[727,49690,49691],{"class":729,"line":4662},[727,49692,49693],{"class":2920},"\u002F\u002F We will use Jest to run these tests.\n",[727,49695,49696],{"class":729,"line":1316},[727,49697,49698],{"class":2920},"\u002F\u002F This is the beginning of our test suite.\n",[727,49700,49701,49704,49706,49709,49712,49714],{"class":729,"line":4671},[727,49702,49703],{"class":2376},"describe",[727,49705,2542],{"class":768},[727,49707,49708],{"class":737},"'Puppeteer Automation Script'",[727,49710,49711],{"class":768},", () ",[727,49713,2388],{"class":1986},[727,49715,2391],{"class":768},[727,49717,49718],{"class":729,"line":4676},[727,49719,49720],{"class":2920},"  \u002F\u002F Before each test, we'll set up our mocks.\n",[727,49722,49723,49726],{"class":729,"line":4681},[727,49724,49725],{"class":1986},"  let",[727,49727,48766],{"class":768},[727,49729,49730,49732],{"class":729,"line":4686},[727,49731,49725],{"class":1986},[727,49733,48773],{"class":768},[727,49735,49736,49738],{"class":729,"line":4691},[727,49737,49725],{"class":1986},[727,49739,48780],{"class":768},[727,49741,49742,49744],{"class":729,"line":4696},[727,49743,49725],{"class":1986},[727,49745,48787],{"class":768},[727,49747,49748],{"class":729,"line":4702},[727,49749,1898],{"emptyLinePlaceholder":522},[727,49751,49752,49755,49757,49759],{"class":729,"line":4708},[727,49753,49754],{"class":2376},"  beforeEach",[727,49756,47914],{"class":768},[727,49758,2388],{"class":1986},[727,49760,2391],{"class":768},[727,49762,49763],{"class":729,"line":4714},[727,49764,49765],{"class":2920},"    \u002F\u002F Mock the locator first\n",[727,49767,49768,49771,49773],{"class":729,"line":4719},[727,49769,49770],{"class":768},"    mockLocator ",[727,49772,4970],{"class":1986},[727,49774,2391],{"class":768},[727,49776,49777,49780,49782,49784,49786],{"class":729,"line":4724},[727,49778,49779],{"class":768},"      fill: jest.",[727,49781,48823],{"class":2376},[727,49783,9465],{"class":768},[727,49785,48828],{"class":2376},[727,49787,48831],{"class":768},[727,49789,49790],{"class":729,"line":4729},[727,49791,2633],{"class":768},[727,49793,49794],{"class":729,"line":4734},[727,49795,1898],{"emptyLinePlaceholder":522},[727,49797,49798],{"class":729,"line":4739},[727,49799,49800],{"class":2920},"    \u002F\u002F Mock the page object and its methods\n",[727,49802,49803,49806,49808],{"class":729,"line":4744},[727,49804,49805],{"class":768},"    mockPage ",[727,49807,4970],{"class":1986},[727,49809,2391],{"class":768},[727,49811,49812,49815,49817,49819,49821],{"class":729,"line":4749},[727,49813,49814],{"class":768},"      goto: jest.",[727,49816,48823],{"class":2376},[727,49818,9465],{"class":768},[727,49820,48828],{"class":2376},[727,49822,48831],{"class":768},[727,49824,49825,49828,49830,49832,49834,49836],{"class":729,"line":4754},[727,49826,49827],{"class":768},"      locator: jest.",[727,49829,48823],{"class":2376},[727,49831,9465],{"class":768},[727,49833,48828],{"class":2376},[727,49835,48880],{"class":768},[727,49837,48883],{"class":2920},[727,49839,49840,49843,49845,49847,49849],{"class":729,"line":1753},[727,49841,49842],{"class":768},"      close: jest.",[727,49844,48823],{"class":2376},[727,49846,9465],{"class":768},[727,49848,48828],{"class":2376},[727,49850,48831],{"class":768},[727,49852,49853],{"class":729,"line":4763},[727,49854,2633],{"class":768},[727,49856,49857],{"class":729,"line":4768},[727,49858,1898],{"emptyLinePlaceholder":522},[727,49860,49861],{"class":729,"line":4773},[727,49862,49863],{"class":2920},"    \u002F\u002F Mock the browser object and its methods\n",[727,49865,49866,49869,49871],{"class":729,"line":4778},[727,49867,49868],{"class":768},"    mockBrowser ",[727,49870,4970],{"class":1986},[727,49872,2391],{"class":768},[727,49874,49875,49878,49880,49882,49884],{"class":729,"line":4783},[727,49876,49877],{"class":768},"      newPage: jest.",[727,49879,48823],{"class":2376},[727,49881,9465],{"class":768},[727,49883,48828],{"class":2376},[727,49885,48932],{"class":768},[727,49887,49888,49890,49892,49894,49896],{"class":729,"line":4788},[727,49889,49842],{"class":768},[727,49891,48823],{"class":2376},[727,49893,9465],{"class":768},[727,49895,48828],{"class":2376},[727,49897,48831],{"class":768},[727,49899,49900],{"class":729,"line":1048},[727,49901,2633],{"class":768},[727,49903,49904],{"class":729,"line":512},[727,49905,1898],{"emptyLinePlaceholder":522},[727,49907,49908],{"class":729,"line":4801},[727,49909,49910],{"class":2920},"    \u002F\u002F Mock the Puppeteer module itself\n",[727,49912,49913,49916,49918],{"class":729,"line":4806},[727,49914,49915],{"class":768},"    mockPuppeteer ",[727,49917,4970],{"class":1986},[727,49919,2391],{"class":768},[727,49921,49922,49925,49927,49929,49931],{"class":729,"line":4811},[727,49923,49924],{"class":768},"      connect: jest.",[727,49926,48823],{"class":2376},[727,49928,9465],{"class":768},[727,49930,48828],{"class":2376},[727,49932,48980],{"class":768},[727,49934,49935],{"class":729,"line":4816},[727,49936,2633],{"class":768},[727,49938,49939],{"class":729,"line":4821},[727,49940,1898],{"emptyLinePlaceholder":522},[727,49942,49943],{"class":729,"line":4826},[727,49944,49945],{"class":2920},"    \u002F\u002F Mock the global setTimeout to prevent the test from waiting 5 seconds.\n",[727,49947,49948,49950,49952],{"class":729,"line":4831},[727,49949,49119],{"class":768},[727,49951,49001],{"class":2376},[727,49953,47105],{"class":768},[727,49955,49956],{"class":729,"line":4836},[727,49957,48474],{"class":768},[727,49959,49960],{"class":729,"line":4841},[727,49961,1898],{"emptyLinePlaceholder":522},[727,49963,49964,49967,49969,49971],{"class":729,"line":4847},[727,49965,49966],{"class":2376},"  afterEach",[727,49968,47914],{"class":768},[727,49970,2388],{"class":1986},[727,49972,2391],{"class":768},[727,49974,49975],{"class":729,"line":4852},[727,49976,49977],{"class":2920},"    \u002F\u002F Restore the timers after each test\n",[727,49979,49980,49982,49984],{"class":729,"line":4857},[727,49981,49119],{"class":768},[727,49983,49033],{"class":2376},[727,49985,47105],{"class":768},[727,49987,49988],{"class":729,"line":4862},[727,49989,48474],{"class":768},[727,49991,49992],{"class":729,"line":4867},[727,49993,1898],{"emptyLinePlaceholder":522},[727,49995,49996,49999,50001,50003,50005,50007,50009,50011],{"class":729,"line":4872},[727,49997,49998],{"class":2376},"  test",[727,50000,2542],{"class":768},[727,50002,49064],{"class":737},[727,50004,2004],{"class":768},[727,50006,10151],{"class":1986},[727,50008,2385],{"class":768},[727,50010,2388],{"class":1986},[727,50012,2391],{"class":768},[727,50014,50015],{"class":729,"line":4877},[727,50016,50017],{"class":2920},"    \u002F\u002F Wrap the logic in a mock for the global alert function if needed, but since\n",[727,50019,50021],{"class":729,"line":50020},73,[727,50022,50023],{"class":2920},"    \u002F\u002F the original `alert()` is not standard for Node.js, we should change it to `throw`.\n",[727,50025,50027,50029],{"class":729,"line":50026},74,[727,50028,2396],{"class":1986},[727,50030,2391],{"class":768},[727,50032,50034],{"class":729,"line":50033},75,[727,50035,50036],{"class":2920},"      \u002F\u002F Run the main automation function with our mocked puppeteer.\n",[727,50038,50040,50043,50045],{"class":729,"line":50039},76,[727,50041,50042],{"class":1986},"      await",[727,50044,49102],{"class":2376},[727,50046,49105],{"class":768},[727,50048,50050],{"class":729,"line":50049},77,[727,50051,1898],{"emptyLinePlaceholder":522},[727,50053,50055],{"class":729,"line":50054},78,[727,50056,50057],{"class":2920},"      \u002F\u002F Fast-forward time to skip the setTimeout call.\n",[727,50059,50061,50064,50066,50068,50070],{"class":729,"line":50060},79,[727,50062,50063],{"class":768},"      jest.",[727,50065,49122],{"class":2376},[727,50067,2542],{"class":768},[727,50069,47995],{"class":1882},[727,50071,12611],{"class":768},[727,50073,50075],{"class":729,"line":50074},80,[727,50076,1898],{"emptyLinePlaceholder":522},[727,50078,50080],{"class":729,"line":50079},81,[727,50081,50082],{"class":2920},"      \u002F\u002F Assertions to check if the correct methods were called.\n",[727,50084,50086],{"class":729,"line":50085},82,[727,50087,50088],{"class":2920},"      \u002F\u002F Check that the script connected to the browser.\n",[727,50090,50092,50095,50097,50099,50101,50103],{"class":729,"line":50091},83,[727,50093,50094],{"class":2376},"      expect",[727,50096,49150],{"class":768},[727,50098,49153],{"class":2376},[727,50100,2542],{"class":768},[727,50102,165],{"class":1882},[727,50104,12611],{"class":768},[727,50106,50108,50110,50112,50114],{"class":729,"line":50107},84,[727,50109,50094],{"class":2376},[727,50111,49150],{"class":768},[727,50113,49168],{"class":2376},[727,50115,49171],{"class":768},[727,50117,50119,50122,50124],{"class":729,"line":50118},85,[727,50120,50121],{"class":768},"        expect.",[727,50123,49179],{"class":2376},[727,50125,2479],{"class":768},[727,50127,50129,50132,50134,50136],{"class":729,"line":50128},86,[727,50130,50131],{"class":768},"          browserWSEndpoint: expect.",[727,50133,49189],{"class":2376},[727,50135,49192],{"class":768},[727,50137,49195],{"class":2920},[727,50139,50141],{"class":729,"line":50140},87,[727,50142,4203],{"class":768},[727,50144,50146],{"class":729,"line":50145},88,[727,50147,50148],{"class":768},"      )\n",[727,50150,50152],{"class":729,"line":50151},89,[727,50153,1898],{"emptyLinePlaceholder":522},[727,50155,50157],{"class":729,"line":50156},90,[727,50158,50159],{"class":2920},"      \u002F\u002F Check that a new page was opened.\n",[727,50161,50163,50165,50167,50169,50171,50173],{"class":729,"line":50162},91,[727,50164,50094],{"class":2376},[727,50166,49220],{"class":768},[727,50168,49153],{"class":2376},[727,50170,2542],{"class":768},[727,50172,165],{"class":1882},[727,50174,12611],{"class":768},[727,50176,50178],{"class":729,"line":50177},92,[727,50179,1898],{"emptyLinePlaceholder":522},[727,50181,50183],{"class":729,"line":50182},93,[727,50184,50185],{"class":2920},"      \u002F\u002F Check that it navigated to the correct URL.\n",[727,50187,50189,50191,50193,50195,50197,50199],{"class":729,"line":50188},94,[727,50190,50094],{"class":2376},[727,50192,49244],{"class":768},[727,50194,49153],{"class":2376},[727,50196,2542],{"class":768},[727,50198,165],{"class":1882},[727,50200,12611],{"class":768},[727,50202,50204,50206,50208,50210,50212,50214],{"class":729,"line":50203},95,[727,50205,50094],{"class":2376},[727,50207,49244],{"class":768},[727,50209,49168],{"class":2376},[727,50211,2542],{"class":768},[727,50213,48522],{"class":737},[727,50215,12611],{"class":768},[727,50217,50219],{"class":729,"line":50218},96,[727,50220,1898],{"emptyLinePlaceholder":522},[727,50222,50224],{"class":729,"line":50223},97,[727,50225,50226],{"class":2920},"      \u002F\u002F Check that it located the search bar.\n",[727,50228,50230,50232,50234,50236,50238,50240],{"class":729,"line":50229},98,[727,50231,50094],{"class":2376},[727,50233,49282],{"class":768},[727,50235,49168],{"class":2376},[727,50237,2542],{"class":768},[727,50239,48547],{"class":737},[727,50241,12611],{"class":768},[727,50243,50245],{"class":729,"line":50244},99,[727,50246,1898],{"emptyLinePlaceholder":522},[727,50248,50250],{"class":729,"line":50249},100,[727,50251,50252],{"class":2920},"      \u002F\u002F Check that it filled the search bar with the correct text.\n",[727,50254,50256,50258,50260,50262,50264,50266],{"class":729,"line":50255},101,[727,50257,50094],{"class":2376},[727,50259,49306],{"class":768},[727,50261,49153],{"class":2376},[727,50263,2542],{"class":768},[727,50265,165],{"class":1882},[727,50267,12611],{"class":768},[727,50269,50271,50273,50275,50277,50279,50281],{"class":729,"line":50270},102,[727,50272,50094],{"class":2376},[727,50274,49306],{"class":768},[727,50276,49168],{"class":2376},[727,50278,2542],{"class":768},[727,50280,48556],{"class":737},[727,50282,12611],{"class":768},[727,50284,50286],{"class":729,"line":50285},103,[727,50287,1898],{"emptyLinePlaceholder":522},[727,50289,50291],{"class":729,"line":50290},104,[727,50292,50293],{"class":2920},"      \u002F\u002F Check that the page and browser were closed correctly.\n",[727,50295,50297,50299,50301,50303,50305,50307],{"class":729,"line":50296},105,[727,50298,50094],{"class":2376},[727,50300,49344],{"class":768},[727,50302,49153],{"class":2376},[727,50304,2542],{"class":768},[727,50306,165],{"class":1882},[727,50308,12611],{"class":768},[727,50310,50312,50314,50316,50318,50320,50322],{"class":729,"line":50311},106,[727,50313,50094],{"class":2376},[727,50315,49359],{"class":768},[727,50317,49153],{"class":2376},[727,50319,2542],{"class":768},[727,50321,165],{"class":1882},[727,50323,12611],{"class":768},[727,50325,50327,50329,50331],{"class":729,"line":50326},107,[727,50328,2606],{"class":768},[727,50330,2609],{"class":1986},[727,50332,21987],{"class":768},[727,50334,50336],{"class":729,"line":50335},108,[727,50337,50338],{"class":2920},"      \u002F\u002F If an error is thrown, the test will fail.\n",[727,50340,50342],{"class":729,"line":50341},109,[727,50343,50344],{"class":2920},"      \u002F\u002F This is how we test the happy path.\n",[727,50346,50348,50351],{"class":729,"line":50347},110,[727,50349,50350],{"class":1986},"      throw",[727,50352,49393],{"class":768},[727,50354,50356],{"class":729,"line":50355},111,[727,50357,2633],{"class":768},[727,50359,50361],{"class":729,"line":50360},112,[727,50362,48474],{"class":768},[727,50364,50366],{"class":729,"line":50365},113,[727,50367,1898],{"emptyLinePlaceholder":522},[727,50369,50371,50373,50375,50378,50380,50382,50384,50386],{"class":729,"line":50370},114,[727,50372,49998],{"class":2376},[727,50374,2542],{"class":768},[727,50376,50377],{"class":737},"'should handle connection errors gracefully'",[727,50379,2004],{"class":768},[727,50381,10151],{"class":1986},[727,50383,2385],{"class":768},[727,50385,2388],{"class":1986},[727,50387,2391],{"class":768},[727,50389,50391],{"class":729,"line":50390},115,[727,50392,50393],{"class":2920},"    \u002F\u002F Mock a connection error.\n",[727,50395,50397,50400,50403,50405,50407,50410,50412,50415],{"class":729,"line":50396},116,[727,50398,50399],{"class":768},"    mockPuppeteer.connect.",[727,50401,50402],{"class":2376},"mockRejectedValue",[727,50404,2542],{"class":768},[727,50406,2473],{"class":1986},[727,50408,50409],{"class":2376}," Error",[727,50411,2542],{"class":768},[727,50413,50414],{"class":737},"'Connection Failed'",[727,50416,50417],{"class":768},"))\n",[727,50419,50421],{"class":729,"line":50420},117,[727,50422,1898],{"emptyLinePlaceholder":522},[727,50424,50426],{"class":729,"line":50425},118,[727,50427,50428],{"class":2920},"    \u002F\u002F Use a spy to see if browser.close was called.\n",[727,50430,50432,50434,50437,50439,50442,50445,50448,50451],{"class":729,"line":50431},119,[727,50433,17003],{"class":1986},[727,50435,50436],{"class":1882}," mockBrowserCloseSpy",[727,50438,2321],{"class":1986},[727,50440,50441],{"class":768}," jest.",[727,50443,50444],{"class":2376},"spyOn",[727,50446,50447],{"class":768},"(mockBrowser, ",[727,50449,50450],{"class":737},"'close'",[727,50452,12611],{"class":768},[727,50454,50456],{"class":729,"line":50455},120,[727,50457,1898],{"emptyLinePlaceholder":522},[727,50459,50461],{"class":729,"line":50460},121,[727,50462,50463],{"class":2920},"    \u002F\u002F Expect the function to throw an error, since we've replaced the alert().\n",[727,50465,50467,50469,50472,50474,50477,50480,50483],{"class":729,"line":50466},122,[727,50468,10163],{"class":1986},[727,50470,50471],{"class":2376}," expect",[727,50473,2542],{"class":768},[727,50475,50476],{"class":2376},"runAutomation",[727,50478,50479],{"class":768},"(mockPuppeteer)).rejects.",[727,50481,50482],{"class":2376},"toThrow",[727,50484,49171],{"class":768},[727,50486,50488],{"class":729,"line":50487},123,[727,50489,50490],{"class":737},"      'Connection Failed'\n",[727,50492,50494],{"class":729,"line":50493},124,[727,50495,49204],{"class":768},[727,50497,50499],{"class":729,"line":50498},125,[727,50500,1898],{"emptyLinePlaceholder":522},[727,50502,50504],{"class":729,"line":50503},126,[727,50505,50506],{"class":2920},"    \u002F\u002F Even on failure, the browser should attempt to close.\n",[727,50508,50510,50512,50515,50517,50519,50521],{"class":729,"line":50509},127,[727,50511,49147],{"class":2376},[727,50513,50514],{"class":768},"(mockBrowserCloseSpy).",[727,50516,49153],{"class":2376},[727,50518,2542],{"class":768},[727,50520,165],{"class":1882},[727,50522,12611],{"class":768},[727,50524,50526],{"class":729,"line":50525},128,[727,50527,48474],{"class":768},[727,50529,50531],{"class":729,"line":50530},129,[727,50532,5051],{"class":768},[811,50534,50535],{},"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 .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 .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":494,"searchDepth":495,"depth":495,"links":50537},[50538,50539,50540,50543,50544,50545],{"id":48386,"depth":498,"text":48387},{"id":48696,"depth":498,"text":48697},{"id":48725,"depth":498,"text":48726,"children":50541},[50542],{"id":48743,"depth":495,"text":48744},{"id":49042,"depth":498,"text":49043},{"id":795,"depth":498,"text":796},{"id":49423,"depth":498,"text":49424},"2025-08-27","Learn more how to take advantage of large-language models in order to build tests for your automation scripts.",{"metaTitle":48378,"read":50549,"summary":50547,"type":90,"tool":50550,"category":50551,"tags":50553,"location":46733,"featuredimg":50556,"landingimg":50557,"canonicalUrl":50558},"8 min read",[46802],[50552],"Browser automation",[50554,50555,23962],"code dashboard","testing","\u002Fblog\u002Fcode-text-post.webp","\u002Fblog\u002Fcode-text-sq.webp","https:\u002F\u002Faxiom.ai\u002Fblog\u002Fwriting-tests-with-llms","\u002Fblog\u002Fwriting-tests-with-llms",{"title":48378,"description":50547},"blog\u002Fwriting-tests-with-llms","JBkG002hsOQPN4JvfAmU5m4hVsIvR-aN0hbrmRw5HJY",[50552],[90],[46802],{"id":50567,"title":50568,"author":48082,"body":50569,"date":50700,"description":50573,"draft":26250,"extension":506,"meta":50701,"navigation":522,"path":50708,"seo":50709,"stem":50710,"__hash__":50711,"pinned":-1,"category":50712,"type":50713,"tool":50714},"blog\u002Fblog\u002Fwhat-are-anti-detect-browsers-and-why-use-them.md","What Are Anti-Detect Browsers and Why You Should Use Them",{"type":8,"value":50570,"toc":50692},[50571,50574,50577,50581,50584,50587,50590,50594,50597,50600,50621,50624,50628,50631,50634,50637,50640,50644,50647,50650,50657,50661,50664,50678,50681,50684,50687,50689],[14,50572,50573],{},"In today's interconnected digital landscape, every online interaction leaves a trace. From IP addresses and user-agent strings to canvas rendering and WebGL capabilities, websites are increasingly adept at compiling a unique \"digital fingerprint\" for each user. While this practice often serves legitimate purposes like security and personalisation, it also presents significant challenges for developers and organisations engaged in activities that require maintaining privacy, managing multiple accounts, or performing large-scale data collection without triggering sophisticated anti-bot systems.",[14,50575,50576],{},"Anti-detect browsers came in to save the day. These browsers are specialised tools that are engineered to meticulously control and manipulate the data points that make up a browsers digital identity. For developers, understanding the underlying mechanisms of anti-detect browsers isn't just about bypassing restrictions; it's about gaining a deeper insight into browser forensics, advanced fingerprinting techniques, and the evolving cat-and-mouse game between online security measures and privacy-preserving technologies.",[21,50578,50580],{"id":50579},"what-are-digital-fingerprints","What are digital fingerprints",[14,50582,50583],{},"Browser fingerprinting is a method that websites use to identify and track users online by collecting unique information about their web browser and device. This information, such as browser type, operating system, screen resolution, installed fonts, User-Agent, IP address, and much more, are combined to create a \"fingerprint\" that can uniquely identify a user across different websites and browsing sessions.",[14,50585,50586],{},"This fingerprint is then used for a variety of activities by the trackers, such as targeted advertising, website personalisation or as an alternative to cookies - as users can decline permission to set cookies. Fingerprints can also be used for fraud detection and additional security for the website.",[14,50588,50589],{},"Fingerprints are generally difficult to work with as users can change them, or can clear them completely. Anti-detect browser take advantage of this weakness to allow you to spoof your fingerprint.",[21,50591,50593],{"id":50592},"how-anti-detect-browser-work","How anti-detect browser work",[14,50595,50596],{},"Anti-detect browsers take fingerprinting into consideration while you're using them. They use techniques such as changing a value within a fingerprint but not enough to make it look like a fake fingerprint, they keep it as close to the original to make it as genuine as possible to trick websites into thinking it is real. They allow you to create profiles that have consistent fingerprints to ensure that websites know no different!",[14,50598,50599],{},"They spoof your fingerprint using various methods, including:",[80,50601,50602,50605,50608,50615,50618],{},[83,50603,50604],{},"Manipulating your User-Agent string.",[83,50606,50607],{},"Using proxies to change your IP address.",[83,50609,50610,50611,50614],{},"Intercepting and modifying the ",[90,50612,50613],{},"navigator"," object properties to change your hardware details.",[83,50616,50617],{},"Overriding timezone and geo-location information.",[83,50619,50620],{},"Managing cookies and local storage for profile-specific storage and isolations.",[14,50622,50623],{},"All of these factors may be used to spoof a fingerprint, but remember, these will always stay consistent within the profile that's created by the anti-detect browser. Consistency is key and any deviation may give the trackers a hint that it may be spoofed.",[21,50625,50627],{"id":50626},"why-use-an-anti-detect-browser","Why use an anti-detect browser",[14,50629,50630],{},"Anti-detect browsers are quite popular with developers as a method of automated testing, web scraping and research.",[14,50632,50633],{},"From a web scraping, data collection and automated testing point of view, anti-detect browsers allow developers to bypass advanced anti-bot measures such as Cloudflare, while avoiding IP bans. This is important in an automated scenario as it's important that these processes do not get stuck.",[14,50635,50636],{},"For social media managers, anti-detect browsers can still offer some great solutions - specifically around handling multiple social media accounts and remaining logged into them. Each profile, with it's unique fingerprint, can stay logged into multiple social media accounts and can protect the accounts from being blocked due to perceived activity on the accounts. Social media platforms generally do not like automation!",[14,50638,50639],{},"Similar to automated testing, anti-detect browser can be useful in cybersecurity research and penetration testing for applications. As multiple profiles can be used, this gives the testers an opportunity of emulating various user profiles to test various vulnerabilities and to bypass detection from anti-bot detection systems.",[21,50641,50643],{"id":50642},"challenges-and-limitations","Challenges and limitations",[14,50645,50646],{},"Anti-bot detection methods are ever evolving - this is a constant race against the next method that is developed. Cloudflare are one of the major players in this space, even if you don't run bots you will have likely came across one of their screens to confirm if you are a human. The good news is that this is a two sided fight and many anti-detection browsers are fighting back by developing techniques to circumvent these blocking methods.",[14,50648,50649],{},"Cost and performance overhead is something else to consider. Most anti-detection browsers offer a small number of profiles that you can set up for free to test out their product, but this is often not enough for large scale operations where you may need to opt for their subscription which will add extra costs to your project. On top of this, there is additional overhead in setting up profiles, isolating these profiles and continuously spoofing them.",[14,50651,50652,50653,50656],{},"There are always risks that the anti-detect browser itself may be detected which could put your IP at risk of being banned, or your social media accounts being restricted, if this is what you are using the browser for. The chances of this happening are often lower than when you are not using an anti-detect browser but it's ",[807,50654,50655],{},"never"," zero.",[21,50658,50660],{"id":50659},"choosing-an-anti-detect-browser","Choosing an anti-detect browser",[14,50662,50663],{},"The anti-detect browser that you will need to use will very much depend on your project's needs. There are some key features that we recommend keeping an eye out for:",[80,50665,50666,50669,50672,50675],{},[83,50667,50668],{},"Fingerprint management",[83,50670,50671],{},"Proxy integrations",[83,50673,50674],{},"Pricing",[83,50676,50677],{},"Community support\u002Fdocumentation",[14,50679,50680],{},"If you are looking for web automation, you're going to want to look for an API that can integrate with an automation framework such as Puppeteer or Playwright to allow for the browser to be controlled by automation.",[14,50682,50683],{},"Documentation and community support are an important feature, especially if this is a paid product, support that can be there to help if you run into issues, and documentation that you can refer to to get started quickly and help you solve problems.",[14,50685,50686],{},"Test! Testing the browser itself is important. Make sure to take full advantage of any free plan that's on offer to try a slimmed down version of your project to ensure that it does meet your needs. Using sites like amiunique.org and browserleaks.com can help you check that the anti-detect features have been set up correctly and are working effectively.",[21,50688,46678],{"id":46677},[14,50690,50691],{},"Anti-detect browsers can be extremely helpful when navigating the web in instances where you need multiple digital fingerprints. From automated testing, cybersecurity research and social media account management, they can be used for a variety of tasks that require delicate handling of fingerprints to avoid being detected by websites that could potentially ban your IP address and cause more trouble.",{"title":494,"searchDepth":495,"depth":495,"links":50693},[50694,50695,50696,50697,50698,50699],{"id":50579,"depth":498,"text":50580},{"id":50592,"depth":498,"text":50593},{"id":50626,"depth":498,"text":50627},{"id":50642,"depth":498,"text":50643},{"id":50659,"depth":498,"text":50660},{"id":46677,"depth":498,"text":46678},"2025-07-30",{"read":46726,"type":90,"category":50702,"tags":50703,"location":46733,"featuredimg":50705,"landingimg":50706,"summary":50707,"video":523},[48207],[3974,50704],"anti-detect browsers","\u002Fblog\u002Fanti-detection-browser.webp","\u002Fblog\u002Fanti-detection-browser-sq.webp","Learn about digital fingerprinting, anti-detect browsers and when to take advantage of them in your workflow.","\u002Fblog\u002Fwhat-are-anti-detect-browsers-and-why-use-them",{"title":50568,"description":50573},"blog\u002Fwhat-are-anti-detect-browsers-and-why-use-them","Vcg_es5QYOF2KSZAhtRWQ9XEfAcPRxA5pzHQeq6adM8",[48207],[90],[],{"id":50716,"title":50717,"author":48082,"body":50718,"date":51170,"description":494,"draft":26250,"extension":506,"meta":51171,"navigation":522,"path":51179,"seo":51180,"stem":51181,"__hash__":51182,"pinned":-1,"category":51183,"type":51184,"tool":51185},"blog\u002Fblog\u002Fmastering-xpath-selectors.md","Mastering XPath Selectors",{"type":8,"value":50719,"toc":51155},[50720,50724,50727,50730,50734,50737,50740,50743,50746,50750,50753,50774,50777,50812,50819,50845,50858,50862,50870,50924,50935,50939,50945,50972,50975,51022,51026,51029,51033,51049,51113,51115,51118,51122,51125,51129,51132,51136,51139,51141,51144,51146,51153],[21,50721,50723],{"id":50722},"introduction","Introduction",[14,50725,50726],{},"You can think of XPath selectors as more powerful CSS selectors, addressing the limitations of standard CSS selectors for complex document navigation. As the web continues to move more towards frameworks that use automatically generated IDs and classes within their code, it has become more difficult to create appropriate CSS selectors that gets the content that you want without a selector that takes 2-3 business days just to read.",[14,50728,50729],{},"This is where xpath selectors come in. XPath (XML Path Language) is a powerful query language that can be used for navigating through nodes and selecting them based on the query. While XML is in the name, this works with HTML where it is often treated as XML (XHTML) or pared into a DOM (Document Object Model) tree.",[21,50731,50733],{"id":50732},"benefits-of-xpath","Benefits of XPath",[14,50735,50736],{},"XPath selectors allows you to identify and extract specific elements from a webpage document with far more flexibility than standard CSS selectors allow for. For example, xpath allows you to query elements within a webpage based on an attribute, which can be helpful to identify specific elements such as inputs based on an attribute like placeholder. This added flexibility allows you to locate elements based on a wider range of criteria.",[14,50738,50739],{},"On top of the flexibility that XPath offers, it can also be more effective for identifying content on dynamic pages that may change on each load or may not have consistent IDs or classes. In addition to this, it's also possible to partially match selectors to help locate dynamic content.",[14,50741,50742],{},"XPath is a W3C standard, which means that it's well-defined and widely adopted. This means that there is plenty of support out there for the standard and support through various programming languages - for example, this is built into Python libraries such as Scrapy, BeautifulSoup and web automation frameworks such as Selenium, Puppeteer and Playright, to name a few.",[14,50744,50745],{},"One of the biggest benefits that people love, including ourselves, is the ability to target an element based on the text that is contained within that element. This can be super helpful when trying to target an element such as a button, or a link, within a page, like a \"Buy now\" button.",[21,50747,50749],{"id":50748},"xpath-fundamentals","XPath Fundamentals",[14,50751,50752],{},"It can sometimes be beneficial to think about xpath queries as file paths as they allow you to specify not just where an element will be in the structure of the page, but also its attributes, content and it's relationship to other elements.",[14,50754,50755,50756,2004,50759,2004,50762,50765,50766,50769,50770,50773],{},"We start off with the standard elements that are available within standard CSS selectors, including ",[90,50757,50758],{},"document",[90,50760,50761],{},"\u003Cdiv>",[90,50763,50764],{},"\u003Cp>"," and all of the usual characters that you'll find in HTML. Attribute nodes are also available, such as the ",[90,50767,50768],{},"href"," attribute in the ",[90,50771,50772],{},"\u003Ca>"," tag.",[14,50775,50776],{},"When constructing an XPath selector there's a specific format that you are required to use:",[80,50778,50779,50796,50809],{},[83,50780,50781,50784,50785,50788,50789,50792,50793],{},[90,50782,50783],{},"\u002F"," to start at the root of the document, for example, ",[90,50786,50787],{},"\u002Fhtml\u002Fbody\u002Fdiv",". Or ",[90,50790,50791],{},"\u002F\u002F"," to target anywhere in the document, ",[90,50794,50795],{},"\u002F\u002Fdiv[@class='my-element']",[83,50797,50798,50799,50801,50802,50805,50806,50808],{},"The name of the node, for example, ",[90,50800,50787],{}," which selects all the ",[90,50803,50804],{},"div"," elements within the ",[90,50807,385],{}," node",[83,50810,50811],{},"Any other element that you wish to target",[14,50813,50814,50815,50818],{},"There are multiple filters that are available within your XPath selector, we are not going to get into them in this article but it's good to be aware of what can be done. We already seen one above with the ",[90,50816,50817],{},"@class"," filter, but you can also filter by:",[80,50820,50821,50830,50836],{},[83,50822,50823,50826,50827],{},[90,50824,50825],{},"@attribute",", for example, ",[90,50828,50829],{},"@src",[83,50831,50832,50833],{},"By index, if you are targetting a list, for example, ",[90,50834,50835],{},"\u002F\u002Fli[position() \u003C 3]",[83,50837,50838,50839,50826,50842],{},"By text content using ",[90,50840,50841],{},"text()",[90,50843,50844],{},"\u002F\u002Fh2[text()='Add to cart']",[14,50846,50847,50848,2004,50851,16767,50854,50857],{},"You can combine these filters using the ",[90,50849,50850],{},"and",[90,50852,50853],{},"or",[90,50855,50856],{},"not()"," logic operators.",[21,50859,50861],{"id":50860},"using-xpath-with-javascript","Using XPath with JavaScript",[14,50863,5070,50864,50869],{},[322,50865,50868],{"href":50866,"rel":50867},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FDocument\u002Fevaluate",[2245],"document.evaluate()"," function can be used to bring your xpath queries into your JavaScript code. For example, if you wanted to get all of the add to cart buttons on the page, the following code would work:",[719,50871,50873],{"className":756,"code":50872,"language":758,"meta":494,"style":494},"const buttons = document.evaluate(\n    \"\u002F\u002Fbutton[text()='Add to cart']\",\n    null,\n    XPathResult.ANY_TYPE,\n    null\n)\n",[90,50874,50875,50891,50898,50905,50915,50920],{"__ignoreMap":494},[727,50876,50877,50879,50882,50884,50887,50889],{"class":729,"line":730},[727,50878,2315],{"class":1986},[727,50880,50881],{"class":1882}," buttons",[727,50883,2321],{"class":1986},[727,50885,50886],{"class":768}," document.",[727,50888,47911],{"class":2376},[727,50890,49171],{"class":768},[727,50892,50893,50896],{"class":729,"line":498},[727,50894,50895],{"class":737},"    \"\u002F\u002Fbutton[text()='Add to cart']\"",[727,50897,2427],{"class":768},[727,50899,50900,50903],{"class":729,"line":495},[727,50901,50902],{"class":1882},"    null",[727,50904,2427],{"class":768},[727,50906,50907,50910,50913],{"class":729,"line":1895},[727,50908,50909],{"class":768},"    XPathResult.",[727,50911,50912],{"class":1882},"ANY_TYPE",[727,50914,2427],{"class":768},[727,50916,50917],{"class":729,"line":1901},[727,50918,50919],{"class":1882},"    null\n",[727,50921,50922],{"class":729,"line":1973},[727,50923,12611],{"class":768},[14,50925,50926,50927,50930,50931,50934],{},"You can see that the second argument provided is in the format that was provided in the ",[322,50928,50749],{"href":50929},"#xpath-fundamentals"," section, nothing about the formatting changes when you bring it into JavaScript. To iterate through these elements you can use ",[90,50932,50933],{},"buttons.iterateNext()"," to access each element individually.",[21,50936,50938],{"id":50937},"combining-xpath-with-puppeteer","Combining XPath with Puppeteer",[14,50940,50941,50942,50944],{},"If you are using a library such as Puppeteer to run your web automations it also supports xpath. This takes advantage of the ",[90,50943,50868],{}," function that is native to JavaScript, but has some slight differences on how it's written, for example, the query to select the add to cart buttons would look like:",[719,50946,50948],{"className":756,"code":50947,"language":758,"meta":494,"style":494},"const buttons = await page.waitForSelector('::-p-xpath(\u002F\u002Fbutton[text()=\"Add to cart\"])')\n",[90,50949,50950],{"__ignoreMap":494},[727,50951,50952,50954,50956,50958,50960,50962,50965,50967,50970],{"class":729,"line":730},[727,50953,2315],{"class":1986},[727,50955,50881],{"class":1882},[727,50957,2321],{"class":1986},[727,50959,2410],{"class":1986},[727,50961,16668],{"class":768},[727,50963,50964],{"class":2376},"waitForSelector",[727,50966,2542],{"class":768},[727,50968,50969],{"class":737},"'::-p-xpath(\u002F\u002Fbutton[text()=\"Add to cart\"])'",[727,50971,12611],{"class":768},[14,50973,50974],{},"It contains a bit more boilerplate code to get the job done, but works the same - you may wish to skip this and just go straight for the standard implementation. You can then go ahead and use Puppeteers built in options to work with the elements, such as clicking on the button:",[719,50976,50978],{"className":756,"code":50977,"language":758,"meta":494,"style":494},"for (var i = 0; i \u003C buttons.length; i++) {\n    buttons[i].click()\n}\n",[90,50979,50980,51009,51018],{"__ignoreMap":494},[727,50981,50982,50984,50986,50988,50990,50992,50994,50996,50998,51001,51003,51005,51007],{"class":729,"line":730},[727,50983,6783],{"class":1986},[727,50985,2524],{"class":768},[727,50987,4964],{"class":1986},[727,50989,18119],{"class":768},[727,50991,4970],{"class":1986},[727,50993,18124],{"class":1882},[727,50995,18127],{"class":768},[727,50997,18130],{"class":1986},[727,50999,51000],{"class":768}," buttons.",[727,51002,18136],{"class":1882},[727,51004,21428],{"class":768},[727,51006,21431],{"class":1986},[727,51008,16992],{"class":768},[727,51010,51011,51014,51016],{"class":729,"line":498},[727,51012,51013],{"class":768},"    buttons[i].",[727,51015,13865],{"class":2376},[727,51017,47105],{"class":768},[727,51019,51020],{"class":729,"line":495},[727,51021,2639],{"class":768},[21,51023,51025],{"id":51024},"using-xpath-with-axiomai","Using XPath with axiom.ai",[14,51027,51028],{},"While axiom.ai does not currently support the use of xpath selectors as custom selectors, it does offer the ability to use custom JavaScript, and access the Puppeteer library to run your custom scripts. This includes the ability to run your xpath queries in order to extract data from websites manually. You can even return data from the 'Write Javascript' step.",[21,51030,51032],{"id":51031},"using-xpath-with-python","Using XPath with Python",[14,51034,51035,51036,51041,51042,450,51045,51048],{},"Interacting with your HTML content with Python and xpath queries is another good choice. This can be done in a similar method that we highlight in our ",[322,51037,51040],{"href":51038,"rel":51039},"https:\u002F\u002Faxiom.ai\u002Fblog\u002Fweb-scraping-with-python",[2245],"Web Scraping With Python Tutorial"," - using BeautifulSoup. The only different in this method is making use of ",[90,51043,51044],{},"lxml",[90,51046,51047],{},"requests",", let's review the code:",[719,51050,51054],{"className":51051,"code":51052,"language":51053,"meta":494,"style":494},"language-py shiki shiki-themes github-light-default github-dark-default","import requests \nfrom lxml import etree\nfrom bs4 import BeautifulSoup\n\nhtml = requests.get(\"https\u002F\u002Faxiom.ai\")\nbs = BeautifulSoup(html.text, \"html.parser\")\ndom = etree.HTML(str(bs))\n\nhero_title = dom.xpath('\u002F\u002Fh1')[0].text\nprint(hero_title)\n\n# Output as of 22 July 2025: Browser Automation. Quickly, without code.\n","py",[90,51055,51056,51061,51066,51071,51075,51080,51085,51090,51094,51099,51104,51108],{"__ignoreMap":494},[727,51057,51058],{"class":729,"line":730},[727,51059,51060],{},"import requests \n",[727,51062,51063],{"class":729,"line":498},[727,51064,51065],{},"from lxml import etree\n",[727,51067,51068],{"class":729,"line":495},[727,51069,51070],{},"from bs4 import BeautifulSoup\n",[727,51072,51073],{"class":729,"line":1895},[727,51074,1898],{"emptyLinePlaceholder":522},[727,51076,51077],{"class":729,"line":1901},[727,51078,51079],{},"html = requests.get(\"https\u002F\u002Faxiom.ai\")\n",[727,51081,51082],{"class":729,"line":1973},[727,51083,51084],{},"bs = BeautifulSoup(html.text, \"html.parser\")\n",[727,51086,51087],{"class":729,"line":2052},[727,51088,51089],{},"dom = etree.HTML(str(bs))\n",[727,51091,51092],{"class":729,"line":2058},[727,51093,1898],{"emptyLinePlaceholder":522},[727,51095,51096],{"class":729,"line":2064},[727,51097,51098],{},"hero_title = dom.xpath('\u002F\u002Fh1')[0].text\n",[727,51100,51101],{"class":729,"line":2087},[727,51102,51103],{},"print(hero_title)\n",[727,51105,51106],{"class":729,"line":2140},[727,51107,1898],{"emptyLinePlaceholder":522},[727,51109,51110],{"class":729,"line":2154},[727,51111,51112],{},"# Output as of 22 July 2025: Browser Automation. Quickly, without code.\n",[21,51114,12734],{"id":18425},[14,51116,51117],{},"There are a lot of potential use cases for using xpath selectors with your content, this ranges from page interactions, through data extraction and automated testing.",[639,51119,51121],{"id":51120},"automating-add-to-cart","Automating add to cart",[14,51123,51124],{},"Using our example above, it's possible to automate the full process of purchasing through an online store. Using the text filter on an xpath selector allows you to directly target the add to cart button that is required in order for you to add an item to the cart - you may run into issues with the checkout requiring some manual intervention but this should be able to automate most of the process.",[639,51126,51128],{"id":51127},"automated-testing","Automated testing",[14,51130,51131],{},"Xpath queries can be used to automatically test web pages - for example, it can be used to click through user journeys in order to ensure that key features of your application work as expected, such as the ability to add new products to the card. When combined with a library such as Puppeteer can be a super power for your QA team.",[639,51133,51135],{"id":51134},"data-extraction","Data extraction",[14,51137,51138],{},"The most obvious use case for this is data extraction - the process where you automatically extract data from a website in order to save the data for research or analytics. Using xpath queries will allow you to have more flexibility over the elements that you are targetting - especially if you are attempting to extract data from multiple websites that do not have a consistent layout.",[21,51140,46678],{"id":46677},[14,51142,51143],{},"Xpath queries can be used as a great companion to regular CSS selectors and offer an additional layer of flexibility that standard selectors just can't offer. This allows you to create selectors that can easily handle dynamic content, and can handle a great change of structure of web pages that you are looking to interact with. XPath is supported by a wide variety of languages, we have included JavaScript and Python in this example, but the options are pretty limitless, you may just need to search for a specific library that suits your needs.",[11,51145],{},[14,51147,51148,51149,51152],{},"We would love to hear what you do with this information, we would love to hear over in our ",[322,51150,3326],{"href":8928,"rel":51151},[2245],". Got a suggestion on how we can improve this article? Let us know!",[811,51154,46933],{},{"title":494,"searchDepth":495,"depth":495,"links":51156},[51157,51158,51159,51160,51161,51162,51163,51164,51169],{"id":50722,"depth":498,"text":50723},{"id":50732,"depth":498,"text":50733},{"id":50748,"depth":498,"text":50749},{"id":50860,"depth":498,"text":50861},{"id":50937,"depth":498,"text":50938},{"id":51024,"depth":498,"text":51025},{"id":51031,"depth":498,"text":51032},{"id":18425,"depth":498,"text":12734,"children":51165},[51166,51167,51168],{"id":51120,"depth":495,"text":51121},{"id":51127,"depth":495,"text":51128},{"id":51134,"depth":495,"text":51135},{"id":46677,"depth":498,"text":46678},"2025-07-23",{"read":46726,"type":513,"tool":51172,"category":51173,"tags":51174,"location":46733,"featuredimg":51175,"landingimg":51176,"layout":51177,"summary":51178,"video":523},[46728],[50552],[48365,48366],"\u002Fblog\u002Fxpath-post.webp","\u002Fblog\u002Fx-path-sq.webp","Guide","Learn all about XPath selectors, how to use them and what they can do to power up your data extraction process.","\u002Fblog\u002Fmastering-xpath-selectors",{"title":50717,"description":494},"blog\u002Fmastering-xpath-selectors","pdKGjmFZNd_mXl-N4sR8JNhlHHBGlNkjX7Sz5AIBRoM",[50552],[513],[46728],{"id":51187,"title":51040,"author":48082,"body":51188,"date":51658,"description":51659,"draft":26250,"extension":506,"meta":51660,"navigation":522,"path":51667,"seo":51668,"stem":51669,"__hash__":51670,"pinned":-1,"category":51671,"type":51672,"tool":51673},"blog\u002Fblog\u002Fweb-scraping-with-python.md",{"type":8,"value":51189,"toc":51647},[51190,51193,51196,51200,51203,51206,51216,51223,51227,51238,51271,51274,51309,51313,51321,51332,51390,51396,51434,51441,51445,51448,51507,51510,51572,51576,51579,51583,51586,51591,51594,51599,51603,51606,51611,51634,51637,51639,51645],[14,51191,51192],{},"There are many code and no-code methods of interacting with the web automatically - whether that's to extract data from websites, perform tasks automatically, or any other interaction that you can think of. From extracting prices from a website, automatically filling in websites, or keeping track of social media trends automatically, web scraping can help you with the data side of things.",[14,51194,51195],{},"We are going to be looking at Python in this tutorial and how we can take advantage of it to scrape data from a website. We recommend that you have a basic understanding of Python before attempting to implement this as this tutorial will get into the code side of things.",[21,51197,51199],{"id":51198},"the-process","The process",[14,51201,51202],{},"The process of web scraping can be split into a few different stages.",[14,51204,51205],{},"First, we need to identify the data that we are looking for from the page. This might be something like a price, or a description of a product, or really anything that is present on the page that we are going to retrieve. We are going to need to understand some of the underlying HTML that is used to identify these elements on the page.",[14,51207,51208],{},[807,51209,51210,51211,51215],{},"Tip: check out our article ",[322,51212,13693],{"href":51213,"rel":51214},"https:\u002F\u002Faxiom.ai\u002Fblog\u002Fbest-custom-css-selectors-for-web-scraping",[2245]," to help you identify good CSS selectors to use.",[14,51217,51218,51219,51222],{},"Remember, it's always wise to respect a websites ",[807,51220,51221],{},"robots.txt"," file in respect to what they allow for scraping and what they don't - this is a common method that sites use to protect their content. You should also consider the legal ramifications on scraping the data, for example, if you are scraping copyrighted content that you intend to use for commerical purposes this may be a legal no-no. We can't offer advice on legal issues but we would recommend reaching out to a legal professional if you are unsure.",[21,51224,51226],{"id":51225},"retrieving-website-data","Retrieving website data",[14,51228,51229,51230,51233,51234,51237],{},"We are going to want to start by retrieving the data from the website. We are going to use the ",[90,51231,51232],{},"urllib3"," library that is installable using the following command: ",[90,51235,51236],{},"pip install urllib3",". Once this has been installed we can make use of this to make HTTP requests that we can use in order to retrieve data from the website. This library will keep things simple when making these requests. Let's look at an example:",[719,51239,51241],{"className":51051,"code":51240,"language":51053,"meta":494,"style":494},"import urllib3\n\npool_manager = urllib3.PoolManager()\nweb_data = pool_manager.request('GET', 'http:\u002F\u002Fwww.google.com')\n\nprint(web_data.data)\n",[90,51242,51243,51248,51252,51257,51262,51266],{"__ignoreMap":494},[727,51244,51245],{"class":729,"line":730},[727,51246,51247],{},"import urllib3\n",[727,51249,51250],{"class":729,"line":498},[727,51251,1898],{"emptyLinePlaceholder":522},[727,51253,51254],{"class":729,"line":495},[727,51255,51256],{},"pool_manager = urllib3.PoolManager()\n",[727,51258,51259],{"class":729,"line":1895},[727,51260,51261],{},"web_data = pool_manager.request('GET', 'http:\u002F\u002Fwww.google.com')\n",[727,51263,51264],{"class":729,"line":1901},[727,51265,1898],{"emptyLinePlaceholder":522},[727,51267,51268],{"class":729,"line":1973},[727,51269,51270],{},"print(web_data.data)\n",[14,51272,51273],{},"We're just printing out the data for now but later in the tutorial we will make use of this data and extract from it. If we want to take this one step further and take advantage of proxies, which is recommended for large scale scraping, we can do the following:",[719,51275,51277],{"className":51051,"code":51276,"language":51053,"meta":494,"style":494},"import urllib3\n\nuser_agent_header = urllib3.make_headers(user_agent=\"\u003CUSER_AGENT>\")\npool_manager = urllib3.ProxyManager('\u003CPROXY_IP>', headers=user_agent_header)\nweb_data = pool_manager.request('GET', 'http:\u002F\u002Fwww.google.com')\n\nprint(web_data.data)\n",[90,51278,51279,51283,51287,51292,51297,51301,51305],{"__ignoreMap":494},[727,51280,51281],{"class":729,"line":730},[727,51282,51247],{},[727,51284,51285],{"class":729,"line":498},[727,51286,1898],{"emptyLinePlaceholder":522},[727,51288,51289],{"class":729,"line":495},[727,51290,51291],{},"user_agent_header = urllib3.make_headers(user_agent=\"\u003CUSER_AGENT>\")\n",[727,51293,51294],{"class":729,"line":1895},[727,51295,51296],{},"pool_manager = urllib3.ProxyManager('\u003CPROXY_IP>', headers=user_agent_header)\n",[727,51298,51299],{"class":729,"line":1901},[727,51300,51261],{},[727,51302,51303],{"class":729,"line":1973},[727,51304,1898],{"emptyLinePlaceholder":522},[727,51306,51307],{"class":729,"line":2052},[727,51308,51270],{},[21,51310,51312],{"id":51311},"extracting-website-data","Extracting website data",[14,51314,51315,51316,51320],{},"Now that we have the data from the website we can work with it to extract the data that we are looking for. For the time being this data includes everything from the website, which we can't really do much with for the time being - unless that's your goal, if so, you can stop here. There are a couple of methods that we can use in order to extract data from the website data, including using ",[322,51317,51319],{"href":51318},"#regular-expressions-regex","Regular Expressions"," or additional libraries such as BeautifulSoup. To keep things simple, we are going to make use of BeautifulSoup as it offers an easier to understand method.",[14,51322,51323,51324,51327,51328,51331],{},"To get started, we will need to install ",[90,51325,51326],{},"BeautifulSoup"," using the following command: ",[90,51329,51330],{},"pip install beautifulsoup4",". We are going to take advantage of the snippet above that we used to retrieve the data to build out a script that looks like the following:",[719,51333,51335],{"className":51051,"code":51334,"language":51053,"meta":494,"style":494},"import urllib3\nfrom bs4 import BeautifulSoup\n\npool_manager = urllib3.PoolManager()\nweb_data = pool_manager.request('GET', 'http:\u002F\u002Fwww.google.com')\n\nsoup = BeautifulSoup(web_data.data, 'html.parser')\n\nfor link_tag in soup.find_all('a'):\n  href = link_tag.get('href')\n  if href:\n    print(href)\n",[90,51336,51337,51341,51345,51349,51353,51357,51361,51366,51370,51375,51380,51385],{"__ignoreMap":494},[727,51338,51339],{"class":729,"line":730},[727,51340,51247],{},[727,51342,51343],{"class":729,"line":498},[727,51344,51070],{},[727,51346,51347],{"class":729,"line":495},[727,51348,1898],{"emptyLinePlaceholder":522},[727,51350,51351],{"class":729,"line":1895},[727,51352,51256],{},[727,51354,51355],{"class":729,"line":1901},[727,51356,51261],{},[727,51358,51359],{"class":729,"line":1973},[727,51360,1898],{"emptyLinePlaceholder":522},[727,51362,51363],{"class":729,"line":2052},[727,51364,51365],{},"soup = BeautifulSoup(web_data.data, 'html.parser')\n",[727,51367,51368],{"class":729,"line":2058},[727,51369,1898],{"emptyLinePlaceholder":522},[727,51371,51372],{"class":729,"line":2064},[727,51373,51374],{},"for link_tag in soup.find_all('a'):\n",[727,51376,51377],{"class":729,"line":2087},[727,51378,51379],{},"  href = link_tag.get('href')\n",[727,51381,51382],{"class":729,"line":2140},[727,51383,51384],{},"  if href:\n",[727,51386,51387],{"class":729,"line":2154},[727,51388,51389],{},"    print(href)\n",[14,51391,51392,51393,51395],{},"In the sample above we are just retrieving the links from the page and printing them, but this can be changed to more complex selectors. We can take advantage of the ",[90,51394,47277],{}," function available in BeautifulSoup, for example:",[719,51397,51399],{"className":51051,"code":51398,"language":51053,"meta":494,"style":494},"# ... including the code above\n\n# Return elements based on classname\nclassname_text = soup.select('a.my-favourite-class')\n\n# Return based on attribute\nattribute_text = soup.select('[data-id=\"1234\"]')\n",[90,51400,51401,51406,51410,51415,51420,51424,51429],{"__ignoreMap":494},[727,51402,51403],{"class":729,"line":730},[727,51404,51405],{},"# ... including the code above\n",[727,51407,51408],{"class":729,"line":498},[727,51409,1898],{"emptyLinePlaceholder":522},[727,51411,51412],{"class":729,"line":495},[727,51413,51414],{},"# Return elements based on classname\n",[727,51416,51417],{"class":729,"line":1895},[727,51418,51419],{},"classname_text = soup.select('a.my-favourite-class')\n",[727,51421,51422],{"class":729,"line":1901},[727,51423,1898],{"emptyLinePlaceholder":522},[727,51425,51426],{"class":729,"line":1973},[727,51427,51428],{},"# Return based on attribute\n",[727,51430,51431],{"class":729,"line":2052},[727,51432,51433],{},"attribute_text = soup.select('[data-id=\"1234\"]')\n",[14,51435,51436,51437,51440],{},"You can use this code for all CSS selectors that you can use in the ",[90,51438,51439],{},"document.querySelector"," function available in JavaScript.",[21,51442,51444],{"id":51443},"real-world-example","Real world example",[14,51446,51447],{},"Now that we have some of the basics down it's time to look at a real world example. Let's say that we want to go to rte.ie and download the current news headlines that they are displaying on their homepage. To do this we will first need to retrieve the website data itself, and then we want to extract the headlines from the data. Our code would look something like the following:",[719,51449,51451],{"className":51051,"code":51450,"language":51053,"meta":494,"style":494},"import urllib3\nfrom bs4 import BeautifulSoup\n\npool_manager = urllib3.PoolManager()\nwebsite_data = pool_manager.request('GET', 'http:\u002F\u002Fwww.rte.ie')\n\nsoup = BeautifulSoup(website_data.data, 'html.parser')\n\nfor article_titles in soup.select('.article-title span'):\n    title = article_titles.get('title')\n    if title:\n        print(title)\n",[90,51452,51453,51457,51461,51465,51469,51474,51478,51483,51487,51492,51497,51502],{"__ignoreMap":494},[727,51454,51455],{"class":729,"line":730},[727,51456,51247],{},[727,51458,51459],{"class":729,"line":498},[727,51460,51070],{},[727,51462,51463],{"class":729,"line":495},[727,51464,1898],{"emptyLinePlaceholder":522},[727,51466,51467],{"class":729,"line":1895},[727,51468,51256],{},[727,51470,51471],{"class":729,"line":1901},[727,51472,51473],{},"website_data = pool_manager.request('GET', 'http:\u002F\u002Fwww.rte.ie')\n",[727,51475,51476],{"class":729,"line":1973},[727,51477,1898],{"emptyLinePlaceholder":522},[727,51479,51480],{"class":729,"line":2052},[727,51481,51482],{},"soup = BeautifulSoup(website_data.data, 'html.parser')\n",[727,51484,51485],{"class":729,"line":2058},[727,51486,1898],{"emptyLinePlaceholder":522},[727,51488,51489],{"class":729,"line":2064},[727,51490,51491],{},"for article_titles in soup.select('.article-title span'):\n",[727,51493,51494],{"class":729,"line":2087},[727,51495,51496],{},"    title = article_titles.get('title')\n",[727,51498,51499],{"class":729,"line":2140},[727,51500,51501],{},"    if title:\n",[727,51503,51504],{"class":729,"line":2154},[727,51505,51506],{},"        print(title)\n",[14,51508,51509],{},"Once this has been run, we will end up with a list of headlines being output in the console, as of the time of writing, this is a subset of the results that were retrieved:",[719,51511,51515],{"className":51512,"code":51513,"language":51514,"meta":494,"style":494},"language-txt shiki shiki-themes github-light-default github-dark-default","New documentary highlights inspiring stories from Irish educators\n'I have to have hope' says Tuam relative amid excavation\nEU says could target €72bn of goods if tariff talks fail\nOver half of Wallace allegations substantiated - report\nFive young siblings rescued from sea by off-duty nurses\nStatus Yellow thunderstorm warning for 14 counties\nReliance on Clifford doesn't bode well for Kerry\nWhy we made it - The Last Irish Missionaries\nBryan Dobson on the joy of retirement and his advice to Joe Duffy\nLocal students win national robotics championship\n...\n","txt",[90,51516,51517,51522,51527,51532,51537,51542,51547,51552,51557,51562,51567],{"__ignoreMap":494},[727,51518,51519],{"class":729,"line":730},[727,51520,51521],{},"New documentary highlights inspiring stories from Irish educators\n",[727,51523,51524],{"class":729,"line":498},[727,51525,51526],{},"'I have to have hope' says Tuam relative amid excavation\n",[727,51528,51529],{"class":729,"line":495},[727,51530,51531],{},"EU says could target €72bn of goods if tariff talks fail\n",[727,51533,51534],{"class":729,"line":1895},[727,51535,51536],{},"Over half of Wallace allegations substantiated - report\n",[727,51538,51539],{"class":729,"line":1901},[727,51540,51541],{},"Five young siblings rescued from sea by off-duty nurses\n",[727,51543,51544],{"class":729,"line":1973},[727,51545,51546],{},"Status Yellow thunderstorm warning for 14 counties\n",[727,51548,51549],{"class":729,"line":2052},[727,51550,51551],{},"Reliance on Clifford doesn't bode well for Kerry\n",[727,51553,51554],{"class":729,"line":2058},[727,51555,51556],{},"Why we made it - The Last Irish Missionaries\n",[727,51558,51559],{"class":729,"line":2064},[727,51560,51561],{},"Bryan Dobson on the joy of retirement and his advice to Joe Duffy\n",[727,51563,51564],{"class":729,"line":2087},[727,51565,51566],{},"Local students win national robotics championship\n",[727,51568,51569],{"class":729,"line":2140},[727,51570,51571],{},"...\n",[21,51573,51575],{"id":51574},"helpful-tips","Helpful tips",[14,51577,51578],{},"We've compiled some helpful tips that you can use within your scripts to help you get the most out of it.",[639,51580,51582],{"id":51581},"regular-expressions-regex","Regular Expressions (RegEx)",[14,51584,51585],{},"Regular Expressions, commonly known as RegEx, are patterns that can be used to match data without knowing the exact data. RegEx is commonly used to match data based on the characters it includes, or the format of the text. A common example of this is using RegEx to check if a string of text is an email, checking for things like the @ symbol and that it looks like an email. These RegExs are not very human-readable, but they are readable by the programming language that you are working with, let's look at a basic one for email:",[14,51587,51588],{},[90,51589,51590],{},"email_regex = r\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\"",[14,51592,51593],{},"This looks like a mess but does check for various important pieces of an email address, including: the @ symbol, the format of the domain and that there are enough characters in it to ensure that it is a valid email. It won't catch everything, but should catch most common emails.",[14,51595,51596],{},[807,51597,51598],{},"Tip: LLMs are fantastic for this type of work, try: \"Can you create a RegEx for checking valid email addresses in Python?\"",[639,51600,51602],{"id":51601},"ssl-error","SSL error",[14,51604,51605],{},"When running this code for the first time, you may experience the following error from urllib3:",[14,51607,51608],{},[90,51609,51610],{},"urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='\u003CSITE>', port=443): Max retries exceeded with url: \u002F (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1028)')))",[14,51612,51613,51614,51617,51618,51621,51622,51625,51626,51629,51630,51633],{},"This most often occurs with macOS ans can be resolved by first installing ",[90,51615,51616],{},"certifi"," using the ",[90,51619,51620],{},"pip install --upgrade certifi"," command. Once this has been done, head into your Python installation, often located at ",[90,51623,51624],{},"Applications\u002FPython 3.x\u002F"," and run the ",[90,51627,51628],{},"Install Certificates.command"," file (you may not see the ",[90,51631,51632],{},".command"," part but that's okay).",[14,51635,51636],{},"Try running your code once more and this should be resolved.",[21,51638,796],{"id":795},[14,51640,51641,51642,44],{},"Web scraping with Python can be pretty straight forward and requires little experience with Python - depending on how in-depth you want to get with your script, of course. We introduced one method of retrieving data from a website and then extracting data from it using BeautifulSoup and urllib3. We're excited to hear about what you do with this - let us know over in our ",[322,51643,3326],{"href":8928,"rel":51644},[2245],[811,51646,4898],{},{"title":494,"searchDepth":495,"depth":495,"links":51648},[51649,51650,51651,51652,51653,51657],{"id":51198,"depth":498,"text":51199},{"id":51225,"depth":498,"text":51226},{"id":51311,"depth":498,"text":51312},{"id":51443,"depth":498,"text":51444},{"id":51574,"depth":498,"text":51575,"children":51654},[51655,51656],{"id":51581,"depth":495,"text":51582},{"id":51601,"depth":495,"text":51602},{"id":795,"depth":498,"text":796},"2025-07-15","Learn how to scrape the web with your python scripts to give you full control over your scraping process.",{"read":46726,"type":90,"tool":51661,"category":51662,"tags":51663,"location":46733,"featuredimg":51665,"landingimg":51666,"summary":51659,"video":523},[46802],[48207],[3974,51664],"updates","\u002Fblog\u002Fpython-scraping-post.webp","\u002Fblog\u002Fpython-scraping.webp","\u002Fblog\u002Fweb-scraping-with-python",{"title":51040,"description":51659},"blog\u002Fweb-scraping-with-python","p1LRwoGMd3SROC6AvJjkhzpMmI9Oqfs14jdlu-P8Nd0",[48207],[90],[46802],{"id":51675,"title":51676,"author":48082,"body":51677,"date":51883,"description":51884,"draft":26250,"extension":506,"meta":51885,"navigation":522,"path":51893,"seo":51894,"stem":51895,"__hash__":51896,"pinned":-1,"category":51897,"type":51898,"tool":51899},"blog\u002Fblog\u002Fweb-scraping-without-getting-blocked.md","Web Scraping Without Getting Blocked",{"type":8,"value":51678,"toc":51871},[51679,51681,51684,51692,51706,51709,51717,51720,51724,51729,51732,51735,51738,51742,51747,51750,51753,51757,51762,51770,51774,51777,51781,51786,51789,51792,51799,51803,51808,51811,51815,51822,51825,51828,51853,51859,51861,51864],[21,51680,50723],{"id":50722},[14,51682,51683],{},"Web scraping, also known as web crawling, is the act of scraping data from a website by downloading and parsing the HTML to extract data. Search engines often do this to be able to surface search results. Often it's easier to find an API that can provide this data to you - this is because it already comes in a machine readable format that is much easier to store and manipulate.",[14,51685,51686,51687,51691],{},"We've seen numerous use cases where ",[322,51688,3435],{"href":51689,"rel":51690},"https:\u002F\u002Faxiom.ai",[2245]," has helped individuals and businesses automate the scraping of web pages to help them with:",[80,51693,51694,51697,51700,51703],{},[83,51695,51696],{},"Competitor monitoring",[83,51698,51699],{},"Price monitoring",[83,51701,51702],{},"Lead generation",[83,51704,51705],{},"Research dataset collection",[14,51707,51708],{},"Scraping data from the web can be a powerful tool for generating datasets to be later used in wider applications and there are various tools out there that can help you achieve your goals. However, the downside of web scraping (with any of these tools) is sites generally don't like bots scraping their content and will put active blockers in your path, such as:",[80,51710,51711,51714],{},[83,51712,51713],{},"CAPTCHA - where you may need to solve a puzzle to confirm you're human.",[83,51715,51716],{},"CloudFlare verification - a verification tool that will only let you enter a site once it's confirmed you're human (or can convince them you are!).",[14,51718,51719],{},"Let's dive into some things that you can do to unblock yourself.",[21,51721,51723],{"id":51722},"proxies","Proxies",[8898,51725,51726],{},[14,51727,51728],{},"A proxy is a server that acts as an intermediary for requests between clients and servers.",[14,51730,51731],{},"Using a proxy allows you to determine various factors on how your activity is perceived by the server that you are requesting resources from - this includes when you're just visiting a site. When making a large number of requests to a specific server, it's possible that they recognise the traffic and block the IP that you are accessing the site from. Using proxies allows you to get around this as it routes your traffic through an IP address that you can change if it gets blocked - this can allow your connection to appear as if it's coming through multiple sources, lessening the risk of being recognised.",[14,51733,51734],{},"Residential proxies are IP addresses that are generally provided to residential connections by ISPs, which means that they are less likely to trigger alarms as they are considered a safer connection - just like you may be accessing this article from! Stealth proxies are also available and are designed to be difficult to recognise as a proxy. Data center proxies are also available, but may be at a higher risk of identification - however, these may be cheaper to purchase. Choosing the right proxy type will depend on the amount of traffic and the level of security\u002Fspoofing that you require for your project.",[14,51736,51737],{},"If you have a large scale project, consider rotating your proxies. This practice allows you to have a single script that can rotate between various proxies. This dramatically reduces the risk of your proxies being blocked as if done right this will distribute the traffic between any proxy that you have access to within your script. This can also help you recover if one of the proxies is blocked.",[21,51739,51741],{"id":51740},"headless","Headless",[8898,51743,51744],{},[14,51745,51746],{},"A headless browser is a lightweight browser that lacks a user interface, primarily used for automated testing and web scraping.",[14,51748,51749],{},"While headless browsers lack a user interface, their ability to be controlled programmatically is their real superpower. They can render webpages, interact with them and execute JavaScript as it would be when run on a non-headless browser. Combined with a library like Puppeteer or Selenium this allows you to write scripts to control a headless browser - whether this is for testing or for web scraping. These libraries allow for user interactions, page navigations, handling cookies and other complex tasks like executing their own JavaScript scripts on pages.",[14,51751,51752],{},"The one downside of using a headless browser for testing and web scraping is the lack of user interface - this makes debugging more difficult and we would recommend that you add robust error handling within your scripts to avoid being in the dark when things do go wrong while testing.",[21,51754,51756],{"id":51755},"captcha-solving","CAPTCHA Solving",[8898,51758,51759],{},[14,51760,51761],{},"CAPTCHA is a tool that website administrators use to avoid spam or protect login\u002Fregistration forms. There are many types of CAPTCHA that present puzzles to the website visitor.",[14,51763,51764,51765,51769],{},"We all know the dreaded \"I'm not a robot\" prompt that appears from time to time to check if you're human - CAPTCHA will stop your scripts in their tracks unless you account for it during your script runs. There are various services available that can help you solve CAPTCHAs on webpages when operating your browser programmatically - ",[322,51766,6548],{"href":51767,"rel":51768},"https:\u002F\u002F2captcha.com",[2245],", for example. It's worth noting that these services do not always have the ability to solve more complex CAPTCHA, or even custom ones that are created by the organisation who owns the site that you are looking to automate.",[21,51771,51773],{"id":51772},"storing-cookies-and-local-storage","Storing cookies and local storage",[14,51775,51776],{},"Sometimes, the best way to get around CAPTCHA prompts is to avoid what causes them to appear. CAPTCHA will often appear in login\u002Fregistration forms and can prevent you from continuing with the script execution. Storing cookies and local storage means that you can carry over an authentication session into your scripts meaning that you can skip the login process completely and avoid the CAPTCHA showing. This has the benefit of speeding up your scripts.",[21,51778,51780],{"id":51779},"apis","APIs",[8898,51782,51783],{},[14,51784,51785],{},"An API (Application Programming Interface) is a set of rules and protocols that allows different software applications to communicate and exchange data with each other.",[14,51787,51788],{},"APIs are used all around us - websites, apps, and operating systems use them for a wide range of applications. Let's say you open the weather app on your phone, the app will reach out to the services API to retrieve the most up-to-date weather data to show it to you.",[14,51790,51791],{},"Using APIs to access the data that you are looking for tends to be a better path when you are looking to extract data from a website - however, finding an API that has the data that you need can be difficult as they are not always officially publicly available. Using an API provides an already formatted dataset that can be used within your script easier than scraping the data from a webpage.",[14,51793,51794,51795,44],{},"As an example of this, you can check out the following website and compare scraping it via a script versus retrieving it using the API: ",[322,51796,51797],{"href":51797,"rel":51798},"https:\u002F\u002Fjsonplaceholder.typicode.com\u002Fposts",[2245],[21,51800,51802],{"id":51801},"rate-limits","Rate limits",[8898,51804,51805],{},[14,51806,51807],{},"A rate limit is a control mechanism that defines the frequency or number of requests a user or client can make to a server or API within a specific period of time.",[14,51809,51810],{},"Rate limits apply to most APIs in order to protect them from attacks that may render the service unavailable to other users. We use it here at axiom.ai to protect our API. Understanding an APIs rate limit, or a services rate limit, is important to prevent you hitting the ceiling when visiting the website. Rate limits are often based on a per minute basis - for example, for axiom.ai this is 100 requests per minute.",[21,51812,51814],{"id":51813},"bypass-bot-detection","Bypass Bot Detection",[14,51816,51817,51818,51821],{},"This is an axiom.ai specific option - the ability to automatically bypass the Cloudflare verification screen. Cloudflare aims to protect sites from DDoS attacks and ensure that they remain available. This may be thought about as a more advanced CAPTCHA that can't be worked around with standard methods. When your script hits this roadblock it will not continue to run and will likely run into an error, or get stuck running. axiom.ai offers a ",[322,51819,51814],{"href":51820},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fbypass-bot-detection"," option that allows your scripts to get around these roadblocks.",[21,51823,3435],{"id":51824},"axiomai",[14,51826,51827],{},"While most roadblocks above can be solved using libraries and services that are available to add into your web scraping scripts, axiom.ai has a lot of these features built into it that can help you get going quickly. We have documentation on getting around all of these roadblocks:",[80,51829,51830,51835,51840,51844,51848],{},[83,51831,51832],{},[322,51833,51723],{"href":51834},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fproxy",[83,51836,51837],{},[322,51838,51741],{"href":51839},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fheadless",[83,51841,51842],{},[322,51843,51756],{"href":6547},[83,51845,51846],{},[322,51847,51814],{"href":51820},[83,51849,51850],{},[322,51851,51852],{"href":6540},"Store cookies and local storage",[14,51854,51855,51856,51858],{},"axiom.ai does not directly support APIs, but they can be used within the ",[322,51857,4083],{"href":494}," step that is available.",[21,51860,796],{"id":795},[14,51862,51863],{},"Encountering these roadblocks can seem like the end of the path when you first encounter them, but that's not the case! Getting around these roadblocks is actually quite easy if you know some of the tools that are available. From using proxies to using CAPTCHA solving services, there are method of getting around these bumps in the road.",[14,51865,51866,51867],{},"Have any other methods that you like to use in your scripts? ",[322,51868,51870],{"href":8928,"rel":51869},[2245],"Let us know!",{"title":494,"searchDepth":495,"depth":495,"links":51872},[51873,51874,51875,51876,51877,51878,51879,51880,51881,51882],{"id":50722,"depth":498,"text":50723},{"id":51722,"depth":498,"text":51723},{"id":51740,"depth":498,"text":51741},{"id":51755,"depth":498,"text":51756},{"id":51772,"depth":498,"text":51773},{"id":51779,"depth":498,"text":51780},{"id":51801,"depth":498,"text":51802},{"id":51813,"depth":498,"text":51814},{"id":51824,"depth":498,"text":3435},{"id":795,"depth":498,"text":796},"2025-06-03","Learn how to scrape the web without fear of getting blocked.",{"read":46726,"type":513,"tool":51886,"category":51887,"tags":51888,"featuredimg":51891,"landingimg":51892,"summary":51884,"video":523,"metaTitle":51676},[46728,46802],[48207],[51722,51740,51889,51890,7854],"captcha","cookies","\u002Fblocked-post.webp","\u002Fblocked-sq.webp","\u002Fblog\u002Fweb-scraping-without-getting-blocked",{"title":51676,"description":51884},"blog\u002Fweb-scraping-without-getting-blocked","oL0s9YWyABpOFChbQuUAG05w0mOlgTBbywMd5PAVIGw",[48207],[513],[46728,46802],{"id":51901,"title":51902,"author":48082,"body":51903,"date":52966,"description":52967,"draft":26250,"extension":506,"meta":52968,"navigation":522,"path":52975,"seo":52976,"stem":52977,"__hash__":52978,"pinned":-1,"category":52979,"type":52980,"tool":52981},"blog\u002Fblog\u002Fscraping-web-with-js.md","Scraping Web Content with JavaScript",{"type":8,"value":51904,"toc":52947},[51905,51908,51916,51919,51923,51926,51937,51941,51944,51947,51958,51968,51972,51977,52055,52061,52064,52207,52211,52214,52218,52233,52236,52344,52348,52357,52360,52458,52462,52469,52471,52478,52596,52606,52610,52613,52662,52666,52676,52679,52773,52776,52909,52913,52916,52920,52923,52933,52936,52939,52941,52944],[14,51906,51907],{},"Scraping web content with JavaScript opens up a world of possibilities. This is aimed at developers who are comfortable with the basics of JavaScript and understand how to run scripts. We recommend knowing the basics of:",[80,51909,51910,51913],{},[83,51911,51912],{},"JavaScript and Node.js",[83,51914,51915],{},"DevTools",[14,51917,51918],{},"If you don't have experience with these, don't worry! We are going to attempt to make this article as accessibly as possible to all experience levels.",[21,51920,51922],{"id":51921},"introduction-to-javascript-nodejs","Introduction to JavaScript & Node.js",[14,51924,51925],{},"JavaScript is a scripting language that powers most interactive features on a website that you use - some sites are even built purely in JavaScript using frameworks like React! When you click a button on a website, they will often use JavaScript to perform the expected action, such as submitting a form, or calling another resource.",[14,51927,51928,51929,51933,44],{},"Node.js provides a JavaScript runtime that is based on Chrome's V8 JavaScript engine that allows you to execute your JavaScript libraries outside of a browser context. This means that the scripts that you write no longer need to be included in a web page for them to run and perform actions. This is most useful for allowing JavaScript scripts to run on a server. You can learn more about it at ",[322,51930],{"href":51931,"target":51932},"https:\u002F\u002Fnodejs.org","_blank",[322,51934,51935],{"href":51935,"rel":51936},"https:\u002F\u002Fnodejs.org\u002F",[2245],[21,51938,51940],{"id":51939},"querying-a-website","Querying a website",[14,51942,51943],{},"HTTP clients can be used to send requests to a server and then receive a response from the server. When you load a webpage, resources are retrieved from the server of the site that you are viewing.",[14,51945,51946],{},"Ultimately, there are some considerations that you should take into account when choosing the method to use to query the data from a website, such as:",[80,51948,51949,51952,51955],{},[83,51950,51951],{},"Your current environment - you may find that the project that you are working on already has a library installed, or a preferred method of handling HTTP requests.",[83,51953,51954],{},"Features - certain libraries such as Axios and Got offer additional features on top of the standard Fetch API implementation.",[83,51956,51957],{},"Bundle size - any time we add new libraries to a project it can increase the bundle size. If you are concerned about bundle size, it may be best to stick with the Fetch API as a built in option.",[14,51959,51960,51961,3289,51964,51967],{},"Where possible, we would recommend attempting to find an API for the content that you are looking to scrape rather than scraping the content directly from the site. For example, rather than scraping a subreddit for the content that you are looking for, consider using their ",[90,51962,51963],{},".json",[90,51965,51966],{},".csv"," endpoints that can give you the data in a machine-readable format.",[21,51969,51971],{"id":51970},"querying-with-pure-javascript","Querying with pure JavaScript",[14,51973,5070,51974,51976],{},[90,51975,9658],{}," function that is built into JavaScript offers a method of extracting web data from a website, provided it's in a specific format, such as JSON. This function returns a promise and should be dealt as such, for example to retrieve the data on axiom.ai's subreddit:",[719,51978,51980],{"className":756,"code":51979,"language":758,"meta":494,"style":494},"const fetch_data = async () => {\n    const res = await fetch(\"https:\u002F\u002Fwww.reddit.com\u002Fr\u002Faxiom_ai.json\");\n\n    const data = await res.json();\n}\n\nfetch_data();\n",[90,51981,51982,51999,52019,52023,52040,52044,52048],{"__ignoreMap":494},[727,51983,51984,51986,51989,51991,51993,51995,51997],{"class":729,"line":730},[727,51985,2315],{"class":1986},[727,51987,51988],{"class":2376}," fetch_data",[727,51990,2321],{"class":1986},[727,51992,2382],{"class":1986},[727,51994,2385],{"class":768},[727,51996,2388],{"class":1986},[727,51998,2391],{"class":768},[727,52000,52001,52003,52006,52008,52010,52012,52014,52017],{"class":729,"line":498},[727,52002,17003],{"class":1986},[727,52004,52005],{"class":1882}," res",[727,52007,2321],{"class":1986},[727,52009,2410],{"class":1986},[727,52011,2413],{"class":2376},[727,52013,2542],{"class":768},[727,52015,52016],{"class":737},"\"https:\u002F\u002Fwww.reddit.com\u002Fr\u002Faxiom_ai.json\"",[727,52018,5005],{"class":768},[727,52020,52021],{"class":729,"line":495},[727,52022,1898],{"emptyLinePlaceholder":522},[727,52024,52025,52027,52029,52031,52033,52036,52038],{"class":729,"line":1895},[727,52026,17003],{"class":1986},[727,52028,22284],{"class":1882},[727,52030,2321],{"class":1986},[727,52032,2410],{"class":1986},[727,52034,52035],{"class":768}," res.",[727,52037,2585],{"class":2376},[727,52039,2588],{"class":768},[727,52041,52042],{"class":729,"line":1901},[727,52043,2639],{"class":768},[727,52045,52046],{"class":729,"line":1973},[727,52047,1898],{"emptyLinePlaceholder":522},[727,52049,52050,52053],{"class":729,"line":2052},[727,52051,52052],{"class":2376},"fetch_data",[727,52054,2588],{"class":768},[14,52056,52057,52058,52060],{},"As this returns a Promise, this will wait for the response from the server before continuing. You can then use the data stored in the ",[90,52059,1838],{}," variable as required.",[14,52062,52063],{},"Node.js also has a built in option to handle HTTP clients to retrieve data from website. This is one of the simplest methods of getting started as it does not require the installation of additional libraries or dependencies.",[719,52065,52067],{"className":756,"code":52066,"language":758,"meta":494,"style":494},"const http = require('http');\n\nconst req = https.request('http:\u002F\u002Fexample.com', res => {\n    const data = [];\n\n    res.on('data', _ => data.push(_));\n    res.on('end', () => console.log(data.join()));\n})\n\nreq.end();\n",[90,52068,52069,52088,52092,52121,52131,52135,52161,52190,52194,52198],{"__ignoreMap":494},[727,52070,52071,52073,52076,52078,52081,52083,52086],{"class":729,"line":730},[727,52072,2315],{"class":1986},[727,52074,52075],{"class":1882}," http",[727,52077,2321],{"class":1986},[727,52079,52080],{"class":2376}," require",[727,52082,2542],{"class":768},[727,52084,52085],{"class":737},"'http'",[727,52087,5005],{"class":768},[727,52089,52090],{"class":729,"line":498},[727,52091,1898],{"emptyLinePlaceholder":522},[727,52093,52094,52096,52099,52101,52104,52107,52109,52112,52114,52117,52119],{"class":729,"line":495},[727,52095,2315],{"class":1986},[727,52097,52098],{"class":1882}," req",[727,52100,2321],{"class":1986},[727,52102,52103],{"class":768}," https.",[727,52105,52106],{"class":2376},"request",[727,52108,2542],{"class":768},[727,52110,52111],{"class":737},"'http:\u002F\u002Fexample.com'",[727,52113,2004],{"class":768},[727,52115,52116],{"class":733},"res",[727,52118,3207],{"class":1986},[727,52120,2391],{"class":768},[727,52122,52123,52125,52127,52129],{"class":729,"line":1895},[727,52124,17003],{"class":1986},[727,52126,22284],{"class":1882},[727,52128,2321],{"class":1986},[727,52130,4973],{"class":768},[727,52132,52133],{"class":729,"line":1901},[727,52134,1898],{"emptyLinePlaceholder":522},[727,52136,52137,52140,52142,52144,52147,52149,52152,52154,52156,52158],{"class":729,"line":1973},[727,52138,52139],{"class":768},"    res.",[727,52141,1857],{"class":2376},[727,52143,2542],{"class":768},[727,52145,52146],{"class":737},"'data'",[727,52148,2004],{"class":768},[727,52150,52151],{"class":733},"_",[727,52153,3207],{"class":1986},[727,52155,21423],{"class":768},[727,52157,5043],{"class":2376},[727,52159,52160],{"class":768},"(_));\n",[727,52162,52163,52165,52167,52169,52172,52174,52176,52179,52181,52184,52187],{"class":729,"line":2052},[727,52164,52139],{"class":768},[727,52166,1857],{"class":2376},[727,52168,2542],{"class":768},[727,52170,52171],{"class":737},"'end'",[727,52173,49711],{"class":768},[727,52175,2388],{"class":1986},[727,52177,52178],{"class":768}," console.",[727,52180,2597],{"class":2376},[727,52182,52183],{"class":768},"(data.",[727,52185,52186],{"class":2376},"join",[727,52188,52189],{"class":768},"()));\n",[727,52191,52192],{"class":729,"line":2058},[727,52193,5051],{"class":768},[727,52195,52196],{"class":729,"line":2064},[727,52197,1898],{"emptyLinePlaceholder":522},[727,52199,52200,52203,52205],{"class":729,"line":2087},[727,52201,52202],{"class":768},"req.",[727,52204,2190],{"class":2376},[727,52206,2588],{"class":768},[21,52208,52210],{"id":52209},"querying-using-javascript-libraries","Querying using JavaScript libraries",[14,52212,52213],{},"There are various libraries available that can help speed up your development. Let's look into some of them.",[639,52215,52217],{"id":52216},"axios","Axios",[14,52219,52220,52223,52224,52226,52227,52229,52230,44],{},[322,52221,52217],{"href":52222,"target":51932},"https:\u002F\u002Faxios-http.com\u002Fdocs\u002Fintro"," is a Nodejs library that extends the functionality of the native ",[90,52225,7027],{}," module that comes built in. It's quite similar to ",[90,52228,9658],{}," in that it is also promise based. This will need to be installed prior to use by calling: ",[90,52231,52232],{},"npm install axios",[14,52234,52235],{},"To use Axios to retrieve data you can use the following snippet:",[719,52237,52239],{"className":756,"code":52238,"language":758,"meta":494,"style":494},"const axios = require('axios');\n\naxios.get('https:\u002F\u002Fapi.example.com')\n  .then(response => {\n    console.log(response.status);\n    console.log(response.data);\n  })\n  .catch(error => {\n    console.error(error);\n  })\n",[90,52240,52241,52259,52263,52278,52295,52304,52313,52317,52331,52340],{"__ignoreMap":494},[727,52242,52243,52245,52248,52250,52252,52254,52257],{"class":729,"line":730},[727,52244,2315],{"class":1986},[727,52246,52247],{"class":1882}," axios",[727,52249,2321],{"class":1986},[727,52251,52080],{"class":2376},[727,52253,2542],{"class":768},[727,52255,52256],{"class":737},"'axios'",[727,52258,5005],{"class":768},[727,52260,52261],{"class":729,"line":498},[727,52262,1898],{"emptyLinePlaceholder":522},[727,52264,52265,52268,52271,52273,52276],{"class":729,"line":495},[727,52266,52267],{"class":768},"axios.",[727,52269,52270],{"class":2376},"get",[727,52272,2542],{"class":768},[727,52274,52275],{"class":737},"'https:\u002F\u002Fapi.example.com'",[727,52277,12611],{"class":768},[727,52279,52280,52283,52286,52288,52291,52293],{"class":729,"line":1895},[727,52281,52282],{"class":768},"  .",[727,52284,52285],{"class":2376},"then",[727,52287,2542],{"class":768},[727,52289,52290],{"class":733},"response",[727,52292,3207],{"class":1986},[727,52294,2391],{"class":768},[727,52296,52297,52299,52301],{"class":729,"line":1901},[727,52298,17164],{"class":768},[727,52300,2597],{"class":2376},[727,52302,52303],{"class":768},"(response.status);\n",[727,52305,52306,52308,52310],{"class":729,"line":1973},[727,52307,17164],{"class":768},[727,52309,2597],{"class":2376},[727,52311,52312],{"class":768},"(response.data);\n",[727,52314,52315],{"class":729,"line":2052},[727,52316,48474],{"class":768},[727,52318,52319,52321,52323,52325,52327,52329],{"class":729,"line":2058},[727,52320,52282],{"class":768},[727,52322,2609],{"class":2376},[727,52324,2542],{"class":768},[727,52326,2539],{"class":733},[727,52328,3207],{"class":1986},[727,52330,2391],{"class":768},[727,52332,52333,52335,52337],{"class":729,"line":2064},[727,52334,17164],{"class":768},[727,52336,2539],{"class":2376},[727,52338,52339],{"class":768},"(error);\n",[727,52341,52342],{"class":729,"line":2087},[727,52343,48474],{"class":768},[639,52345,52347],{"id":52346},"got","Got",[14,52349,52350,52353,52354,44],{},[322,52351,52347],{"href":52352,"target":51932},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fgot"," is a feature-rich HTTP request library that is specifically designed to be used with Nodejs. Under the hood it uses the fetch API to send your requests but also offers some advanced functionality that you might like to take advantage of. This will need to be installed prior to use by calling: ",[90,52355,52356],{},"npm install got",[14,52358,52359],{},"To use Got to retrieve data you can use the following snippet:",[719,52361,52363],{"className":756,"code":52362,"language":758,"meta":494,"style":494},"const got = require('got');\n\ngot('https:\u002F\u002Fapi.example.com')\n  .json()\n  .then(data => {\n    console.log(data);\n  })\n  .catch(error => {\n    console.error(error);\n  })\n",[90,52364,52365,52383,52387,52397,52405,52419,52428,52432,52446,52454],{"__ignoreMap":494},[727,52366,52367,52369,52372,52374,52376,52378,52381],{"class":729,"line":730},[727,52368,2315],{"class":1986},[727,52370,52371],{"class":1882}," got",[727,52373,2321],{"class":1986},[727,52375,52080],{"class":2376},[727,52377,2542],{"class":768},[727,52379,52380],{"class":737},"'got'",[727,52382,5005],{"class":768},[727,52384,52385],{"class":729,"line":498},[727,52386,1898],{"emptyLinePlaceholder":522},[727,52388,52389,52391,52393,52395],{"class":729,"line":495},[727,52390,52346],{"class":2376},[727,52392,2542],{"class":768},[727,52394,52275],{"class":737},[727,52396,12611],{"class":768},[727,52398,52399,52401,52403],{"class":729,"line":1895},[727,52400,52282],{"class":768},[727,52402,2585],{"class":2376},[727,52404,47105],{"class":768},[727,52406,52407,52409,52411,52413,52415,52417],{"class":729,"line":1901},[727,52408,52282],{"class":768},[727,52410,52285],{"class":2376},[727,52412,2542],{"class":768},[727,52414,1838],{"class":733},[727,52416,3207],{"class":1986},[727,52418,2391],{"class":768},[727,52420,52421,52423,52425],{"class":729,"line":1973},[727,52422,17164],{"class":768},[727,52424,2597],{"class":2376},[727,52426,52427],{"class":768},"(data);\n",[727,52429,52430],{"class":729,"line":2052},[727,52431,48474],{"class":768},[727,52433,52434,52436,52438,52440,52442,52444],{"class":729,"line":2058},[727,52435,52282],{"class":768},[727,52437,2609],{"class":2376},[727,52439,2542],{"class":768},[727,52441,2539],{"class":733},[727,52443,3207],{"class":1986},[727,52445,2391],{"class":768},[727,52447,52448,52450,52452],{"class":729,"line":2064},[727,52449,17164],{"class":768},[727,52451,2539],{"class":2376},[727,52453,52339],{"class":768},[727,52455,52456],{"class":729,"line":2087},[727,52457,48474],{"class":768},[21,52459,52461],{"id":52460},"data-extraction-with-javascript","Data Extraction with JavaScript",[14,52463,52464,52465,52468],{},"Once you have queried the site for that data that you wish to use within your script, you'll need to figure out how you want to extract that data to be able to actually ",[807,52466,52467],{},"use"," the data.",[639,52470,9620],{"id":2585},[14,52472,52473,52474,52477],{},"If the data that you have retrieved from the website is in JSON format we have good news for you - JavaScript can handle this natively using the ",[90,52475,52476],{},"JSON.parse()"," function. When combined with the Fetch API this can be quite simple to do, for example:",[719,52479,52481],{"className":756,"code":52480,"language":758,"meta":494,"style":494},"fetch('https:\u002F\u002Fapi.example.com')\n  .then(response => {\n    return response.text();\n  })\n  .then(data => {\n    try {\n      const parsedData = JSON.parse(data);\n      console.log(\"Parsed data:\", parsedData);\n    } catch (error) {\n      console.error(error);\n    }\n  })\n",[90,52482,52483,52493,52507,52517,52521,52535,52541,52558,52572,52580,52588,52592],{"__ignoreMap":494},[727,52484,52485,52487,52489,52491],{"class":729,"line":730},[727,52486,9658],{"class":2376},[727,52488,2542],{"class":768},[727,52490,52275],{"class":737},[727,52492,12611],{"class":768},[727,52494,52495,52497,52499,52501,52503,52505],{"class":729,"line":498},[727,52496,52282],{"class":768},[727,52498,52285],{"class":2376},[727,52500,2542],{"class":768},[727,52502,52290],{"class":733},[727,52504,3207],{"class":1986},[727,52506,2391],{"class":768},[727,52508,52509,52511,52513,52515],{"class":729,"line":495},[727,52510,8514],{"class":1986},[727,52512,2582],{"class":768},[727,52514,16520],{"class":2376},[727,52516,2588],{"class":768},[727,52518,52519],{"class":729,"line":1895},[727,52520,48474],{"class":768},[727,52522,52523,52525,52527,52529,52531,52533],{"class":729,"line":1901},[727,52524,52282],{"class":768},[727,52526,52285],{"class":2376},[727,52528,2542],{"class":768},[727,52530,1838],{"class":733},[727,52532,3207],{"class":1986},[727,52534,2391],{"class":768},[727,52536,52537,52539],{"class":729,"line":1973},[727,52538,2396],{"class":1986},[727,52540,2391],{"class":768},[727,52542,52543,52545,52548,52550,52552,52554,52556],{"class":729,"line":2052},[727,52544,17096],{"class":1986},[727,52546,52547],{"class":1882}," parsedData",[727,52549,2321],{"class":1986},[727,52551,12519],{"class":1882},[727,52553,44],{"class":768},[727,52555,12524],{"class":2376},[727,52557,52427],{"class":768},[727,52559,52560,52562,52564,52566,52569],{"class":729,"line":2058},[727,52561,17114],{"class":768},[727,52563,2597],{"class":2376},[727,52565,2542],{"class":768},[727,52567,52568],{"class":737},"\"Parsed data:\"",[727,52570,52571],{"class":768},", parsedData);\n",[727,52573,52574,52576,52578],{"class":729,"line":2064},[727,52575,2606],{"class":768},[727,52577,2609],{"class":1986},[727,52579,2612],{"class":768},[727,52581,52582,52584,52586],{"class":729,"line":2087},[727,52583,17114],{"class":768},[727,52585,2539],{"class":2376},[727,52587,52339],{"class":768},[727,52589,52590],{"class":729,"line":2140},[727,52591,2633],{"class":768},[727,52593,52594],{"class":729,"line":2154},[727,52595,48474],{"class":768},[14,52597,52598,52599,52602,52603],{},"This will allow you to access the data stored within the ",[90,52600,52601],{},"parsedData"," variable. ",[807,52604,52605],{},"Note, we've left out some error handling for brevity.",[639,52607,52609],{"id":52608},"html-regular-expressions","HTML - Regular expressions",[14,52611,52612],{},"If the data that you are retrieving is HTML content then the built in method of handling this would be to use regular expressions (RegEx) to parse the data. This is a bit cumbersome as RegEx can be quite a complex function to construct. We won't be diving into the ins and outs of RegEx during this article, but below is a short snippet on how to extract H1 titles from a string of HTML.",[719,52614,52616],{"className":756,"code":52615,"language":758,"meta":494,"style":494},"const results = htmlString.match(\u002F\u003Ch1>(.+)\u003C\\\u002Fh1>\u002F);\nconsole.log(results);\n",[90,52617,52618,52652],{"__ignoreMap":494},[727,52619,52620,52622,52625,52627,52630,52632,52634,52637,52639,52641,52644,52647,52650],{"class":729,"line":730},[727,52621,2315],{"class":1986},[727,52623,52624],{"class":1882}," results",[727,52626,2321],{"class":1986},[727,52628,52629],{"class":768}," htmlString.",[727,52631,8475],{"class":2376},[727,52633,2542],{"class":768},[727,52635,52636],{"class":737},"\u002F\u003Ch1>(",[727,52638,44],{"class":1882},[727,52640,8486],{"class":1986},[727,52642,52643],{"class":737},")\u003C",[727,52645,52646],{"class":8496},"\\\u002F",[727,52648,52649],{"class":737},"h1>\u002F",[727,52651,5005],{"class":768},[727,52653,52654,52657,52659],{"class":729,"line":498},[727,52655,52656],{"class":768},"console.",[727,52658,2597],{"class":2376},[727,52660,52661],{"class":768},"(results);\n",[639,52663,52665],{"id":52664},"html-jsdom","HTML - jsdom",[14,52667,52668,52672,52673,44],{},[322,52669,52671],{"href":52670,"target":51932},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fjsdom","jsdom"," replicates jQuery's functionality in the browser DOM. This would work best if you are retrieving HTML data from a website, such as scraping the whole site. This library can also parse JavaScript within the HTML, allowing you to interact with basic JavaScript - though it should be noted that this may not work as expected with JS files that are loaded into the page, which most sites will do these days, this is disabled by default. To get started, you'll need to install jsdom in your project by running: ",[90,52674,52675],{},"npm install jsdom",[14,52677,52678],{},"Let's look at an example:",[719,52680,52682],{"className":756,"code":52681,"language":758,"meta":494,"style":494},"const jsdom = require('jsdom');\nconst { JSDOM } = jsdom;\n\nconst dom = new JSDOM(`\u003C!DOCTYPE html>\u003Ch1>Hello, World!\u003C\u002Fh1>\u003C\u002Fhtml>`);\n\n\u002F\u002F Print the content of the H1 element.\nconsole.log(dom.window.document.querySelector('h1').textContent);\n",[90,52683,52684,52702,52720,52724,52745,52749,52754],{"__ignoreMap":494},[727,52685,52686,52688,52691,52693,52695,52697,52700],{"class":729,"line":730},[727,52687,2315],{"class":1986},[727,52689,52690],{"class":1882}," jsdom",[727,52692,2321],{"class":1986},[727,52694,52080],{"class":2376},[727,52696,2542],{"class":768},[727,52698,52699],{"class":737},"'jsdom'",[727,52701,5005],{"class":768},[727,52703,52704,52706,52709,52712,52715,52717],{"class":729,"line":498},[727,52705,2315],{"class":1986},[727,52707,52708],{"class":768}," { ",[727,52710,52711],{"class":1882},"JSDOM",[727,52713,52714],{"class":768}," } ",[727,52716,4970],{"class":1986},[727,52718,52719],{"class":768}," jsdom;\n",[727,52721,52722],{"class":729,"line":495},[727,52723,1898],{"emptyLinePlaceholder":522},[727,52725,52726,52728,52731,52733,52735,52738,52740,52743],{"class":729,"line":1895},[727,52727,2315],{"class":1986},[727,52729,52730],{"class":1882}," dom",[727,52732,2321],{"class":1986},[727,52734,47976],{"class":1986},[727,52736,52737],{"class":2376}," JSDOM",[727,52739,2542],{"class":768},[727,52741,52742],{"class":737},"`\u003C!DOCTYPE html>\u003Ch1>Hello, World!\u003C\u002Fh1>\u003C\u002Fhtml>`",[727,52744,5005],{"class":768},[727,52746,52747],{"class":729,"line":1901},[727,52748,1898],{"emptyLinePlaceholder":522},[727,52750,52751],{"class":729,"line":1973},[727,52752,52753],{"class":2920},"\u002F\u002F Print the content of the H1 element.\n",[727,52755,52756,52758,52760,52763,52765,52767,52770],{"class":729,"line":2052},[727,52757,52656],{"class":768},[727,52759,2597],{"class":2376},[727,52761,52762],{"class":768},"(dom.window.document.",[727,52764,47926],{"class":2376},[727,52766,2542],{"class":768},[727,52768,52769],{"class":737},"'h1'",[727,52771,52772],{"class":768},").textContent);\n",[14,52774,52775],{},"This can be used for larger websites, with the results stored in an array, for example:",[719,52777,52779],{"className":756,"code":52778,"language":758,"meta":494,"style":494},"const jsdom = require('jsdom');\nconst { JSDOM } = jsdom;\n\n\u002F\u002F Let's imagine we have a bunch of HTML in here like the example above.\nconst dom = new JSDOM(`...`);\n\nconst results = dom.window.document.querySelector('h1.title');\n\nfor (var i = 0; i \u003C results.length; i++) {\n  console.log(results[i]);\n}\n",[90,52780,52781,52797,52811,52815,52820,52839,52843,52863,52867,52896,52905],{"__ignoreMap":494},[727,52782,52783,52785,52787,52789,52791,52793,52795],{"class":729,"line":730},[727,52784,2315],{"class":1986},[727,52786,52690],{"class":1882},[727,52788,2321],{"class":1986},[727,52790,52080],{"class":2376},[727,52792,2542],{"class":768},[727,52794,52699],{"class":737},[727,52796,5005],{"class":768},[727,52798,52799,52801,52803,52805,52807,52809],{"class":729,"line":498},[727,52800,2315],{"class":1986},[727,52802,52708],{"class":768},[727,52804,52711],{"class":1882},[727,52806,52714],{"class":768},[727,52808,4970],{"class":1986},[727,52810,52719],{"class":768},[727,52812,52813],{"class":729,"line":495},[727,52814,1898],{"emptyLinePlaceholder":522},[727,52816,52817],{"class":729,"line":1895},[727,52818,52819],{"class":2920},"\u002F\u002F Let's imagine we have a bunch of HTML in here like the example above.\n",[727,52821,52822,52824,52826,52828,52830,52832,52834,52837],{"class":729,"line":1901},[727,52823,2315],{"class":1986},[727,52825,52730],{"class":1882},[727,52827,2321],{"class":1986},[727,52829,47976],{"class":1986},[727,52831,52737],{"class":2376},[727,52833,2542],{"class":768},[727,52835,52836],{"class":737},"`...`",[727,52838,5005],{"class":768},[727,52840,52841],{"class":729,"line":1973},[727,52842,1898],{"emptyLinePlaceholder":522},[727,52844,52845,52847,52849,52851,52854,52856,52858,52861],{"class":729,"line":2052},[727,52846,2315],{"class":1986},[727,52848,52624],{"class":1882},[727,52850,2321],{"class":1986},[727,52852,52853],{"class":768}," dom.window.document.",[727,52855,47926],{"class":2376},[727,52857,2542],{"class":768},[727,52859,52860],{"class":737},"'h1.title'",[727,52862,5005],{"class":768},[727,52864,52865],{"class":729,"line":2058},[727,52866,1898],{"emptyLinePlaceholder":522},[727,52868,52869,52871,52873,52875,52877,52879,52881,52883,52885,52888,52890,52892,52894],{"class":729,"line":2064},[727,52870,6783],{"class":1986},[727,52872,2524],{"class":768},[727,52874,4964],{"class":1986},[727,52876,18119],{"class":768},[727,52878,4970],{"class":1986},[727,52880,18124],{"class":1882},[727,52882,18127],{"class":768},[727,52884,18130],{"class":1986},[727,52886,52887],{"class":768}," results.",[727,52889,18136],{"class":1882},[727,52891,21428],{"class":768},[727,52893,21431],{"class":1986},[727,52895,16992],{"class":768},[727,52897,52898,52900,52902],{"class":729,"line":2087},[727,52899,48435],{"class":768},[727,52901,2597],{"class":2376},[727,52903,52904],{"class":768},"(results[i]);\n",[727,52906,52907],{"class":729,"line":2140},[727,52908,2639],{"class":768},[21,52910,52912],{"id":52911},"using-these-methods-within-axiomai","Using these methods within axiom.ai",[14,52914,52915],{},"The methods above can be used within axiom.ai to extend it's existing functionality. Let's dive into how.",[639,52917,52919],{"id":52918},"no-code-extension","No-code extension",[14,52921,52922],{},"As standard, the axiom.ai extension offers a range of scraping steps that can be used in order to scrape data from a website. These require very little set up and gives you control over the selection of elements on the page without the need to add code.",[14,52924,52925,52926,52929,52930,52932],{},"In addition to this, it's possible to use ",[807,52927,52928],{},"some"," of the methods above within the ",[322,52931,2301],{"href":494}," step within your automations. It's important to note that the importing of libraries is not supported so it would only be possible to use features that make use of the Fetch API.",[639,52934,52935],{"id":90},"Code",[14,52937,52938],{},"As part of our future updates to axiom.ai, it will be possible to build your automations with code and thus would enable all of the methods above within your automations, including the ability to install your own libraries to run your scripts.",[21,52940,796],{"id":795},[14,52942,52943],{},"We covered a lot in this article that has been centred around scraping web content with JavaScript, including some tips on some libraries that you can use in order to parse the data that you have extracted. The above article is by no means exhaustive so you may find other solutions that fit your project better than those above - but hopefully we have pointed you in the right direction!",[811,52945,52946],{},"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 .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 .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}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}",{"title":494,"searchDepth":495,"depth":495,"links":52948},[52949,52950,52951,52952,52956,52961,52965],{"id":51921,"depth":498,"text":51922},{"id":51939,"depth":498,"text":51940},{"id":51970,"depth":498,"text":51971},{"id":52209,"depth":498,"text":52210,"children":52953},[52954,52955],{"id":52216,"depth":495,"text":52217},{"id":52346,"depth":495,"text":52347},{"id":52460,"depth":498,"text":52461,"children":52957},[52958,52959,52960],{"id":2585,"depth":495,"text":9620},{"id":52608,"depth":495,"text":52609},{"id":52664,"depth":495,"text":52665},{"id":52911,"depth":498,"text":52912,"children":52962},[52963,52964],{"id":52918,"depth":495,"text":52919},{"id":90,"depth":495,"text":52935},{"id":795,"depth":498,"text":796},"2025-05-20","Learn how to get started with Javascript web scraping using pure JavaScript, Axios, Got, JSDOM and the Fetch API",{"read":46726,"type":90,"tool":52969,"category":52970,"tags":52971,"featuredimg":52973,"landingimg":52974,"summary":52967,"video":523,"metaTitle":51902},[46802],[48207],[23962,9658,52972],"require","\u002Fjavascript-web-scraping-post.webp","\u002Fjavascript-web-scraping-sq.webp","\u002Fblog\u002Fscraping-web-with-js",{"title":51902,"description":52967},"blog\u002Fscraping-web-with-js","UQbFsYyZB_nMbmAQbTKkTF-FPheFDi-QstcjaUdrm0w",[48207],[90],[46802],{"id":52983,"title":52984,"author":48082,"body":52985,"date":53410,"description":53411,"draft":26250,"extension":506,"meta":53412,"navigation":522,"path":53420,"seo":53421,"stem":53422,"__hash__":53423,"pinned":-1,"category":53424,"type":53425,"tool":53426},"blog\u002Fblog\u002Fwebhooks-explained-build-reactive-automations-today.md","Webhooks Explained - Build Reactive Automations Today",{"type":8,"value":52986,"toc":53401},[52987,52991,52994,53000,53006,53012,53018,53023,53029,53032,53036,53039,53042,53046,53063,53252,53263,53267,53275,53326,53336,53340,53343,53349,53360,53364,53367,53377,53380,53387,53389,53392,53395,53398],[21,52988,52990],{"id":52989},"what-are-webhooks","What are webhooks?",[14,52992,52993],{},"Webhooks are a method for applications to send real-time (or near enough real-time) information to each other automatically. They enable one-way communication that allows for the sending of information between applications. They have some key characteristics that differentiate them from standard APIs, let's explore them.",[14,52995,52996,52999],{},[29,52997,52998],{},"Event-driven:"," webhooks are event-driven, meaning that they operate on the principle of \"events.\" When a specific event occurs in one application, it can trigger a webhook that sends information to another application.",[14,53001,53002,53005],{},[29,53003,53004],{},"Real-time:"," the process of sending information over a webhook happens in real-time, or very close to it, allowing for instant updates and seamless communication between applications.",[14,53007,53008,53011],{},[29,53009,53010],{},"HTTP-based:"," webhooks typically use HTTP requests, most commonly POST requests, to transmit data.",[14,53013,53014,53017],{},[29,53015,53016],{},"URL-based destination:"," a webhook requires a designated URL where the payload is sent - this acts as the endpoint for receiving the webhook's message. This allows for multiple endpoints to be created to handle different payloads within the same domain.",[14,53019,53020,53022],{},[29,53021,21181],{}," webhooks often carry a payload, often formatted in JSON or XML, containing information about the triggering event - this is fully configurable and can be dynamically changed for each request.",[14,53024,53025,53028],{},[29,53026,53027],{},"One-way communication:"," webhooks are primarily designed for one way communication, from the triggering application to the destination application. The triggering application will often receive a HTTP status code to inform the status of the data sent but will never receive a payload in return.",[14,53030,53031],{},"It has some other benefits, including being simple to integrate with other applications, and reducing server load as the application does not need to constantly 'poll' for changes - that  the usual methods of communication often use. Using webhooks introduces certain disadvantages, notably: security risks from improper implementation, debugging challenges, reliance on external application reliability, and heightened complexity in advanced workflows.",[21,53033,53035],{"id":53034},"why-use-webhooks","Why use webhooks?",[14,53037,53038],{},"Webhooks offer an efficient solution for initiating automated event-driven notifications, particularly when two-way communication is unnecessary. For example, when a user action takes place in an application, a webhook can automatically send a message to a notification system (or messaging platform), which then delivers an alert to the intended recipient. The real strength of webhooks is their ease of configuration. You can dynamically modify the notification recipient through the webhook settings, allowing you to use the same notification system for a variety of users without needing to hardcode specific recipients. Think of webhooks as a dynamic, one-way pipeline, seamlessly connecting applications and delivering event-triggered information.",[14,53040,53041],{},"For developers, webhooks offer broad compatibility, and are readily integrated into applications across diverse programming environments, which will be demonstrated with Javascript and Python examples later in this article. This makes it a good choice when it comes to implementing communications in their applications.",[21,53043,53045],{"id":53044},"implementing-webhooks-in-javascript","Implementing webhooks in JavaScript",[14,53047,53048,53049,53053,53054,53058,53059,5983],{},"While there are various libraries available that can help with the implementation of webhooks, such as ",[322,53050,52216],{"href":53051,"rel":53052},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Faxios",[2245],", we are going to stick with the basics - we believe that you should know the basics before diving into libraries as it helps with troubleshooting when issues do occur. To do this in JavaScript, we are going to use the ",[322,53055,9658],{"href":53056,"rel":53057},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FFetch_API",[2245]," function. You can check out a code snippet below (",[322,53060,53062],{"href":24277,"rel":53061},[2245],"source",[719,53064,53066],{"className":756,"code":53065,"language":758,"meta":494,"style":494},"async function getData() {\n  try {\n    const response = await fetch('https:\u002F\u002Fexample.org\u002Fwebhook', {\n      method: 'POST',\n      headers: [ 'Content-Type': 'application\u002Fjson' ],\n      body: JSON.stringify({ username: 'example' }),\n      \u002F\u002F ...\n    })\n\n    if (!response.ok) {\n      throw new Error(`Response status: ${response.status}`)\n    }\n\n    const json = await response.json()\n    console.log(json)\n  } catch (error) {\n    console.error(error.message)\n  }\n}\n",[90,53067,53068,53079,53085,53105,53113,53128,53147,53152,53156,53160,53170,53193,53197,53201,53218,53227,53235,53244,53248],{"__ignoreMap":494},[727,53069,53070,53072,53074,53077],{"class":729,"line":730},[727,53071,10151],{"class":1986},[727,53073,16982],{"class":1986},[727,53075,53076],{"class":2376}," getData",[727,53078,8430],{"class":768},[727,53080,53081,53083],{"class":729,"line":498},[727,53082,9641],{"class":1986},[727,53084,2391],{"class":768},[727,53086,53087,53089,53091,53093,53095,53097,53099,53102],{"class":729,"line":495},[727,53088,17003],{"class":1986},[727,53090,2093],{"class":1882},[727,53092,2321],{"class":1986},[727,53094,2410],{"class":1986},[727,53096,2413],{"class":2376},[727,53098,2542],{"class":768},[727,53100,53101],{"class":737},"'https:\u002F\u002Fexample.org\u002Fwebhook'",[727,53103,53104],{"class":768},", {\n",[727,53106,53107,53109,53111],{"class":729,"line":1895},[727,53108,17019],{"class":768},[727,53110,2424],{"class":737},[727,53112,2427],{"class":768},[727,53114,53115,53118,53121,53123,53125],{"class":729,"line":1901},[727,53116,53117],{"class":768},"      headers: [ ",[727,53119,53120],{"class":737},"'Content-Type'",[727,53122,1995],{"class":768},[727,53124,9608],{"class":737},[727,53126,53127],{"class":768}," ],\n",[727,53129,53130,53132,53134,53136,53138,53141,53144],{"class":729,"line":1973},[727,53131,17065],{"class":768},[727,53133,9620],{"class":1882},[727,53135,44],{"class":768},[727,53137,9625],{"class":2376},[727,53139,53140],{"class":768},"({ username: ",[727,53142,53143],{"class":737},"'example'",[727,53145,53146],{"class":768}," }),\n",[727,53148,53149],{"class":729,"line":2052},[727,53150,53151],{"class":2920},"      \u002F\u002F ...\n",[727,53153,53154],{"class":729,"line":2058},[727,53155,48612],{"class":768},[727,53157,53158],{"class":729,"line":2064},[727,53159,1898],{"emptyLinePlaceholder":522},[727,53161,53162,53164,53166,53168],{"class":729,"line":2087},[727,53163,17088],{"class":1986},[727,53165,2524],{"class":768},[727,53167,2527],{"class":1986},[727,53169,2530],{"class":768},[727,53171,53172,53174,53176,53178,53180,53183,53185,53187,53189,53191],{"class":729,"line":2140},[727,53173,50350],{"class":1986},[727,53175,47976],{"class":1986},[727,53177,50409],{"class":2376},[727,53179,2542],{"class":768},[727,53181,53182],{"class":737},"`Response status: ${",[727,53184,52290],{"class":768},[727,53186,44],{"class":737},[727,53188,4348],{"class":768},[727,53190,2448],{"class":737},[727,53192,12611],{"class":768},[727,53194,53195],{"class":729,"line":2154},[727,53196,2633],{"class":768},[727,53198,53199],{"class":729,"line":1529},[727,53200,1898],{"emptyLinePlaceholder":522},[727,53202,53203,53205,53208,53210,53212,53214,53216],{"class":729,"line":2178},[727,53204,17003],{"class":1986},[727,53206,53207],{"class":1882}," json",[727,53209,2321],{"class":1986},[727,53211,2410],{"class":1986},[727,53213,2582],{"class":768},[727,53215,2585],{"class":2376},[727,53217,47105],{"class":768},[727,53219,53220,53222,53224],{"class":729,"line":2187},[727,53221,17164],{"class":768},[727,53223,2597],{"class":2376},[727,53225,53226],{"class":768},"(json)\n",[727,53228,53229,53231,53233],{"class":729,"line":2533},[727,53230,9682],{"class":768},[727,53232,2609],{"class":1986},[727,53234,2612],{"class":768},[727,53236,53237,53239,53241],{"class":729,"line":2551},[727,53238,17164],{"class":768},[727,53240,2539],{"class":2376},[727,53242,53243],{"class":768},"(error.message)\n",[727,53245,53246],{"class":729,"line":2559},[727,53247,9712],{"class":768},[727,53249,53250],{"class":729,"line":2565},[727,53251,2639],{"class":768},[14,53253,53254,53255,2004,53257,2004,53259,450,53261,44],{},"You can check out more specific examples in our guides for ",[322,53256,4914],{"href":4915},[322,53258,21233],{"href":22503},[322,53260,2246],{"href":3361},[322,53262,18287],{"href":12438},[21,53264,53266],{"id":53265},"implementing-webhooks-in-python","Implementing webhooks in Python",[14,53268,53269,53270,53274],{},"Python is a very popular language for data science, and as such, you may find the need to trigger a webhook from your Python scripts to another application (did someone say ",[322,53271,53273],{"href":53272},"\u002Fdocs\u002Fdeveloper-hub\u002Fapi","axiom.ai's API","?). This can be done relatively simple within Python and has code that's simpler than JavaScript, see below:",[719,53276,53278],{"className":51051,"code":53277,"language":51053,"meta":494,"style":494},"import requests\n\nwebhook_url = 'https:\u002F\u002Fwww.example.com\u002Fwebhook'\n\ndata = {\n  'event': 'button_triggered',\n  'user_id': 12345\n}\n\nrequests.post(webhook_url, json=data)\n",[90,53279,53280,53285,53289,53294,53298,53303,53308,53313,53317,53321],{"__ignoreMap":494},[727,53281,53282],{"class":729,"line":730},[727,53283,53284],{},"import requests\n",[727,53286,53287],{"class":729,"line":498},[727,53288,1898],{"emptyLinePlaceholder":522},[727,53290,53291],{"class":729,"line":495},[727,53292,53293],{},"webhook_url = 'https:\u002F\u002Fwww.example.com\u002Fwebhook'\n",[727,53295,53296],{"class":729,"line":1895},[727,53297,1898],{"emptyLinePlaceholder":522},[727,53299,53300],{"class":729,"line":1901},[727,53301,53302],{},"data = {\n",[727,53304,53305],{"class":729,"line":1973},[727,53306,53307],{},"  'event': 'button_triggered',\n",[727,53309,53310],{"class":729,"line":2052},[727,53311,53312],{},"  'user_id': 12345\n",[727,53314,53315],{"class":729,"line":2058},[727,53316,2639],{},[727,53318,53319],{"class":729,"line":2064},[727,53320,1898],{"emptyLinePlaceholder":522},[727,53322,53323],{"class":729,"line":2087},[727,53324,53325],{},"requests.post(webhook_url, json=data)\n",[14,53327,53328,53329,53331,53332,53335],{},"As yuo can see, the ",[90,53330,1838],{}," variable can be modified to use any data that you wish to include in your payload. This data will then be sent to the webhook defined in the ",[90,53333,53334],{},"webhook_url"," variable.",[21,53337,53339],{"id":53338},"testing-your-webhooks","Testing your webhooks",[14,53341,53342],{},"There are various tools available for testing webhooks to ensure that your implementation is working as expected, let's look at a couple of these tools:",[14,53344,53345,53348],{},[29,53346,53347],{},"Postman:"," this tool allows you to send HTTP requests and observe their responses, this can be useful in ensuring that you are sending your payload to the correct endpoint and observe the status that you receive back. This can enable you to debug your POST requests and troubleshoot any issues that you are experiencing. It's free to use so well worth checking out.",[14,53350,53351,53354,53355,44],{},[29,53352,53353],{},"Webhook.site:"," another free tool - Website.site allows you to test triggering of your webhooks. You can use this within your source application to observe what payload the destination application is receiving when you send the payload. This can be helpful for debugging the payload that you are sending. Learn more: ",[322,53356,53359],{"href":53357,"rel":53358},"https:\u002F\u002Fwebhook.site",[2245],"https:\u002F\u002Fwebhook.site\u002F",[21,53361,53363],{"id":53362},"using-webhooks-in-axiomai","Using webhooks in axiom.ai",[14,53365,53366],{},"There are a few methods of sending data to a webhook in your automation using axiom.ai, such as using:",[80,53368,53369,53373],{},[83,53370,5070,53371,1230],{},[322,53372,7722],{"href":18400},[83,53374,5070,53375,1230],{},[322,53376,2301],{"href":2300},[14,53378,53379],{},"Both options allow you full control over the endpoint and the payload that contains your data - plus, both have the ability to use data tokens to automatically include data from your automations. This allows you to create a payload that contains information from your automation, such as scrape data, alerts and other notifications. The only benefit of using the JavaScript method is having more control over the HTTP status response that the webhook would receive - this does not come through the \"Trigger webhook\" step.",[14,53381,53382,53383,44],{},"You might also be interested in how you can use webhooks to send notifications from your automation: ",[322,53384,53386],{"href":53385},"\u002Fblog\u002Fenhance-your-automations-with-notifications","Enhance Your Automations with Notifications",[21,53388,796],{"id":795},[14,53390,53391],{},"Webhooks offer a powerful and efficient way to connect applications, enabling real-time data exchange and automated workflows. Their event-driven nature, combined with simplicity and flexibility, makes them a valuable tool for developers. By understanding the core concepts – event triggers, HTTP-based communication, and payload delivery – you can effectively leverage webhooks to streamline processes and create seamless integrations.",[14,53393,53394],{},"While we've explored basic implementations in JavaScript and Python, remember that the true potential of webhooks lies in their adaptability. From simple notifications to complex data pipelines, they provide a configurable bridge between services. However, it's crucial to be mindful of potential challenges, such as security risks and debugging complexities.",[14,53396,53397],{},"Whether you're looking to enhance your automations with real-time alerts or build sophisticated data-driven applications, webhooks offer a versatile solution. And with tools like axiom.ai, you can further simplify the process by easily incorporating webhooks into your automated workflows. As you continue to explore the world of webhooks, you'll discover their ability to unlock new possibilities and drive innovation in your projects.",[811,53399,53400],{},"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 .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 .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":494,"searchDepth":495,"depth":495,"links":53402},[53403,53404,53405,53406,53407,53408,53409],{"id":52989,"depth":498,"text":52990},{"id":53034,"depth":498,"text":53035},{"id":53044,"depth":498,"text":53045},{"id":53265,"depth":498,"text":53266},{"id":53338,"depth":498,"text":53339},{"id":53362,"depth":498,"text":53363},{"id":795,"depth":498,"text":796},"2025-05-13","Unlock seamless app integrations with webhooks. Explore how these powerful tools enable real-time communication, automate data flow, and connect your favourite applications effortlessly.",{"read":46726,"type":90,"tool":53413,"category":53414,"tags":53415,"featuredimg":53418,"landingimg":53419,"summary":53411,"video":523,"metaTitle":52984},[46728,46802],[50552],[53416,12571,53417],"webhooks","post","\u002Fwebhook-post.webp","\u002Fwebhook-sq.webp","\u002Fblog\u002Fwebhooks-explained-build-reactive-automations-today",{"title":52984,"description":53411},"blog\u002Fwebhooks-explained-build-reactive-automations-today","KTnmnYjbrr3hswgbzEiiNsDrc_zTke1ccLxF8JkpeBk",[50552],[90],[46728,46802],{"id":53428,"title":53429,"author":48082,"body":53430,"date":53984,"description":53985,"draft":26250,"extension":506,"meta":53986,"navigation":522,"path":53996,"seo":53997,"stem":53998,"__hash__":53999,"pinned":-1,"category":54000,"type":54001,"tool":54002},"blog\u002Fblog\u002Fcreating-a-no-code-auto-clicker.md","Creating a No-code Auto Clicker in Minutes",{"type":8,"value":53431,"toc":53971},[53432,53435,53439,53442,53446,53453,53462,53466,53472,53479,53484,53488,53494,53503,53506,53510,53519,53525,53582,53585,53638,53641,53690,53694,53697,53701,53704,53710,53713,53858,53863,53867,53870,53875,53883,53886,53889,53894,53897,53957,53959,53962,53968],[14,53433,53434],{},"Creating an auto clicker with axiom.ai can allow you to use the tool to automatically click a button, or element, multiple times. There are many reasons why you may wish to automate this - the primary reason being to avoid a repetitive strain injury! Automatic clickers can help solve a wide range of use cases with browser automation.",[21,53436,53438],{"id":53437},"what-is-an-auto-clicker-bot","What is an auto clicker bot?",[14,53440,53441],{},"Exactly what it says on the tin, an auto clicker bot is a piece of software that is designed to automatically perform a click action - in this article we are going to be concentrating on auto clicking within a browser environment. They are useful for applications where you may need to click multiple times where you may not wish to do this manually.",[21,53443,53445],{"id":53444},"how-to-create-an-auto-clicker-bot","How to create an auto clicker bot",[14,53447,53448,53449,53452],{},"To get started, we are going to be utilising ",[322,53450,3435],{"href":51689,"rel":53451},[2245]," to create a bot that can perform the clicks for us. If you haven't already signed up, you can do so to take advantage of the free trial that's on offer - from our testing for this article, we believe you should be able to create this auto clicker bot within the trial period.",[14,53454,53455,53456,53458,53459,53461],{},"Create a new automation, or navigate to the automation you want to add this functionality to. Ensure that there is a ",[322,53457,124],{"href":4943}," step added to your automation to ensure that there are elements loaded to be able to click them. We will be using the ",[322,53460,3639],{"href":6378}," step to perform the action on the webpage once it has loaded.",[639,53463,53465],{"id":53464},"using-the-jump-method","Using the 'Jump' method",[14,53467,53468,53469,53471],{},"The first step after the \"Go to page\" step that you will want to add is the ",[322,53470,3639],{"href":6378}," step, this step will allow you to click the element on the page itself. Add the \"Click element\" step and follow the instructions in the step to select the element that you wish to click.",[14,53473,53474,53475,53478],{},"Once the step has been set up as you require, add a ",[322,53476,5619],{"href":53477},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fjump-step"," step to your automation, you'll want to set this up to \"jump back\" to the \"Click element\" step that you previously created. You'll be able to configure the maximum number of jumps that this step will perform - consider the impact on runtime this may have if set to a larger umber.",[14,53480,53481],{},[807,53482,53483],{},"Note, if you change the order of steps in the future, you will need to update the \"Jump to another step\" step with the new step number.",[639,53485,53487],{"id":53486},"using-the-loop-method","Using the 'Loop' method",[14,53489,53490,53491,53493],{},"axiom.ai offers a ",[322,53492,114],{"href":2296}," step that is normally used to loop through rows of data within a data token - this allows you access to the individual rows of data. However, this can also be used to loop and perform repetitive tasks as a little \"hack\".",[14,53495,53496,53497,3289,53499,53502],{},"To get started, create a Google Sheet and add content to the number of iterations that you would like to iterate through. For example, set rows A1-A10 with the numbers 1-10. The content in this case does not matter once the number of rows with content matches the number of iterations that you'd like to perform. Read this data into your automation using a ",[322,53498,92],{"href":8384},[322,53500,13833],{"href":53501},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fread-data-from-excel"," step and setting the data token into the \"Loop through data\" step.",[14,53504,53505],{},"Inside of the \"Loop through data\" step you can then add the \"Click element\" step that will perform the click action.",[639,53507,53509],{"id":53508},"using-the-code-method","Using the 'Code' method",[14,53511,53512,53513,53515,53516,53518],{},"What! Code in a no-code article? I know, but hear me out. Using the built-in tools with axiom.ai it's quite easy to use a small about of code to achieve big things, like an auto clicker. This is an alternative option that would use the ",[322,53514,2301],{"href":2300}," step to write code that can be used to repeatedly click the button or element. You'll need to know the selector for the element for this method - see our article ",[322,53517,13693],{"href":10190}," for some tips and tricks.",[14,53520,53521,53522,53524],{},"To get started, create a ",[90,53523,6783],{}," loop within your code, setting it tot he desired number of iterations, for example:",[719,53526,53528],{"className":756,"code":53527,"language":758,"meta":494,"style":494},"const iterations = 10;\n\nfor (var i = 0 ; i \u003C iterations ; i++) {\n    \u002F\u002F Click code\n}\n",[90,53529,53530,53543,53547,53573,53578],{"__ignoreMap":494},[727,53531,53532,53534,53537,53539,53541],{"class":729,"line":730},[727,53533,2315],{"class":1986},[727,53535,53536],{"class":1882}," iterations",[727,53538,2321],{"class":1986},[727,53540,18105],{"class":1882},[727,53542,2327],{"class":768},[727,53544,53545],{"class":729,"line":498},[727,53546,1898],{"emptyLinePlaceholder":522},[727,53548,53549,53551,53553,53555,53557,53559,53561,53564,53566,53569,53571],{"class":729,"line":495},[727,53550,6783],{"class":1986},[727,53552,2524],{"class":768},[727,53554,4964],{"class":1986},[727,53556,18119],{"class":768},[727,53558,4970],{"class":1986},[727,53560,18124],{"class":1882},[727,53562,53563],{"class":768}," ; i ",[727,53565,18130],{"class":1986},[727,53567,53568],{"class":768}," iterations ; i",[727,53570,21431],{"class":1986},[727,53572,16992],{"class":768},[727,53574,53575],{"class":729,"line":1895},[727,53576,53577],{"class":2920},"    \u002F\u002F Click code\n",[727,53579,53580],{"class":729,"line":1901},[727,53581,2639],{"class":768},[14,53583,53584],{},"From here, there are two options that you can take to click the element. Both are written in Javascript, however, one takes advantage of the Puppeteer library. The second option will require that you run your automation locally using the desktop application.",[719,53586,53588],{"className":756,"code":53587,"language":758,"meta":494,"style":494},"\u002F\u002F Pure JS\ndocument.getElementById(\"#id\").click();\n\n\u002F\u002F Puppeteer\nawait page.click('\u003Cselector>');\n",[90,53589,53590,53595,53614,53618,53623],{"__ignoreMap":494},[727,53591,53592],{"class":729,"line":730},[727,53593,53594],{"class":2920},"\u002F\u002F Pure JS\n",[727,53596,53597,53600,53603,53605,53608,53610,53612],{"class":729,"line":498},[727,53598,53599],{"class":768},"document.",[727,53601,53602],{"class":2376},"getElementById",[727,53604,2542],{"class":768},[727,53606,53607],{"class":737},"\"#id\"",[727,53609,5983],{"class":768},[727,53611,13865],{"class":2376},[727,53613,2588],{"class":768},[727,53615,53616],{"class":729,"line":495},[727,53617,1898],{"emptyLinePlaceholder":522},[727,53619,53620],{"class":729,"line":1895},[727,53621,53622],{"class":2920},"\u002F\u002F Puppeteer\n",[727,53624,53625,53627,53629,53631,53633,53636],{"class":729,"line":1901},[727,53626,47115],{"class":1986},[727,53628,16668],{"class":768},[727,53630,13865],{"class":2376},[727,53632,2542],{"class":768},[727,53634,53635],{"class":737},"'\u003Cselector>'",[727,53637,5005],{"class":768},[14,53639,53640],{},"Using Puppeteer has a few advantages, such as being able to click an element based on text or XPath selectors, for example:",[719,53642,53644],{"className":756,"code":53643,"language":758,"meta":494,"style":494},"\u002F\u002F Click based on text\nawait page.click(\"a:has-text('Buy now')\");\n\n\u002F\u002F Click based on XPath\nawait page.click('xpath=\u002F\u002Finput[@id=\"search-input\"]');\n",[90,53645,53646,53651,53666,53670,53675],{"__ignoreMap":494},[727,53647,53648],{"class":729,"line":730},[727,53649,53650],{"class":2920},"\u002F\u002F Click based on text\n",[727,53652,53653,53655,53657,53659,53661,53664],{"class":729,"line":498},[727,53654,47115],{"class":1986},[727,53656,16668],{"class":768},[727,53658,13865],{"class":2376},[727,53660,2542],{"class":768},[727,53662,53663],{"class":737},"\"a:has-text('Buy now')\"",[727,53665,5005],{"class":768},[727,53667,53668],{"class":729,"line":495},[727,53669,1898],{"emptyLinePlaceholder":522},[727,53671,53672],{"class":729,"line":1895},[727,53673,53674],{"class":2920},"\u002F\u002F Click based on XPath\n",[727,53676,53677,53679,53681,53683,53685,53688],{"class":729,"line":1901},[727,53678,47115],{"class":1986},[727,53680,16668],{"class":768},[727,53682,13865],{"class":2376},[727,53684,2542],{"class":768},[727,53686,53687],{"class":737},"'xpath=\u002F\u002Finput[@id=\"search-input\"]'",[727,53689,5005],{"class":768},[21,53691,53693],{"id":53692},"additional-configuration","Additional configuration",[14,53695,53696],{},"These auto clickers on their own are great, however, there may be times when you need to make changes to them in order for them to meet your requirements.",[639,53698,53700],{"id":53699},"adding-delays","Adding delays",[14,53702,53703],{},"Delays can be added to all of the above methods, this can be useful if you are waiting for something else to happen, or if you are looking to avoid a site detecting your bot.",[14,53705,53706,53707,53709],{},"For the no-code options, simply add a ",[322,53708,2695],{"href":1292}," step after your “Click element\" step. Configure this to your desired delay and this will cause a delay between clicks.",[14,53711,53712],{},"The coded option is a bit more involved and does require modification to the code, we’ve included a full example below:",[719,53714,53716],{"className":756,"code":53715,"language":758,"meta":494,"style":494},"var i = 1;          \u002F\u002F rather than 0\nconst delay = 3000;     \u002F\u002F milliseconds, change as required\nconst iterations = 10;\n\nfunction clickLoop() {\n    setTimeout(function() {\n        page.click('#example');\n        i++;\n\n        if (i \u003C iterations) {\n            clickLoop();\n        }\n    }, delay)\n};\n\nclickLoop();\n",[90,53717,53718,53734,53752,53764,53768,53777,53788,53802,53811,53815,53827,53834,53838,53843,53847,53851],{"__ignoreMap":494},[727,53719,53720,53722,53724,53726,53728,53731],{"class":729,"line":730},[727,53721,4964],{"class":1986},[727,53723,18119],{"class":768},[727,53725,4970],{"class":1986},[727,53727,18206],{"class":1882},[727,53729,53730],{"class":768},";          ",[727,53732,53733],{"class":2920},"\u002F\u002F rather than 0\n",[727,53735,53736,53738,53741,53743,53746,53749],{"class":729,"line":498},[727,53737,2315],{"class":1986},[727,53739,53740],{"class":1882}," delay",[727,53742,2321],{"class":1986},[727,53744,53745],{"class":1882}," 3000",[727,53747,53748],{"class":768},";     ",[727,53750,53751],{"class":2920},"\u002F\u002F milliseconds, change as required\n",[727,53753,53754,53756,53758,53760,53762],{"class":729,"line":495},[727,53755,2315],{"class":1986},[727,53757,53536],{"class":1882},[727,53759,2321],{"class":1986},[727,53761,18105],{"class":1882},[727,53763,2327],{"class":768},[727,53765,53766],{"class":729,"line":1895},[727,53767,1898],{"emptyLinePlaceholder":522},[727,53769,53770,53772,53775],{"class":729,"line":1901},[727,53771,8424],{"class":1986},[727,53773,53774],{"class":2376}," clickLoop",[727,53776,8430],{"class":768},[727,53778,53779,53782,53784,53786],{"class":729,"line":1973},[727,53780,53781],{"class":2376},"    setTimeout",[727,53783,2542],{"class":768},[727,53785,8424],{"class":1986},[727,53787,8430],{"class":768},[727,53789,53790,53793,53795,53797,53800],{"class":729,"line":2052},[727,53791,53792],{"class":768},"        page.",[727,53794,13865],{"class":2376},[727,53796,2542],{"class":768},[727,53798,53799],{"class":737},"'#example'",[727,53801,5005],{"class":768},[727,53803,53804,53807,53809],{"class":729,"line":2058},[727,53805,53806],{"class":768},"        i",[727,53808,21431],{"class":1986},[727,53810,2327],{"class":768},[727,53812,53813],{"class":729,"line":2064},[727,53814,1898],{"emptyLinePlaceholder":522},[727,53816,53817,53819,53822,53824],{"class":729,"line":2087},[727,53818,2521],{"class":1986},[727,53820,53821],{"class":768}," (i ",[727,53823,18130],{"class":1986},[727,53825,53826],{"class":768}," iterations) {\n",[727,53828,53829,53832],{"class":729,"line":2140},[727,53830,53831],{"class":2376},"            clickLoop",[727,53833,2588],{"class":768},[727,53835,53836],{"class":729,"line":2154},[727,53837,2562],{"class":768},[727,53839,53840],{"class":729,"line":1529},[727,53841,53842],{"class":768},"    }, delay)\n",[727,53844,53845],{"class":729,"line":2178},[727,53846,16966],{"class":768},[727,53848,53849],{"class":729,"line":2187},[727,53850,1898],{"emptyLinePlaceholder":522},[727,53852,53853,53856],{"class":729,"line":2533},[727,53854,53855],{"class":2376},"clickLoop",[727,53857,2588],{"class":768},[14,53859,53860],{},[807,53861,53862],{},"Note, you may need to also add a “Wait” step after the “Write Javascript” step that equals the total time your loop will take. For the example above, we would add a wait of 31000 (delay * iterations + 1000 (to account for any loading)).",[639,53864,53866],{"id":53865},"exiting-a-loop","Exiting a loop",[14,53868,53869],{},"If you are using your automation to monitor a page for changes, there may not always be a need to complete the entire loop. These are various methods of exiting a loop early in this instance.",[14,53871,53872],{},[29,53873,53874],{},"No-code options",[14,53876,53877,53878,53882],{},"Both options for the no-code methods will make use of ",[322,53879,53881],{"href":53880},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002F#control-flow","Conditional steps"," to determine when to leave the loop. We won’t be reviewing these steps in this article but we would recommend checking out the documentation on them.",[14,53884,53885],{},"When using the “jump” method, we’ll want to add a “Conditional step”, such as an “If\u002Felse” step, to your automation before the “Jump to another step” step. Configure this conditional step as you require, and then add another “Jump to another step” inside the conditional step - you’ll want to set this to “jump” to the step after the original “Jump to another step”.",[14,53887,53888],{},"For the “loop” method, as of the time of writing, we are developing an “End loop” step that can be inserted into a conditional step that can be used to exit your loop.",[14,53890,53891],{},[29,53892,53893],{},"Code options",[14,53895,53896],{},"For the “code” method of looping, you can use an if statement within your loop, adding the break keyword will allow you to break out of the loop, for example:",[719,53898,53900],{"className":756,"code":53899,"language":758,"meta":494,"style":494},"for (var i = 0; i \u003C 10; i++) {\n    if (i === 10){\n        break;\n    }\n}\n",[90,53901,53902,53928,53942,53949,53953],{"__ignoreMap":494},[727,53903,53904,53906,53908,53910,53912,53914,53916,53918,53920,53922,53924,53926],{"class":729,"line":730},[727,53905,6783],{"class":1986},[727,53907,2524],{"class":768},[727,53909,4964],{"class":1986},[727,53911,18119],{"class":768},[727,53913,4970],{"class":1986},[727,53915,18124],{"class":1882},[727,53917,18127],{"class":768},[727,53919,18130],{"class":1986},[727,53921,18105],{"class":1882},[727,53923,21428],{"class":768},[727,53925,21431],{"class":1986},[727,53927,16992],{"class":768},[727,53929,53930,53932,53934,53937,53939],{"class":729,"line":498},[727,53931,17088],{"class":1986},[727,53933,53821],{"class":768},[727,53935,53936],{"class":1986},"===",[727,53938,18105],{"class":1882},[727,53940,53941],{"class":768},"){\n",[727,53943,53944,53947],{"class":729,"line":495},[727,53945,53946],{"class":1986},"        break",[727,53948,2327],{"class":768},[727,53950,53951],{"class":729,"line":1895},[727,53952,2633],{"class":768},[727,53954,53955],{"class":729,"line":1901},[727,53956,2639],{"class":768},[21,53958,796],{"id":795},[14,53960,53961],{},"Performing repetitive tasks by hand can be time consuming, which is exactly where an auto clicker bot comes in. This can be used for a wide range of applications, such as automatically refreshing an element on a page to check if there are updates to the page that you are automating. The ease of development of these no-code auto clicker bots means that there is less friction when creating these, and the code option means that you can expand the functionality to ensure that it meets your requirements.",[14,53963,53964,53965,44],{},"We look forward to hearing from you on how you have used axiom.ai to create an auto clicker bot, feel free to join us over in our ",[322,53966,3326],{"href":8928,"rel":53967},[2245],[811,53969,53970],{},"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 .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);}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}",{"title":494,"searchDepth":495,"depth":495,"links":53972},[53973,53974,53979,53983],{"id":53437,"depth":498,"text":53438},{"id":53444,"depth":498,"text":53445,"children":53975},[53976,53977,53978],{"id":53464,"depth":495,"text":53465},{"id":53486,"depth":495,"text":53487},{"id":53508,"depth":495,"text":53509},{"id":53692,"depth":498,"text":53693,"children":53980},[53981,53982],{"id":53699,"depth":495,"text":53700},{"id":53865,"depth":495,"text":53866},{"id":795,"depth":498,"text":796},"2025-05-08","Learn how to build a no-code auto clicker in minutes with axiom.ai—automate repetitive browser clicks, reduce strain, and streamline your workflow without writing a single line of code.",{"read":53987,"type":513,"tool":53988,"category":53989,"tags":53991,"featuredimg":53993,"landingimg":53994,"summary":53995,"video":523,"metaTitle":53429},"6 min read",[46728],[53990],"Workflow automation",[3639,53992],"Clicker","\u002Fauto-clicker-post.webp","\u002Fauto-clicker-sq.webp","Learn more about how to get started with axiom.ai to create an auto clicker.","\u002Fblog\u002Fcreating-a-no-code-auto-clicker",{"title":53429,"description":53985},"blog\u002Fcreating-a-no-code-auto-clicker","RQ9_TWJTPwIIxq2wbymKdIqIxOaOGIP7tpkYJnXafv8",[53990],[513],[46728],{"id":54004,"title":54005,"author":48082,"body":54006,"date":54187,"description":54188,"draft":26250,"extension":506,"meta":54189,"navigation":522,"path":54196,"seo":54197,"stem":54198,"__hash__":54199,"pinned":-1,"category":54200,"type":54201,"tool":54202},"blog\u002Fblog\u002Fmaking-your-automations-mobile-with-apple-shortcuts.md","Making Your Automations Mobile with Apple Shortcuts",{"type":8,"value":54007,"toc":54173},[54008,54011,54014,54017,54020,54024,54027,54031,54034,54037,54041,54044,54070,54073,54078,54082,54088,54091,54096,54100,54103,54106,54120,54123,54129,54131,54134,54137,54140,54144,54152,54156,54159,54161,54164,54167],[14,54009,54010],{},"Apple Shortcuts is an application that comes pre-installed on most Apple devices and can provide a powerful solution for performing automations on your devices. It provides access to various system events that can be used to start a Shortcut, we will explore this later in this article.",[14,54012,54013],{},"One of the benefits of using Apple Shortcuts is that the shortcuts that you create will be available on any device that supports Shortcuts, and that you have signed into your iCloud account on. For instance, you can create a shortcut on your Mac that can then be run on your iPhone, or iPad, and vice versa.",[14,54015,54016],{},"Your Shortcuts live and run on your Apple device - which can be great from a privacy and security point of view as it means that none of the data that you are processing with it leaves your device. This is similar to when you run an axiom.ai automation on your computer, no information leaves your device unless you explicitly instruct it to.",[14,54018,54019],{},"As Shortcuts runs on your device, it can tie into the applications on your device - most applications provide steps to Shortcuts that can be used. For example, if you wanted to read data from the Apple Health application, you could do so with a Shortcut and then share this information to another application or service. Or, a Shortcut can be used to write data to another app, such as creating a new calendar event when the Shortcut is run.",[21,54021,54023],{"id":54022},"triggering-a-shortcut","Triggering a Shortcut",[14,54025,54026],{},"There are multiple methods that can be used to trigger your Shortcut that are provided by the Apple Shortcuts application, let’s explore them.",[639,54028,54030],{"id":54029},"manually","Manually",[14,54032,54033],{},"Shortcuts can be triggered manually by either navigating to the Shortcuts application and selecting the one you wish to trigger, adding it to your Control Centre, or even adding it to your homescreen as a widget. This can make triggering super convenient and available right at your fingertips. These can be triggered by Siri as a hands-free option by saying, \"Hey Siri,\" followed by the Shortcut name.",[14,54035,54036],{},"Some additional options are available to manually trigger a shortcut on macOS devices, such as adding the Shortcut to your Share Sheet, Quick Actions, or Menu Bar for easy access.",[639,54038,54040],{"id":54039},"automatically","Automatically",[14,54042,54043],{},"The other option is to have this automatically triggered. Apple provide a wide range of triggers that can be set up to automatically trigger your Shortcuts, such as:",[80,54045,54046,54049,54052,54055,54058,54061,54064,54067],{},[83,54047,54048],{},"Time of day",[83,54050,54051],{},"When your alarm stops",[83,54053,54054],{},"When you reach or leave a location",[83,54056,54057],{},"When you receive an email or message",[83,54059,54060],{},"When a device setting has been changed, such as connecting to a Wi-Fi network",[83,54062,54063],{},"When an application is opened",[83,54065,54066],{},"When your battery reaches a certain percentage",[83,54068,54069],{},"When a focus mode has been activated\u002Fdeactivated",[14,54071,54072],{},"These can be very convenient when requiring actions to be performed at certain times, or under certain conditions. For example, a personal favourite of mine is when I enable the “Sleep” focus mode on my iPhone, this will prompt me to turn off all of the lights in my home.",[14,54074,54075],{},[807,54076,54077],{},"Note: as of time of writing, automatic triggers are currently only available on iOS and iPadOS devices.",[639,54079,54081],{"id":54080},"via-axiomai","Via axiom.ai",[14,54083,54084,54085,54087],{},"Even though axiom.ai does not officially integrate with Apple Shortcuts, there is a clever workaround that can be used to trigger your Shortcuts from an axiom.ai automation. To do this, create an automation in axiom.ai as normal. Once you are ready to trigger your Shortcut, add a ",[322,54086,7619],{"href":7618}," step to your automation and set this to send an email to an email address that you have set up on your Apple device.",[14,54089,54090],{},"Next, create a new Shortcut that triggers when an email has been received. We would recommend setting the “Subject Contains” field to match the subject that you have added in your axiom.ai automation. Click “Run” in axiom.ai to test your automation and confirm that the Shortcut has been triggered - you’ll also see the email in your Mail inbox to confirm receipt.",[14,54092,54093],{},[807,54094,54095],{},"Note: your axiom.ai automation will continue to run after the email has been sent, it does not have oversight over the Shortcut on your device.",[21,54097,54099],{"id":54098},"triggering-an-axiomai-automation","Triggering an axiom.ai automation",[14,54101,54102],{},"While axiom.ai does not officially integrate with Shortcuts, as we do not provide an iOS application, you can still trigger your automations from Shortcuts. This means that you can automatically trigger your axiom.ai automations as part of your workflow.",[14,54104,54105],{},"To get started, create your Shortcut as normal, when you are ready to trigger your axiom.ai automation, add a “Get Contents of URL” step to your Shortcut. Change the method to “POST” and add two key\u002Fvalue pairs in the “headers” section of this step, as follows:",[80,54107,54108,54114],{},[83,54109,54110,54111],{},"key: ",[90,54112,54113],{},"\u003Cyour api key>",[83,54115,54116,54117],{},"name: ",[90,54118,54119],{},"\u003Cyour automation name>",[14,54121,54122],{},"Once you run your Shortcut, you will see your axiom.ai automation run a few moments later.",[14,54124,54125,54126,54128],{},"You can learn more about this in our ",[322,54127,530],{"href":834}," guide.",[21,54130,12734],{"id":18425},[14,54132,54133],{},"There are a bunch of use cases that can be used to take advantage of this combination of tools, such as:",[639,54135,46730],{"id":54136},"social-media-automation",[14,54138,54139],{},"Shortcuts have the ability to interact with most social media applications that are installed on your device. Automatically posting to your social media account via your Apple device can be even more useful when you trigger your Shortcut via axiom.ai. This can be a useful alternative to automating social media when using multiple accounts without relying on sessions or steps to log in and out of multiple accounts.",[639,54141,54143],{"id":54142},"workout-tracking","Workout tracking",[14,54145,54146,54147,54149,54150,44],{},"Your iPhone has the ability to trigger a Shortcut when a workout has been started or ended on your Apple Watch - this can be used to share information with your axiom.ai automation using the “Health” steps provided, this could be used to log this data in a ",[322,54148,3913],{"href":9291}," for further analysis, or other services such as ",[322,54151,21233],{"href":22503},[639,54153,54155],{"id":54154},"credit-card-transactions","Credit card transactions",[14,54157,54158],{},"Transactions can be used to automate the triggering of Shortcuts - these will be triggered when an Apple Pay linked card has been used to make a purchase. You can configure this based on what type of card you would like notifications about, and if you only want certain types of transactions to trigger the Shortcut. This can be useful to log Apple Pay transactions for later analysis on spending.",[21,54160,796],{"id":795},[14,54162,54163],{},"Combining the power of Apple Shortcuts with the power of axiom.ai allows you to create a chain of automation that can be triggered from your Apple devices, or can trigger events to occur on your Apple devices.",[14,54165,54166],{},"With Apple Shortcuts' ability to integrate with system applications, and downloaded applications, on your device, this gives you an opportunity to expand the functionality offered to your automations. From automatically triggering an axiom.ai automation based on a change in device settings via Shortcuts, to triggering a Shortcut based on criteria set within your axiom.ai automation, the possibilities are endless.",[14,54168,54169,54170,44],{},"We’re excited to hear about what you build with Apple Shortcuts and axiom.ai, let us know over in our ",[322,54171,3326],{"href":8928,"rel":54172},[2245],{"title":494,"searchDepth":495,"depth":495,"links":54174},[54175,54180,54181,54186],{"id":54022,"depth":498,"text":54023,"children":54176},[54177,54178,54179],{"id":54029,"depth":495,"text":54030},{"id":54039,"depth":495,"text":54040},{"id":54080,"depth":495,"text":54081},{"id":54098,"depth":498,"text":54099},{"id":18425,"depth":498,"text":12734,"children":54182},[54183,54184,54185],{"id":54136,"depth":495,"text":46730},{"id":54142,"depth":495,"text":54143},{"id":54154,"depth":495,"text":54155},{"id":795,"depth":498,"text":796},"2025-05-06","Learn how to harness Apple Shortcuts to make your axiom.ai automations more mobile, trigger them from anywhere with a shortcut.",{"read":50549,"type":513,"tool":54190,"category":54191,"tags":54192,"location":46733,"featuredimg":54194,"landingimg":54195,"summary":54188},[46728],[53990],[734,54193,830],"apple","\u002Fappleshortucts-post.webp","\u002Fappleshortucts-sq.webp","\u002Fblog\u002Fmaking-your-automations-mobile-with-apple-shortcuts",{"title":54005,"description":54188},"blog\u002Fmaking-your-automations-mobile-with-apple-shortcuts","yxI3RShCKqKOPeYdP-2MKxqyz12XGCYBk6smt9XH768",[53990],[513],[46728],{"id":54204,"title":54205,"author":48082,"body":54206,"date":54358,"description":54359,"draft":26250,"extension":506,"meta":54360,"navigation":522,"path":54367,"seo":54368,"stem":54369,"__hash__":54370,"pinned":-1,"category":54371,"type":54372,"tool":54373},"blog\u002Fblog\u002Fcombining-the-power-of-apis-with-browser-automation.md","Combining the Power of APIs with Browser Automation",{"type":8,"value":54207,"toc":54348},[54208,54211,54214,54217,54220,54224,54227,54230,54233,54237,54240,54247,54250,54258,54261,54265,54276,54279,54283,54286,54301,54305,54313,54316,54333,54336,54338,54341],[14,54209,54210],{},"Before we dive into how combining the power of APIs with browser automation can upgrade your workflows, let’s dive into what an API is, and what browser automation is.",[14,54212,54213],{},"An API (Application Programming Interface) is used to specify how applications interact with each other - it’s essentially a contract that outlines the requests, responses, and data formats that different applications can use to communicate. For example, when you use your axiom.ai account, we use our API to interact with our database to retrieve your automations and account information.",[14,54215,54216],{},"Browser automation is the process of using software tools to control and interact with web browsers automatically. Instead of manually navigating websites, filling out forms, clicking buttons, and extracting data, these tasks are performed by scripts or specialised software. They’re great at simulating user interactions with the browser.",[14,54218,54219],{},"When you combine these two to create workflows, you can unlock the ability to create dynamic workflows that can be used for a wider range of tasks. For example, if you use an API to trigger and send data to an automation that carries out a browser automation task, you can have this automation behave differently depending on what data is sent.",[21,54221,54223],{"id":54222},"more-about-apis","More about APIs",[14,54225,54226],{},"You likely use tens of APIs a day and don’t even realise it - they power everything from weather apps, messaging services, social media, smart home products, and so much more. Some services even rely on multiple APIs - when you hit “Run” on an axiom.ai automation, our API is triggered to run the automation and it may then use the Google Sheets API to interact with sheets, if you have the steps in your automation.",[14,54228,54229],{},"They can be used for a wide range of applications, such as retrieving or storing data, triggering tasks, or sending analytics data for the application running the code that interacts with the API.",[14,54231,54232],{},"In all of these cases, the API has laid out a contract that the calling application is required to adhere to to be able to interact with the API. This contract often lays out the HTTP method that is required to be used, as well as the attributes that the API expects, such as an API key, or parameters.",[21,54234,54236],{"id":54235},"the-axiomai-api","The axiom.ai API",[14,54238,54239],{},"The axiom.ai API can be used for a variety of tasks with your automations, the most common use of this would be to trigger your automations and send information to them. Triggering your automations via the API allows you to send dynamic data to your automations that allow for more dynamic use cases. The axiom.ai API allows you to include your automations as part of a larger workflow within your organisation, or personal projects.",[14,54241,54242,54243,54246],{},"We’d recommend checking out our ",[322,54244,54245],{"href":53272},"API"," documentation for more details on getting started.",[14,54248,54249],{},"Currently, the API supports the following functions:",[80,54251,54252,54255],{},[83,54253,54254],{},"Trigger an automation",[83,54256,54257],{},"Check status",[14,54259,54260],{},"A future update to the API is planned and will introduce more features for your automations.",[21,54262,54264],{"id":54263},"combining-an-api-with-browser-automation","Combining an API with browser automation",[14,54266,54267,54268,450,54270,54272,54273,44],{},"A great example of building a dynamic automation comes in the form of a web form filling automation - dynamic data can be sent to your automation over the API, triggering the automation and navigating to and filling in the web form that you are looking to automate. As part of a larger system, you may have a system that has the ability to trigger a webhook when a change occurs which would allow you to fully automate the process. ",[322,54269,18287],{"href":12438},[322,54271,21233],{"href":22503}," are examples of services that can do this. A library is also available for automatically triggering your automations from your website, this is not affiliated with axiom.ai but is available on ",[727,54274,54275],{},"npm",[14,54277,54278],{},"Let’s explore some possible use cases.",[639,54280,54282],{"id":54281},"cicd","CI\u002FCD",[14,54284,54285],{},"Continuous integration and\u002For continuous deployment is a set of practices used by development and devops teams to automate the software development lifecycle, aiming for faster and more reliable software releases. Teams will create a “pipeline” that is a set of automated tasks that are required to be performed within the lifecycle of an application - for example, building the project from the source repository.",[14,54287,54288,54289,54292,54293,54295,54296,3289,54298,54300],{},"As part of the pipeline, you may wish to perform browser automation, or interact with APIs that may not be supported by the build system that you are utilising. One alternative for this would be to use the axiom.ai API to trigger an automation that can perform additional tasks - for example, triggering a ",[322,54290,54291],{"href":24683},"Zapier Zap",", notifying your team via ",[322,54294,20852],{"href":21216},", creating a new entry in ",[322,54297,21233],{"href":22503},[322,54299,22520],{"href":22880}," and much more.",[639,54302,54304],{"id":54303},"data-storage","Data storage",[14,54306,54307,54308,3289,54310,54312],{},"Building out applications that can handle the storage of data in services such as ",[322,54309,21233],{"href":22503},[322,54311,22520],{"href":22880}," can be difficult when you are building browser automation. Combining the API and browser automation means you can store any data that you need to perform your automation, or any data that is produced during the automation - for example, data that you have scraped from the page.",[639,54314,54315],{"id":1052},"Social media",[14,54317,54318,54319,54321,54322,3289,54324,54327,54328,54332],{},"Most social media platforms offer APIs that allow you to retrieve insights from your profiles, or automatically post. For example, ",[322,54320,4914],{"href":4915}," provide a very easy to use API that can be used to post to your profile - this can be very useful for taking data from a spreadsheet, such as ",[322,54323,9292],{"href":9291},[322,54325,24640],{"href":54326},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fexcel"," and pushing this to your account, combine this with axiom.ai ",[322,54329,54331],{"href":54330},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Frun-options\u002Fschedule","scheduling"," and you can have a fully automated social media presence that you can create a backlog for.",[14,54334,54335],{},"Certain CRMs offer an API, this could be utilised within your automations to draw on data that you have about a person before contacting them. For example, you could have a link to their LinkedIn and their name, you could then input this into your browser automation to automatically send them a message like, “Hey Karl, I see you’re still with axiom.ai. How are you finding it there? Do you need any automation solutions?”.",[21,54337,796],{"id":795},[14,54339,54340],{},"Combining APIs and browser automation gives you a great opportunity to add both into larger workflows - leveraging the power of APIs to perform more complex tasks within the context of a browser. This provides you with the opportunity to add additional functionality to your browser automation, or to other tools that you already use. It can be useful for CI\u002FCD, managing data storage and automating social media accounts to level up your marketing or scheduling.",[14,54342,54343,54344,54347],{},"We would love to hear how you use APIs and browser automation (even if it’s not with axiom.ai!) - feel free to hop into our ",[322,54345,3326],{"href":8928,"rel":54346},[2245]," and share your ideas!",{"title":494,"searchDepth":495,"depth":495,"links":54349},[54350,54351,54352,54357],{"id":54222,"depth":498,"text":54223},{"id":54235,"depth":498,"text":54236},{"id":54263,"depth":498,"text":54264,"children":54353},[54354,54355,54356],{"id":54281,"depth":495,"text":54282},{"id":54303,"depth":495,"text":54304},{"id":1052,"depth":495,"text":54315},{"id":795,"depth":498,"text":796},"2025-05-02","Learn how to leverage the power of APIs in your browser automations to level up your data storage, social media and CI\u002FCD pipelines",{"read":46726,"type":90,"tool":54361,"category":54362,"tags":54363,"featuredimg":54365,"landingimg":54366,"summary":54359,"video":523,"metaTitle":54205},[46728],[50552],[23962,829,54364],"Axiom API","\u002Fapi-browser-post.webp","\u002Fapi-browser-sq.webp","\u002Fblog\u002Fcombining-the-power-of-apis-with-browser-automation",{"title":54205,"description":54359},"blog\u002Fcombining-the-power-of-apis-with-browser-automation","Aa5VxfOOAONSucX3D5kNDaulAz6RPZQ_rcGP-xk7t3M",[50552],[90],[46728],{"id":54375,"title":54376,"author":48082,"body":54377,"date":55112,"description":55113,"draft":26250,"extension":506,"meta":55114,"navigation":522,"path":55122,"seo":55123,"stem":55124,"__hash__":55125,"pinned":-1,"category":55126,"type":55127,"tool":55128},"blog\u002Fblog\u002Fhow-axiom-ai-helper-was-created.md","How axiom.ai Helper was created",{"type":8,"value":54378,"toc":55098},[54379,54397,54400,54414,54421,54431,54435,54444,54449,54458,54462,54465,54473,54482,54486,54493,54496,54533,54540,54544,54549,54593,54596,54643,54690,54693,54749,54753,54758,54788,54790,54837,54880,54882,54936,54940,54946,54951,54957,54961,54964,54968,54971,55017,55023,55028,55034,55052,55056,55059,55070,55073,55075,55078,55081,55087,55095],[14,54380,54381,54382,54384,54385,2004,54387,2004,54389,2004,54392,450,54394,44],{},"The axiom.ai ",[322,54383,54245],{"href":53272}," can be super powerful when used to trigger your automations, pass data to them, and check the status of the automations. The API has a wide variety of users, such as being used to trigger your automations from third-party services such as ",[322,54386,3288],{"href":24683},[322,54388,3293],{"href":18481},[322,54390,54391],{"href":7029},"cURL",[322,54393,18827],{"href":19085},[322,54395,54396],{"href":324},"much more",[14,54398,54399],{},"When considering different methods of using the API an idea came up regarding the use of axiom.ai as 'middleware' - a piece of software that can be used to connect two other services. The initial idea of this was using axiom.ai to capture form data from a website and pass it onto your automation to do one of the following operations:",[555,54401,54402,54405,54408,54411],{},[83,54403,54404],{},"Send an email notification containing the form data.",[83,54406,54407],{},"Logging the form data in a Google Sheet.",[83,54409,54410],{},"Performing operations on the data.",[83,54412,54413],{},"Pass the data onto another service.",[14,54415,54416,54417,54420],{},"Or all of the above - all of these options could be added into a single automation, meaning that with a single function call to the ",[90,54418,54419],{},"axiom-ai-helper"," package you could have the data propagate throughout your system.",[8898,54422,54423],{},[14,54424,54425,54426,44],{},"💡 Note, this package was created by the author, an employee of axiom.ai, but is not an official product of axiom.ai. Issues, questions and feature requests should be directed to the author through the repository: ",[322,54427,54430],{"href":54428,"rel":54429},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Faxiom-ai-helper",[2245],"npmjs.com",[21,54432,54434],{"id":54433},"installing-the-package","Installing the package",[14,54436,54437,54439,54440,54443],{},[90,54438,54419],{}," is available to download on ",[322,54441,54430],{"href":54428,"rel":54442},[2245],". To install, navigate to your project and install the package using the following command:",[14,54445,54446],{},[90,54447,54448],{},"npm install axiom-ai-helper",[14,54450,54451,54452,450,54454,54457],{},"You can then import the required functions individually, at time of writing, the ",[90,54453,830],{},[90,54455,54456],{},"checkStatus"," functions are available - there are plans to continue development if new API features become available in the future.",[21,54459,54461],{"id":54460},"usage","Usage",[14,54463,54464],{},"I wanted to make this package as easy as possible to use, and as such, only included the standard requirements of the axiom.ai API. You'll need the following to be able to use the package, all can be acquired from axiom.ai:",[555,54466,54467,54470],{},[83,54468,54469],{},"An account",[83,54471,54472],{},"An API key",[14,54474,54475,54476,54478,54479],{},"You'll also need to have an automation to use with your code - for triggering automations, you'll need to start your automation with a ",[322,54477,8895],{"href":6958}," step. ",[807,54480,54481],{},"Tip: ensure that you have the 'test data' filled out, it'll help with testing and debugging, I promise!",[21,54483,54485],{"id":54484},"functions","Functions",[14,54487,54488,54489,44],{},"The package is built using JavaScript and is based on simple HTTP requests, this code is open source and is available on Github: ",[322,54490,54419],{"href":54491,"rel":54492},"https:\u002F\u002Fgithub.com\u002FKarljoones\u002Faxiom-ai-helper",[2245],[14,54494,54495],{},"The functions directly relate to the options that are available within the axiom.ai API.",[7092,54497,54498,54510],{},[7095,54499,54500],{},[7098,54501,54502,54505,54508],{},[7101,54503,54504],{},"Function",[7101,54506,54507],{},"Signature",[7101,54509,577],{},[7108,54511,54512,54522],{},[7098,54513,54514,54516,54519],{},[7113,54515,12204],{},[7113,54517,54518],{},"trigger(name, data, key)",[7113,54520,54521],{},"\u002Ftrigger",[7098,54523,54524,54527,54530],{},[7113,54525,54526],{},"Status",[7113,54528,54529],{},"checkStatus(name, key)",[7113,54531,54532],{},"\u002Fcheck-status",[14,54534,54535,54536,54539],{},"I'd recommend storing the API key in an ",[90,54537,54538],{},".env"," file to safeguard it and ensure that it's not uploaded to a public repository.",[639,54541,54543],{"id":54542},"triggering-your-automations","Triggering your automations",[14,54545,5070,54546,54548],{},[90,54547,830],{}," function can be used to trigger an automation that you have previously build in axiom.ai, this accepts 3 parameters:",[7092,54550,54551,54563],{},[7095,54552,54553],{},[7098,54554,54555,54557,54560],{},[7101,54556,2662],{},[7101,54558,54559],{},"Details",[7101,54561,54562],{},"Optional",[7108,54564,54565,54575,54583],{},[7098,54566,54567,54569,54572],{},[7113,54568,2009],{},[7113,54570,54571],{},"Name of the automation",[7113,54573,54574],{},"No",[7098,54576,54577,54579,54581],{},[7113,54578,1990],{},[7113,54580,561],{},[7113,54582,54574],{},[7098,54584,54585,54587,54590],{},[7113,54586,1838],{},[7113,54588,54589],{},"Data to send to the automation, formatted as an array of arrays",[7113,54591,54592],{},"Yes",[14,54594,54595],{},"This will return an object containing 3 values that have been returned from the API, see below:",[719,54597,54599],{"className":7732,"code":54598,"language":2585,"meta":494,"style":494},"{\n    status: \"\",\n    link: \"\",\n    message: \"\"\n}\n",[90,54600,54601,54605,54618,54629,54639],{"__ignoreMap":494},[727,54602,54603],{"class":729,"line":730},[727,54604,7740],{"class":768},[727,54606,54607,54611,54613,54616],{"class":729,"line":498},[727,54608,54610],{"class":54609},"sZcZs","    status",[727,54612,1995],{"class":768},[727,54614,54615],{"class":737},"\"\"",[727,54617,2427],{"class":768},[727,54619,54620,54623,54625,54627],{"class":729,"line":495},[727,54621,54622],{"class":54609},"    link",[727,54624,1995],{"class":768},[727,54626,54615],{"class":737},[727,54628,2427],{"class":768},[727,54630,54631,54634,54636],{"class":729,"line":1895},[727,54632,54633],{"class":54609},"    message",[727,54635,1995],{"class":768},[727,54637,54638],{"class":737},"\"\"\n",[727,54640,54641],{"class":729,"line":1901},[727,54642,2639],{"class":768},[7092,54644,54645,54656],{},[7095,54646,54647],{},[7098,54648,54649,54651,54653],{},[7101,54650,5353],{},[7101,54652,54559],{},[7101,54654,54655],{},"Values",[7108,54657,54658,54668,54679],{},[7098,54659,54660,54662,54665],{},[7113,54661,4348],{},[7113,54663,54664],{},"The status of your automation",[7113,54666,54667],{},"\"success\"\"error\"",[7098,54669,54670,54673,54676],{},[7113,54671,54672],{},"link",[7113,54674,54675],{},"A link to the running automation",[7113,54677,54678],{},"\"{link}\"\u002Fnull",[7098,54680,54681,54684,54687],{},[7113,54682,54683],{},"message",[7113,54685,54686],{},"Any error messages",[7113,54688,54689],{},"\"{error}\"\u002F{\"Automation successfully triggered\"}",[14,54691,54692],{},"An example of running this is included below:",[719,54694,54696],{"className":756,"code":54695,"language":758,"meta":494,"style":494},"import { trigger } from 'axiom-ai-helper';\n\n...\n\nconst result = await trigger(name, key, data);\nconsole.log(result.message);\n",[90,54697,54698,54712,54716,54720,54724,54740],{"__ignoreMap":494},[727,54699,54700,54702,54705,54707,54710],{"class":729,"line":730},[727,54701,48400],{"class":1986},[727,54703,54704],{"class":768}," { trigger } ",[727,54706,48406],{"class":1986},[727,54708,54709],{"class":737}," 'axiom-ai-helper'",[727,54711,2327],{"class":768},[727,54713,54714],{"class":729,"line":498},[727,54715,1898],{"emptyLinePlaceholder":522},[727,54717,54718],{"class":729,"line":495},[727,54719,51571],{"class":1986},[727,54721,54722],{"class":729,"line":1895},[727,54723,1898],{"emptyLinePlaceholder":522},[727,54725,54726,54728,54730,54732,54734,54737],{"class":729,"line":1901},[727,54727,2315],{"class":1986},[727,54729,2575],{"class":1882},[727,54731,2321],{"class":1986},[727,54733,2410],{"class":1986},[727,54735,54736],{"class":2376}," trigger",[727,54738,54739],{"class":768},"(name, key, data);\n",[727,54741,54742,54744,54746],{"class":729,"line":1973},[727,54743,52656],{"class":768},[727,54745,2597],{"class":2376},[727,54747,54748],{"class":768},"(result.message);\n",[639,54750,54752],{"id":54751},"checking-the-status-of-your-automations","Checking the status of your automations",[14,54754,5070,54755,54757],{},[90,54756,54456],{}," function can be used to check the status of an automation that you have previously run in axiom.ai, this accepts 2 parameters:",[7092,54759,54760,54770],{},[7095,54761,54762],{},[7098,54763,54764,54766,54768],{},[7101,54765,2662],{},[7101,54767,54559],{},[7101,54769,54562],{},[7108,54771,54772,54780],{},[7098,54773,54774,54776,54778],{},[7113,54775,2009],{},[7113,54777,54571],{},[7113,54779,54574],{},[7098,54781,54782,54784,54786],{},[7113,54783,1990],{},[7113,54785,561],{},[7113,54787,54574],{},[14,54789,54595],{},[719,54791,54793],{"className":7732,"code":54792,"language":2585,"meta":494,"style":494},"{\n    status: \"\",\n    message: \"\",\n    data: {\"google-sheet-data\": [[],[]]}\n}\n",[90,54794,54795,54799,54809,54819,54833],{"__ignoreMap":494},[727,54796,54797],{"class":729,"line":730},[727,54798,7740],{"class":768},[727,54800,54801,54803,54805,54807],{"class":729,"line":498},[727,54802,54610],{"class":54609},[727,54804,1995],{"class":768},[727,54806,54615],{"class":737},[727,54808,2427],{"class":768},[727,54810,54811,54813,54815,54817],{"class":729,"line":495},[727,54812,54633],{"class":54609},[727,54814,1995],{"class":768},[727,54816,54615],{"class":737},[727,54818,2427],{"class":768},[727,54820,54821,54824,54827,54830],{"class":729,"line":1895},[727,54822,54823],{"class":54609},"    data",[727,54825,54826],{"class":768},": {",[727,54828,54829],{"class":7745},"\"google-sheet-data\"",[727,54831,54832],{"class":768},": [[],[]]}\n",[727,54834,54835],{"class":729,"line":1901},[727,54836,2639],{"class":768},[7092,54838,54839,54849],{},[7095,54840,54841],{},[7098,54842,54843,54845,54847],{},[7101,54844,5353],{},[7101,54846,54559],{},[7101,54848,54655],{},[7108,54850,54851,54859,54867],{},[7098,54852,54853,54855,54857],{},[7113,54854,4348],{},[7113,54856,54664],{},[7113,54858,54667],{},[7098,54860,54861,54863,54865],{},[7113,54862,54683],{},[7113,54864,54686],{},[7113,54866,54689],{},[7098,54868,54869,54871,54874],{},[7113,54870,1838],{},[7113,54872,54873],{},"Data written to a Google Sheet",[7113,54875,54876,54877,54879],{},"{\"google-sheet-data: [[],",[727,54878],{},"]\"}\u002Fnull",[14,54881,54692],{},[719,54883,54885],{"className":756,"code":54884,"language":758,"meta":494,"style":494},"import { checkStatus } from 'axiom-ai-helper';\n\n...\n\nconst result = await checkStatus(name, key);\nconsole.log(result.message);\n",[90,54886,54887,54900,54904,54908,54912,54928],{"__ignoreMap":494},[727,54888,54889,54891,54894,54896,54898],{"class":729,"line":730},[727,54890,48400],{"class":1986},[727,54892,54893],{"class":768}," { checkStatus } ",[727,54895,48406],{"class":1986},[727,54897,54709],{"class":737},[727,54899,2327],{"class":768},[727,54901,54902],{"class":729,"line":498},[727,54903,1898],{"emptyLinePlaceholder":522},[727,54905,54906],{"class":729,"line":495},[727,54907,51571],{"class":1986},[727,54909,54910],{"class":729,"line":1895},[727,54911,1898],{"emptyLinePlaceholder":522},[727,54913,54914,54916,54918,54920,54922,54925],{"class":729,"line":1901},[727,54915,2315],{"class":1986},[727,54917,2575],{"class":1882},[727,54919,2321],{"class":1986},[727,54921,2410],{"class":1986},[727,54923,54924],{"class":2376}," checkStatus",[727,54926,54927],{"class":768},"(name, key);\n",[727,54929,54930,54932,54934],{"class":729,"line":1973},[727,54931,52656],{"class":768},[727,54933,2597],{"class":2376},[727,54935,54748],{"class":768},[21,54937,54939],{"id":54938},"using-the-data-in-axiomai","Using the data in axiom.ai",[14,54941,54942,54943,54945],{},"To trigger an automation, you'll need to have an automation created. Once this has been created, set a ",[322,54944,8895],{"href":6958}," step as the first step, this will allow the automation to be able to receive the webhook that we are sending. In this step, ensure that you have the \"Test data\" filled in with the same format that you expect to receive the data, this will help with testing. For example:",[14,54947,54948],{},[90,54949,54950],{},"name, email",[14,54952,54953,54954,54956],{},"Once this has been done, you can then access the data that you send to the automation using the ",[90,54955,9369],{}," data token.",[21,54958,54960],{"id":54959},"potential-use-cases","Potential use cases",[14,54962,54963],{},"There are various use cases that you could make use of while using the axiom.ai API, such as:",[639,54965,54967],{"id":54966},"contact-forms","Contact forms",[14,54969,54970],{},"Using the package to send along the data from a webform can allow you to build completely custom contact or feedback forms. You could use the following code to send along the data:",[719,54972,54974],{"className":756,"code":54973,"language":758,"meta":494,"style":494},"const result = await trigger(\"Contact form\", \"KEY\", [[\"Karl Jones\", \"example@example.com\", \"Hi, I'm looking to enquire about a recent order.\"]]);\n",[90,54975,54976],{"__ignoreMap":494},[727,54977,54978,54980,54982,54984,54986,54988,54990,54993,54995,54998,55001,55004,55006,55009,55011,55014],{"class":729,"line":730},[727,54979,2315],{"class":1986},[727,54981,2575],{"class":1882},[727,54983,2321],{"class":1986},[727,54985,2410],{"class":1986},[727,54987,54736],{"class":2376},[727,54989,2542],{"class":768},[727,54991,54992],{"class":737},"\"Contact form\"",[727,54994,2004],{"class":768},[727,54996,54997],{"class":737},"\"KEY\"",[727,54999,55000],{"class":768},", [[",[727,55002,55003],{"class":737},"\"Karl Jones\"",[727,55005,2004],{"class":768},[727,55007,55008],{"class":737},"\"example@example.com\"",[727,55010,2004],{"class":768},[727,55012,55013],{"class":737},"\"Hi, I'm looking to enquire about a recent order.\"",[727,55015,55016],{"class":768},"]]);\n",[14,55018,55019,55020,55022],{},"Jump into the axiom.ai extension and create a new automation called \"Contact form\". As the first step, add a ",[322,55021,8895],{"href":494}," step, with the following test data set, this will help with creating your automation:",[14,55024,55025],{},[90,55026,55027],{},"name, email, message",[14,55029,55030,55031,55033],{},"You can use this data by accessing the ",[90,55032,9369],{}," data token. You could then:",[80,55035,55036,55042,55047],{},[83,55037,55038,55039,55041],{},"Use a ",[322,55040,7619],{"href":7618}," step to email this data to your team.",[83,55043,55044,55045,1230],{},"Store using the ",[322,55046,3303],{"href":3302},[83,55048,55049,55050,1230],{},"Automatically craft a response using the ",[322,55051,173],{"href":7845},[639,55053,55055],{"id":55054},"automating-actions-or-track-errors-in-your-web-app","Automating actions or track errors in your web app",[14,55057,55058],{},"Whether it's a standard web app or a mobile web app, you can use the API to automation actions or track errors within your web app. This can be helpful for various use cases, such as:",[80,55060,55061,55064,55067],{},[83,55062,55063],{},"Tracking newsletter sign ups.",[83,55065,55066],{},"Logging errors into a Google Sheet.",[83,55068,55069],{},"Logging attributes about users, such as browser, or language.",[14,55071,55072],{},"Other tools do offer these features, however, this may be worth a look before committing to a larger, and often more expensive, option.",[21,55074,796],{"id":795},[14,55076,55077],{},"Implementing the API into your projects is relatively simple, and if you have the skills or time you likely won't need to use this library - this is purely designed to be a time saver to ensure that you are meeting the requirements of the API without having to write the code yourself.",[14,55079,55080],{},"Future plans for this library will ensure that this will be kept updated with the latest developments in the axiom.ai API.",[14,55082,55083,55084],{},"You can get started with axiom-ai-helper over on npm: ",[322,55085,54428],{"href":54428,"rel":55086},[2245],[8898,55088,55089],{},[14,55090,55091,55092,44],{},"💡 Reminder, this package was created by the author, an employee of axiom.ai, but is not an official product of axiom.ai. Issues, questions and feature requests should be directed to the author through the repository: ",[322,55093,54430],{"href":54428,"rel":55094},[2245],[811,55096,55097],{},"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 .sZcZs, html code.shiki .sZcZs{--shiki-default:#82071E;--shiki-default-font-style:italic;--shiki-dark:#FFA198;--shiki-dark-font-style:italic}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}",{"title":494,"searchDepth":495,"depth":495,"links":55099},[55100,55101,55102,55106,55107,55111],{"id":54433,"depth":498,"text":54434},{"id":54460,"depth":498,"text":54461},{"id":54484,"depth":498,"text":54485,"children":55103},[55104,55105],{"id":54542,"depth":495,"text":54543},{"id":54751,"depth":495,"text":54752},{"id":54938,"depth":498,"text":54939},{"id":54959,"depth":498,"text":54960,"children":55108},[55109,55110],{"id":54966,"depth":495,"text":54967},{"id":55054,"depth":495,"text":55055},{"id":795,"depth":498,"text":796},"2025-04-29","Learn more about how the axiom-ai-helper package was created, why it was created and how it can help you get started quickly.",{"read":46726,"type":513,"tool":55115,"category":55116,"tags":55117,"featuredimg":55120,"landingimg":55121,"video":523},[46728],[50552],[55118,8424,830,55119],"helper","notifications","\u002Fnpm-axiom-post.webp","\u002Fnpm-axiom-sq.webp","\u002Fblog\u002Fhow-axiom-ai-helper-was-created",{"title":54376,"description":55113},"blog\u002Fhow-axiom-ai-helper-was-created","7j4OYXsuI5iyGXCOldqZ54YwWE3Y5feQ46VUckcJAYs",[50552],[513],[46728],{"id":55130,"title":55131,"author":48082,"body":55132,"date":55258,"description":55259,"draft":26250,"extension":506,"meta":55260,"navigation":522,"path":55269,"seo":55270,"stem":55271,"__hash__":55272,"pinned":-1,"category":55273,"type":55274,"tool":55275},"blog\u002Fblog\u002Fgetting-to-know-the-trycatch-step.md","Getting to Know the Try\u002FCatch Step - Tips and Tricks",{"type":8,"value":55133,"toc":55247},[55134,55137,55143,55146,55148,55151,55154,55157,55161,55164,55166,55169,55172,55175,55184,55187,55190,55200,55207,55210,55214,55226,55230,55233,55236,55242,55244],[14,55135,55136],{},"A critical concept to understand development or automation building is how to handle errors within your workflows in a way that does not cause the workflow to stop. The idea of a Try\u002FCatch has existed in programming for a long time and this is something that we brought into axiom.ai to help you manage your automations.",[14,55138,5070,55139,55142],{},[322,55140,55141],{"href":6250},"Try\u002FCatch"," step is a step within axiom.ai that can be used within your automations to gracefully catch any errors that you may encounter. Let’s look at an example of when this may be applicable:",[14,55144,55145],{},"You have an automation that visits a website and clicks a button - however, this button does not always appear on the page. Set up without the “Try\u002Fcatch” step, this would cause an error within your automation and the automation will stop. Instead, if you wrap the “Click element” step within a “Try\u002Fcatch” step you can add additional steps inside the “catch” portion that will be run when the error occurs - you could try to click an additional button or simply just send an email letting you know that the error occurred. The steps after the “Try\u002Fcatch” step will still run in this case.",[21,55147,54461],{"id":54460},[14,55149,55150],{},"To get started, add a “Try\u002Fcatch” step to your automation. You’ll notice that this step has two sections, a “try” and a “catch” section. You can use the “+ Add substep” button to add steps into these sections.",[14,55152,55153],{},"There are a couple of ways that you can implement this step into your automation - either proactively or reactively. Proactively adding this to your automation allows you to ensure that you are more likely to have a successful run the first time the automation is run, if you believe that there may be issues or if you are aware that the site is likely to change quite regularly. Adding these reactively would mean that you add these to your automation based on errors that you have experienced during the running of your automation.",[14,55155,55156],{},"If you are familiar with development, the “Try\u002Fcatch” step works exactly like it would when you are writing code yourself so you can likely understand the concept and best practices.",[639,55158,55160],{"id":55159},"try","Try",[14,55162,55163],{},"The “try” portion of this step can be used to add steps that you believe may cause an error within your automation. The steps will run as normal in the flow of your automation and have access to the data tokens from the rest of the automation. You can imagine these running as if the “Try\u002Fcatch” step was not present.",[639,55165,6494],{"id":2609},[14,55167,55168],{},"The “catch” portion of this still can be used to add steps that are run if an error occurs within the steps included in the “try” section. These steps will not be run during normal operation of the automation and will only run when an error occurs with the steps in the “try” section, if no error is encountered, these steps will never run within your automation. We don't recommend adding steps that you need to run every time your automation runs as this may cause additional errors in your automation outside the \"Try\u002Fcatch\" step if the steps aren't run every run.",[21,55170,24346],{"id":55171},"handling-errors",[14,55173,55174],{},"When an error occurs within your automation, there are a few methods that you can use to handle it. We are going to concentrate on the “catch” portion of the “Try\u002Fcatch” step for this blog. There are many things that you can do once your automation has encountered an error.",[8898,55176,55177],{},[14,55178,55179,55180,55183],{},"💡 To learn more about error handling, you can check out our ",[322,55181,55182],{"href":24345},"Error Handling"," documentation where you will find more advice on handling errors.",[21,55185,55186],{"id":55119},"Notifications",[14,55188,55189],{},"If you have your automation scheduled, you’re going to want to know if the automation runs into any errors that occur so you can jump in and make any changes that are required. There are a few steps that you can make use of to alert you or another system, such as:",[80,55191,55192,55196],{},[83,55193,55194],{},[322,55195,7619],{"href":7618},[83,55197,55198],{},[322,55199,12302],{"href":18400},[14,55201,55202,55203,55206],{},"Personally, the “Trigger a webhook” can be quite useful for alerting other systems that there has been an issue, for example, you could have this trigger a ",[322,55204,55205],{"href":21216},"Slack workflow"," webhook that can alert your team, if you have multiple people who require the results of the automation.",[14,55208,55209],{},"Simply adding these steps and configuring them in the “catch” portion of the “Try\u002Fcatch” step will be sufficient to catch any errors.",[21,55211,55213],{"id":55212},"ending-the-run","Ending the run",[14,55215,55216,55217,55221,55222,55225],{},"There may be situations where you wish to end the run in the event of the error rather than continue with the other steps in your workflow. For example, if you want the automation to finish if a button is not present on a page. To do this, you can use the ",[322,55218,55220],{"href":55219},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fend-run","End run"," step within the “catch” portion of the automation - once your automation reaches this step it will stop the automation run. This will be paired with a ",[322,55223,55224],{"href":21046},"notification"," to alert you to this.",[21,55227,55229],{"id":55228},"triggering-additional-steps","Triggering additional steps",[14,55231,55232],{},"It’s important to remember that when an error occurs, it is caught by the “catch” portion of the “Try\u002Fcatch” step, once the steps inside the “catch” portion are completed the rest of the steps within the automation will run.",[14,55234,55235],{},"However, there may be instances where you wish to trigger additional steps when an error occurs with a certain step. For example, if you have a button being clicked inside the “try” portion, and if this is not found an error is caught by the “catch” portion, you may want to attempt to click another button - worth noting though that any errors inside the “catch” portion will not be caught and will cause your automation to fail, consider nesting “Try\u002Fcatch” steps if you are worried about this.",[14,55237,55238,55239,55241],{},"You may also want to skip certain steps within your workflow, you can use the ",[322,55240,5619],{"href":53477}," step in the “catch” section to navigate between your steps in your workflow to create a more dynamic workflow.",[21,55243,796],{"id":795},[14,55245,55246],{},"Handling errors gracefully can help ensure that your automations can dynamically adapt to errors that it may encounter when working with websites that may be changing. The “Try\u002Fcatch” step allows you to decide the actions that are performed in the event of an error so that your automation can continue to run and achieve your goals. This is a great tool for error handling within your automations to prevent them from stopping when they encounter an error, if required.",{"title":494,"searchDepth":495,"depth":495,"links":55248},[55249,55253,55254,55255,55256,55257],{"id":54460,"depth":498,"text":54461,"children":55250},[55251,55252],{"id":55159,"depth":495,"text":55160},{"id":2609,"depth":495,"text":6494},{"id":55171,"depth":498,"text":24346},{"id":55119,"depth":498,"text":55186},{"id":55212,"depth":498,"text":55213},{"id":55228,"depth":498,"text":55229},{"id":795,"depth":498,"text":796},"2025-04-22","Learn how you can utilise the try\u002Fcatch step to handle errors, end runs, or send notifications during your bot runs.",{"read":46726,"type":513,"tool":55261,"category":55262,"tags":55263,"featuredimg":55267,"landingimg":55268,"summary":55259,"video":523,"metaTitle":55131},[46728],[50552],[55264,55265,55266,55119],"try \u002F catch","logic","errors","\u002Ftry-catch-post.webp","\u002Ftry-catch-sq.webp","\u002Fblog\u002Fgetting-to-know-the-trycatch-step",{"title":55131,"description":55259},"blog\u002Fgetting-to-know-the-trycatch-step","vOgDNq2PjmeLRo-RAP3nE4MrmDHJ87MyMUDtTa0XgaM",[50552],[513],[46728],{"id":55277,"title":55278,"author":48082,"body":55279,"date":55810,"description":55811,"draft":26250,"extension":506,"meta":55812,"navigation":522,"path":55821,"seo":55822,"stem":55823,"__hash__":55824,"pinned":-1,"category":55825,"type":55826,"tool":55827},"blog\u002Fblog\u002Fcreating-a-reddit-notification-bot.md","Creating a Reddit Notification Bot",{"type":8,"value":55280,"toc":55800},[55281,55284,55287,55289,55292,55296,55299,55303,55306,55309,55313,55316,55343,55346,55350,55353,55361,55364,55368,55371,55375,55378,55388,55391,55754,55757,55760,55766,55770,55773,55776,55780,55783,55786,55789,55791,55794,55797],[14,55282,55283],{},"We had a problem here at axiom.ai, we wanted to be sure that our teams were notified of new posts within our community so that we could review them, help where we can, or simply collect feedback from all of you.",[14,55285,55286],{},"Originally, we had a Zapier workflow that would detect new posts in the subreddit, and then trigger an axiom.ai automation that would then trigger a Slack workflow. Unfortunately, due to changes with Zapier, this stopped working as expected which meant that we missed a few posts.",[18,55288],{},[14,55290,55291],{},"Let’s look into how we solved this issue and simplified this process purely with axiom.ai and Google Sheets.",[21,55293,55295],{"id":55294},"the-problem-to-solve","The problem to solve",[14,55297,55298],{},"We will start by defining the problem that we are looking to solve with axiom.ai. Our team wanted to be notified when new posts go live into our community. This would ensure that we can get back to those who need help, and collect any feedback that has been posted there so we can feed it back into our development process.",[21,55300,55302],{"id":55301},"solving-the-problem","Solving the problem",[14,55304,55305],{},"Enter axiom.ai and Google Sheets. To solve this problem we are going to want an automation that can automatically get the data from the subreddit, and then check if there is new data on the subreddit. If there is new data, we then want the automation to let the team know.",[14,55307,55308],{},"Note: this will only track the newest ‘new’ post.",[639,55310,55312],{"id":55311},"setting-up-your-google-sheet","Setting up your Google Sheet",[14,55314,55315],{},"Before getting started, we would recommend setting up a Google Sheet that will be used to keep track of the most recent post. We created a sheet with three columns and we will be continuing this guide with the assumption that you have done the same. You can see the sample below of how we have it set up.",[7092,55317,55318,55331],{},[7095,55319,55320],{},[7098,55321,55322,55325,55328],{},[7101,55323,55324],{},"Subreddit",[7101,55326,55327],{},"Latest Post",[7101,55329,55330],{},"Date of last check",[7108,55332,55333],{},[7098,55334,55335,55338,55341],{},[7113,55336,55337],{},"r\u002Faxiom_ai",[7113,55339,55340],{},"No current post",[7113,55342],{},[14,55344,55345],{},"The first step in your automation should be a Read data from a Google Sheet that reads in the data that you are using, we set the “First cell” input to “A2”, and the “Last cell” input to “B2” - at this stage we only need the subreddit name, and the latest post URL.",[639,55347,55349],{"id":55348},"getting-the-subreddit-data","Getting the subreddit data",[14,55351,55352],{},"The first step that we need to do is to be able to get the data from the subreddit. It would be possible to directly scrape this from the page but we have found that a more reliable method is to do this using the RSS feed that is provided for each subreddit. In our case, the URL we use is the following:",[8898,55354,55355],{},[14,55356,55357],{},[322,55358,55359],{"href":55359,"rel":55360},"https:\u002F\u002Fwww.reddit.com\u002Fr\u002Faxiom_ai\u002F.rss",[2245],[14,55362,55363],{},"You can replace the subreddit name with the subreddit that you’d like to scrape. We are going to use the subreddit name that we have read in from the Google Sheet to make the automation more dynamic. You’ll need to set up your Go to page step to do the following:",[592,55365],{"src":55366,"alt":55367},"\u002Fblog\u002Fcreating-a-reddit-notification-bot-go-to-page.png","A dialog box titled 'Go to page: reddit.com' is displayed. It contains a field labelled 'Enter URL' with the pre-filled URL 'https:\u002F\u002Fwww.reddit.com\u002F[google-sheet-data?all&0]\u002F.rss'. Below this field is the text 'You can also plugin data from other steps to provide a URL. Enter (skip) to skip this step.' Two toggle switches are present at the bottom: 'Do not share localstorage' is toggled off, and 'Open in new tab' is also toggled off. Above the URL field are two buttons: 'Open url in new tab' and 'Get current URL'.",[14,55369,55370],{},"You can also skip the step of adding in the data token and insert the full URL manually. To the human eye, this looks like a jumble of information, we will look at how we can extract the data next.",[639,55372,55374],{"id":55373},"deciding-if-there-is-new-content","Deciding if there is new content",[14,55376,55377],{},"To determine if there are new posts, we will first need to read the content of the page, and then compare it to the URL of the latest post that we have stored in our Google Sheet. To do this we will need to make use of custom code within the Write Javascript step. To get started, add the following steps to your automation:",[77,55379,55380],{},[555,55381,55382,55385],{},[83,55383,55384],{},"A Try\u002Fcatch step - to catch any errors",[83,55386,55387],{},"Inside of the “try” section of this step, add a Write Javascript step.",[14,55389,55390],{},"Once this has been finished, you can insert the code below into the Write Javascript step:",[719,55392,55394],{"className":756,"code":55393,"language":758,"meta":494,"style":494},"\u002F\u002F Parse the text that we have retrieved from the 'pre' tag containing the RSS data.\nconst parseRss = (rssText) => {\n  const parser = new DOMParser()\n  return parser.parseFromString(rssText, 'text\u002Fxml')\n}\n\n\u002F\u002F Extract the individual items from the data into rows to be used in your automation.\nconst extractData = (xmlDoc) => {\n  \u002F\u002F Grab the individual 'entry' items\n  const items = xmlDoc.getElementsByTagName('entry')\n  var entries = []\n\n  for (let i = 0; i \u003C items.length; i++) {\n    const author = items[i]\n      .getElementsByTagName('author')[0]\n      .getElementsByTagName('name')[0].textContent\n    const link = items[i].getElementsByTagName('link')[0].getAttribute('href')\n    const title = items[i].getElementsByTagName('title')[0].textContent\n\n    entries.push([author, link, title])\n  }\n  return entries\n}\n\nconst preBody = document.getElementsByTagName('pre')[0].innerText\nconst parsedRss = parseRss(preBody)\n\nreturn extractData(parsedRss)\n",[90,55395,55396,55401,55421,55437,55455,55459,55463,55468,55488,55493,55515,55527,55531,55560,55572,55591,55609,55645,55669,55673,55683,55687,55694,55698,55702,55727,55741,55745],{"__ignoreMap":494},[727,55397,55398],{"class":729,"line":730},[727,55399,55400],{"class":2920},"\u002F\u002F Parse the text that we have retrieved from the 'pre' tag containing the RSS data.\n",[727,55402,55403,55405,55408,55410,55412,55415,55417,55419],{"class":729,"line":498},[727,55404,2315],{"class":1986},[727,55406,55407],{"class":2376}," parseRss",[727,55409,2321],{"class":1986},[727,55411,2524],{"class":768},[727,55413,55414],{"class":733},"rssText",[727,55416,5031],{"class":768},[727,55418,2388],{"class":1986},[727,55420,2391],{"class":768},[727,55422,55423,55425,55428,55430,55432,55435],{"class":729,"line":495},[727,55424,22321],{"class":1986},[727,55426,55427],{"class":1882}," parser",[727,55429,2321],{"class":1986},[727,55431,47976],{"class":1986},[727,55433,55434],{"class":2376}," DOMParser",[727,55436,47105],{"class":768},[727,55438,55439,55441,55444,55447,55450,55453],{"class":729,"line":1895},[727,55440,17377],{"class":1986},[727,55442,55443],{"class":768}," parser.",[727,55445,55446],{"class":2376},"parseFromString",[727,55448,55449],{"class":768},"(rssText, ",[727,55451,55452],{"class":737},"'text\u002Fxml'",[727,55454,12611],{"class":768},[727,55456,55457],{"class":729,"line":1901},[727,55458,2639],{"class":768},[727,55460,55461],{"class":729,"line":1973},[727,55462,1898],{"emptyLinePlaceholder":522},[727,55464,55465],{"class":729,"line":2052},[727,55466,55467],{"class":2920},"\u002F\u002F Extract the individual items from the data into rows to be used in your automation.\n",[727,55469,55470,55472,55475,55477,55479,55482,55484,55486],{"class":729,"line":2058},[727,55471,2315],{"class":1986},[727,55473,55474],{"class":2376}," extractData",[727,55476,2321],{"class":1986},[727,55478,2524],{"class":768},[727,55480,55481],{"class":733},"xmlDoc",[727,55483,5031],{"class":768},[727,55485,2388],{"class":1986},[727,55487,2391],{"class":768},[727,55489,55490],{"class":729,"line":2064},[727,55491,55492],{"class":2920},"  \u002F\u002F Grab the individual 'entry' items\n",[727,55494,55495,55497,55500,55502,55505,55508,55510,55513],{"class":729,"line":2087},[727,55496,22321],{"class":1986},[727,55498,55499],{"class":1882}," items",[727,55501,2321],{"class":1986},[727,55503,55504],{"class":768}," xmlDoc.",[727,55506,55507],{"class":2376},"getElementsByTagName",[727,55509,2542],{"class":768},[727,55511,55512],{"class":737},"'entry'",[727,55514,12611],{"class":768},[727,55516,55517,55519,55522,55524],{"class":729,"line":2140},[727,55518,9433],{"class":1986},[727,55520,55521],{"class":768}," entries ",[727,55523,4970],{"class":1986},[727,55525,55526],{"class":768}," []\n",[727,55528,55529],{"class":729,"line":2154},[727,55530,1898],{"emptyLinePlaceholder":522},[727,55532,55533,55535,55537,55539,55541,55543,55545,55547,55549,55552,55554,55556,55558],{"class":729,"line":1529},[727,55534,18112],{"class":1986},[727,55536,2524],{"class":768},[727,55538,12512],{"class":1986},[727,55540,18119],{"class":768},[727,55542,4970],{"class":1986},[727,55544,18124],{"class":1882},[727,55546,18127],{"class":768},[727,55548,18130],{"class":1986},[727,55550,55551],{"class":768}," items.",[727,55553,18136],{"class":1882},[727,55555,21428],{"class":768},[727,55557,21431],{"class":1986},[727,55559,16992],{"class":768},[727,55561,55562,55564,55567,55569],{"class":729,"line":2178},[727,55563,17003],{"class":1986},[727,55565,55566],{"class":1882}," author",[727,55568,2321],{"class":1986},[727,55570,55571],{"class":768}," items[i]\n",[727,55573,55574,55577,55579,55581,55584,55587,55589],{"class":729,"line":2187},[727,55575,55576],{"class":768},"      .",[727,55578,55507],{"class":2376},[727,55580,2542],{"class":768},[727,55582,55583],{"class":737},"'author'",[727,55585,55586],{"class":768},")[",[727,55588,17395],{"class":1882},[727,55590,17433],{"class":768},[727,55592,55593,55595,55597,55599,55602,55604,55606],{"class":729,"line":2533},[727,55594,55576],{"class":768},[727,55596,55507],{"class":2376},[727,55598,2542],{"class":768},[727,55600,55601],{"class":737},"'name'",[727,55603,55586],{"class":768},[727,55605,17395],{"class":1882},[727,55607,55608],{"class":768},"].textContent\n",[727,55610,55611,55613,55616,55618,55621,55623,55625,55628,55630,55632,55635,55638,55640,55643],{"class":729,"line":2551},[727,55612,17003],{"class":1986},[727,55614,55615],{"class":1882}," link",[727,55617,2321],{"class":1986},[727,55619,55620],{"class":768}," items[i].",[727,55622,55507],{"class":2376},[727,55624,2542],{"class":768},[727,55626,55627],{"class":737},"'link'",[727,55629,55586],{"class":768},[727,55631,17395],{"class":1882},[727,55633,55634],{"class":768},"].",[727,55636,55637],{"class":2376},"getAttribute",[727,55639,2542],{"class":768},[727,55641,55642],{"class":737},"'href'",[727,55644,12611],{"class":768},[727,55646,55647,55649,55652,55654,55656,55658,55660,55663,55665,55667],{"class":729,"line":2559},[727,55648,17003],{"class":1986},[727,55650,55651],{"class":1882}," title",[727,55653,2321],{"class":1986},[727,55655,55620],{"class":768},[727,55657,55507],{"class":2376},[727,55659,2542],{"class":768},[727,55661,55662],{"class":737},"'title'",[727,55664,55586],{"class":768},[727,55666,17395],{"class":1882},[727,55668,55608],{"class":768},[727,55670,55671],{"class":729,"line":2565},[727,55672,1898],{"emptyLinePlaceholder":522},[727,55674,55675,55678,55680],{"class":729,"line":2570},[727,55676,55677],{"class":768},"    entries.",[727,55679,5043],{"class":2376},[727,55681,55682],{"class":768},"([author, link, title])\n",[727,55684,55685],{"class":729,"line":2591},[727,55686,9712],{"class":768},[727,55688,55689,55691],{"class":729,"line":2603},[727,55690,17377],{"class":1986},[727,55692,55693],{"class":768}," entries\n",[727,55695,55696],{"class":729,"line":2615},[727,55697,2639],{"class":768},[727,55699,55700],{"class":729,"line":2630},[727,55701,1898],{"emptyLinePlaceholder":522},[727,55703,55704,55706,55709,55711,55713,55715,55717,55720,55722,55724],{"class":729,"line":2636},[727,55705,2315],{"class":1986},[727,55707,55708],{"class":1882}," preBody",[727,55710,2321],{"class":1986},[727,55712,50886],{"class":768},[727,55714,55507],{"class":2376},[727,55716,2542],{"class":768},[727,55718,55719],{"class":737},"'pre'",[727,55721,55586],{"class":768},[727,55723,17395],{"class":1882},[727,55725,55726],{"class":768},"].innerText\n",[727,55728,55729,55731,55734,55736,55738],{"class":729,"line":2642},[727,55730,2315],{"class":1986},[727,55732,55733],{"class":1882}," parsedRss",[727,55735,2321],{"class":1986},[727,55737,55407],{"class":2376},[727,55739,55740],{"class":768},"(preBody)\n",[727,55742,55743],{"class":729,"line":2647},[727,55744,1898],{"emptyLinePlaceholder":522},[727,55746,55747,55749,55751],{"class":729,"line":4657},[727,55748,2972],{"class":1986},[727,55750,55474],{"class":2376},[727,55752,55753],{"class":768},"(parsedRss)\n",[14,55755,55756],{},"This code will return the author, link and title of the latest post that has been created on the subreddit. This will be stored in the code-data data token that can then be used in later steps of your automation. This code can be extended to take more values out of the code of the page - feel free to copy it and play around with it for yourself!",[14,55758,55759],{},"Once we have this data, we will need to decide if the post is a new post, or if it’s an existing post. To do this, we will want to check the URL of the latest post against the URL of the post that you have stored in your Google Sheet.",[14,55761,55762,55763,55765],{},"To get started, add an “If condition is true, run steps” step to your automation. The data to check will be the URL that has been stored in your Google Sheet - this should be in Column B of your data that was imported in the “Read data from a Google Sheet” step. We will want to compare this to Column B from the ",[90,55764,2982],{}," data token that was exported from the “Write JavaScript” step. It’s important to note that we want the steps inside of the “If condition” step to run if these do not match - enable the “Reverse condition” option.",[592,55767],{"src":55768,"alt":55769},"\u002Fblog\u002Fcreating-a-reddit-notification-bot-if-condition.png","A dialog box titled 'If condition' is displayed. The 'Data to check:' field shows '[google-sheet-data?all&1]'. The 'Condition to check:' is set to 'When any of '[code-data?&1]'' is present'. Below this, there are tabs for 'Words', 'Numbers', and 'JS == true', with 'Words' selected. A field contains the inserted data '[code-data?&1]' with a close button. Below this is the instruction: '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.' 1  The 'Apply rule when match' section has buttons for 'Any word' (selected) and 'All words'. A checkbox for 'Match only complete word' is unchecked, with explanatory text below it. Finally, a 'Reverse condition:' dropdown is set to 'Run steps if condition is false'.",[14,55771,55772],{},"Now, any steps that you include within the “If condition” step will run when the URL that is stored within the Google Sheet does not match the URL of the latest post.",[14,55774,55775],{},"You can add steps to notify your team of any new posts, this could be done using a Send an Email step, the Trigger a webhook step, or simply just logging this into a Google Sheet. We decided to go ahead and send this onto a Slack channel using our guide on How to automate Slack with axiom.ai.",[639,55777,55779],{"id":55778},"logging-the-status-of-the-automation","Logging the status of the automation",[14,55781,55782],{},"As previously mentioned, the post URL will need to be logged each time a new post has been picked up by the automation. Now that we have confirmation that a new post has been created, we will want to replace the URL of the last post that the team was notified about and replace this with the URL of the latest post. These steps will need to remain inside the “If condition” step that we created above.",[14,55784,55785],{},"First, we will want to replace the URL within the Google Sheet. To do this, create a new “Write data to a Google Sheet” step. Configure this to use the same sheet that you used previously, and set the data to write to be the code-data data token, using Column B, when prompted. The step should be set to “Add to existing data” and “B2” should be entered in the cell.",[14,55787,55788],{},"Next, we are going to log the last time that the automation ran and successfully detected a new post - first, add a “Date and time” step and configure this with the time format that you wish to use. Then, create a new “Write data to a Google Sheet” step. Configure this to use the same sheet that you used previously, and set the data to write to be the date-and-time data token. The step should be set to “Add to existing data” and “C2” should be entered in the cell.",[21,55790,796],{"id":795},[14,55792,55793],{},"In this article, we explored the problem of automating Reddit notifications using axiom.ai and Google Sheets. We walked through the steps involved in setting up the automation, from reading data from a Google Sheet to getting the subreddit data and comparing it to the latest stored post. We also demonstrated how to use custom code to parse the RSS feed and extract the individual items from the data.",[14,55795,55796],{},"By leveraging the power of axiom.ai and Google Sheets, we were able to create a reliable and efficient automation that helps our team stay informed about new posts in our community. This solution allows us to be more responsive to our users and collect valuable feedback that we can use to improve our products and services.",[811,55798,55799],{},"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}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}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 .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":494,"searchDepth":495,"depth":495,"links":55801},[55802,55803,55809],{"id":55294,"depth":498,"text":55295},{"id":55301,"depth":498,"text":55302,"children":55804},[55805,55806,55807,55808],{"id":55311,"depth":495,"text":55312},{"id":55348,"depth":495,"text":55349},{"id":55373,"depth":495,"text":55374},{"id":55778,"depth":495,"text":55779},{"id":795,"depth":498,"text":796},"2025-04-17","Discover how to create a bot that can check for new posts within a subreddit and send a notification when there is one",{"read":48203,"type":90,"tool":55813,"category":55814,"tags":55815,"featuredimg":55819,"landingimg":55820,"summary":55811,"video":523,"metaTitle":55278},[46728],[53990],[55816,55817,12881,55818],"subreddit","subreddit data","rss feed","\u002Fblog\u002Freddit-notification-post.webp","\u002Fblog\u002Freddit-sq-notifications.webp","\u002Fblog\u002Fcreating-a-reddit-notification-bot",{"title":55278,"description":55811},"blog\u002Fcreating-a-reddit-notification-bot","2KFL0_hj7YsT0oLFhUk_6VypgRur5JFbgkyh_bsbZVU",[53990],[90],[46728],{"id":55829,"title":55830,"author":48082,"body":55831,"date":56149,"description":56150,"draft":26250,"extension":506,"meta":56151,"navigation":522,"path":56160,"seo":56161,"stem":56162,"__hash__":56163,"pinned":-1,"category":56164,"type":56165,"tool":56166},"blog\u002Fblog\u002Fbeyond-the-basics-javascript-and-axiom.md","Beyond the Basics - JavaScript and axiom.ai",{"type":8,"value":55832,"toc":56138},[55833,55839,55854,55858,55863,55868,55876,55936,55943,55946,55974,55978,55985,55988,55996,56000,56009,56017,56020,56024,56027,56031,56034,56037,56040,56044,56050,56059,56062,56071,56074,56108,56121,56124,56127,56130,56133,56136],[14,55834,55835,55836,55838],{},"axiom.ai automations are already very powerful on their own, add JavaScript to them? You can extend it's functionalities tenfold, you're only limited by your development skills and imagination. The ",[322,55837,2301],{"href":2300}," step that we provide allows you to add your scripts right into your automation and have them executed on the page that your bot is working on. This can be useful for adding custom logic, data processing and accessing Puppeteer functions within your runs.",[14,55840,55841,55842,450,55845,55849,55850,55853],{},"Did you know that we also provide some snippets? Our growing library of ",[322,55843,11031],{"href":55844},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript",[322,55846,55848],{"href":55847},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fpuppeteer","Puppeteer"," snippets can help solve some standard use cases within your automations. Our ",[322,55851,3326],{"href":3324,"rel":55852},[2245]," can also be a great place to get some help, if you are unsure.",[21,55855,55857],{"id":55856},"using-javascript-within-an-automation","Using JavaScript within an automation",[14,55859,21301,55860,55862],{},[322,55861,2301],{"href":2300}," step to your automation. This step allows you to write a JavaScript script in your automation. The script that you write will only be executed when the automation run reaches the step that you have inserted the \"Write Javascript\" step at.",[8898,55864,55865],{},[14,55866,55867],{},"💡 Your script will be executed in the context of a function, this is important to note to understand the syntax and features that can be used within this step.",[14,55869,55870,55871,55875],{},"While axiom.ai does provide a library of ",[322,55872,55874],{"href":55873},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002F#manipulate-data","data manipulation"," steps that can be used to manipulate any data that you pass into your automation, or gather through your automations actions, there are times when you may want a more than the built in features provide. An example of this is adding a constant value to any empty cells of scrape data - when scrape data is written to a Google Sheet, these blanks will cause the data to shift as a result of their API. To get around this, a simple script can be used:",[719,55877,55879],{"className":756,"code":55878,"language":758,"meta":494,"style":494},"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",[90,55880,55881,55886,55891,55895,55900,55905,55910,55915,55919,55923,55927,55931],{"__ignoreMap":494},[727,55882,55883],{"class":729,"line":730},[727,55884,55885],{},"var data = [scrape - data]\n",[727,55887,55888],{"class":729,"line":498},[727,55889,55890],{},"const placeholder = '-'\n",[727,55892,55893],{"class":729,"line":495},[727,55894,1898],{"emptyLinePlaceholder":522},[727,55896,55897],{"class":729,"line":1895},[727,55898,55899],{},"for (var i = 0; i \u003C data.length; i++) {\n",[727,55901,55902],{"class":729,"line":1901},[727,55903,55904],{},"  for (var j = 0; j \u003C data[i].length; j++) {\n",[727,55906,55907],{"class":729,"line":1973},[727,55908,55909],{},"    if (data[i][j] == '') {\n",[727,55911,55912],{"class":729,"line":2052},[727,55913,55914],{},"      data[i][j] = placeholder\n",[727,55916,55917],{"class":729,"line":2058},[727,55918,2633],{},[727,55920,55921],{"class":729,"line":2064},[727,55922,9712],{},[727,55924,55925],{"class":729,"line":2087},[727,55926,2639],{},[727,55928,55929],{"class":729,"line":2140},[727,55930,1898],{"emptyLinePlaceholder":522},[727,55932,55933],{"class":729,"line":2154},[727,55934,55935],{},"return data\n",[14,55937,55938,55939,44],{},"Source: ",[322,55940,55942],{"href":55941},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fdata#adding-a-constant-to-scrape-data","JavaScript Snippets",[14,55944,55945],{},"Functions can be declared within your scripts, allowing you to structure your code neatly, for example:",[719,55947,55949],{"className":756,"code":55948,"language":758,"meta":494,"style":494},"const add = (a, b) => {\n  return a + b\n}\n\nconst sum = add(1, 2) \u002F\u002F 3\n",[90,55950,55951,55956,55961,55965,55969],{"__ignoreMap":494},[727,55952,55953],{"class":729,"line":730},[727,55954,55955],{},"const add = (a, b) => {\n",[727,55957,55958],{"class":729,"line":498},[727,55959,55960],{},"  return a + b\n",[727,55962,55963],{"class":729,"line":495},[727,55964,2639],{},[727,55966,55967],{"class":729,"line":1895},[727,55968,1898],{"emptyLinePlaceholder":522},[727,55970,55971],{"class":729,"line":1901},[727,55972,55973],{},"const sum = add(1, 2) \u002F\u002F 3\n",[639,55975,55977],{"id":55976},"javascript-limitations","JavaScript limitations",[14,55979,55980,55981,55984],{},"Your scripts are encapsulated and will not interact with each other. For example, if you have a script that declares the variable ",[727,55982,11085],{"style":55983},"font-family: monospace;",", you will not be able to access this within another script.",[14,55986,55987],{},"As the script that you insert into this step is executed as a function, you will not be able to import any additional libraries or modules into your script - doing so will actually cause issues with your automation and may prevent it from running.",[14,55989,55990,55991,55995],{},"If you are using JavaScript to access an API, it's important to remember that you may run into cross-origin resources sharing (CORS) issues. You may attempt ",[322,55992,55994],{"href":55993},"#running-in-app","running in-app"," option, but we are unable to guarantee that this will resolve the problem.",[21,55997,55999],{"id":55998},"using-puppeteer-within-an-automation","Using Puppeteer within an automation",[14,56001,56002,56003,56008],{},"In the same way that you can use JavaScript within your automations, you can also access certain Puppeteer functions. This allows you to make completely custom automations that can interact with pages and perform actions using custom code - essentially using axiom.ai as a wrapper for your custom scripts. Generally, you are able to use any function that is available in the ",[322,56004,56007],{"href":56005,"rel":56006},"https:\u002F\u002Fpptr.dev\u002Fapi\u002Fpuppeteer.page",[2245],"Page"," class. This means that you can access functions such as:",[80,56010,56011,56014],{},[83,56012,56013],{},"click()",[83,56015,56016],{},"reload()",[14,56018,56019],{},"And many other functions that can be found in the Puppeteer documentation. This can be helpful if you need to access certain functions that are not natively available through axiom.ai, such as automating the scrolling on a page, or performing actions on a subset of elements on a page, for example, only buttons that contain a certain string of text rather than all buttons on the page.",[639,56021,56023],{"id":56022},"puppeteer-limitations","Puppeteer limitations",[14,56025,56026],{},"Puppeteer scripts can only be run locally and can not be run in the cloud, this means that you will need to have the desktop application installed and active to run your scripts - you'll need to select \"Run in app\" within the step. This does limit the functionality of this integration, but JavaScript can usually be a stand-in in the event that you need to run this in the cloud.",[21,56028,56030],{"id":56029},"running-in-app","Running in-app",[14,56032,56033],{},"The \"Run in app\" option within the \"Write Javascript\" step can be used to run code in the context of the desktop application, rather than the context of the browser. If you are running your automation locally, you will need to have the desktop application installed and active. There are some benefits to using it with your other scripts, such as:",[14,56035,56036],{},"Ensuring your code does not interfere with the site's code - for example, triggering event listeners, conflicting function or variable names.\nAccessing the Puppeteer library (required to use the \"Run in app\" option).",[14,56038,56039],{},"The downside of running code in the desktop application is the inability to access elements, functions or variables from the page that your automation is running on. You will not have the ability to see the console output from code within the \"Write Javascript\" step while using this option.",[21,56041,56043],{"id":56042},"using-data-tokens","Using data tokens",[14,56045,56046,56047,56049],{},"Data tokens contain information that has been output from steps - for example, the ",[90,56048,198],{}," data token that is output from the \"Get data from bot's current page\" step contains all of the data that the step has retrieved from the page. These can be used within your custom scripts by clicking the \"Insert data\" option and this will insert the data token into your script. For example:",[719,56051,56053],{"className":756,"code":56052,"language":758,"meta":494,"style":494},"let data = [scrape - data]\n",[90,56054,56055],{"__ignoreMap":494},[727,56056,56057],{"class":729,"line":730},[727,56058,56052],{},[14,56060,56061],{},"For data tokens that just contain a single value, you can insert it like so, replacing the data token with the one from your automation:",[719,56063,56065],{"className":756,"code":56064,"language":758,"meta":494,"style":494},"let data = '[data-token]'\n",[90,56066,56067],{"__ignoreMap":494},[727,56068,56069],{"class":729,"line":730},[727,56070,56064],{},[14,56072,56073],{},"From this point you have an array of arrays that you can loop through, manipulate or use for logic conditions throughout your script. For example:",[719,56075,56077],{"className":756,"code":56076,"language":758,"meta":494,"style":494},"let data = [scrape - data]\n\nfor (var i = 0; i \u003C data.length; i++) {\n  for (var j = 0; j \u003C data[i].length; j++) {\n    console.log(data[i][j])\n  }\n}\n",[90,56078,56079,56083,56087,56091,56095,56100,56104],{"__ignoreMap":494},[727,56080,56081],{"class":729,"line":730},[727,56082,56052],{},[727,56084,56085],{"class":729,"line":498},[727,56086,1898],{"emptyLinePlaceholder":522},[727,56088,56089],{"class":729,"line":495},[727,56090,55899],{},[727,56092,56093],{"class":729,"line":1895},[727,56094,55904],{},[727,56096,56097],{"class":729,"line":1901},[727,56098,56099],{},"    console.log(data[i][j])\n",[727,56101,56102],{"class":729,"line":1973},[727,56103,9712],{},[727,56105,56106],{"class":729,"line":2052},[727,56107,2639],{},[14,56109,56110,56111,56113,56114,3289,56116,56118,56119,44],{},"This can be helpful when creating custom integrations with services that make use of the data from your automations, such as posting to ",[322,56112,4914],{"href":4915},", sending data to ",[322,56115,21233],{"href":22503},[322,56117,22520],{"href":22880},", or triggering other automations such as from ",[322,56120,3288],{"href":24683},[21,56122,56123],{"id":795},"Wrapping Up",[14,56125,56126],{},"By incorporating JavaScript and Puppeteer into your axiom.ai automations, you unlock a realm of possibilities far beyond standard automation capabilities. Whether you're refining scraped data with custom logic, interacting with web pages using Puppeteer's powerful functions, or building intricate integrations with external services, these tools empower you to tailor your automations to your precise needs.",[14,56128,56129],{},"Remember, while JavaScript offers flexibility for data manipulation and custom logic, Puppeteer enables direct interaction with web pages, albeit with the limitation of local execution. Leverage our growing library of snippets and community support to navigate common use cases and overcome any challenges you encounter.",[14,56131,56132],{},"Keep in mind the limitations of encapsulated scripts and CORS issues when working with APIs, and always explore the \"Run in app\" option when necessary. By effectively utilizing data tokens, you can seamlessly integrate data from various steps within your automation into your custom scripts, creating dynamic and responsive workflows.",[14,56134,56135],{},"With axiom.ai's JavaScript and Puppeteer integration, you're not just automating tasks; you're crafting bespoke solutions that enhance your productivity and streamline your workflows. We encourage you to experiment, explore, and push the boundaries of what's possible with automation.",[811,56137,4898],{},{"title":494,"searchDepth":495,"depth":495,"links":56139},[56140,56143,56146,56147,56148],{"id":55856,"depth":498,"text":55857,"children":56141},[56142],{"id":55976,"depth":495,"text":55977},{"id":55998,"depth":498,"text":55999,"children":56144},[56145],{"id":56022,"depth":495,"text":56023},{"id":56029,"depth":498,"text":56030},{"id":56042,"depth":498,"text":56043},{"id":795,"depth":498,"text":56123},"2025-04-15","Take your axiom.ai skills to the next level. Learn how to use JavaScript for custom logic, data processing, and advanced automation, moving beyond standard workflows.",{"read":56152,"type":90,"tool":56153,"category":56154,"tags":56155,"featuredimg":56158,"landingimg":56159,"summary":56150,"video":523,"metaTitle":55830},"7 min read",[46728],[50552],[23962,55848,56156,56157],"Data tokens","Write JavaScript step","\u002Faxiom-js.webp","\u002Faxiom-js-sq.webp","\u002Fblog\u002Fbeyond-the-basics-javascript-and-axiom",{"title":55830,"description":56150},"blog\u002Fbeyond-the-basics-javascript-and-axiom","EMvO8aMExjKIhKX3lJM5KesN9ztznzzwWexyAdRMZsw",[50552],[90],[46728],{"id":56168,"title":56169,"author":48082,"body":56170,"date":56879,"description":56880,"draft":26250,"extension":506,"meta":56881,"navigation":522,"path":56891,"seo":56892,"stem":56893,"__hash__":56894,"pinned":-1,"category":56895,"type":56896,"tool":56897},"blog\u002Fblog\u002Funderstanding-and-working-with-the-shadow-dom.md","Understanding and Working with the Shadow DOM",{"type":8,"value":56171,"toc":56867},[56172,56176,56179,56183,56186,56192,56198,56202,56205,56209,56212,56241,56247,56338,56345,56349,56357,56587,56599,56602,56621,56628,56632,56635,56640,56646,56657,56668,56716,56719,56723,56726,56829,56832,56836,56839,56853,56855,56858,56861,56864],[21,56173,56175],{"id":56174},"what-is-the-shadow-dom","What is the Shadow DOM?",[14,56177,56178],{},"As web applications grow in complexity, managing styles and preventing conflicts between different components becomes increasingly challenging. Enter the Shadow DOM, a key technology that empowers developers to create encapsulated and reusable web components. By providing a way to isolate HTML, CSS, and JavaScript, the Shadow DOM enables the construction of modular and self-contained elements that enhance code organization and maintainability. This article will guide you through the core concepts of the Shadow DOM, demonstrating its practical use and highlighting its role in modern web development.",[21,56180,56182],{"id":56181},"why-use-shadow-dom","Why use Shadow DOM?",[14,56184,56185],{},"Shadow DOM can be a very powerful feature of web development that allows for elements to be created separately from the main document of the website. You can think of these as \"sub documents\". There are a few benefits to using this:",[14,56187,56188,56191],{},[29,56189,56190],{},"Encapsulation:"," as the code within the Shadow DOM are self-contained, this means that the code inside of them is self-contained. This can be useful to avoid the resources from the main document interacting with the code within the Shadow DOM, which could have unexpected side-effects.",[14,56193,56194,56197],{},[29,56195,56196],{},"Style scoping:"," as a result of encapsulation, you can include styling within the Shadow DOM that will only have an effect on the elements included within. This can give you the ability to customise certain elements, without impacting others.",[21,56199,56201],{"id":56200},"working-with-the-shadow-dom","Working with the Shadow DOM",[14,56203,56204],{},"Working with the Shadow DOM requires the use of JavaScript and they can be interacted with programmatically.",[639,56206,56208],{"id":56207},"creating-a-shadow-dom","Creating a Shadow DOM",[14,56210,56211],{},"To get started, you'll first need to create a Shadow DOM on your page, consider the following HTML - this will demonstrate where we are wanting to place the code. We will be attaching the Shadow DOM to this element using JavaScript.",[719,56213,56217],{"className":56214,"code":56215,"language":56216,"meta":494,"style":494},"language-html shiki shiki-themes github-light-default github-dark-default","\u003Cdiv id=\"host\">\u003C\u002Fdiv>\n","html",[90,56218,56219],{"__ignoreMap":494},[727,56220,56221,56223,56225,56228,56230,56233,56236,56238],{"class":729,"line":730},[727,56222,18130],{"class":768},[727,56224,50804],{"class":7745},[727,56226,56227],{"class":1882}," id",[727,56229,4970],{"class":768},[727,56231,56232],{"class":737},"\"host\"",[727,56234,56235],{"class":768},">\u003C\u002F",[727,56237,50804],{"class":7745},[727,56239,56240],{"class":768},">\n",[14,56242,56243,56244,56246],{},"Now, we can come in with JavaScript to create our Shadow DOM, we are going to use the ",[90,56245,50761],{}," with the ID of \"host\" as our placeholder:",[719,56248,56250],{"className":756,"code":56249,"language":758,"meta":494,"style":494},"const host = document.querySelector('#host')\nconst shadow = host.attachShadow({ mode: 'open' })\nconst span = document.createElement('span')\nspan.textContent = \"I'm in the shadow DOM\"\nshadow.appendChild(span)\n",[90,56251,56252,56272,56296,56317,56327],{"__ignoreMap":494},[727,56253,56254,56256,56259,56261,56263,56265,56267,56270],{"class":729,"line":730},[727,56255,2315],{"class":1986},[727,56257,56258],{"class":1882}," host",[727,56260,2321],{"class":1986},[727,56262,50886],{"class":768},[727,56264,47926],{"class":2376},[727,56266,2542],{"class":768},[727,56268,56269],{"class":737},"'#host'",[727,56271,12611],{"class":768},[727,56273,56274,56276,56279,56281,56284,56287,56290,56293],{"class":729,"line":498},[727,56275,2315],{"class":1986},[727,56277,56278],{"class":1882}," shadow",[727,56280,2321],{"class":1986},[727,56282,56283],{"class":768}," host.",[727,56285,56286],{"class":2376},"attachShadow",[727,56288,56289],{"class":768},"({ mode: ",[727,56291,56292],{"class":737},"'open'",[727,56294,56295],{"class":768}," })\n",[727,56297,56298,56300,56303,56305,56307,56310,56312,56315],{"class":729,"line":495},[727,56299,2315],{"class":1986},[727,56301,56302],{"class":1882}," span",[727,56304,2321],{"class":1986},[727,56306,50886],{"class":768},[727,56308,56309],{"class":2376},"createElement",[727,56311,2542],{"class":768},[727,56313,56314],{"class":737},"'span'",[727,56316,12611],{"class":768},[727,56318,56319,56322,56324],{"class":729,"line":1895},[727,56320,56321],{"class":768},"span.textContent ",[727,56323,4970],{"class":1986},[727,56325,56326],{"class":737}," \"I'm in the shadow DOM\"\n",[727,56328,56329,56332,56335],{"class":729,"line":1901},[727,56330,56331],{"class":768},"shadow.",[727,56333,56334],{"class":2376},"appendChild",[727,56336,56337],{"class":768},"(span)\n",[14,56339,56340,56341,56344],{},"From a user perspective, they will not notice any different in the ",[90,56342,56343],{},"\u003Cspan>"," that has been created on the page, but under the hood this implementation will allow you to fully take advantage of the benefits that Shadow DOM provides.",[639,56346,56348],{"id":56347},"encapsulation","Encapsulation",[14,56350,56351,56352,56356],{},"Having the ability to ensure that CSS and JavaScript on the page does not impact your custom element can be a powerful tool to ensuring that the elements inside your Shadow DOM will operate as expected. Let's look at the example below (",[322,56353,53062],{"href":56354,"rel":56355},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FWeb_components\u002FUsing_shadow_DOM#encapsulation_from_javascript",[2245],"):",[719,56358,56360],{"className":756,"code":56359,"language":758,"meta":494,"style":494},"const host = document.querySelector('#host')\nconst shadow = host.attachShadow({ mode: 'open' })\nconst span = document.createElement('span')\nspan.textContent = \"I'm in the shadow DOM\"\nshadow.appendChild(span)\n\nconst upper = document.querySelector('button#upper')\nupper.addEventListener('click', () => {\n  const spans = Array.from(document.querySelectorAll('span'))\n  for (const span of spans) {\n    span.textContent = span.textContent.toUpperCase()\n  }\n})\n\nconst reload = document.querySelector('#reload')\nreload.addEventListener('click', () => document.location.reload())\n",[90,56361,56362,56380,56398,56416,56424,56432,56436,56456,56475,56501,56516,56531,56535,56539,56543,56563],{"__ignoreMap":494},[727,56363,56364,56366,56368,56370,56372,56374,56376,56378],{"class":729,"line":730},[727,56365,2315],{"class":1986},[727,56367,56258],{"class":1882},[727,56369,2321],{"class":1986},[727,56371,50886],{"class":768},[727,56373,47926],{"class":2376},[727,56375,2542],{"class":768},[727,56377,56269],{"class":737},[727,56379,12611],{"class":768},[727,56381,56382,56384,56386,56388,56390,56392,56394,56396],{"class":729,"line":498},[727,56383,2315],{"class":1986},[727,56385,56278],{"class":1882},[727,56387,2321],{"class":1986},[727,56389,56283],{"class":768},[727,56391,56286],{"class":2376},[727,56393,56289],{"class":768},[727,56395,56292],{"class":737},[727,56397,56295],{"class":768},[727,56399,56400,56402,56404,56406,56408,56410,56412,56414],{"class":729,"line":495},[727,56401,2315],{"class":1986},[727,56403,56302],{"class":1882},[727,56405,2321],{"class":1986},[727,56407,50886],{"class":768},[727,56409,56309],{"class":2376},[727,56411,2542],{"class":768},[727,56413,56314],{"class":737},[727,56415,12611],{"class":768},[727,56417,56418,56420,56422],{"class":729,"line":1895},[727,56419,56321],{"class":768},[727,56421,4970],{"class":1986},[727,56423,56326],{"class":737},[727,56425,56426,56428,56430],{"class":729,"line":1901},[727,56427,56331],{"class":768},[727,56429,56334],{"class":2376},[727,56431,56337],{"class":768},[727,56433,56434],{"class":729,"line":1973},[727,56435,1898],{"emptyLinePlaceholder":522},[727,56437,56438,56440,56443,56445,56447,56449,56451,56454],{"class":729,"line":2052},[727,56439,2315],{"class":1986},[727,56441,56442],{"class":1882}," upper",[727,56444,2321],{"class":1986},[727,56446,50886],{"class":768},[727,56448,47926],{"class":2376},[727,56450,2542],{"class":768},[727,56452,56453],{"class":737},"'button#upper'",[727,56455,12611],{"class":768},[727,56457,56458,56461,56464,56466,56469,56471,56473],{"class":729,"line":2058},[727,56459,56460],{"class":768},"upper.",[727,56462,56463],{"class":2376},"addEventListener",[727,56465,2542],{"class":768},[727,56467,56468],{"class":737},"'click'",[727,56470,49711],{"class":768},[727,56472,2388],{"class":1986},[727,56474,2391],{"class":768},[727,56476,56477,56479,56482,56484,56487,56489,56492,56495,56497,56499],{"class":729,"line":2064},[727,56478,22321],{"class":1986},[727,56480,56481],{"class":1882}," spans",[727,56483,2321],{"class":1986},[727,56485,56486],{"class":768}," Array.",[727,56488,48406],{"class":2376},[727,56490,56491],{"class":768},"(document.",[727,56493,56494],{"class":2376},"querySelectorAll",[727,56496,2542],{"class":768},[727,56498,56314],{"class":737},[727,56500,50417],{"class":768},[727,56502,56503,56505,56507,56509,56511,56513],{"class":729,"line":2087},[727,56504,18112],{"class":1986},[727,56506,2524],{"class":768},[727,56508,2315],{"class":1986},[727,56510,56302],{"class":1882},[727,56512,2119],{"class":1986},[727,56514,56515],{"class":768}," spans) {\n",[727,56517,56518,56521,56523,56526,56529],{"class":729,"line":2140},[727,56519,56520],{"class":768},"    span.textContent ",[727,56522,4970],{"class":1986},[727,56524,56525],{"class":768}," span.textContent.",[727,56527,56528],{"class":2376},"toUpperCase",[727,56530,47105],{"class":768},[727,56532,56533],{"class":729,"line":2154},[727,56534,9712],{"class":768},[727,56536,56537],{"class":729,"line":1529},[727,56538,5051],{"class":768},[727,56540,56541],{"class":729,"line":2178},[727,56542,1898],{"emptyLinePlaceholder":522},[727,56544,56545,56547,56550,56552,56554,56556,56558,56561],{"class":729,"line":2187},[727,56546,2315],{"class":1986},[727,56548,56549],{"class":1882}," reload",[727,56551,2321],{"class":1986},[727,56553,50886],{"class":768},[727,56555,47926],{"class":2376},[727,56557,2542],{"class":768},[727,56559,56560],{"class":737},"'#reload'",[727,56562,12611],{"class":768},[727,56564,56565,56568,56570,56572,56574,56576,56578,56581,56584],{"class":729,"line":2533},[727,56566,56567],{"class":768},"reload.",[727,56569,56463],{"class":2376},[727,56571,2542],{"class":768},[727,56573,56468],{"class":737},[727,56575,49711],{"class":768},[727,56577,2388],{"class":1986},[727,56579,56580],{"class":768}," document.location.",[727,56582,56583],{"class":2376},"reload",[727,56585,56586],{"class":768},"())\n",[14,56588,56589,56590,56592,56593,56595,56596,56598],{},"You'll note that there is a ",[90,56591,56343],{}," created inside a newly created Shadow DOM, this will appear on the page as normal alongside any other ",[90,56594,56343],{}," elements on the page. An event listener has been added to a button that will cause any ",[90,56597,56343],{}," in the document to have it's text content changed to uppercase - however, as the Shadow DOM is encapsulated, this will not effect the content inside of the Shadow DOM.",[14,56600,56601],{},"This concept also applies to CSS styles that have been applied to the main document - they will not impact your content that has been placed inside of a Shadow DOM. In order to modify the CSS inside of the Shadow DOM, you would need to add a bit more code to it, such as:",[80,56603,56604,56611],{},[83,56605,56606,56607,56610],{},"Creating a ",[90,56608,56609],{},"CSSStyleSheet"," object programmatically.",[83,56612,56613,56614,56617,56618,50773],{},"Including a ",[90,56615,56616],{},"\u003Cstyle>"," tag inside of your ",[90,56619,56620],{},"\u003Ctemplate>",[14,56622,56623,56624,44],{},"You can read more about both of these methods here: ",[322,56625,5084],{"href":56626,"rel":56627},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FWeb_components\u002FUsing_shadow_DOM#applying_styles_inside_the_shadow_dom",[2245],[21,56629,56631],{"id":56630},"custom-elements","Custom Elements",[14,56633,56634],{},"When combined with custom elements, Shadow DOMs create a useful framework for developing reusable elements that can level up your website, as well as make them more maintainable. Custom elements share a lot of the same characteristics of the Shadow DOM, let's look at them.",[14,56636,56637,56639],{},[29,56638,56190],{}," as custom elements have the ability to encapsulate the HTML, CSS, and JavaScript that has been used to create them. This allows for the creation of self-contained elements that are generally more maintainable. Furthermore, this means that it is a lot more difficult for the component to be accidentally modified by other elements that are being manipulated in the main document.",[14,56641,56642,56645],{},[29,56643,56644],{},"Reusability:"," as they are self-contained, custom elements can be rapidly reused within a webpage. This means that if you have a webpage with multiple versions of a similar component, you may be able to create a single custom element that can be used to handle the different states with differing information relevant to the document.",[14,56647,56648,56650,56651,56653,56654,56656],{},[29,56649,56196],{}," styles can be applied to the specific custom element, rather than the document as a whole. This means that if you wish for the ",[90,56652,56343],{}," element to have a specific style, you can add this into your custom element and it would not effect the rest of the ",[90,56655,56343],{}," elements in the main document.",[14,56658,56659,56660,56663,56664,56667],{},"Custom elements can be created to extend the features of HTML elements, customising them to the web developers requirements. Behaviours can be defined by the web developer. They can either extend a specific HTML element, such as ",[90,56661,56662],{},"HTMLImageElement",", or just generally extend ",[90,56665,56666],{},"HTMLElement"," to create an autonomous custom element. They are developed using JavaScript. For example,",[719,56669,56671],{"className":756,"code":56670,"language":758,"meta":494,"style":494},"class CustomParagraph extends HTMLParagraphElement {\n  constructor() {\n    super()\n  }\n  \u002F\u002F Element functionality written in here\n}\n",[90,56672,56673,56689,56696,56703,56707,56712],{"__ignoreMap":494},[727,56674,56675,56678,56681,56684,56687],{"class":729,"line":730},[727,56676,56677],{"class":1986},"class",[727,56679,56680],{"class":733}," CustomParagraph",[727,56682,56683],{"class":1986}," extends",[727,56685,56686],{"class":1882}," HTMLParagraphElement",[727,56688,2391],{"class":768},[727,56690,56691,56694],{"class":729,"line":498},[727,56692,56693],{"class":1986},"  constructor",[727,56695,8430],{"class":768},[727,56697,56698,56701],{"class":729,"line":495},[727,56699,56700],{"class":1882},"    super",[727,56702,47105],{"class":768},[727,56704,56705],{"class":729,"line":1895},[727,56706,9712],{"class":768},[727,56708,56709],{"class":729,"line":1901},[727,56710,56711],{"class":2920},"  \u002F\u002F Element functionality written in here\n",[727,56713,56714],{"class":729,"line":1973},[727,56715,2639],{"class":768},[14,56717,56718],{},"Custom elements and Shadow DOM go hand-in-hand - without it, custom elements would be fragile and could break with other changes to the main document of the website. For example, selectors within the custom element would be prone to changes using CSS or JS within the main document, breaking it's functionality and rendering it inoperable.",[21,56720,56722],{"id":56721},"shadow-dom-and-scraping","Shadow DOM and scraping",[14,56724,56725],{},"The encapsulated nature of Shadow DOM makes it difficult for web scraping. Standard selectors, designed for the main document, cannot penetrate the shadow tree, requiring specialized methods to access its content. Let's look at some code that can be used to access the shadow tree.",[719,56727,56729],{"className":756,"code":56728,"language":758,"meta":494,"style":494},"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 wish to interact with.\n  const innerElm = shadowRoot.querySelector('\u003CSELECTOR>')\n\n  if (innerElm) {\n    \u002F\u002F Example: innerElm.click();\n  }\n}\n",[90,56730,56731,56751,56755,56763,56775,56779,56784,56804,56808,56816,56821,56825],{"__ignoreMap":494},[727,56732,56733,56735,56738,56740,56742,56744,56746,56749],{"class":729,"line":730},[727,56734,2315],{"class":1986},[727,56736,56737],{"class":1882}," shadowHost",[727,56739,2321],{"class":1986},[727,56741,50886],{"class":768},[727,56743,47926],{"class":2376},[727,56745,2542],{"class":768},[727,56747,56748],{"class":737},"'\u003CSELECTOR>'",[727,56750,12611],{"class":768},[727,56752,56753],{"class":729,"line":498},[727,56754,1898],{"emptyLinePlaceholder":522},[727,56756,56757,56760],{"class":729,"line":495},[727,56758,56759],{"class":1986},"if",[727,56761,56762],{"class":768}," (shadowHost) {\n",[727,56764,56765,56767,56770,56772],{"class":729,"line":1895},[727,56766,22321],{"class":1986},[727,56768,56769],{"class":1882}," shadowRoot",[727,56771,2321],{"class":1986},[727,56773,56774],{"class":768}," shadowHost.shadowRoot\n",[727,56776,56777],{"class":729,"line":1901},[727,56778,1898],{"emptyLinePlaceholder":522},[727,56780,56781],{"class":729,"line":1973},[727,56782,56783],{"class":2920},"  \u002F\u002F Locate the element inside the shadow root that you wish to interact with.\n",[727,56785,56786,56788,56791,56793,56796,56798,56800,56802],{"class":729,"line":2052},[727,56787,22321],{"class":1986},[727,56789,56790],{"class":1882}," innerElm",[727,56792,2321],{"class":1986},[727,56794,56795],{"class":768}," shadowRoot.",[727,56797,47926],{"class":2376},[727,56799,2542],{"class":768},[727,56801,56748],{"class":737},[727,56803,12611],{"class":768},[727,56805,56806],{"class":729,"line":2058},[727,56807,1898],{"emptyLinePlaceholder":522},[727,56809,56810,56813],{"class":729,"line":2064},[727,56811,56812],{"class":1986},"  if",[727,56814,56815],{"class":768}," (innerElm) {\n",[727,56817,56818],{"class":729,"line":2087},[727,56819,56820],{"class":2920},"    \u002F\u002F Example: innerElm.click();\n",[727,56822,56823],{"class":729,"line":2140},[727,56824,9712],{"class":768},[727,56826,56827],{"class":729,"line":2154},[727,56828,2639],{"class":768},[14,56830,56831],{},"While we acknowledge that the method above is more technical than some users may wish, this is currently the best option for interacting with Shadow DOM in your axiom.ai automations.",[21,56833,56835],{"id":56834},"shadow-dom-and-page-interactions","Shadow DOM and page interactions",[14,56837,56838],{},"For the same reasons mentioned in the scraping section above, programmatically interacting with a page that makes use of Shadow DOM can be difficult for most automation tools. For example, if we ask a script to click a button that has the ID \"button\", it will fail to find this in the main document of the page where it would be looking - due to the additional requirements, it will often not check the shadow tree for this element as this would slow down any script. There are a few methods of getting around this, such as:",[80,56840,56841,56847,56850],{},[83,56842,56843,56844,56846],{},"Using the keyboard to navigate on the page - see the ",[322,56845,14950],{"href":10793}," step in axiom.ai.",[83,56848,56849],{},"Using code, see the example above.",[83,56851,56852],{},"Clicking on the page using coordinates - this isn't really recommended as elements may move depending on the size of the window that the website is open on.",[21,56854,796],{"id":795},[14,56856,56857],{},"The Shadow DOM is a vital tool for building modern, robust web components. It provides crucial encapsulation, isolating styles and DOM structure to prevent conflicts and enhance maintainability. We explored how to create and manipulate shadow trees with JavaScript, showcasing its benefits for style scoping and code isolation.",[14,56859,56860],{},"We also discussed the powerful combination of Shadow DOM and custom elements, highlighting their role in creating reusable and modular components. Finally, we addressed the challenges of web scraping within Shadow DOM, offering a practical approach to accessing encapsulated elements.",[14,56862,56863],{},"By mastering the Shadow DOM, you gain the ability to create cleaner, more maintainable, and scalable web applications. It's an essential skill for any developer aiming to build high-quality web experiences.",[811,56865,56866],{},"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}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":494,"searchDepth":495,"depth":495,"links":56868},[56869,56870,56871,56875,56876,56877,56878],{"id":56174,"depth":498,"text":56175},{"id":56181,"depth":498,"text":56182},{"id":56200,"depth":498,"text":56201,"children":56872},[56873,56874],{"id":56207,"depth":495,"text":56208},{"id":56347,"depth":495,"text":56348},{"id":56630,"depth":498,"text":56631},{"id":56721,"depth":498,"text":56722},{"id":56834,"depth":498,"text":56835},{"id":795,"depth":498,"text":796},"2025-04-10","Learn how the Shadow DOM enhances web development by providing encapsulation for HTML, CSS, and JavaScript. Build reusable, modular web components and prevent style conflicts.",{"read":46726,"type":90,"tool":56882,"category":56883,"tags":56884,"featuredimg":56889,"landingimg":56890},[46728],[50552],[56885,56886,56887,56888],"shadow dom","scoping","host","dom","\u002Fshadow-dom-post.webp","\u002Fshadow-dom-sq.webp","\u002Fblog\u002Funderstanding-and-working-with-the-shadow-dom",{"title":56169,"description":56880},"blog\u002Funderstanding-and-working-with-the-shadow-dom","PuZ6eNLzRVWeFw92EXLJ38gWrLAN9ky8enRNIElrHk4",[50552],[90],[46728],{"id":56899,"title":56900,"author":48082,"body":56901,"date":57238,"description":57239,"draft":26250,"extension":506,"meta":57240,"navigation":522,"path":57248,"seo":57249,"stem":57250,"__hash__":57251,"pinned":-1,"category":57252,"type":57253,"tool":57254},"blog\u002Fblog\u002Fhow-axiom-protects-your-data.md","How axiom.ai Protects Your Data",{"type":8,"value":56902,"toc":57221},[56903,56906,56909,56911,56918,56922,56929,57043,57046,57052,57056,57059,57062,57066,57069,57073,57079,57083,57086,57090,57096,57114,57118,57121,57132,57135,57138,57142,57149,57154,57158,57161,57165,57171,57175,57184,57191,57195,57198,57207,57209,57212,57218],[14,56904,56905],{},"Protecting your data is a high priority for us here at axiom.ai. We store the code to run your automations, not the data that you process with them. Your data is your own and is never stored, sold, or used to train AI models.",[14,56907,56908],{},"Let's dive into how your data has been handled within your automations, what is stored and what is not stored as well as how to ensure that your use of axiom.ai in your projects complies with any regulations that your organisation may be required to adhere to.",[18,56910],{},[14,56912,56913,56914,44],{},"For more details on specifics, see our ",[322,56915,56917],{"href":56916},"\u002Fprivacy-policy","privacy policy",[21,56919,56921],{"id":56920},"how-step-data-is-stored","How step data is stored",[14,56923,56924,56925,56928],{},"When you create an automation, we store the data for the steps that make up your automation. This includes any of the settings that you have enabled within your automation. For example, if you have an \"Enter text\" step in your automation that is set to input the text \"Hello, World!\", we are going to store the text and any of the other options that you have enabled. In the exported automation, this will appear in the ",[90,56926,56927],{},"params"," of the step as follows:",[719,56930,56932],{"className":7732,"code":56931,"language":2585,"meta":494,"style":494},"{\n  \"collapsible\": 0,\n  \"configurable\": true,\n  \"default_value\": \"\",\n  \"description\": [\"Input the text to enter.\"],\n  \"help\": [],\n  \"image\": \"h-text-input\",\n  \"name\": \"Text\",\n  \"type\": \"long_text_required\",\n  \"value\": \"Hello, World!\"\n}\n",[90,56933,56934,56938,56949,56961,56972,56985,56993,57005,57017,57029,57039],{"__ignoreMap":494},[727,56935,56936],{"class":729,"line":730},[727,56937,7740],{"class":768},[727,56939,56940,56943,56945,56947],{"class":729,"line":498},[727,56941,56942],{"class":7745},"  \"collapsible\"",[727,56944,1995],{"class":768},[727,56946,17395],{"class":1882},[727,56948,2427],{"class":768},[727,56950,56951,56954,56956,56959],{"class":729,"line":495},[727,56952,56953],{"class":7745},"  \"configurable\"",[727,56955,1995],{"class":768},[727,56957,56958],{"class":1882},"true",[727,56960,2427],{"class":768},[727,56962,56963,56966,56968,56970],{"class":729,"line":1895},[727,56964,56965],{"class":7745},"  \"default_value\"",[727,56967,1995],{"class":768},[727,56969,54615],{"class":737},[727,56971,2427],{"class":768},[727,56973,56974,56977,56980,56983],{"class":729,"line":1901},[727,56975,56976],{"class":7745},"  \"description\"",[727,56978,56979],{"class":768},": [",[727,56981,56982],{"class":737},"\"Input the text to enter.\"",[727,56984,17398],{"class":768},[727,56986,56987,56990],{"class":729,"line":1973},[727,56988,56989],{"class":7745},"  \"help\"",[727,56991,56992],{"class":768},": [],\n",[727,56994,56995,56998,57000,57003],{"class":729,"line":2052},[727,56996,56997],{"class":7745},"  \"image\"",[727,56999,1995],{"class":768},[727,57001,57002],{"class":737},"\"h-text-input\"",[727,57004,2427],{"class":768},[727,57006,57007,57010,57012,57015],{"class":729,"line":2058},[727,57008,57009],{"class":7745},"  \"name\"",[727,57011,1995],{"class":768},[727,57013,57014],{"class":737},"\"Text\"",[727,57016,2427],{"class":768},[727,57018,57019,57022,57024,57027],{"class":729,"line":2064},[727,57020,57021],{"class":7745},"  \"type\"",[727,57023,1995],{"class":768},[727,57025,57026],{"class":737},"\"long_text_required\"",[727,57028,2427],{"class":768},[727,57030,57031,57034,57036],{"class":729,"line":2087},[727,57032,57033],{"class":7745},"  \"value\"",[727,57035,1995],{"class":768},[727,57037,57038],{"class":737},"\"Hello, World!\"\n",[727,57040,57041],{"class":729,"line":2140},[727,57042,2639],{"class":768},[14,57044,57045],{},"If you have used a data token within the step, you will see this here, too. This data, along with all other steps, are stored within our cloud services ensure availability when you need them - your data is encrypted at rest and in transit.",[14,57047,57048,57049,57051],{},"If you are concerned about how your data is being stored within your automations, we recommend making use of data tokens and an external service to pass data into your automation. Going back to the example of the \"Enter text\" step, you could use a ",[322,57050,92],{"href":8384}," step to read in the data that you wish to enter in the textfield, when exporting your automation, you would only see the data token that you have input into the step.",[639,57053,57055],{"id":57054},"exporting-your-automations","Exporting your automations",[14,57057,57058],{},"When contacting our support team it is quite common for us to ask for a copy of your automation so that we can assess it for any issues that you are experiencing. For additional security purposes, we limit internal access to your automations. When requesting a copy of your automation we are aware that there are times when you may be hesitant to share due to the sensitivity of the data that you are working with - unless shared with us, we will not have access to the data that you are working with apart from the data that you have stored in steps. We will not have access to the Google or Excel sheets that you are using.",[14,57060,57061],{},"If your automation contains credentials, we would recommend removing these - we generally recommend storing these elsewhere regardless of whether or not you are sharing your automation. There are instances where we may need additional access but we will discuss this with your directly in the event of contacting our team. If there are credentials present in the automation when shared, our team will always request permission before running the automation - but would always rather a test account be set up for the team where possible.",[21,57063,57065],{"id":57064},"how-processed-data-is-stored","How processed data is stored",[14,57067,57068],{},"Understanding how data is stored when being processed by an automation is key to ensuring that you have met the information security requirements that you may have for your project.",[639,57070,57072],{"id":57071},"running-your-automations-locally","Running your automations locally",[14,57074,57075,57076,57078],{},"When you make use of the desktop application to run your automations locally the data that you process with your automation will ",[29,57077,50655],{}," leave your local computer, or server - unless you have steps specifically to send this data. This can be massively beneficial when you are working with sensitive data that is not shareable outside of your organisation, for example, when working with PII or medical data. If required, the axiom.ai desktop application can be installed on a server to be used.",[639,57080,57082],{"id":57081},"running-in-the-cloud","Running in the cloud",[14,57084,57085],{},"When running in the cloud, we only store the data that is processed by your automation for the amount of time that your automation runs. Once your run has finished, no matter what the state of that finish is, the data will be erased from the \"pod\" that your automation has run in. Your automation is only able to access data that has been created during the run.",[639,57087,57089],{"id":57088},"things-to-note","Things to note",[14,57091,57092,57093,57095],{},"It's important to note that ",[322,57094,24569],{"href":791}," will be stored for each run and this data is stored within axiom.ai's servers. In the event of your automation running into an error, it's possible that some data could be included in these error messages. For example, if a \"Click element\" step is unable to find the selector that you have selected, this selector may be included in the error message.",[14,57097,57098,57099,57101,57102,3289,57104,57106,57107,57110,57111,57113],{},"Similarly, if you make use of the ",[322,57100,8218],{"href":21025}," step and include your data, or data tokens, in this field, then this will be included in the Run Reports. An alternative to this may be to use the ",[322,57103,7619],{"href":7618},[322,57105,7722],{"href":18400}," to catch errors and report them to your own systems rather than let the automation run into errors. See our documentation on ",[322,57108,57109],{"href":24345},"handling errors"," for more tips. You could also make use of the ",[322,57112,54245],{"href":53272}," to pass in credentials, if you are on an appropriate axiom.ai plan.",[639,57115,57117],{"id":57116},"third-party-services","Third-party services",[14,57119,57120],{},"We provide a few steps that allow you to directly interact with third-party services, such as:",[80,57122,57123,57126,57128,57130],{},[83,57124,57125],{},"OpenAI (ChatGPT)",[83,57127,3288],{},[83,57129,9292],{},[83,57131,48303],{},[14,57133,57134],{},"When you use any of these steps to interact with these services, the data that you set to be shared with this service will be shared to provide the service. For example, the prompt that you input into the ChatGPT steps will be shared, along with your API key that has been set within the step or in the settings. You should refer to their privacy policies for more details on how your data is managed within those services.",[14,57136,57137],{},"We do not share any usage data with these service providers, only the data required to perform the action, and the data that you have input.",[21,57139,57141],{"id":57140},"connecting-your-accounts","Connecting your accounts",[14,57143,57144,57145,57148],{},"To allow you to make use of certain steps, you have the ability to connect certain accounts to your axiom.ai account. For example, you can connect your Google or Microsoft (work or school) account to be able to use their respective steps. When you use this feature to connect to your account, you will be prompted to use their native login flow to connect your account - when you do this, we do ",[29,57146,57147],{},"not"," store your login credentials. These services provide us with an access token that can be used to interact with these services.",[14,57150,57151],{},[807,57152,57153],{},"Note, as part of their security features, these services can revoke these access tokens at any point for reasons that they do not publish.",[21,57155,57157],{"id":57156},"storing-api-keys","Storing API keys",[14,57159,57160],{},"Some services that we allow you to interact with within your automations require an API key to be used, these can be stored within the automation itself but we would recommend storing these in our \"External API keys\" section within your account. These keys are encrypted at rest and in transit within our systems, ensuring that they remain private and only for your use. When used within a step, this will not be included in the export of your automation.",[21,57162,57164],{"id":57163},"storing-cookies","Storing cookies",[14,57166,5070,57167,57170],{},[322,57168,57169],{"href":6540},"Store cookies"," feature allows you to sync your local cookies with your automation to carry them over to your cloud browser session, this can be massively beneficial to carry over login sessions. These cookies are encrypted and will not be included in the export of the automation.",[21,57172,57174],{"id":57173},"regulatory-compliance","Regulatory compliance",[14,57176,57177,57178,57183],{},"axiom.ai always strives to protect your data in line with information security standards and regulations, and has a ",[322,57179,57182],{"href":57180,"rel":57181},"https:\u002F\u002Fappdefensealliance.dev\u002Fcasa",[2245],"Cloud App Security Assessment (CASA)"," Tier II certification. However, if your organisation requires you to adhere to specific standards and regulations while using third-party services, there are still methods of using axiom.ai within these limits.",[14,57185,57186,57187,57190],{},"As discussed above in ",[322,57188,57072],{"href":57189},"#running-your-automations-locally",", your data never leaves your device or network when being process on a locally run automation. Only the data stored in the steps themselves will be stored by axiom.ai. This means that you can maintain compliance with local regulations such as HIPAA (US), GDPR (EU), DPA (UK), PIPEDA (CAN) and the Fair Information Processing Principles (US).",[21,57192,57194],{"id":57193},"tips","Tips",[14,57196,57197],{},"If you are concerned with storing login credentials within your automations, consider storing them in Google Sheets and then importing them into your automation using the \"Read data from a Google Sheet\" step or the \"Read data from an Excel\" step. This would mean that they are imported each time that the automation runs rather than being stored in the automation.",[14,57199,57200,57201,57203,57204,57206],{},"Alternatively, you can use the ",[322,57202,57169],{"href":6540}," option within your automation to store the authentication token from sites that you are already logged into ony our desktop. For most sites, this will mean that you do not need to log into the site when your automation runs. When running locally, your automation will automatically use your local cookies. We recommend setting up ",[322,57205,55119],{"href":21046}," when using this method as your automation may run into errors if the site revokes the authentication cookie at any time.",[21,57208,796],{"id":795},[14,57210,57211],{},"Understanding how axiom.ai handles your data is key to ensuring security and compliance with your organization's regulations. While we store step configuration data to keep your automations available, processed data is only stored temporarily when running in the cloud and never leaves your device when running locally. By leveraging data tokens, external storage, and local execution, you can take full control over how sensitive data is handled within your workflows.",[14,57213,57214,57215,57217],{},"If you have any concerns about data storage or security, we encourage you to review our ",[322,57216,56917],{"href":56916}," or reach out to our support team for further guidance.",[811,57219,57220],{},"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);}",{"title":494,"searchDepth":495,"depth":495,"links":57222},[57223,57226,57232,57233,57234,57235,57236,57237],{"id":56920,"depth":498,"text":56921,"children":57224},[57225],{"id":57054,"depth":495,"text":57055},{"id":57064,"depth":498,"text":57065,"children":57227},[57228,57229,57230,57231],{"id":57071,"depth":495,"text":57072},{"id":57081,"depth":495,"text":57082},{"id":57088,"depth":495,"text":57089},{"id":57116,"depth":495,"text":57117},{"id":57140,"depth":498,"text":57141},{"id":57156,"depth":498,"text":57157},{"id":57163,"depth":498,"text":57164},{"id":57173,"depth":498,"text":57174},{"id":57193,"depth":498,"text":57194},{"id":795,"depth":498,"text":796},"2025-03-27","Learn how axiom.ai handles your data within automations, including what is stored, how processed data is managed, and best practices for security and compliance. Discover how to protect sensitive information while automating workflows with axiom.ai.",{"read":50549,"type":513,"tool":57241,"category":57242,"tags":57243,"featuredimg":57246,"landingimg":57247,"summary":57239,"video":523,"metaTitle":56900},[46728],[50552],[57244,57245],"security","privacy","\u002Fblog\u002Fsafe-data-post.webp","\u002Fblog\u002Fsafe-data-sq.webp","\u002Fblog\u002Fhow-axiom-protects-your-data",{"title":56900,"description":57239},"blog\u002Fhow-axiom-protects-your-data","IKdx3nv4pfY6Uyv1lQg4fu8hXCuk5kglNbPwDN2BTxY",[50552],[513],[46728],{"id":57256,"title":57257,"author":48082,"body":57258,"date":57462,"description":57463,"draft":26250,"extension":506,"meta":57464,"navigation":522,"path":57473,"seo":57474,"stem":57475,"__hash__":57476,"pinned":-1,"category":57477,"type":57478,"tool":57479},"blog\u002Fblog\u002Fcost-effective-ai.md","Cost-Effective AI - Smart Strategies for Maximising Value",{"type":8,"value":57259,"toc":57452},[57260,57263,57268,57270,57274,57277,57294,57297,57301,57304,57307,57312,57324,57328,57331,57334,57339,57342,57347,57350,57354,57357,57361,57364,57375,57378,57389,57398,57409,57413,57422,57440,57442,57449],[14,57261,57262],{},"With the use of AI becoming ubiquitous in personal and work lives, understanding how to take advantage of it without it costing an arm and a leg can be beneficial to ensuring that you are maximising the value that you are getting out of it. Using AI can save yourself, or your organisation, a lot of time and effort but used inefficiently can lead to value loss.",[8898,57264,57265],{},[14,57266,57267],{},"💡 Note, we are going to use the term \"AI\" in this article to refer generally to LLMs, GenAI and other models.",[18,57269],{},[21,57271,57273],{"id":57272},"how-ai-can-help-your-organisation","How AI can help your organisation",[14,57275,57276],{},"AI can be used to navigate around tasks that usually would require a large number of man-hours to either complete, or develop a system to complete the task. This can reduce it down to a few minutes with the help of AI. For example:",[80,57278,57279,57282,57285,57288,57291],{},[83,57280,57281],{},"Speeding up code development.",[83,57283,57284],{},"Automating customer service.",[83,57286,57287],{},"Data analytics.",[83,57289,57290],{},"Generating marketing copy.",[83,57292,57293],{},"Product innovation.",[14,57295,57296],{},"All of the use cases above can be used with the currently available tools, such as ChatGPT, Gemini, Copilot and Le Chat.",[21,57298,57300],{"id":57299},"understanding-the-cost-of-ai","Understanding the cost of AI",[14,57302,57303],{},"When using commercial products (such as ChatGPT, Gemini, Copilot and Le Chat) to power your AI tasks it's important to understand how (most) products charge for the use of their services. If you are using the standard web or app interface to interact with the AI, your usage is often restricted based on the subscription tier that you have subscribed to.",[14,57305,57306],{},"If you are using an API to access the AI, you'll be charged based on \"tokens\". \"Tokens\" are used to measure the data that you are sending to the API and are used to charge users. OpenAI states on their website:",[8898,57308,57309],{},[14,57310,57311],{},"You can think of tokens as pieces of words, where 1,000 tokens is about 750 words.",[14,57313,57314,57315,57318,57319,12252],{},"As of the time of writing, they charge $2.50\u002F1m input tokens. Your input would include your prompt, along with all of the data that you are sending over. For example, the sentence, ",[807,57316,57317],{},"\"axiom.ai is great!\""," is about 5 tokens - this can be language dependent, too. You can learn more from OpenAi on their definition of a token in their ",[322,57320,57323],{"href":57321,"rel":57322},"https:\u002F\u002Fhelp.openai.com\u002Fen\u002Farticles\u002F4936856-what-are-tokens-and-how-to-count-them",[2245],"What are tokens and how to count them",[21,57325,57327],{"id":57326},"prompt-engineering","Prompt engineering",[14,57329,57330],{},"Prompt engineering is the practice of designing and optimising inputs (prompts) to guide AI models to generate desired outputs efficiently and effectively. It's a critical skill for working with LLMs and other generative AI systems. Learning how to craft prompts that not only get the answer that you need, but does so without wasting resources.",[14,57332,57333],{},"Consider the following prompts, both used in ChatGPT using an axiom.ai automation export as an attachment:",[14,57335,57336],{},[807,57337,57338],{},"\"Can you describe this file?\"",[14,57340,57341],{},"vs.",[14,57343,57344],{},[807,57345,57346],{},"\"Can you count the number of steps in the automation, returning the value as a number only.\"",[14,57348,57349],{},"The first prompt will give us a full rundown of the file, including information on the keys that are contained within the JSON, the steps and details about them. It'll also give you a description of what the automation does. While this would be helpful in certain situations, you may find that you only need a subset of this data - the second step would give a much shorter response, responding simply with \"4\". Simply defining the output that you wish can be an effective way of ensuring that the prompt is more efficient.",[21,57351,57353],{"id":57352},"alternatives","Alternatives",[14,57355,57356],{},"While using the commerical off the shelf products to fulfil your AI needs, there are alternatives if you are looking to maximise the value of AI to your team, lowering costs but sustaining the helpfulness of it.",[639,57358,57360],{"id":57359},"local-processing","Local processing",[14,57362,57363],{},"If you are concerned about maximising value for your team, you may need to reconsider which parts of a project really need AI. For example, if you are processing a large amount of data and then performing analysis on it using AI, you may wish to break down the project into smaller parts, such as:",[80,57365,57366,57369,57372],{},[83,57367,57368],{},"Data collection",[83,57370,57371],{},"Data cleaning",[83,57373,57374],{},"Data analysis",[14,57376,57377],{},"By doing this, you can then determine which parts are more cost efficient to be done by AI and which may be more cost efficient to be done by the team. An approach such as this may work:",[80,57379,57380,57383,57386],{},[83,57381,57382],{},"Data collection: this could be handled by browser automation, such as axiom.ai, or simply data that has been acquired from a data broker.",[83,57384,57385],{},"Data cleaning: for larger projects, writing a Python script may be more cost efficient than AI, this also gives you much more control over the data that you are going to be inputting in the analysis step.",[83,57387,57388],{},"Data analysis: this is where AI excels, you've already cleaned your data so it will be easy to feed into the AI to gain accurate insights.",[14,57390,57391,57392,57397],{},"Often, processing data or manipulating data through a local script can be more beneficial than doing it through AI as the scripts are often not overly complex, libraries such as ",[322,57393,57396],{"href":57394,"rel":57395},"https:\u002F\u002Fpandas.pydata.org",[2245],"pandas"," can help make this a simple task within Python, alternatives are available for R. If you do not have access to engineers, it may be worth a once off conversation with an AI to develop a script that could be used for this task.",[14,57399,57400,57401,57404,57405,57408],{},"Tools like ",[322,57402,3435],{"href":51689,"rel":57403},[2245]," can also help in manipulating data and preparing it for processing by an AI, see our ",[322,57406,57407],{"href":55873},"Manipulate Data"," steps to learn more.",[639,57410,57412],{"id":57411},"local-llm","Local LLM",[14,57414,57415,57416,57421],{},"Running AI\u002FLLMs locally can be another alternative for your organisation - models, such as ",[322,57417,57420],{"href":57418,"rel":57419},"https:\u002F\u002Fai.meta.com\u002Fblog\u002Fllama-3-2-connect-2024-vision-edge-mobile-devices",[2245],"Llama 3.2",", can be run locally on your PC to allow access without having to go through the Internet. This has security benefits as your data does not leave your device, however, it's also worth noting that these do not get updated with live data as it does not have access to the Internet.",[14,57423,57424,57425,2004,57430,450,57435,44],{},"Using an AI locally completely cuts the costs of accessing an commercial AI - replacing these with the cost of hosting the AI. Your IT department may be able to set up a server running this to use within your organisation, or you may run this on a single workstation. There are many existing tools out there that can be used to enable this, such as ",[322,57426,57429],{"href":57427,"rel":57428},"https:\u002F\u002Fjs.langchain.com\u002Fv0.1\u002Fdocs\u002Fuse_cases\u002Fquestion_answering\u002Flocal_retrieval_qa",[2245],"Langchain",[322,57431,57434],{"href":57432,"rel":57433},"https:\u002F\u002Follama.com",[2245],"Ollama",[322,57436,57439],{"href":57437,"rel":57438},"https:\u002F\u002Flmstudio.ai",[2245],"LM Studio",[21,57441,796],{"id":795},[14,57443,57444,57445,57448],{},"Breaking down your projects and considering what parts ",[807,57446,57447],{},"actually"," need to be done using AI is one of the most efficient ways of maximising value with you and your teams use of AI. Weigh the cost of doing a task manually (or using a script) against the cost of doing it with AI - you may be surprised to find out the differences! Running a local LLM is also definitely an option - and a lot more accessible than most people realise, if you have hardware that is powerful enough to run it.",[14,57450,57451],{},"We are still a long way from AI replacing most jobs, but it is still worth noting that there are areas where AI excels - specifically around data analysis. Even internally, we will use this to get insights on data or help with research on blog articles such as this one, though we rarely rely on the generative nature of these tools.",{"title":494,"searchDepth":495,"depth":495,"links":57453},[57454,57455,57456,57457,57461],{"id":57272,"depth":498,"text":57273},{"id":57299,"depth":498,"text":57300},{"id":57326,"depth":498,"text":57327},{"id":57352,"depth":498,"text":57353,"children":57458},[57459,57460],{"id":57359,"depth":495,"text":57360},{"id":57411,"depth":495,"text":57412},{"id":795,"depth":498,"text":796},"2025-03-20","Discover how to leverage AI efficiently and maximise its value while keeping costs under control",{"read":48203,"type":513,"tool":57465,"category":57466,"tags":57467,"featuredimg":57470,"landingimg":57471,"summary":57463,"video":523,"metaTitle":57472},[46728],[50552],[57468,57469,57327,518],"local LLM","LLM","\u002Fblog\u002Fai-cost-effective.webp","\u002Fblog\u002Fai-cost-effective-sq.webp","Cost-Effective AI - Smart Strategies for Maximizing Value","\u002Fblog\u002Fcost-effective-ai",{"title":57257,"description":57463},"blog\u002Fcost-effective-ai","dTQFDKYn7PwWBgYLkmGsU-1bm5BeDiC_Nz1TUaCONLU",[50552],[513],[46728],{"id":57481,"title":57482,"author":46205,"body":57483,"date":58381,"description":58382,"draft":26250,"extension":506,"meta":58383,"navigation":522,"path":58396,"seo":58397,"stem":58398,"__hash__":58399,"pinned":-1,"category":58400,"type":58401,"tool":58402},"blog\u002Fblog\u002Finput-fields.md","Master selecting form input fields with CSS for automation",{"type":8,"value":57484,"toc":58366},[57485,57493,57500,57508,57511,57514,57518,57521,57524,57669,57687,57772,57775,57790,57794,57797,57808,57811,57815,57818,57825,57829,57844,57847,57865,57869,57872,57936,57943,57946,57950,57953,57958,57962,57965,58079,58082,58115,58122,58126,58129,58132,58135,58149,58152,58157,58160,58163,58167,58170,58172,58179,58243,58246,58251,58254,58261,58317,58320,58323,58328,58331,58334,58339,58349,58351,58354,58357,58360,58363],[14,57486,57487,57488,57492],{},"Knowing how to cherry-pick the correct selector for targeting form input elements will make your life easier when automating forms. If you want to learn how, read on. For transparency, I use axiom.ai, a ",[322,57489,57491],{"href":57490},"\u002Fno-code-builder","no-code browser automation tool",". However, this guide is relevant for people using other tools or coding solutions. The tool may change, but the selectors remain the same.",[14,57494,57495,57496,57499],{},"When I create bots to automate form filling in the browser, I add Enter text steps, select the input fields using our ",[322,57497,57498],{"href":11340},"no-code selector tool",", and set the data I want to pass into the field. It's straightforward; selecting an element requires just pointing and clicking. I repeat this process for each input in the form. However, sometimes, the selectors generated by axiom.ai do not work. When I run a test, I might see an error like \"Step 4: element not found\"—this means axiom.ai couldn't find the element on the webpage.",[14,57501,57502,57503,57507],{},"To solve this problem, I can reselect the element or try a custom selector. I always try the former first, then proceed to the latter. Now, if you're a no-coder or a developer, you may not be familiar with CSS selectors. Read our general ",[322,57504,57506],{"href":57505},"\u002Fbest-custom-css-selectors-for-web-scraping","CSS selector guide here",". This guide will teach anyone how to quickly extract a custom selector from the HTML of a form input element.",[14,57509,57510],{},"I will walk you through real-world scenarios using custom selectors, explain how I created them, and share my go-to selectors for form inputs.",[14,57512,57513],{},"I'm Alex Barlow, co-founder of axiom.ai; let's dive in. By the end of this article, you'll be able to formulate a correct custom selector faster than an AI could.",[21,57515,57517],{"id":57516},"anatomy-of-the-input-field-type","Anatomy of the input field type",[14,57519,57520],{},"Having a basic understanding of the anatomy of an Input field helps us understand how to identify custom selectors.",[14,57522,57523],{},"Here is a search input field taken from the BBC website:",[719,57525,57528],{"className":56214,"code":57526,"language":56216,"meta":57527,"style":494},"\u003Cinput aria-activedescendant=\"\" aria-autocomplete=\"list\" aria-controls=\"suggestions\" aria-expanded=\"false\" aria-haspopup=\"listbox\" autocomplete=\"off\" id=\"searchInput\" name=\"q\" placeholder=\"Search the BBC\" role=\"combobox\" class=\"ssrcss-199fsd8-StyledInput e1ld3nu72\" value=\"\">\u003Cdiv pseudo=\"-webkit-input-placeholder\" id=\"placeholder\" style=\"display: block !important;\">Search the BBC\u003C\u002Fdiv>\u003C\u002Finput>\n","HTML",[90,57529,57530],{"__ignoreMap":494},[727,57531,57532,57534,57537,57540,57542,57544,57547,57549,57552,57555,57557,57560,57563,57565,57568,57571,57573,57576,57579,57581,57584,57586,57588,57591,57594,57596,57599,57602,57604,57607,57610,57612,57615,57618,57620,57623,57626,57628,57630,57633,57635,57638,57640,57643,57645,57647,57650,57653,57655,57658,57661,57663,57665,57667],{"class":729,"line":730},[727,57533,18130],{"class":768},[727,57535,57536],{"class":7745},"input",[727,57538,57539],{"class":1882}," aria-activedescendant",[727,57541,4970],{"class":768},[727,57543,54615],{"class":737},[727,57545,57546],{"class":1882}," aria-autocomplete",[727,57548,4970],{"class":768},[727,57550,57551],{"class":737},"\"list\"",[727,57553,57554],{"class":1882}," aria-controls",[727,57556,4970],{"class":768},[727,57558,57559],{"class":737},"\"suggestions\"",[727,57561,57562],{"class":1882}," aria-expanded",[727,57564,4970],{"class":768},[727,57566,57567],{"class":737},"\"false\"",[727,57569,57570],{"class":1882}," aria-haspopup",[727,57572,4970],{"class":768},[727,57574,57575],{"class":737},"\"listbox\"",[727,57577,57578],{"class":1882}," autocomplete",[727,57580,4970],{"class":768},[727,57582,57583],{"class":737},"\"off\"",[727,57585,56227],{"class":1882},[727,57587,4970],{"class":768},[727,57589,57590],{"class":737},"\"searchInput\"",[727,57592,57593],{"class":1882}," name",[727,57595,4970],{"class":768},[727,57597,57598],{"class":737},"\"q\"",[727,57600,57601],{"class":1882}," placeholder",[727,57603,4970],{"class":768},[727,57605,57606],{"class":737},"\"Search the BBC\"",[727,57608,57609],{"class":1882}," role",[727,57611,4970],{"class":768},[727,57613,57614],{"class":737},"\"combobox\"",[727,57616,57617],{"class":1882}," class",[727,57619,4970],{"class":768},[727,57621,57622],{"class":737},"\"ssrcss-199fsd8-StyledInput e1ld3nu72\"",[727,57624,57625],{"class":1882}," value",[727,57627,4970],{"class":768},[727,57629,54615],{"class":737},[727,57631,57632],{"class":768},">\u003C",[727,57634,50804],{"class":7745},[727,57636,57637],{"class":1882}," pseudo",[727,57639,4970],{"class":768},[727,57641,57642],{"class":737},"\"-webkit-input-placeholder\"",[727,57644,56227],{"class":1882},[727,57646,4970],{"class":768},[727,57648,57649],{"class":737},"\"placeholder\"",[727,57651,57652],{"class":1882}," style",[727,57654,4970],{"class":768},[727,57656,57657],{"class":737},"\"display: block !important;\"",[727,57659,57660],{"class":768},">Search the BBC\u003C\u002F",[727,57662,50804],{"class":7745},[727,57664,56235],{"class":768},[727,57666,57536],{"class":54609},[727,57668,56240],{"class":768},[14,57670,57671,57672,57675,57676,57678,57679,57682,57683,57686],{},"Breaking it down, we are looking for the opening tag of the",[90,57673,57674],{},"\u003Cinput>"," field. The tag contains attributes after ",[90,57677,57536],{}," and before ",[90,57680,57681],{},">",". For example,",[90,57684,57685],{},"aria-controls=\"suggestions\""," is an attribute. We use the attribute to create our custom selectors.",[719,57688,57690],{"className":56214,"code":57689,"language":56216,"meta":57527,"style":494},"\u003Cinput aria-activedescendant=\"\" aria-autocomplete=\"list\" aria-controls=\"suggestions\" aria-expanded=\"false\" aria-haspopup=\"listbox\" autocomplete=\"off\" id=\"searchInput\" name=\"q\" placeholder=\"Search the BBC\" role=\"combobox\" class=\"ssrcss-199fsd8-StyledInput e1ld3nu72\" value=\"\">\n",[90,57691,57692],{"__ignoreMap":494},[727,57693,57694,57696,57698,57700,57702,57704,57706,57708,57710,57712,57714,57716,57718,57720,57722,57724,57726,57728,57730,57732,57734,57736,57738,57740,57742,57744,57746,57748,57750,57752,57754,57756,57758,57760,57762,57764,57766,57768,57770],{"class":729,"line":730},[727,57695,18130],{"class":768},[727,57697,57536],{"class":7745},[727,57699,57539],{"class":1882},[727,57701,4970],{"class":768},[727,57703,54615],{"class":737},[727,57705,57546],{"class":1882},[727,57707,4970],{"class":768},[727,57709,57551],{"class":737},[727,57711,57554],{"class":1882},[727,57713,4970],{"class":768},[727,57715,57559],{"class":737},[727,57717,57562],{"class":1882},[727,57719,4970],{"class":768},[727,57721,57567],{"class":737},[727,57723,57570],{"class":1882},[727,57725,4970],{"class":768},[727,57727,57575],{"class":737},[727,57729,57578],{"class":1882},[727,57731,4970],{"class":768},[727,57733,57583],{"class":737},[727,57735,56227],{"class":1882},[727,57737,4970],{"class":768},[727,57739,57590],{"class":737},[727,57741,57593],{"class":1882},[727,57743,4970],{"class":768},[727,57745,57598],{"class":737},[727,57747,57601],{"class":1882},[727,57749,4970],{"class":768},[727,57751,57606],{"class":737},[727,57753,57609],{"class":1882},[727,57755,4970],{"class":768},[727,57757,57614],{"class":737},[727,57759,57617],{"class":1882},[727,57761,4970],{"class":768},[727,57763,57622],{"class":737},[727,57765,57625],{"class":1882},[727,57767,4970],{"class":768},[727,57769,54615],{"class":737},[727,57771,56240],{"class":768},[14,57773,57774],{},"The CSS selectors we can abstract and find helpful in this example are:",[555,57776,57777,57779,57785],{},[83,57778,57536],{},[83,57780,57781,57782],{},"#searchInput or ",[727,57783,57784],{},"id=\"searchInput\"",[83,57786,57787],{},[727,57788,57789],{},"placeholder=\"Search the BBC\"",[21,57791,57793],{"id":57792},"how-to-use-chrome-inspector-to-inspect-input-fields","How to use Chrome Inspector to inspect input fields",[14,57795,57796],{},"To create custom CSS selectors, we need to inspect the code. Chrome provides a built-in tool that makes this easy: Chrome DevTools. Here’s how to use it:",[555,57798,57799,57802,57805],{},[83,57800,57801],{},"Open Chrome Inspector - Right-click on the element you want to inspect and select \"Inspect\" from the menu. This will open Chrome DevTools, with the element’s code highlighted.",[83,57803,57804],{},"Select the Inspector Tool - If DevTools is already open, click the cursor icon in the top-left corner of the panel. This tool allows you to hover over elements on the page to inspect them.",[83,57806,57807],{},"Find the Code - Hover over an input field (or any element) to see its structure. Click on it to freeze the selection in DevTools. The corresponding HTML and CSS will appear in the Elements tab, where you can copy the element’s selector or make edits in the Styles panel.",[14,57809,57810],{},"You can find the opening tag and identify its attributes on any webpage.",[21,57812,57814],{"id":57813},"when-you-may-need-to-use-a-custom-selector-in-axiomai","When you may need to use a custom selector in axiom.ai",[14,57816,57817],{},"I do test runs when automating forms, observing the bot every 4-5 steps added. I do this to check for errors. The error I look for is \"Element not found.\" This means the element has not been found on the page. If I see the element on the page during the run, I then know it's an issue with the CSS sector being used to locate that element.",[14,57819,57820,57821,57824],{},"I will then reselect and run again. If that fails, I fall back to a ",[322,57822,57823],{"href":10190},"custom CSS selector",". Now, no worries if you're a new user and stuck at that point. Keep reading, as I will teach you.",[21,57826,57828],{"id":57827},"how-to-use-a-custom-selector-in-axiomai","How to use a custom selector in axiom.ai",[14,57830,57831,57832,57835,57836,57839,57840,57843],{},"Now, in axiom.ai, we have a no-code selector tool with advanced algorithms that automatically determine selectors for you 99% of the time. You can point and click to select elements. We offer a ",[322,57833,57834],{"href":10402},"Single-selector tool"," for interacting with elements and a ",[322,57837,57838],{"href":19499},"Multi-selector tool"," for ",[322,57841,57842],{"href":19716},"scraping data",". Custom selectors can be used with both tools and in both cases, you can select elements by pointing and clicking.",[14,57845,57846],{},"How to use a custom selector in the single selector tool:",[555,57848,57849,57852,57855,57858],{},[83,57850,57851],{},"Click Select to open the no-code selector tool.",[83,57853,57854],{},"Click Custom, then enter your selector in the text field.",[83,57856,57857],{},"If the selector finds the element, it will be highlighted.",[83,57859,57860,57861,57864],{},"Use Chrome Inspector to check if the class ",[90,57862,57863],{},"axiom-selected"," has been applied to the selected element.",[21,57866,57868],{"id":57867},"do-not-use-these-types-of-selectors","Do not use these types of selectors",[14,57870,57871],{},"Notably, there are CSS selectors you should avoid.",[719,57873,57875],{"className":56214,"code":57874,"language":56216,"meta":57527,"style":494},"\u003Cinput aria-label=\"Search input\" autocapitalize=\"none\" class=\"x1lugfcp x1hmx34t x1lq5wgf xgqcy7u x30kzoy x9jhf4c x972fbf xcfux6l x1qhh985 xm0m39n x9f619 x5n08af xl565be x5yr21d x1a2a7pz xyqdw3p x1pi30zi xg8j3zb x1swvt13 x1yc453h xh8yej3 xhtitgo xs3hnx8 x1dbmdqj xoy4bel x7xwk5j\" dir=\"\" placeholder=\"Search\" type=\"text\" value=\"\">\n",[90,57876,57877],{"__ignoreMap":494},[727,57878,57879,57881,57883,57886,57888,57891,57894,57896,57899,57901,57903,57906,57909,57911,57913,57915,57917,57920,57923,57925,57928,57930,57932,57934],{"class":729,"line":730},[727,57880,18130],{"class":768},[727,57882,57536],{"class":7745},[727,57884,57885],{"class":1882}," aria-label",[727,57887,4970],{"class":768},[727,57889,57890],{"class":737},"\"Search input\"",[727,57892,57893],{"class":1882}," autocapitalize",[727,57895,4970],{"class":768},[727,57897,57898],{"class":737},"\"none\"",[727,57900,57617],{"class":1882},[727,57902,4970],{"class":768},[727,57904,57905],{"class":737},"\"x1lugfcp x1hmx34t x1lq5wgf xgqcy7u x30kzoy x9jhf4c x972fbf xcfux6l x1qhh985 xm0m39n x9f619 x5n08af xl565be x5yr21d x1a2a7pz xyqdw3p x1pi30zi xg8j3zb x1swvt13 x1yc453h xh8yej3 xhtitgo xs3hnx8 x1dbmdqj xoy4bel x7xwk5j\"",[727,57907,57908],{"class":1882}," dir",[727,57910,4970],{"class":768},[727,57912,54615],{"class":737},[727,57914,57601],{"class":1882},[727,57916,4970],{"class":768},[727,57918,57919],{"class":737},"\"Search\"",[727,57921,57922],{"class":1882}," type",[727,57924,4970],{"class":768},[727,57926,57927],{"class":737},"\"text\"",[727,57929,57625],{"class":1882},[727,57931,4970],{"class":768},[727,57933,54615],{"class":737},[727,57935,56240],{"class":768},[14,57937,57938,57939,57942],{},"In this example, you can see what appear to be random combinations of numbers and letters in the class tag, for example, ",[90,57940,57941],{},"xs3hnx8",". These are obfuscated CSS classes, meaning they change and will differ each time the bot runs.",[14,57944,57945],{},"As a rule of thumb, I avoid using classes unless they are clearly unique and relevant to the input, such as 'search-field`.",[21,57947,57949],{"id":57948},"how-i-formulate-custom-css-selectors","How I formulate custom css selectors",[14,57951,57952],{},"First, I create a unique selector using attributes from the input field. I use the Chrome inspector to compare other inputs and identify unique attributes. This approach works well, but what if there isn't a unique selector?",[14,57954,57955,57956,44],{},"In that case, I work backwards from the input field up the DOM Tree. All elements are connected, just like a family tree. I look at the parent elements of my input field and identify unique selectors on them to create a ",[322,57957,381],{"href":380},[21,57959,57961],{"id":57960},"first-try-to-identify-a-unique-selector","First, try to identify a unique selector",[14,57963,57964],{},"Inspect your input field and examine the attributes.",[719,57966,57967],{"className":56214,"code":57526,"language":56216,"meta":57527,"style":494},[90,57968,57969],{"__ignoreMap":494},[727,57970,57971,57973,57975,57977,57979,57981,57983,57985,57987,57989,57991,57993,57995,57997,57999,58001,58003,58005,58007,58009,58011,58013,58015,58017,58019,58021,58023,58025,58027,58029,58031,58033,58035,58037,58039,58041,58043,58045,58047,58049,58051,58053,58055,58057,58059,58061,58063,58065,58067,58069,58071,58073,58075,58077],{"class":729,"line":730},[727,57972,18130],{"class":768},[727,57974,57536],{"class":7745},[727,57976,57539],{"class":1882},[727,57978,4970],{"class":768},[727,57980,54615],{"class":737},[727,57982,57546],{"class":1882},[727,57984,4970],{"class":768},[727,57986,57551],{"class":737},[727,57988,57554],{"class":1882},[727,57990,4970],{"class":768},[727,57992,57559],{"class":737},[727,57994,57562],{"class":1882},[727,57996,4970],{"class":768},[727,57998,57567],{"class":737},[727,58000,57570],{"class":1882},[727,58002,4970],{"class":768},[727,58004,57575],{"class":737},[727,58006,57578],{"class":1882},[727,58008,4970],{"class":768},[727,58010,57583],{"class":737},[727,58012,56227],{"class":1882},[727,58014,4970],{"class":768},[727,58016,57590],{"class":737},[727,58018,57593],{"class":1882},[727,58020,4970],{"class":768},[727,58022,57598],{"class":737},[727,58024,57601],{"class":1882},[727,58026,4970],{"class":768},[727,58028,57606],{"class":737},[727,58030,57609],{"class":1882},[727,58032,4970],{"class":768},[727,58034,57614],{"class":737},[727,58036,57617],{"class":1882},[727,58038,4970],{"class":768},[727,58040,57622],{"class":737},[727,58042,57625],{"class":1882},[727,58044,4970],{"class":768},[727,58046,54615],{"class":737},[727,58048,57632],{"class":768},[727,58050,50804],{"class":7745},[727,58052,57637],{"class":1882},[727,58054,4970],{"class":768},[727,58056,57642],{"class":737},[727,58058,56227],{"class":1882},[727,58060,4970],{"class":768},[727,58062,57649],{"class":737},[727,58064,57652],{"class":1882},[727,58066,4970],{"class":768},[727,58068,57657],{"class":737},[727,58070,57660],{"class":768},[727,58072,50804],{"class":7745},[727,58074,56235],{"class":768},[727,58076,57536],{"class":54609},[727,58078,56240],{"class":768},[14,58080,58081],{},"Inspect your input field and examine its attributes.",[555,58083,58084,58098,58109],{},[83,58085,58086,58087,58090,58091,58094,58095,44],{},"First, I look for an ",[90,58088,58089],{},"id="," attribute. The ",[90,58092,58093],{},"id"," tag is unique to the element nine times out of ten. I can use it like this: ",[90,58096,58097],{},"#searchInput",[83,58099,58100,58101,58104,58105,58108],{},"Next, I check the ",[90,58102,58103],{},"placeholder"," attribute. The text that appears inside an input field is often unique. I can use it like this: ",[90,58106,58107],{},"[placeholder=\"Search the BBC\"]"," (inside square brackets).",[83,58110,58111,58112,44],{},"You may want to try a combination of attributes: ",[90,58113,58114],{},"[id=\"searchInput\"][placeholder=\"Search the BBC\"]",[14,58116,58117,58118,58121],{},"I would not use these classes: ",[90,58119,58120],{},"class=\"ssrcss-199fsd8-StyledInput e1ld3nu72\"",". They are obfuscated and will likely change each time the page loads.",[21,58123,58125],{"id":58124},"if-required-traverse-the-dom-to-find-a-unique-combination","If required, traverse the DOM to find a unique combination",[14,58127,58128],{},"If you cannot find a unique selector, we go back up the tree using the Inspector tool.",[14,58130,58131],{},"What does that mean? Simply put, it means inspecting other elements that wrap around the input. We identify attributes on those elements that can be combined to construct a unique selector.",[14,58133,58134],{},"It's important to note that the input must be a child of the element you've traversed, or the selector will not work. Being a child means the input is nested inside another element, creating a selector hierarchy in the DOM tree that we can leverage.",[14,58136,58137,58138,58141,58142,58145,58146,44],{},"For example, I inspect an input and extract this attribute:   ",[90,58139,58140],{},"[\"aria-label=\"To recipients\"]",";  I observe that this attribute also appears on other inputs and is not unique. So, I traverse the DOM further. I identify a parent element in which the input is nested in a ",[90,58143,58144],{},"form"," with the attribute ",[90,58147,58148],{},"method=\"POST\"",[14,58150,58151],{},"If I combine what I have observed, I can create a unique selector. This would be my selector:",[14,58153,58154],{},[90,58155,58156],{},"form[method=\"POST] [\"aria-label=\"To recipients\"]",[14,58158,58159],{},"First, I add the parent element and its attribute selector. Then, after a space, I add the input attribute.",[14,58161,58162],{},"Creating combinations like this using hierarchy allows you to quickly construct unique selectors for most elements.",[21,58164,58166],{"id":58165},"real-world-examples","Real-world examples",[14,58168,58169],{},"Here are some real-world examples where I've had to use a custom selector.",[639,58171,11534],{"id":12880},[14,58173,58174,58175,58178],{},"This is a comment box on an Instagram post that opens in a dialog. Inspecting the element, I found a unique attribute I could use. However, I observed multiple comment boxes loaded on the page, and my supposed unique attribute  ",[90,58176,58177],{},"[aria-label=\"Add a comment…\"]"," was not unique, as it appeared in multiple comment boxes.",[719,58180,58182],{"className":56214,"code":58181,"language":56216,"meta":57527,"style":494},"\u003Ctextarea aria-label=\"Add a comment…\" placeholder=\"Add a comment…\" autocomplete=\"off\" autocorrect=\"off\" class=\"x1i0vuye xvbhtw8 x1ejq31n xd10rxx x1sy0etr x17r0tee x5n08af x78zum5 x1iyjqo2 x1qlqyl8 x1d6elog xlk1fp6 x1a2a7pz xexx8yu x4uap5 x18d9i69 xkhd6sd xtt52l0 xnalus7 xs3hnx8 x1bq4at4 xaqnwrm\" dir=\"\" style=\"height: 18px !important;\">\u003C\u002Ftextarea>\n",[90,58183,58184],{"__ignoreMap":494},[727,58185,58186,58188,58191,58193,58195,58198,58200,58202,58204,58206,58208,58210,58213,58215,58217,58219,58221,58224,58226,58228,58230,58232,58234,58237,58239,58241],{"class":729,"line":730},[727,58187,18130],{"class":768},[727,58189,58190],{"class":7745},"textarea",[727,58192,57885],{"class":1882},[727,58194,4970],{"class":768},[727,58196,58197],{"class":737},"\"Add a comment…\"",[727,58199,57601],{"class":1882},[727,58201,4970],{"class":768},[727,58203,58197],{"class":737},[727,58205,57578],{"class":1882},[727,58207,4970],{"class":768},[727,58209,57583],{"class":737},[727,58211,58212],{"class":1882}," autocorrect",[727,58214,4970],{"class":768},[727,58216,57583],{"class":737},[727,58218,57617],{"class":1882},[727,58220,4970],{"class":768},[727,58222,58223],{"class":737},"\"x1i0vuye xvbhtw8 x1ejq31n xd10rxx x1sy0etr x17r0tee x5n08af x78zum5 x1iyjqo2 x1qlqyl8 x1d6elog xlk1fp6 x1a2a7pz xexx8yu x4uap5 x18d9i69 xkhd6sd xtt52l0 xnalus7 xs3hnx8 x1bq4at4 xaqnwrm\"",[727,58225,57908],{"class":1882},[727,58227,4970],{"class":768},[727,58229,54615],{"class":737},[727,58231,57652],{"class":1882},[727,58233,4970],{"class":768},[727,58235,58236],{"class":737},"\"height: 18px !important;\"",[727,58238,56235],{"class":768},[727,58240,58190],{"class":7745},[727,58242,56240],{"class":768},[14,58244,58245],{},"The solution was to traverse the DOM. I observed that the input was inside a dialog pop-up, which made it unique. So, I formulated this selector using the grandparent element's attribute:",[14,58247,58248],{},[90,58249,58250],{},"[role=\"dialog\"] [aria-label=\"Add a comment…\"]",[639,58252,3395],{"id":58253},"cerebro",[14,58255,58256,58257,58260],{},"In Cerebro's filters, I observed that the filter inputs had no specific attributes I could target. For example, the ",[90,58258,58259],{},"placeholder=\" min\""," attribute was repeated eight times, making it unreliable for selection.",[719,58262,58264],{"className":56214,"code":58263,"language":56216,"meta":57527,"style":494},"\u003Cinput data-testid=\"wordcount\" type=\"number\" placeholder=\"Min\" min=\"0\" class=\"sc-hIPBNq sc-jnbAOD eYtKDj\" value=\"\">\n",[90,58265,58266],{"__ignoreMap":494},[727,58267,58268,58270,58272,58275,58277,58280,58282,58284,58287,58289,58291,58294,58297,58299,58302,58304,58306,58309,58311,58313,58315],{"class":729,"line":730},[727,58269,18130],{"class":768},[727,58271,57536],{"class":7745},[727,58273,58274],{"class":1882}," data-testid",[727,58276,4970],{"class":768},[727,58278,58279],{"class":737},"\"wordcount\"",[727,58281,57922],{"class":1882},[727,58283,4970],{"class":768},[727,58285,58286],{"class":737},"\"number\"",[727,58288,57601],{"class":1882},[727,58290,4970],{"class":768},[727,58292,58293],{"class":737},"\"Min\"",[727,58295,58296],{"class":1882}," min",[727,58298,4970],{"class":768},[727,58300,58301],{"class":737},"\"0\"",[727,58303,57617],{"class":1882},[727,58305,4970],{"class":768},[727,58307,58308],{"class":737},"\"sc-hIPBNq sc-jnbAOD eYtKDj\"",[727,58310,57625],{"class":1882},[727,58312,4970],{"class":768},[727,58314,54615],{"class":737},[727,58316,56240],{"class":768},[14,58318,58319],{},"Of course, the solution was to traverse the DOM and inspect the parent elements using Chrome Inspector. However, I could still not use unique attributes. Instead, I needed to rely on hierarchy, which is how the elements are ordered.",[14,58321,58322],{},"First, I found the form ID:",[14,58324,58325],{},[90,58326,58327],{},"id=\"CerebroFilterContent\"",[14,58329,58330],{},"This gave me a starting point. Then, I observed that the children of this element were structured to organize the form inputs. This meant I could use the child relationship to target the correct input.",[14,58332,58333],{},"My selector looked like this:",[14,58335,58336],{},[90,58337,58338],{},"#CerebroFilterContent div:nth-child(2) input[placeholder=\"min\"]",[14,58340,58341,58342,58345,58346,44],{},"This selector targets the second child div within ",[90,58343,58344],{},"#CerebroFilterContent"," and selects the input with the attribute ",[90,58347,58348],{},"placeholder=\"Min\"",[21,58350,796],{"id":795},[14,58352,58353],{},"Creating custom CSS selectors might seem daunting if you're new to automation. But with some practice, you'll quickly get the hang of it.",[14,58355,58356],{},"By learning to inspect elements in Chrome DevTools, identify valuable attributes, and avoid unreliable selectors, you're building skills to make your automation more reliable. axiom.ai's no-code selector tool does most of the work, but knowing how to find the correct selector gives you confidence and control when things don't go as expected.",[14,58358,58359],{},"Don't worry about getting it perfect the first time. Try inspecting an input field, test different selectors, and see what works. The more you practice, the easier it becomes.",[14,58361,58362],{},"If you get stuck, we are, of course, here to help. Reach out via Reddit with questions or support for subscribers.",[811,58364,58365],{},"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 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);}",{"title":494,"searchDepth":495,"depth":495,"links":58367},[58368,58369,58370,58371,58372,58373,58374,58375,58376,58380],{"id":57516,"depth":498,"text":57517},{"id":57792,"depth":498,"text":57793},{"id":57813,"depth":498,"text":57814},{"id":57827,"depth":498,"text":57828},{"id":57867,"depth":498,"text":57868},{"id":57948,"depth":498,"text":57949},{"id":57960,"depth":498,"text":57961},{"id":58124,"depth":498,"text":58125},{"id":58165,"depth":498,"text":58166,"children":58377},[58378,58379],{"id":12880,"depth":495,"text":11534},{"id":58253,"depth":495,"text":3395},{"id":795,"depth":498,"text":796},"2025-03-19","Learn how to create custom selectors to target inputs",{"read":58384,"type":513,"tool":58385,"category":58386,"tags":58388,"location":46733,"featuredimg":58392,"landingimg":58393,"content_type":58394,"layout":51177,"summary":58382,"video":523,"metaTitle":58395},"17 min read",[46728],[58387],"Form automation",[57536,58389,58390,58391,48365],"input field","text fields","forms","\u002Fform-input-master-post.webp","\u002Fform-input-master-sq.webp","blog","Custom selectors for input fields.","\u002Fblog\u002Finput-fields",{"title":57482,"description":58382},"blog\u002Finput-fields","TaT_GpoOkV9BcyP9_jR5LeqWocTxUQHfgHJQNvlQ1tk",[58387],[513],[46728],{"id":58404,"title":58405,"author":46205,"body":58406,"date":59048,"description":59049,"draft":26250,"extension":506,"meta":59050,"navigation":522,"path":59061,"seo":59062,"stem":59063,"__hash__":59064,"pinned":-1,"category":59065,"type":59066,"tool":59067},"blog\u002Fblog\u002Fextract-selectors-chagtgpt.md","Can ChatGPT help me extract CSS selectors?",{"type":8,"value":58407,"toc":59031},[58408,58415,58418,58421,58424,58427,58430,58433,58437,58443,58451,58506,58509,58512,58516,58519,58522,58524,58527,58555,58562,58566,58569,58572,58575,58578,58581,58635,58638,58641,58645,58647,58649,58652,58655,58658,58661,58755,58758,58767,58774,58778,58781,58831,58837,58840,58843,58857,58860,58864,58867,58870,58873,58876,58879,59003,59006,59010,59013,59016,59019,59022,59025,59028],[14,58409,58410,58411,58414],{},"I want to test if ",[322,58412,521],{"href":58413},"\u002Fchatgpt"," can extract CSS selectors from HTML. When I first tried this, it wasn't possible, but with the new models, it might be. Let's find out. How much prompt crafting will it take?",[14,58416,58417],{},"When scraping the web or automating a browser, I sometimes need to create a custom CSS selector to locate an element on the page. I usually use Google Chrome's inspector to examine the code and identify a unique selector—a process that takes just a few minutes.",[14,58419,58420],{},"I'm excited to see how ChatGPT performs. How detailed will my prompts need to be? Will ChatGPT understand how to create a unique selector while avoiding pitfalls like obfuscated CSS classes?",[14,58422,58423],{},"I'm going to test this with real-world selector challenges I've encountered. I'll start with a simple prompt: can ChatGPT solve the problem without guidance?",[14,58425,58426],{},"For clarity, I don't just want ChatGPT to generate a CSS selector—I want it to be unique to the element. I'm curious to see how ChatGPT achieves that and what the results will be.",[14,58428,58429],{},"Does ChatGPT understand the hierarchy of selectors?\nWill it be able to leverage other types of selectors?\nWill ChatGPT know what I mean by a unique selector?\nI'm Alex Barlow, co-founder of Axiom. Let's dive in.",[14,58431,58432],{},"The first model I'll test is GPT-4-turbo-03-mini, as it allows me to paste a full page of HTML into the web UI. However, my gut tells me the reasoning could be total overkill, leading to funky results.",[21,58434,58436],{"id":58435},"how-i-will-conduct-my-css-experiments-with-ai-and-chatgpt","How I will conduct my CSS experiments with AI and ChatGPT",[14,58438,58439,58440,58442],{},"I aim to determine whether ChatGPT can generate a unique ",[322,58441,47632],{"href":10190}," for an element within an HTML page. I will be testing ChatGPT and a few of its recent models. I will provide:",[555,58444,58445,58448],{},[83,58446,58447],{},"The entire HTML of the page.",[83,58449,58450],{},"I want a unique css selector to locate the element shown below.",[719,58452,58454],{"className":56214,"code":58453,"language":56216,"meta":494,"style":494},"\u003Cinput data-testid=\"wordcount\" type=\"number\" placeholder=\"Max\" min=\"0\" class=\"sc-csKJxZ sc-dsAqUS dQSMvU\" value=\"\">\u003C\u002Finput>\n",[90,58455,58456],{"__ignoreMap":494},[727,58457,58458,58460,58462,58464,58466,58468,58470,58472,58474,58476,58478,58481,58483,58485,58487,58489,58491,58494,58496,58498,58500,58502,58504],{"class":729,"line":730},[727,58459,18130],{"class":768},[727,58461,57536],{"class":7745},[727,58463,58274],{"class":1882},[727,58465,4970],{"class":768},[727,58467,58279],{"class":737},[727,58469,57922],{"class":1882},[727,58471,4970],{"class":768},[727,58473,58286],{"class":737},[727,58475,57601],{"class":1882},[727,58477,4970],{"class":768},[727,58479,58480],{"class":737},"\"Max\"",[727,58482,58296],{"class":1882},[727,58484,4970],{"class":768},[727,58486,58301],{"class":737},[727,58488,57617],{"class":1882},[727,58490,4970],{"class":768},[727,58492,58493],{"class":737},"\"sc-csKJxZ sc-dsAqUS dQSMvU\"",[727,58495,57625],{"class":1882},[727,58497,4970],{"class":768},[727,58499,54615],{"class":737},[727,58501,56235],{"class":768},[727,58503,57536],{"class":54609},[727,58505,56240],{"class":768},[14,58507,58508],{},"I will not share the full HTML of the page here; it's a whole page of code, and including it would not be practical. As for my prompts, I'll keep them simple to see how well AI can handle the task with minimal instruction.",[14,58510,58511],{},"I will also avoid including ChatGPT's response word-for-word in the post; I fear that would make the longest blog post in the world.",[21,58513,58515],{"id":58514},"experiment-1-minimal-guidance","Experiment 1: Minimal guidance",[14,58517,58518],{},"We want AI to perform tasks without needing a long list of instructions. For my first experiment, I kept it simple with a short prompt.",[14,58520,58521],{},":: prompt ChatGPT Prompt\nCan you find a unique CSS selector for this element (I inserted the elements HTML)\nFrom this HTML (I inserted the HTML)\n::",[639,58523,48726],{"id":48725},[14,58525,58526],{},"Well, first off, it didn't produce a unique selector. Instead, the response was a lengthy explanation covering CSS selectors, JavaScript, and XPath. None of which I asked for. After nudging it, ChatGPT quickly generated a selector for me:",[719,58528,58532],{"className":58529,"code":58530,"language":58531,"meta":494,"style":494},"language-CSS shiki shiki-themes github-light-default github-dark-default","\u002F* This is the unique selector recommended by ChatGPT *\u002F\ninput[data-testid=\"wordcount\"]\n","CSS",[90,58533,58534,58539],{"__ignoreMap":494},[727,58535,58536],{"class":729,"line":730},[727,58537,58538],{"class":2920},"\u002F* This is the unique selector recommended by ChatGPT *\u002F\n",[727,58540,58541,58543,58546,58549,58551,58553],{"class":729,"line":498},[727,58542,57536],{"class":7745},[727,58544,58545],{"class":768},"[",[727,58547,58548],{"class":1882},"data-testid",[727,58550,4970],{"class":1986},[727,58552,58279],{"class":737},[727,58554,17433],{"class":768},[14,58556,58557,58558,58561],{},"ChatGPT claimed the selector was unique. However, after inspecting the HTML, I discovered there were two inputs with that selector: `input",[727,58559,58560],{},"data-testid=\"wordcount\"",". Additionally, I would avoid using the data-testid attribute as it originates from testing code and could be removed.",[21,58563,58565],{"id":58564},"experiment-2-minimal-guidance-with-some-instruction","Experiment 2: Minimal guidance with some instruction",[14,58567,58568],{},"I Make minimal changes to the prompt. Keep in mind that this is a short task, and AI must be worth it. I don't want to spend hours prompt writing.",[14,58570,58571],{},":: prompt ChatGPT Prompt",[14,58573,58574],{},"Can you find a unique CSS selector for this element (Element HTML)\nFrom this HTML (I insert the HTML).",[14,58576,58577],{},"I want a unique selector without using data-testid=\"wordcount\" or any other data-testid attributes.\n::",[639,58579,48726],{"id":58580},"the-result-1",[719,58582,58584],{"className":58529,"code":58583,"language":58531,"meta":494,"style":494},"\u002F* Option one - element with 3 attributes *\u002F\ninput[type=\"number\"][placeholder=\"Min\"][min=\"0\"]\n\u002F* Option one - 3 css classes *\u002F\ninput.sc-csKJxZ.sc-dsAqUS.dQSMvU\n",[90,58585,58586,58591,58623,58628],{"__ignoreMap":494},[727,58587,58588],{"class":729,"line":730},[727,58589,58590],{"class":2920},"\u002F* Option one - element with 3 attributes *\u002F\n",[727,58592,58593,58595,58597,58599,58601,58603,58606,58608,58610,58612,58614,58617,58619,58621],{"class":729,"line":498},[727,58594,57536],{"class":7745},[727,58596,58545],{"class":768},[727,58598,47218],{"class":1882},[727,58600,4970],{"class":1986},[727,58602,58286],{"class":737},[727,58604,58605],{"class":768},"][",[727,58607,58103],{"class":1882},[727,58609,4970],{"class":1986},[727,58611,58293],{"class":737},[727,58613,58605],{"class":768},[727,58615,58616],{"class":1882},"min",[727,58618,4970],{"class":1986},[727,58620,58301],{"class":737},[727,58622,17433],{"class":768},[727,58624,58625],{"class":729,"line":495},[727,58626,58627],{"class":2920},"\u002F* Option one - 3 css classes *\u002F\n",[727,58629,58630,58632],{"class":729,"line":1895},[727,58631,57536],{"class":7745},[727,58633,58634],{"class":1882},".sc-csKJxZ.sc-dsAqUS.dQSMvU\n",[14,58636,58637],{},"ChatGPT states, \"Either approach will give you a unique CSS selector without relying on data-testid attributes.\"",[14,58639,58640],{},"When manually checking the HTML, I found that the first solution was not unique because other inputs shared the exact attributes. The second suggestion used obfuscated CSS classes that could change periodically, causing the selector to break. I do not recommend doing that! I will make sure to mention this explicitly in my following prompt.",[21,58642,58644],{"id":58643},"experiment-3-expanding-the-prompt-using-the-console-to-validate-results","Experiment 3:  Expanding the prompt using the console to validate results",[11,58646],{},[14,58648,58571],{},[14,58650,58651],{},"Can you find a unique CSS selector for this element (Element HTML)\nFrom this HTML (I inserted the HTML).",[14,58653,58654],{},"I want a unique selector without using data-testid=\"wordcount\" or any other data-testid attributes. In addition to not use CSS classes when obviously obfuscated.\n::",[639,58656,48726],{"id":58657},"the-result-2",[14,58659,58660],{},"ChatGPT turned its attention to using absolute paths, which is excellent. I recommend this approach when solving selector riddles. Nice work! Or was it?",[719,58662,58666],{"className":58663,"code":58664,"language":58665,"meta":494,"style":494},"language-css shiki shiki-themes github-light-default github-dark-default","\u002F* This is a single-line comment *\u002F\n#container form input[type=\"number\"]:nth-of-type(2)\n\u002F* This is a single-line comment *\u002F\nhtml > body > div:nth-child(1) > form:nth-child(1) > input:nth-of-type(2)\n","css",[90,58667,58668,58673,58703,58707],{"__ignoreMap":494},[727,58669,58670],{"class":729,"line":730},[727,58671,58672],{"class":2920},"\u002F* This is a single-line comment *\u002F\n",[727,58674,58675,58678,58680,58683,58685,58687,58689,58691,58694,58697,58699,58701],{"class":729,"line":498},[727,58676,58677],{"class":1882},"#container",[727,58679,2116],{"class":7745},[727,58681,58682],{"class":7745}," input",[727,58684,58545],{"class":768},[727,58686,47218],{"class":1882},[727,58688,4970],{"class":1986},[727,58690,58286],{"class":737},[727,58692,58693],{"class":768},"]",[727,58695,58696],{"class":1882},":nth-of-type",[727,58698,2542],{"class":768},[727,58700,8883],{"class":1882},[727,58702,12611],{"class":768},[727,58704,58705],{"class":729,"line":495},[727,58706,58672],{"class":2920},[727,58708,58709,58711,58714,58717,58719,58722,58725,58727,58729,58731,58733,58735,58737,58739,58741,58743,58745,58747,58749,58751,58753],{"class":729,"line":1895},[727,58710,56216],{"class":7745},[727,58712,58713],{"class":1986}," >",[727,58715,58716],{"class":7745}," body",[727,58718,58713],{"class":1986},[727,58720,58721],{"class":7745}," div",[727,58723,58724],{"class":1882},":nth-child",[727,58726,2542],{"class":768},[727,58728,165],{"class":1882},[727,58730,5031],{"class":768},[727,58732,57681],{"class":1986},[727,58734,2116],{"class":7745},[727,58736,58724],{"class":1882},[727,58738,2542],{"class":768},[727,58740,165],{"class":1882},[727,58742,5031],{"class":768},[727,58744,57681],{"class":1986},[727,58746,58682],{"class":7745},[727,58748,58696],{"class":1882},[727,58750,2542],{"class":768},[727,58752,8883],{"class":1882},[727,58754,12611],{"class":768},[14,58756,58757],{},"I was excited by the results, so I didn't just manually check them—I validated them using the Console in Chrome Tools:",[719,58759,58761],{"className":56214,"code":58760,"language":56216,"meta":758,"style":494},"document.querySelector('html > body > div:nth-child(1) > form:nth-child(1) > input:nth-of-type(2)')\n",[90,58762,58763],{"__ignoreMap":494},[727,58764,58765],{"class":729,"line":730},[727,58766,58760],{"class":768},[14,58768,58769,58770,58773],{},"When I checked in the console, the selectors failed validation. When I checked the HTML, they were completely incorrect. The selector ",[90,58771,58772],{},"form input[type=\"number\"]:nth-of-type(2)"," was misusing nth-of-type, and it wasn't even close to accurate. Something had gone astray, or some AI.",[21,58775,58777],{"id":58776},"a-dead-end","A dead end",[14,58779,58780],{},"I started to wonder why the selectors were so inaccurate. The structure didn't match the HTML at all. But why? I asked the AI to recheck the HTML. After restructuring the prompt several times and providing both the element and HTML snippet again, the AI obliged and returned a few results.",[719,58782,58784],{"className":58663,"code":58783,"language":58665,"meta":494,"style":494},"form#myForm > div:nth-child(2) > div:nth-child(1) > input[placeholder=\"Max\"]\n",[90,58785,58786],{"__ignoreMap":494},[727,58787,58788,58790,58793,58795,58797,58799,58801,58803,58805,58807,58809,58811,58813,58815,58817,58819,58821,58823,58825,58827,58829],{"class":729,"line":730},[727,58789,58144],{"class":7745},[727,58791,58792],{"class":1882},"#myForm",[727,58794,58713],{"class":1986},[727,58796,58721],{"class":7745},[727,58798,58724],{"class":1882},[727,58800,2542],{"class":768},[727,58802,8883],{"class":1882},[727,58804,5031],{"class":768},[727,58806,57681],{"class":1986},[727,58808,58721],{"class":7745},[727,58810,58724],{"class":1882},[727,58812,2542],{"class":768},[727,58814,165],{"class":1882},[727,58816,5031],{"class":768},[727,58818,57681],{"class":1986},[727,58820,58682],{"class":7745},[727,58822,58545],{"class":768},[727,58824,58103],{"class":1882},[727,58826,4970],{"class":1986},[727,58828,58480],{"class":737},[727,58830,17433],{"class":768},[14,58832,58833,58834,58836],{},"However, it used this ID selector: ",[90,58835,58792],{},". The issue was that this ID wasn't part of the HTML I provided. I asked ChatGPT to show me the HTML it used to generate the selector. It obliged, revealing it wasn't using the HTML snippet I gave it—it had invented its example form. I'd reached a dead end; the AI was confused and hallucinating.",[14,58838,58839],{},"That's enough—time to start again in a fresh window.",[14,58841,58842],{},"It kept forgetting the HTML snippet I shared.",[555,58844,58845,58848,58854],{},[83,58846,58847],{},"It started using its own basic form example.",[83,58849,58850,58851,58853],{},"It invented an ID (",[90,58852,58792],{},") that didn’t exist.",[83,58855,58856],{},"Its reasoning meant every prompt adjustment caused it to reevaluate moving further away from the solution.",[14,58858,58859],{},"The reasoning model was completely the wrong choice. It tends to go off the rails, making leaps when I needed incremental improvements.",[21,58861,58863],{"id":58862},"experiment-5-one-last-go-with-chatgpt-40-model","Experiment 5: One last go with ChatGPT 4.0 model",[14,58865,58866],{},"I didn't use this model first because of its character limit—I can't share the entire HTML page with the AI to work out its solution fully. Starting from scratch:",[14,58868,58869],{},":: prompt ChatGPT prompt\nConstruct a unique CSS selector:",[14,58871,58872],{},"Start with the Form ID in the HTML form element containing the input.\nUse document hierarchy from the form to the input, applying nth-child for each div.",[14,58874,58875],{},"For the input element, use an attribute selector.\nDo not use classes or attributes starting with data-test.\n::",[639,58877,58878],{"id":21503},"Result",[719,58880,58882],{"className":58663,"code":58881,"language":58665,"meta":494,"style":494},"\u002F* This is a single-line comment *\u002F\n#CerebroFilter > div > div:nth-of-type(2) > div:nth-of-type(1) > div:nth-of-type(2) > input[type=\"number\"][placeholder=\"Max\"]\n\u002F* This is a single-line comment *\u002F\n#CerebroFilter input[placeholder=\"Max\"]\n\u002F* This is a single-line comment *\u002F\n#CerebroFilter input[placeholder=\"Max\"][type=\"number\"]\n",[90,58883,58884,58888,58955,58959,58975,58979],{"__ignoreMap":494},[727,58885,58886],{"class":729,"line":730},[727,58887,58672],{"class":2920},[727,58889,58890,58893,58895,58897,58899,58901,58903,58905,58907,58909,58911,58913,58915,58917,58919,58921,58923,58925,58927,58929,58931,58933,58935,58937,58939,58941,58943,58945,58947,58949,58951,58953],{"class":729,"line":498},[727,58891,58892],{"class":1882},"#CerebroFilter",[727,58894,58713],{"class":1986},[727,58896,58721],{"class":7745},[727,58898,58713],{"class":1986},[727,58900,58721],{"class":7745},[727,58902,58696],{"class":1882},[727,58904,2542],{"class":768},[727,58906,8883],{"class":1882},[727,58908,5031],{"class":768},[727,58910,57681],{"class":1986},[727,58912,58721],{"class":7745},[727,58914,58696],{"class":1882},[727,58916,2542],{"class":768},[727,58918,165],{"class":1882},[727,58920,5031],{"class":768},[727,58922,57681],{"class":1986},[727,58924,58721],{"class":7745},[727,58926,58696],{"class":1882},[727,58928,2542],{"class":768},[727,58930,8883],{"class":1882},[727,58932,5031],{"class":768},[727,58934,57681],{"class":1986},[727,58936,58682],{"class":7745},[727,58938,58545],{"class":768},[727,58940,47218],{"class":1882},[727,58942,4970],{"class":1986},[727,58944,58286],{"class":737},[727,58946,58605],{"class":768},[727,58948,58103],{"class":1882},[727,58950,4970],{"class":1986},[727,58952,58480],{"class":737},[727,58954,17433],{"class":768},[727,58956,58957],{"class":729,"line":495},[727,58958,58672],{"class":2920},[727,58960,58961,58963,58965,58967,58969,58971,58973],{"class":729,"line":1895},[727,58962,58892],{"class":1882},[727,58964,58682],{"class":7745},[727,58966,58545],{"class":768},[727,58968,58103],{"class":1882},[727,58970,4970],{"class":1986},[727,58972,58480],{"class":737},[727,58974,17433],{"class":768},[727,58976,58977],{"class":729,"line":1901},[727,58978,58672],{"class":2920},[727,58980,58981,58983,58985,58987,58989,58991,58993,58995,58997,58999,59001],{"class":729,"line":1973},[727,58982,58892],{"class":1882},[727,58984,58682],{"class":7745},[727,58986,58545],{"class":768},[727,58988,58103],{"class":1882},[727,58990,4970],{"class":1986},[727,58992,58480],{"class":737},[727,58994,58605],{"class":768},[727,58996,47218],{"class":1882},[727,58998,4970],{"class":1986},[727,59000,58286],{"class":737},[727,59002,17433],{"class":768},[14,59004,59005],{},"This time, the model is faster, and unlike the reasoning models, it extracts the correct form ID without an issue. But again, the selectors are not unique.",[21,59007,59009],{"id":59008},"wrapping-up-is-it-worth-using-ai-to-find-css-selectors","Wrapping up: Is it worth using AI to find CSS selectors?",[14,59011,59012],{},"My experiments showed that ChatGPT can quickly generate CSS selectors but struggles to produce unique ones. Early attempts resulted in selectors that weren't unique or depended on unstable attributes, such as testing-specific or obfuscated CSS classes.",[14,59014,59015],{},"When I added more instruction to the prompts, the results improved but required manual validation. More detailed prompts led to increasingly complex and incorrect selectors. Additionally, the model forgot the provided HTML context and created selectors based on imagined code structures.",[14,59017,59018],{},"Switching to the GPT-4.0 model showed better initial results. It successfully identified correct form IDs and structured the selectors logically. Yet even this improvement didn't fully guarantee unique selectors without manual verification.",[14,59020,59021],{},"The experiment wasn't a great success. It wasn't better than a human, so we're not likely to be replaced anytime soon. However, it has got me excited. With further prompt crafting, it could work well.",[14,59023,59024],{},"We plan to explore using AI to fix broken selectors in axiom.ai, which could be a fantastic application of ChatGPT or similar models. It certainly showed enough promise to warrant further exploration.",[14,59026,59027],{},"However, we must remember that if the AI starts inventing HTML forms, it could confuse users. So we'll approach this cautiously—with a healthy pinch of salt.",[811,59029,59030],{},"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 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 .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}",{"title":494,"searchDepth":495,"depth":495,"links":59032},[59033,59034,59037,59040,59043,59044,59047],{"id":58435,"depth":498,"text":58436},{"id":58514,"depth":498,"text":58515,"children":59035},[59036],{"id":48725,"depth":495,"text":48726},{"id":58564,"depth":498,"text":58565,"children":59038},[59039],{"id":58580,"depth":495,"text":48726},{"id":58643,"depth":498,"text":58644,"children":59041},[59042],{"id":58657,"depth":495,"text":48726},{"id":58776,"depth":498,"text":58777},{"id":58862,"depth":498,"text":58863,"children":59045},[59046],{"id":21503,"depth":495,"text":58878},{"id":59008,"depth":498,"text":59009},"2025-03-18","Explore how to utilise AI to extract CSS selectors",{"read":59051,"type":513,"tool":59052,"category":59053,"tags":59054,"featuredimg":59057,"landingimg":59058,"summary":59059,"video":523,"metaTitle":59060},"12 min read",[46728],[51135],[59055,521,59056],"css selector","attribute selectors","\u002Fchat-gpt-css-selector-post-bocx.webp","\u002Fchat-gpt-css-selector-sq.webp","We test if ChatGPT can be used to generate unique CSS selectors","Extracting CSS selectors with AI","\u002Fblog\u002Fextract-selectors-chagtgpt",{"title":58405,"description":59049},"blog\u002Fextract-selectors-chagtgpt","kNY7BATVAkD0lfu4PSSz1sVylGSLxxCJNWaKXmn_8WI",[51135],[513],[46728],{"id":59069,"title":59070,"author":48082,"body":59071,"date":59386,"description":59387,"draft":26250,"extension":506,"meta":59388,"navigation":522,"path":59395,"seo":59396,"stem":59397,"__hash__":59398,"pinned":-1,"category":59399,"type":59400,"tool":59401},"blog\u002Fblog\u002Fis-ai-suitable-for-large-scale-scraping.md","Is AI Suitable for Large Scale Scraping?",{"type":8,"value":59072,"toc":59375},[59073,59076,59079,59083,59086,59089,59099,59102,59105,59109,59116,59120,59123,59127,59130,59133,59141,59219,59223,59238,59247,59256,59260,59272,59275,59288,59292,59298,59307,59311,59314,59317,59321,59328,59333,59343,59345,59348,59362,59365,59372],[14,59074,59075],{},"With the hype around AI continuing to grow as new technologies are flooding onto the market, it can be tempting to assume that AI is the solution to most problems that you are hoping to solve, including web scraping. There are factors that should be considered when using AI to solve problems, and these should be used in your decision making process.",[18,59077],{"alt":59078},"Is ai suitable for large scale scraping",[21,59080,59082],{"id":59081},"what-is-ai","What is AI?",[14,59084,59085],{},"Artificial intelligence is a blanket term that we have given to any application that can perform tasks that typically require human intelligence - for example, text generation and code development. A key benefit of this for web scraping is the ability to perform analysis on large amounts of data and recognise patterns in the data. In its current state, people often refer to large-language models and generative AI under the umbrella term \"AI\". ChatGPT, Gemini and Copilot are some of the more popular LLMs on the market at the moment.",[14,59087,59088],{},"These AI models are trained using a massive amount of data, including books, web pages, news articles, social media posts and code snippets. Though most developers of these models are quite tight-lipped about how much data is required for training, we can assume that the actual amount if into the tens of terabytes.",[14,59090,59091,59092,450,59095,59098],{},"Currently, axiom.ai offers two steps that allow you to integrate generative AI (GenAI) into your automations - the ",[322,59093,5962],{"href":59094},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fextract-data-with-chatgpt",[322,59096,59097],{"href":7845},"Generate Text with ChatGPT"," steps. This can help you analyse a large set of data that has been scraped from a web page, or help you generate text that you can use with your Interact steps. We plan on expanding this functionality in future updates.",[14,59100,59101],{},"The largest benefit that people are seeing with GenAI is the ability to generate content and code. This can help speed up content or code creation, but should be used sparingly to avoid over-reliance on it. With content creation, it's important to note that the model may not have all of the required context to assist you - for example, currently asking it to create the steps required to create an automation within axiom.ai will give you about 75% of the right answer, however, it will \"create\" new steps that are not part of the tool and may cause additional confusion with users. Being more precise with your prompts can mitigate some of the issues.",[14,59103,59104],{},"When it comes to using it for code generation, again we see a large number of benefits from GenAI - however, there are common pitfalls that catch newer developers. While it can speed up development, we are seeing a large number of developers adding code to their codebase that they may not fully understand. GenAI often will explain the code that it's written, but it's still critical that the developer understands the code that they are copying into a project - this is just like when a developer blindly copies code from StackOverflow! Blindly copying code into your project may get the job done, however, this will decrease the maintainability of your project. Instead, use it as a learning tool - ask the model to explain the code to you so you can learn how to implement it yourself, or at a minimum, so you can modify or add additional comments to the code.",[592,59106],{"src":59107,"alt":59108},"\u002Fblog\u002Fis-ai-suitable-for-large-scale-scraping-code-generation.png","The image contains a screenshot of a conversation where a user asks for a JavaScript function to filter items from an array. The response includes a code snippet defining a filterArray function that uses the .filter() method. The example usage demonstrates filtering even numbers from an array. Below the code, there is an explanation of how the function works, highlighting the use of a callback function for filtering logic. The response concludes with an offer to modify the function if needed.",[14,59110,59111,59112,59115],{},"Both content and code generation can provide benefits when it comes to large scale scraping, including being able to extract ",[322,59113,59114],{"href":10190},"custom CSS selectors"," to use to ensure that you are targeting the correct elements on the page for efficiency. Let's dive into some other considerations.",[21,59117,59119],{"id":59118},"cost","Cost",[14,59121,59122],{},"Using AI as an individual user tends to not be too expensive, however, if you decide to use this for large scale operations, such as scraping, you should consider the cost of using these services. Most services, such as OpenAI (ChatGPT) will offer an API that can be used and charged at a pay-as-you-go rate. \"Tokens\" are used to measure the data that you are sending to the API and are used to charge users. OpenAI states on their website:",[8898,59124,59125],{},[14,59126,57311],{},[14,59128,59129],{},"As of the time of writing, they charge $2.50\u002F1m input tokens. Your input would include your prompt, along with all of the data that you are sending over.",[14,59131,59132],{},"Where this becomes expensive is operations like large scale scraping - if you decide to use AI for data manipulation, you may end up sending a lot of data tokens to the service when you are sending the data that you have scraped. For example, if you scrape the \"contact us\" page of a list of URLs and want to extract a list of email addresses you may end up sending a large amount of data inserted inside of your prompt. Recently, this would be considered the easiest and most reliable solution - that's not always the case.",[14,59134,59135,59136,59140],{},"Instead of sending all of the data in a prompt and using a large number of input tokens, consider doing the data manipulation using a short JavaScript script locally or exporting the data to a service such as Google Sheets. Check out our ",[322,59137,59139],{"href":59138},"\u002Fdocs\u002Fdeveloper-hub\u002Fsnippets\u002Fjavascript\u002Fdata#manipulating-data-with-regex","Manipulating data with regex"," snippets to learn more about doing this locally, or in your axiom.ai automation. For our example above, we could use the \"Extracting data\" snippet:",[719,59142,59144],{"className":756,"code":59143,"language":758,"meta":494,"style":494},"\u002F\u002F Let's use data scraped from a website, this contains the string \"115 Records\".\nconst data = '[scrape-data?all&0]';\n\n\u002F\u002F We just want the number of records here, let's extract it with regex.\nconst records = data.match(\u002F\\+d\u002F)[0];\n\n\u002F\u002F Return this to be included in the 'code-data' data token.\nreturn records;\n",[90,59145,59146,59151,59164,59168,59173,59203,59207,59212],{"__ignoreMap":494},[727,59147,59148],{"class":729,"line":730},[727,59149,59150],{"class":2920},"\u002F\u002F Let's use data scraped from a website, this contains the string \"115 Records\".\n",[727,59152,59153,59155,59157,59159,59162],{"class":729,"line":498},[727,59154,2315],{"class":1986},[727,59156,22284],{"class":1882},[727,59158,2321],{"class":1986},[727,59160,59161],{"class":737}," '[scrape-data?all&0]'",[727,59163,2327],{"class":768},[727,59165,59166],{"class":729,"line":495},[727,59167,1898],{"emptyLinePlaceholder":522},[727,59169,59170],{"class":729,"line":1895},[727,59171,59172],{"class":2920},"\u002F\u002F We just want the number of records here, let's extract it with regex.\n",[727,59174,59175,59177,59180,59182,59184,59186,59188,59190,59193,59196,59198,59200],{"class":729,"line":1901},[727,59176,2315],{"class":1986},[727,59178,59179],{"class":1882}," records",[727,59181,2321],{"class":1986},[727,59183,21423],{"class":768},[727,59185,8475],{"class":2376},[727,59187,2542],{"class":768},[727,59189,50783],{"class":737},[727,59191,59192],{"class":8496},"\\+",[727,59194,59195],{"class":737},"d\u002F",[727,59197,55586],{"class":768},[727,59199,17395],{"class":1882},[727,59201,59202],{"class":768},"];\n",[727,59204,59205],{"class":729,"line":1973},[727,59206,1898],{"emptyLinePlaceholder":522},[727,59208,59209],{"class":729,"line":2052},[727,59210,59211],{"class":2920},"\u002F\u002F Return this to be included in the 'code-data' data token.\n",[727,59213,59214,59216],{"class":729,"line":2058},[727,59215,2972],{"class":1986},[727,59217,59218],{"class":768}," records;\n",[21,59220,59222],{"id":59221},"environment","Environment",[14,59224,59225,59226,59231,59232,59237],{},"At its core, it is important to remember that AI models require a lot of resources to train and to query. When we ask AI a question, or ask it to perform a task, this will require computing resources in the data centres that the service are running these models on. In 2018, OpenAI researchers Dario Amodei and Danny Hernandez published an article stating that the computing requirements of training AI has been increasing at a 3.4 month doubling time (",[322,59227,59230],{"href":59228,"rel":59229},"https:\u002F\u002Fopenai.com\u002Findex\u002Fai-and-compute\u002F",[2245],"OpenAI",", 2018) - this is massive when compared to ",[322,59233,59236],{"href":59234,"rel":59235},"https:\u002F\u002Fwww.intel.com\u002Fcontent\u002Fwww\u002Fus\u002Fen\u002Fnewsroom\u002Fresources\u002Fmoores-law.html",[2245],"Moore's Law"," which has a 2-year doubling period.",[14,59239,59240,59241,59246],{},"Increased computing requirements is expected to continue as these models continue to get trained on an increasing number of parameters, and as \"agents\" start to be become more generally available. It's expected that emissions from the ICT sector as a whole \"will reach 14% of the global emissions, with the majority of those emissions coming from the ICT infrastructure, particularly data centres and communication networks\" (",[322,59242,59245],{"href":59243,"rel":59244},"https:\u002F\u002Fearth.org\u002Fthe-green-dilemma-can-ai-fulfil-its-potential-without-harming-the-environment",[2245],"Earth.org",", 2023). This may be mitigated in the future with more efficient code, however, current trends would suggest that this is not going to be solved in the near future.",[14,59248,59249,59250,59253,59254,44],{},"When considering using AI to power up your scraping workflows, you should consider this in addition to your organisations current carbon footprint as using AI in your workflows may significantly increase the carbon footprint of the task you are attempting to automate. An alternative may be to automate these tasks locally, such as running operations on your local PC using axiom.ai, ",[322,59251,59252],{"href":2228},"Automator",", or ",[322,59255,18827],{"href":19085},[21,59257,59259],{"id":59258},"technical-challenges","Technical Challenges",[14,59261,59262,59263,59265,59266,59271],{},"Even if you are not a bot wandering through the internet you will have run into a CAPTCHA, or a bot-detection algorithm (such as Cloudflare) that are there to confirm that you are a human. While these are pretty simple to bypass as a human, they are effective at preventing bots from entering the site that they are protecting. This can stop your bot in it's tracks and prevent it from scraping content - on a large scale, this may cause a lot of lost time as it's not always obvious when the bot is stuck at one of these checkpoints. Features like ",[322,59264,51814],{"href":51820}," in axiom.ai, ",[322,59267,59270],{"href":59268,"rel":59269},"https:\u002F\u002Fgithub.com\u002Fberstend\u002Fpuppeteer-extra\u002Ftree\u002Fmaster\u002Fpackages\u002Fpuppeteer-extra-plugin-stealth#readme",[2245],"puppeteer-extra-plugin-stealth",", or another Puppeteer plugin can help you get around these limitations.",[14,59273,59274],{},"For large scale scraping, its also recommended to employ efficient proxy management - routing all traffic through a single IP address may lead to the IP address being blacklisted by certain websites and prevent your ability to access them without rotating your proxies. If you are in a large organisation, it may be possible to do this using your current infrastructure, if not, there are plenty of services that offer the ability to purchase residential IPs for a fee, depending on how much traffic you anticipate to be running through them.",[14,59276,59277,59278,450,59282,59287],{},"With frameworks like React, Vue and Angular becoming popular it means that web content can load into a web page dynamically using JavaScript rather than the static pages we are used to. This means that there needs to be mechanisms implemented that can wait for pages to finish loading before continuing with the interaction. Headless browsers such as ",[322,59279,55848],{"href":59280,"rel":59281},"https:\u002F\u002Fpptr.dev",[2245],[322,59283,59286],{"href":59284,"rel":59285},"https:\u002F\u002Fplaywright.dev",[2245],"Playwright"," can help you with this.",[639,59289,59291],{"id":59290},"page-interactions","Page interactions",[14,59293,59294,59295,59297],{},"More and more commonly, you will come across websites that do not initially reveal all of the data that is present on the page when it loads. The increased popularity of Javascript libraries such as React.js means that data can by dynamically added and removed from pages depending on user interactions with the pages - think of dropdowns, accordions or any other elements that require you to \"click\" to reveal information. Most AI agents, or web crawlers will only scrape data that is currently visible on a page and miss out on any data that is hidden on the page, or requires interaction for the page to be dynamically added. You can get around this by using a script, or tool like ",[322,59296,3435],{"href":50783},", to interact with the page prior to scraping to ensure that the data is present on the page, but this can add significant overhead when working on a large scale.",[14,59299,59300,59301,59306],{},"The same concept applies to page loading - when a page is initially loaded, it may decide to ",[322,59302,59305],{"href":59303,"rel":59304},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FPerformance\u002FGuides\u002FLazy_loading",[2245],"lazy load"," content to speed up the initial load of the page. This feature is popular with resource heavy files, such as images and video, where they are not loaded until the user scrolls to the part of the page that contains the resource. This can trip up some AI agents and web crawlers for the reasons that were mentioned above - they are not yet present on the page. You can get around this by scrolling the page prior to scraping data from the page, which can, again, add significant overhead when working on a large scale.",[21,59308,59310],{"id":59309},"legal-ethical-concerns","Legal & Ethical Concerns",[14,59312,59313],{},"When building a large-scale scraper, it's essential to consider legal and ethical implications. Always review the terms of service of the websites you're scraping, as violating them could lead to account suspensions or even legal consequences if the target service takes action. In most cases, terms of service explicitly prohibit scraping.",[14,59315,59316],{},"Privacy laws should also be top of mind for larger operations - GDPR (EU) and CCPA (California) restrict automated data collection, especially for personal or sensitive data, while intellectual property laws and policies. Scraping and republishing certain types of data (e.g., news articles, research papers) can raise copyright concerns.",[21,59318,59320],{"id":59319},"recommendation-learn-prompt-engineering","Recommendation: Learn Prompt Engineering",[14,59322,59323,59327],{},[322,59324,57327],{"href":59325,"rel":59326},"https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fprompt-engineering",[2245]," is an emerging field within AI, it's defined as:",[8898,59329,59330],{},[14,59331,59332],{},"The process of structuring or crafting an instruction in order to produce the best possible output from a generative artificial intelligence (AI) model.",[14,59334,59335,59336,59339,59340,59342],{},"To get the most out of GenAI, you really need to be specific with your instructions. Prompt engineering on the surface seems simple, however, remember that the prompt makes up the input tokens we discussed in the ",[322,59337,59118],{"href":59338},"#cost"," section of this article - you need to ensure that your prompt is as specific ",[807,59341,50850],{}," as concise as possible to reduce the number of input tokens that your prompt will consume.",[21,59344,796],{"id":795},[14,59346,59347],{},"When used correctly AI has the power to provide efficiency boosts to your organisation when it comes to large-scale scrapers and general operations. It can help speed up development activities, such as writing code or content generation. However, there are certain things that you should take into consideration before committing to using AI for your large-scale scrapers, such as:",[80,59349,59350,59353,59356,59359],{},[83,59351,59352],{},"The cost using AI - specifically surrounding API costs.",[83,59354,59355],{},"The environmental impacts of training and using AI.",[83,59357,59358],{},"The technical challenges - bot blocking, proxies, and dynamically loading content.",[83,59360,59361],{},"The legal & ethical concerns surrounding scraping.",[14,59363,59364],{},"Finally, we would recommend learning prompt engineering to make sure that you are creating prompts that get you the results that meet your requirements, but also reduce the number of input tokens in order to reduce the API costs.",[14,59366,59367,59368,59371],{},"Have some thoughts you'd like to share? Drop a post over on our ",[322,59369,24359],{"href":3324,"rel":59370},[2245],", we would love to hear from you!",[811,59373,59374],{},"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 .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 .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}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}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":494,"searchDepth":495,"depth":495,"links":59376},[59377,59378,59379,59380,59383,59384,59385],{"id":59081,"depth":498,"text":59082},{"id":59118,"depth":498,"text":59119},{"id":59221,"depth":498,"text":59222},{"id":59258,"depth":498,"text":59259,"children":59381},[59382],{"id":59290,"depth":495,"text":59291},{"id":59309,"depth":498,"text":59310},{"id":59319,"depth":498,"text":59320},{"id":795,"depth":498,"text":796},"2025-03-06","Is AI Suitable for Large Scale Scraping? Read more about the considerations that you should be thinking about before committing to using AI.",{"read":50549,"type":513,"tool":59389,"category":59390,"tags":59391,"location":46733,"featuredimg":59393,"landingimg":59394,"summary":59387,"video":523},[46728],[48207],[3974,59392,518],"data extraction","\u002Fblog\u002Fweb-scraping-at-scale-post-box.webp","\u002Fblog\u002Fweb-scraping-at-scale-sq.webp","\u002Fblog\u002Fis-ai-suitable-for-large-scale-scraping",{"title":59070,"description":59387},"blog\u002Fis-ai-suitable-for-large-scale-scraping","i2HFiqzppHNYaxCZ1OMwGVZBkaQARSlOMyFp7GEsZ78",[48207],[513],[46728],{"id":59403,"title":59404,"author":48082,"body":59405,"date":59637,"description":59638,"draft":26250,"extension":506,"meta":59639,"navigation":522,"path":53385,"seo":59645,"stem":59646,"__hash__":59647,"pinned":-1,"category":59648,"type":59649,"tool":59650},"blog\u002Fblog\u002Fenhance-your-automations-with-notifications.md","Enhancing Your Automations with Notifications",{"type":8,"value":59406,"toc":59629},[59407,59410,59413,59417,59420,59423,59427,59430,59433,59439,59443,59446,59456,59466,59470,59476,59486,59490,59493,59528,59533,59556,59561,59567,59574,59578,59588,59598,59602,59605,59609,59611,59614,59620,59627],[14,59408,59409],{},"When running your automations unattended, it's important to know that your automation is running as expected - and when it's not running as expected, you need to know as soon as possible so you can intervene and resolve any issues that your automation is experiencing. axiom.ai offers a few options to receive notifications from your automations in the event of success, warnings, or failures.",[18,59411],{"alt":59412},"How to use notifications when building bots with axiom.ai",[21,59414,59416],{"id":59415},"why-use-notifications","Why use notifications",[14,59418,59419],{},"Receiving notifications from your automation helps you track runs and ensure everything is working as expected, whether running in the cloud or on your desktop. If an automation fails, instant notifications let you quickly jump into axiom.ai, resolve any issues, and get back on track. Notifications can be configured for each of your automations, meaning that you can have additional notifications set up for your more mission critical automations.",[14,59421,59422],{},"Notifications are also a great way of being notified that your automation has completed successfully - if you're using an automation to gather data, this may be a signal to your team that the data is now ready for use. Or it could be used to trigger a third-party service using webhooks, more on this later in the article.",[21,59424,59426],{"id":59425},"setting-up-notifications","Setting up notifications",[14,59428,59429],{},"To set up notifications, open your automation, go to Settings, and select \"Set up notifications.\" You can enable notifications based on the automation’s final status: success, success with warnings, or failure. If you're running large-scale operations in axiom.ai, we recommend enabling failure notifications only to avoid overwhelming your team with emails. For more mission-critical automations, you may wish to enable the \"Notify only when a run has warnings\" options within the notification settings.",[14,59431,59432],{},"When you enable any notification type, you will then be shown the \"How to notify\" section, this is where you will configure the notifications. Let's dive into this next!",[14,59434,59435,59436,16668],{},"You can learn more about setting up notifications in our ",[322,59437,59438],{"href":21046},"notification tutorial",[21,59440,59442],{"id":59441},"email-notifications","Email notifications",[14,59444,59445],{},"Notifications can be set to notify you via email. This field accepts a list of email addresses that can be entered by adding a single email address per line, for example:",[14,59447,59448,59452,59454],{},[322,59449,59451],{"href":59450},"mailto:example@organisation.com","example@organisation.com",[344,59453],{},[322,59455,59451],{"href":59450},[14,59457,59458,59459,59462,59463,59465],{},"The email notification will include the error that your automation has encountered - this is the same error message that you would see within your ",[322,59460,59461],{"href":791},"Run report"," or within the builder. See ",[322,59464,4887],{"href":2203}," for more details on specific errors.",[592,59467],{"src":59468,"alt":59469},"\u002Fblog\u002Fenhance-your-automations-with-notifications-email-notification-standard.png","axiom.ai email notification about a task completion issue. The email states that an automation encountered an error in step 2 ('Click element') because the element could not be found during the run. It advises the user to reselect the element using the selector tool or use a custom selector. The email also provides axiom.ai's support email (support@axiom.ai) for assistance. The email is signed by 'The Axiom team.'",[14,59471,59472,59473,59475],{},"Email notifications can also be added into your automations as \"checkpoints\" - using the ",[322,59474,7619],{"href":7618}," step within your notification allows you to receive notifications throughout the running of your automation. For example, you might want to track the data flow through your automation runs but do not have the time to view the automation as it runs - adding \"Send an email\" steps that have custom bodies, including the data tokens that are being generated, can give you insight as to what's happening within your automation.",[8898,59477,59478],{},[14,59479,59480,59481,59485],{},"💡 See ",[322,59482,59484],{"href":59483},"#adding-more-error-data-to-your-notifications","adding more error data to your notifications"," to learn more about powering up your email notifications.",[21,59487,59489],{"id":59488},"webhook-notifications","Webhook notifications",[14,59491,59492],{},"Notifications can be set to notify you via webhook. This field will accept a single webhook that a request will be sent to in the event of a notification. This can be very useful for triggering another service when your automation has finished it's run. The webhook will be sent in the following format:",[719,59494,59496],{"className":7732,"code":59495,"language":2585,"meta":494,"style":494},"{\n    \"status\": \"\u003CSTATUS>\",\n    \"log\": \"\u003CMESSAGE>\"\n}\n",[90,59497,59498,59502,59514,59524],{"__ignoreMap":494},[727,59499,59500],{"class":729,"line":730},[727,59501,7740],{"class":768},[727,59503,59504,59507,59509,59512],{"class":729,"line":498},[727,59505,59506],{"class":7745},"    \"status\"",[727,59508,1995],{"class":768},[727,59510,59511],{"class":737},"\"\u003CSTATUS>\"",[727,59513,2427],{"class":768},[727,59515,59516,59519,59521],{"class":729,"line":495},[727,59517,59518],{"class":7745},"    \"log\"",[727,59520,1995],{"class":768},[727,59522,59523],{"class":737},"\"\u003CMESSAGE>\"\n",[727,59525,59526],{"class":729,"line":1895},[727,59527,2639],{"class":768},[14,59529,5070,59530,59532],{},[90,59531,2597],{}," key will include \"Axiom run completed successfully\" if the run has completed as expected, however, in the event of a failure it will include the error message that prevented the automation from finishing successfully. This can be useful for debugging your automation.",[14,59534,59535,59536,59539,59540,59539,59542,59545,59546,59253,59549,59551,59552,59555],{},"An example of using this to trigger a third party service may be to use this webhook notification to trigger a ",[322,59537,59538],{"href":21216},"Slack Workflow",", a ",[322,59541,54291],{"href":24683},[322,59543,59544],{"href":7877},"Discord notification",", an ",[322,59547,59548],{"href":12691},"IFTTT automation",[322,59550,3293],{"href":18481},". Check out our ",[322,59553,59554],{"href":324},"API guides"," for some other services that we have written about, but you can use any service that can accept a webhook, including your own!",[8898,59557,59558],{},[14,59559,59560],{},"💡 Use webhook notifications to trigger a third-party service to trigger a new automation run in the event of failure",[14,59562,59563,59564,59566],{},"Similar to email notifications, webhooks can also be used throughout your automation to send data throughout the lifecycle of the automation run. The ",[322,59565,7722],{"href":18400}," step can be used to trigger a webhook with a custom payload, and has the ability to insert data tokens into your automations. We find this helpful for having a log of how the automation runs are going - being table to track the data throughout the automation run as it changes.",[8898,59568,59569],{},[14,59570,59480,59571,59573],{},[322,59572,59484],{"href":59483}," to learn more about powering up your webhook notifications.",[21,59575,59577],{"id":59576},"adding-more-error-data-to-your-notifications","Adding more error data to your notifications",[14,59579,59580,59581,59583,59584,59587],{},"In the event of an automation failure notification, this will always include the error message that has stopped the automation from completing successfully - this is to help you debug your automation. In addition to this error, there may be instances where you want to add your own metadata to this. To do this, you'll need to add an ",[322,59582,8218],{"href":21025}," step ",[807,59585,59586],{},"before"," the step that you believe may cause an error, such as a click element that you expect may fail on occasion.",[14,59589,59590,59591,59593,59594,59597],{},"You may use this to add additional context to your error messages, for example, let's say that we have a custom selector stored in a custom data token that we want to use within a ",[322,59592,3639],{"href":6378}," step. We would add the \"Add error metadata\" step before the click element and add the message: \"Attempting click with selector: ",[727,59595,59596],{},"custom-data",".\"",[592,59599],{"src":59600,"alt":59601},"\u002Fblog\u002Fenhance-your-automations-with-notifications-add-error-metadata-setup.png","A screenshot of the axiom.ai interface displaying an automation setup. It includes three steps: 'Enter custom data,' 'Add error metadata,' and 'Click element.' In the 'Add error metadata' step, there is a custom error message being configured. The message field contains the text 'Attempting click with selector:' followed by a token labelled '[custom-data].' A description above the message field explains that users can build custom error messages and insert tokens to display runtime values.",[14,59603,59604],{},"When an error is triggered, this will include the metadata within the body of the email alongside the error message that the offending step has produced:",[592,59606],{"src":59607,"alt":59608},"\u002Fblog\u002Fenhance-your-automations-with-notifications-email-notifications-metadata.png","axiom.ai email notification about a task completion issue. The email states that an automation encountered an error in step 4 ('Click element') because the element could not be found during the run. It advises the user to reselect the element using the selector tool or use a custom selector. The email includes error metadata, showing the attempted click with the selector '.my-custom-selector'. It also provides axiom.ai's support email (support@axiom.ai) for assistance. The email is signed by 'The Axiom team.'",[21,59610,796],{"id":795},[14,59612,59613],{},"Notifications can provide a very helpful health check for your automations - they give you peace of mind that you don't need to keep checking in to ensure that everything is happening as it should be while you go about your day. From mission-critical automations to automations for personal use, it's vital that you know when there is an error - or when an automation is finished.",[14,59615,59616,59617,59619],{},"Here at axiom.ai we find it helpful to be notified when an automation has finished - using a Slack Workflow (",[322,59618,77],{"href":21216},") we can get notified when a specific automation has finished running. This sends a notification to our team so we know that the data that it has processed is ready to act on.",[14,59621,59622,59623,44],{},"Have you built something creative using the notification system? We would love to hear about it over in our ",[322,59624,3326],{"href":59625,"rel":59626},"https:\u002F\u002Freddit.com\u002Faxiom_ai",[2245],[811,59628,7865],{},{"title":494,"searchDepth":495,"depth":495,"links":59630},[59631,59632,59633,59634,59635,59636],{"id":59415,"depth":498,"text":59416},{"id":59425,"depth":498,"text":59426},{"id":59441,"depth":498,"text":59442},{"id":59488,"depth":498,"text":59489},{"id":59576,"depth":498,"text":59577},{"id":795,"depth":498,"text":796},"2025-03-04","Enhance your automations with run status notifications, automated email notifications, and webhooks",{"read":46726,"type":513,"tool":59640,"category":59641,"tags":59642,"location":46733,"featuredimg":59643,"landingimg":59644,"summary":59638,"video":523,"metaTitle":59404},[46728],[50552],[55119,1532,829],"\u002Fblog\u002Fnotifications-post-box.webp","\u002Fblog\u002Fnotifications-sq.webp",{"title":59404,"description":59638},"blog\u002Fenhance-your-automations-with-notifications","Ol-nuHaP0p-0G5Z9nsWghNx-OVVZlsBW9dN7jFLLfaY",[50552],[513],[46728],{"id":59652,"title":48090,"author":48082,"body":59653,"date":59745,"description":48201,"draft":26250,"extension":506,"meta":59746,"navigation":522,"path":59750,"seo":59751,"stem":59752,"__hash__":59753,"pinned":-1,"category":59754,"type":59755,"tool":59756},"blog\u002Fblog\u002F5-methods-of-triggering-via-third-party.md",{"type":8,"value":59654,"toc":59737},[59655,59657,59659,59661,59666,59668,59672,59674,59679,59681,59685,59687,59692,59696,59700,59702,59707,59714,59716,59720,59722,59727,59729,59733,59735],[14,59656,48087],{},[18,59658],{"alt":48090},[21,59660,12139],{"id":48093},[14,59662,59663,48099],{},[322,59664,12139],{"href":12137,"rel":59665},[2245],[14,59667,48102],{},[14,59669,48105,59670],{},[322,59671,12128],{"href":12691},[21,59673,3293],{"id":48110},[14,59675,59676,48117],{},[322,59677,3293],{"href":48115,"rel":59678},[2245],[14,59680,48120],{},[14,59682,48105,59683],{},[322,59684,18294],{"href":18481},[21,59686,18827],{"id":48127},[14,59688,59689,48134],{},[322,59690,18827],{"href":48132,"rel":59691},[2245],[14,59693,48137,59694,48140],{},[322,59695,20852],{"href":21216},[14,59697,48105,59698],{},[322,59699,18774],{"href":19085},[21,59701,3288],{"id":48147},[14,59703,59704,48154],{},[322,59705,3288],{"href":48152,"rel":59706},[2245],[14,59708,48157,59709,48161,59712,48140],{},[322,59710,24359],{"href":3324,"rel":59711},[2245],[322,59713,20852],{"href":21216},[592,59715],{"src":48166},[14,59717,48105,59718],{},[322,59719,24406],{"href":24683},[21,59721,21233],{"id":48173},[14,59723,59724,48179],{},[322,59725,21233],{"href":21231,"rel":59726},[2245],[14,59728,48182],{},[14,59730,48105,59731],{},[322,59732,21222],{"href":22503},[21,59734,796],{"id":795},[14,59736,48191],{},{"title":494,"searchDepth":495,"depth":495,"links":59738},[59739,59740,59741,59742,59743,59744],{"id":48093,"depth":498,"text":12139},{"id":48110,"depth":498,"text":3293},{"id":48127,"depth":498,"text":18827},{"id":48147,"depth":498,"text":3288},{"id":48173,"depth":498,"text":21233},{"id":795,"depth":498,"text":796},"2025-02-27",{"read":48203,"type":513,"tool":59747,"category":59748,"tags":59749,"location":46733,"featuredimg":48209,"landingimg":48210,"summary":48201,"video":523,"metaTitle":48090},[48205],[50552],[12139,48110,19083,48147,48173,829,830],"\u002Fblog\u002F5-methods-of-triggering-via-third-party",{"title":48090,"description":48201},"blog\u002F5-methods-of-triggering-via-third-party","AyUJjHLKRVsyeQD5DBjSeZbsS1Cn8cXDPRCxgp65GA4",[50552],[513],[48205],{"id":59758,"title":59759,"author":59760,"body":59761,"date":60070,"description":60071,"draft":26250,"extension":506,"meta":60072,"navigation":522,"path":60081,"seo":60082,"stem":60083,"__hash__":60084,"pinned":-1,"category":60085,"type":60086,"tool":60087},"blog\u002Fblog\u002F4-powerful-ways-to-use-axiom-for-digital-pr-campaigns.md","4 powerful ways to use web scraping for high-impact digital PR campaigns","Sacha Fournier",{"type":8,"value":59762,"toc":60061},[59763,59766,59769,59773,59776,59785,59789,59792,59806,59810,59819,59823,59826,59829,59840,59851,59854,59858,59861,59865,59872,59875,59884,59887,59891,59894,59905,59909,59916,59919,59924,59927,59930,59933,59937,59940,59943,59954,59958,59965,59968,59971,59980,59984,59987,59990,60001,60005,60012,60015,60018,60021,60031,60033,60036,60044,60047,60051,60058],[14,59764,59765],{},"Digital PR often involves collecting data and then aggregating it to create citable statistics and shareable visuals. axiom.ai can often help you with collecting this data. We will show you some examples of successful campaigns that could be recreated with the help of automations.",[18,59767],{"alt":59768},"Use axiom.ai to automate PR campaigns",[21,59770,59772],{"id":59771},"what-is-digital-pr","What is Digital PR?",[14,59774,59775],{},"Digital PR is a way of building links to your website in order to increase its ranking in search engines. It involves creating a page on your website, usually one that includes data analysis, and then pitching it out to journalists who will then cite your study in their articles.",[14,59777,59778,59779,59784],{},"An example of a successful digital PR campaign was Radical Storage's study into ",[322,59780,59783],{"href":59781,"rel":59782},"https:\u002F\u002Fradicalstorage.com\u002Ftravel\u002Fparis-syndrome",[2245],"the most underwhelming cities for tourists",". This looked at the percentage of negative comments for popular tourist destinations on websites like TripAdvisor and Yelp.",[592,59786],{"src":59787,"alt":59788},"\u002Fblog\u002F4-powerful-ways-to-use-axiom-for-digital-pr-campaigns-radical-storage.png","A table displaying the top 10 cities with the highest percentage of negative comments in reviews. The table has four columns: Rank, City, Country, and Negative comments in reviews. The top-ranked city is Cancún, Mexico, with 14.2% negative comments, followed by Antalya, Turkey (12.2%), and Punta Cana, Dominican Republic (11.9%). Other cities in the list include Beijing, Orlando, Mumbai, Honolulu, Johor Bahru, Kyoto, and Playa Del Carmen, with negative comment percentages ranging from 11.2% to 9.0%.",[14,59790,59791],{},"This study then got features in websites such as:",[80,59793,59794,59797,59800,59803],{},[83,59795,59796],{},"Time Out Magazine",[83,59798,59799],{},"Euronews",[83,59801,59802],{},"CNN",[83,59804,59805],{},"Der Standard (one of the biggest national newspapers in Germany)",[592,59807],{"src":59808,"alt":59809},"\u002Fblog\u002F4-powerful-ways-to-use-axiom-for-digital-pr-campaigns-time-out.png","A screenshot of a Time Out article with a red header displaying the website's name and navigation menu, which includes options like News, Things to Do, Food & Drink, Arts & Culture, Travel, Movies, Music, and Time Out Market. The article headline reads: 'These destinations have been named the most overrated in the world.' The subheading states that a new study analyzed TripAdvisor reviews to judge reactions to famous destinations. The article is written by Ed Cunningham, News Editor, UK, and is dated Friday, December 16, 2022. A share button is visible below the author’s name.",[8898,59811,59812],{},[14,59813,59814,59815],{},"Time Out’s article on the topic. Radical Storage’s research is cited with a link in the article’s body. Source: ",[322,59816,59817],{"href":59817,"rel":59818},"https:\u002F\u002Fwww.timeout.com\u002Fnews\u002Fthese-destinations-have-been-named-the-most-overrated-in-the-world-121622",[2245],[21,59820,59822],{"id":59821},"how-can-axiomai-help-with-digital-pr","How can axiom.ai help with digital PR?",[14,59824,59825],{},"axiom.ai can help you automate the process of collecting the data required to conduct these studies.",[14,59827,59828],{},"Looking back at our previous example, an automation could have helped us with:",[80,59830,59831,59834,59837],{},[83,59832,59833],{},"Collecting a seed list of popular tourist cities and putting them in a Google Sheet.",[83,59835,59836],{},"For each city, collecting their most popular tourist attractions on TripAdvisor and putting them in a Google Sheet.",[83,59838,59839],{},"Collecting reviews from Google My Business (Google Reviews), TripAdvisor and Yelp for each tourist attraction and putting them into a Google Sheet.",[14,59841,59842,59843,59846,59847,59850],{},"These could all be achieved  using the ",[322,59844,24592],{"href":59845},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002F#scrape"," and  ",[322,59848,99],{"href":59849},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002F#spreadsheet"," steps. Doing this manually would take you days. Scraping the data means that the only manual work you have to do is create this study is analysing the reviews themselves and then your final aggregation.",[14,59852,59853],{},"Let's now run through four examples of how we can speed up data collection for digital PR campaigns using axiom.ai.",[21,59855,59857],{"id":59856},"scraping-coinopsys-list-of-dead-coins","Scraping Coinopsy's list of dead coins",[14,59859,59860],{},"The first example we'll look at comes from a campaign done by a cryptocurrency blog called Coin Kickoff, which looked at how the percentage of cryptocoins no longer exist and analysed when and why these cryptocoins were abandoned. The post has been cited in over 200 outlets, including AOL and Nasdaq.",[592,59862],{"src":59863,"alt":59864},"\u002Fblog\u002F4-powerful-ways-to-use-axiom-for-digital-pr-campaigns-nasdaq.png","A screenshot of a financial article section titled 'What Are the Risks?' discussing the risks of investing in cryptocurrency. The text mentions that while crypto has a potentially high upside, the risk of loss is also significant. It cites a study by Coin Kickoff, stating that over 2,500 cryptocurrencies 'died' between 2013 and 2022, indicating the possibility of losing all invested money. The article also highlights Bitcoin’s volatility, noting that it lost more than half its value in three separate years—2012, 2018, and 2022—recording returns of -50.19%, -72.13%, and -62.02%, respectively. Some words, such as 'Coin Kickoff' and 'returns,' are hyperlinked.",[14,59866,59867,59868],{},"This is how the study was cited in Nasdaq. Source: ",[322,59869,59870],{"href":59870,"rel":59871},"https:\u002F\u002Fwww.nasdaq.com\u002Farticles\u002Fcrypto-and-your-retirement-savings-should-you-risk-it",[2245],[14,59873,59874],{},"Coin Kickoff said in the study that they found a list of 2,500 dead coins from a website called Coinopsy along with their year of and reason for death. You can find a video on how to get this information below:",[59876,59877],"iframe",{"width":59878,"height":59879,"src":59880,"title":59881,"frameBorder":17395,"allow":59882,"referrerPolicy":59883,"allowFullScreen":522},560,315,"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FTQb4KhCJH_8?si=pnwc_nWhkmN_ay2Z&start=59","YouTube video player","accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share","strict-origin-when-cross-origin",[14,59885,59886],{},"Since we only needed to scrape information from one page, this was a relatively simple automation to implement. However, doing it manually would have taken at least a couple of days as you couldn't just copy and paste the data into a Google Sheet.",[21,59888,59890],{"id":59889},"scraping-imdb-to-collect-data-on-filming-locations","Scraping IMDB to collect data on filming locations",[14,59892,59893],{},"Our next example is based on a campaign on the most popular horror movie filing locations in the USA, run by a travel insurance company called Insure My Trip. The campaign got featured in 46 outlets, including:",[80,59895,59896,59899,59902],{},[83,59897,59898],{},"Texas Tribune",[83,59900,59901],{},"LA Times",[83,59903,59904],{},"Cincinnati Today",[592,59906],{"src":59907,"alt":59908},"\u002Fblog\u002F4-powerful-ways-to-use-axiom-for-digital-pr-campaigns-texas-tribune.png","A news article headline in a bold sans-serif font reads 'LUBBOCK - There are few sounds as frightening - and iconic - as the roar of Leatherface's chainsaw.' The article continues in a smaller font, discussing the appeal of Texas as a filming location for horror movies, citing the number of horror films made in Texas and mentioning several examples.",[14,59910,59911,59912],{},"The link goes back to Insure My Trip’s study. Source: ",[322,59913,59914],{"href":59914,"rel":59915},"https:\u002F\u002Fwww.texastribune.org\u002F2023\u002F10\u002F31\u002Ftexas-horror-movies-ghost-tours\u002F",[2245],[14,59917,59918],{},"Insure My Trip said in their study’s methodology that they:",[8898,59920,59921],{},[14,59922,59923],{},"Scraped each city’s IMDB location page and the number of titles which were included in the \"Horror\" genre was recorded.",[14,59925,59926],{},"The video below shows how you can scrape information from IMDB in this way using axiom.ai:",[59876,59928],{"width":59878,"height":59879,"src":59929,"title":59881,"frameBorder":17395,"allow":59882,"referrerPolicy":59883,"allowFullScreen":522},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FRK2FBlNHFLo?si=GjxNGuE-Vi9EyYOZ&start=59",[14,59931,59932],{},"As mentioned in the video, IMDB is a relatively easy website to scrape information from because it uses a highly formulaic URL structure. For our next example we will look at scraping information from a website without",[21,59934,59936],{"id":59935},"scraping-crimemapper-to-collect-crime-statistics-for-a-specific-area","Scraping CrimeMapper to collect crime statistics for a specific area",[14,59938,59939],{},"Our next example comes from outdoor activity blog Outforia’s study into the most dangerous beaches in the USA. As part of the study, Outforia looked at the total number of reported crimes in coastal areas from the website Crimemapping.com. They combined this with other data to make an index of the most dangerous beaches.",[14,59941,59942],{},"The study was featured in fifteen different outlets including:",[80,59944,59945,59948,59951],{},[83,59946,59947],{},"Orlando Sentinel",[83,59949,59950],{},"The Epoch Times",[83,59952,59953],{},"24\u002F7 Wall Street",[592,59955],{"src":59956,"alt":59957},"\u002Fblog\u002F4-powerful-ways-to-use-axiom-for-digital-pr-campaigns-dangerous-beaches.png","A news article titled 'Dangerous Coasts: The United States' Most Dangerous Beaches' is displayed on a webpage. The article, written by Douglas A. McIntyre and published on December 2, 2021, discusses the risks of owning beachfront property, including weather-related threats and other dangers considered in a study by Outforia. The article includes social media sharing buttons and a byline with the author's name.",[14,59959,59960,59961],{},"An example of the study’s citation in the 24\u002F7 Wall Street. Source: ",[322,59962,59963],{"href":59963,"rel":59964},"https:\u002F\u002F247wallst.com\u002Feconomy\u002F2021\u002F12\u002F02\u002Famericas-most-dangerous-beach\u002F",[2245],[14,59966,59967],{},"The video below shows you how you can use axiom.ai to automate collecting this data if you have already have a sheet of locations that you want to get crime statistics data for:",[59876,59969],{"width":59878,"height":59879,"src":59970,"title":59881,"frameBorder":17395,"allow":59882,"referrerPolicy":59883,"allowFullScreen":522},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FGFpF7GoT4Tk?si=9iyHMhdoP--if837",[14,59972,59973,59974,2004,59976,450,59978,10697],{},"As you can see, since the website that we want to collect information from does not have a uniform URL structure, we needed to get axiom.ai to automate clicking around the site. We can do this by using a combination of ",[322,59975,5314],{"href":7600},[322,59977,3639],{"href":6378},[322,59979,2695],{"href":1292},[21,59981,59983],{"id":59982},"scraping-airlinequalitycom-to-collect-data-on-the-best-and-worst-airports","Scraping Airlinequality.com to collect data on the best and worst airports",[14,59985,59986],{},"Our final example comes from Business Finance UK who conducted a study into the best and worst airlines for business travellers. The study involved aggregating reviews from business travellers on the airline review site airlinequality.com.",[14,59988,59989],{},"The study was featured in outlets such as:",[80,59991,59992,59995,59998],{},[83,59993,59994],{},"Time Out",[83,59996,59997],{},"The Manila Standard",[83,59999,60000],{},"The Chicago Crusader",[592,60002],{"src":60003,"alt":60004},"\u002Fblog\u002F4-powerful-ways-to-use-axiom-for-digital-pr-campaigns-manila-standard.png","A digital screenshot of a Manila Standard news article titled 'NAIA 4th worst airport in Asia - survey'. The article reports on a Businessfinancing.co.uk survey ranking Ninoy Aquino International Airport (NAIA) as the fourth worst in Asia, citing traveler dissatisfaction with odors and boarding processes. The article features the Manila Standard logo, navigation bar, and social media icons at the top.",[14,60006,60007,60008],{},"An example of the feature’s study in the Manila Standard. Image source: ",[322,60009,60010],{"href":60010,"rel":60011},"https:\u002F\u002Fmanilastandard.net\u002F?p=314419547",[2245],[14,60013,60014],{},"The video below shows you how axiom.ai can automate collecting business reviews for each airport:",[59876,60016],{"width":59878,"height":59879,"src":60017,"title":59881,"frameBorder":17395,"allow":59882,"referrerPolicy":59883,"allowFullScreen":522},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FBEsSF39ZVrA?si=oqRODX722qb4nLWV&start=41",[14,60019,60020],{},"As mentioned in the video, this automation required some custom code in order to match reviews to specific airlines.",[14,60022,60023,60024,60026,60027,44],{},"I sent axiom.ai’s customer support team a video explaining what I wanted the automation to do and they helped me with putting together some custom code that I could paste into the ",[322,60025,2301],{"href":2300}," step which solved the problem. As a side note - I’ve also managed to work through other problems by searching through the ",[322,60028,60030],{"href":3324,"rel":60029},[2245],"axiom.ai subreddit",[21,60032,796],{"id":795},[14,60034,60035],{},"As we’ve seen from these examples, axiom.ai can automate a lot of the tedious data collection involved in putting together data studies for digital PR campaigns.",[14,60037,60038,60039,44],{},"If you’d like to see more examples of digital PR campaigns that use scraped data then its worth checking out this ",[322,60040,60043],{"href":60041,"rel":60042},"https:\u002F\u002Fjournofinder.com\u002Fcampaigns",[2245],"digital PR campaign database",[14,60045,60046],{},"Click the filter button at the top of the database and then click on the dropdown “Data type” -> has any of -> scraped data, and you can find dozens of campaign examples that use scraped data.",[592,60048],{"src":60049,"alt":60050},"\u002Fblog\u002F4-powerful-ways-to-use-axiom-for-digital-pr-campaigns-journofinder.png","A screenshot of the Journo Finder website. The top of the screen shows the Journo Finder logo, along with navigation links for Home, Blog, and Contact, as well as buttons for Sign In and Start 7-day free trial.  Below this is a table listing articles or research topics.  The table has columns labeled Campana, Where, Data type, Scraped data, Tron, Medium, and Rashion and bo.  Some of the rows include titles like 'Most Active Rationalties in The Work', 'How often do you wash your bathroom towels', and '2024s Best Cities for Naked Singing'.  Each row also contains links and data in the other columns. The website design is simple and uses a light color scheme.",[14,60052,60053,60054],{},"JournoFinder, ",[322,60055,60056],{"href":60056,"rel":60057},"https:\u002F\u002Fjournofinder.com",[2245],[14,60059,60060],{},"Hopefully this can give you some inspiration for a digital PR campaign for your own site.",{"title":494,"searchDepth":495,"depth":495,"links":60062},[60063,60064,60065,60066,60067,60068,60069],{"id":59771,"depth":498,"text":59772},{"id":59821,"depth":498,"text":59822},{"id":59856,"depth":498,"text":59857},{"id":59889,"depth":498,"text":59890},{"id":59935,"depth":498,"text":59936},{"id":59982,"depth":498,"text":59983},{"id":795,"depth":498,"text":796},"2025-02-21","Use axiom.ai’s no-code web scraping to gather journalist contacts and media mentions, and build data-driven PR campaigns that captivate your audience.",{"metaTitle":60073,"read":46726,"type":513,"tool":60074,"category":60075,"tags":60076,"location":46733,"featuredimg":60078,"landingimg":60079,"summary":60080,"video":523},"4 ways to supercharge digital PR campaigns",[48366,46728],[48207],[3974,60077],"guest post","\u002Fblog\u002Fpr-post-box.webp","\u002Fblog\u002Fpr-sq.webp","Discover 4 powerful ways to use axiom.ai to automate and enhance your digital PR campaigns. Save time, boost outreach, and maximize results with smart browser automation.","\u002Fblog\u002F4-powerful-ways-to-use-axiom-for-digital-pr-campaigns",{"title":59759,"description":60071},"blog\u002F4-powerful-ways-to-use-axiom-for-digital-pr-campaigns","t2Ddy-7SJYzW_oCfWcmrC4xqZUzRmG0MCcHTkDEt8Fg",[48207],[513],[48366,46728],{"id":60089,"title":13693,"author":48082,"body":60090,"date":60617,"description":60618,"draft":26250,"extension":506,"meta":60619,"navigation":522,"path":10190,"seo":60625,"stem":60626,"__hash__":60627,"pinned":-1,"category":60628,"type":60629,"tool":60630},"blog\u002Fblog\u002Fbest-custom-css-selectors-for-web-scraping.md",{"type":8,"value":60091,"toc":60604},[60092,60098,60101,60103,60106,60109,60113,60116,60170,60173,60180,60184,60187,60228,60290,60296,60300,60303,60318,60366,60377,60424,60427,60431,60440,60443,60450,60454,60467,60481,60485,60488,60491,60516,60521,60524,60551,60554,60556,60559,60563,60566,60582,60586,60590,60602],[14,60093,60094,60095,60097],{},"For the majority of web scraping applications, the ",[322,60096,11341],{"href":11340}," within axiom.ai will suit your needs to select elements on a page that you want to extract. However, there are times when you may need more options to select elements, such as extending the functionality that we offer, or accessing elements on the page that may hidden behind an overlay.",[18,60099],{"alt":60100},"The best css selectors to choose when scraping the web",[21,60102,50723],{"id":50722},[14,60104,60105],{},"CSS (Cascading Style Sheets) are used to control the appearance and layout of HTML elements on a webpage. It allows the developers of the website to apply styles such as colors, fonts, spacing, and positioning, ensuring a consistent and visually appealing design. Most modern websites will have multiple stylesheets that are used to construct the style of a site - some larger websites may have tens of these files!",[14,60107,60108],{},"In order to target the HTML elements on the page, CSS uses a variety of selectors to target the element based on a few methods: using the element tag, an ID, a class (or multiple) or an attribute. You can use a mixture of all of these to create a CSS selector, we will dive into CSS specificity next as an important concept to taking advantage of combining selectors.",[21,60110,60112],{"id":60111},"css-specificity","CSS Specificity",[14,60114,60115],{},"CSS specificity should be kept in mind when writing CSS selectors, this is a set of rules which determine which styles are applied to an element when combining multiple selectors that are targetting the same element. It assigns weight to selectors based on their type, prioritising more specific rules over less specific one - hence the name! The hierarchy works as follows, listed from highest specificity to lowest:",[555,60117,60118,60127,60135,60155],{},[83,60119,60120,60123,60124],{},[29,60121,60122],{},"Inline styles"," such as ",[90,60125,60126],{},"style=\"color: blue;\"",[83,60128,60129,60123,60132],{},[29,60130,60131],{},"ID selectors",[90,60133,60134],{},"#list-item",[83,60136,60137,2004,60140,16767,60143,60123,60146,2004,60149,2004,60152],{},[29,60138,60139],{},"Class selectors",[29,60141,60142],{},"attributes",[29,60144,60145],{},"pseudo-classes",[90,60147,60148],{},".list-item",[90,60150,60151],{},"[type=\"checkbox\"]",[90,60153,60154],{},":hover",[83,60156,60157,450,60160,60123,60163,2004,60165,2004,60167],{},[29,60158,60159],{},"Element selectors",[29,60161,60162],{},"pseudo-elements",[90,60164,50804],{},[90,60166,14],{},[90,60168,60169],{},"::before",[14,60171,60172],{},"When multiple rules conflict, the browser will use the rule with the highest specificity. If specificity is equal, the last declared rule will prevail.",[14,60174,60175,60176,60179],{},"Learning how to take advantage of specificity gives you the advantage of being able to avoid using the dreaded ",[90,60177,60178],{},"!important"," attribute which can have unexpected side effects when used where it's not needed.",[639,60181,60183],{"id":60182},"knowledge-check-css-specificity","Knowledge check: CSS specificity",[14,60185,60186],{},"In the following code, what color will the text be when the CSS is applied?",[719,60188,60190],{"className":56214,"code":60189,"language":56216,"meta":494,"style":494},"\u003Cp id=\"text-1\" class=\"my-text\">\n    Hello, World!\n\u003C\u002Fp>\n",[90,60191,60192,60214,60219],{"__ignoreMap":494},[727,60193,60194,60196,60198,60200,60202,60205,60207,60209,60212],{"class":729,"line":730},[727,60195,18130],{"class":768},[727,60197,14],{"class":7745},[727,60199,56227],{"class":1882},[727,60201,4970],{"class":768},[727,60203,60204],{"class":737},"\"text-1\"",[727,60206,57617],{"class":1882},[727,60208,4970],{"class":768},[727,60210,60211],{"class":737},"\"my-text\"",[727,60213,56240],{"class":768},[727,60215,60216],{"class":729,"line":498},[727,60217,60218],{"class":768},"    Hello, World!\n",[727,60220,60221,60224,60226],{"class":729,"line":495},[727,60222,60223],{"class":768},"\u003C\u002F",[727,60225,14],{"class":7745},[727,60227,56240],{"class":768},[719,60229,60231],{"className":58663,"code":60230,"language":58665,"meta":494,"style":494},".my-text { color: red; }\n\n#text-1 { color: green; }\n\np { color: blue; }\n",[90,60232,60233,60251,60255,60271,60275],{"__ignoreMap":494},[727,60234,60235,60238,60240,60243,60245,60248],{"class":729,"line":730},[727,60236,60237],{"class":1882},".my-text",[727,60239,52708],{"class":768},[727,60241,60242],{"class":1882},"color",[727,60244,1995],{"class":768},[727,60246,60247],{"class":1882},"red",[727,60249,60250],{"class":768},"; }\n",[727,60252,60253],{"class":729,"line":498},[727,60254,1898],{"emptyLinePlaceholder":522},[727,60256,60257,60260,60262,60264,60266,60269],{"class":729,"line":495},[727,60258,60259],{"class":1882},"#text-1",[727,60261,52708],{"class":768},[727,60263,60242],{"class":1882},[727,60265,1995],{"class":768},[727,60267,60268],{"class":1882},"green",[727,60270,60250],{"class":768},[727,60272,60273],{"class":729,"line":1895},[727,60274,1898],{"emptyLinePlaceholder":522},[727,60276,60277,60279,60281,60283,60285,60288],{"class":729,"line":1901},[727,60278,14],{"class":7745},[727,60280,52708],{"class":768},[727,60282,60242],{"class":1882},[727,60284,1995],{"class":768},[727,60286,60287],{"class":1882},"blue",[727,60289,60250],{"class":768},[14,60291,60292],{},[322,60293,60295],{"href":60294},"#knowledge-check-answers","Jump to answer",[21,60297,60299],{"id":60298},"combinators","Combinators",[14,60301,60302],{},"Combinators are CSS elements that can be used to relate two CSS rules. These can be useful in addition to CSS specificity to ensure that you are targetting the right elements.",[14,60304,60305,60310,60311,60313,60314,60317],{},[322,60306,60309],{"href":60307,"rel":60308},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002FChild_combinator",[2245],"Child combinators"," use the ",[90,60312,57681],{}," to match elements that are matched by the second selector that are direct children of the elements matched by the first. For example, ",[90,60315,60316],{},"div > span"," will match the following:",[719,60319,60321],{"className":56214,"code":60320,"language":56216,"meta":494,"style":494},"\u003Cdiv>\n    \u003Cspan>This is matched as a direct child of the div element.\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cspan>This is not matched as it is not a direct child of a div element.\u003C\u002Fspan>\n",[90,60322,60323,60331,60345,60353],{"__ignoreMap":494},[727,60324,60325,60327,60329],{"class":729,"line":730},[727,60326,18130],{"class":768},[727,60328,50804],{"class":7745},[727,60330,56240],{"class":768},[727,60332,60333,60336,60338,60341,60343],{"class":729,"line":498},[727,60334,60335],{"class":768},"    \u003C",[727,60337,727],{"class":7745},[727,60339,60340],{"class":768},">This is matched as a direct child of the div element.\u003C\u002F",[727,60342,50804],{"class":7745},[727,60344,56240],{"class":768},[727,60346,60347,60349,60351],{"class":729,"line":495},[727,60348,60223],{"class":768},[727,60350,50804],{"class":7745},[727,60352,56240],{"class":768},[727,60354,60355,60357,60359,60362,60364],{"class":729,"line":1895},[727,60356,18130],{"class":768},[727,60358,727],{"class":7745},[727,60360,60361],{"class":768},">This is not matched as it is not a direct child of a div element.\u003C\u002F",[727,60363,727],{"class":7745},[727,60365,56240],{"class":768},[14,60367,60368,60373,60374,60317],{},[322,60369,60372],{"href":60370,"rel":60371},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002FDescendant_combinator",[2245],"Descendant combinators"," use a single space character to combine two selectors such that elements matched by the second selector are selected if they have an ancestor element matching the first. For example, ",[90,60375,60376],{},"div span",[719,60378,60380],{"className":56214,"code":60379,"language":56216,"meta":494,"style":494},"\u003Cdiv>\n    \u003Cspan>This is matched as a child of the div element.\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cspan>This is not matched as it is not a child of a div element.\u003C\u002Fspan>\n",[90,60381,60382,60390,60403,60411],{"__ignoreMap":494},[727,60383,60384,60386,60388],{"class":729,"line":730},[727,60385,18130],{"class":768},[727,60387,50804],{"class":7745},[727,60389,56240],{"class":768},[727,60391,60392,60394,60396,60399,60401],{"class":729,"line":498},[727,60393,60335],{"class":768},[727,60395,727],{"class":7745},[727,60397,60398],{"class":768},">This is matched as a child of the div element.\u003C\u002F",[727,60400,50804],{"class":7745},[727,60402,56240],{"class":768},[727,60404,60405,60407,60409],{"class":729,"line":495},[727,60406,60223],{"class":768},[727,60408,50804],{"class":7745},[727,60410,56240],{"class":768},[727,60412,60413,60415,60417,60420,60422],{"class":729,"line":1895},[727,60414,18130],{"class":768},[727,60416,727],{"class":7745},[727,60418,60419],{"class":768},">This is not matched as it is not a child of a div element.\u003C\u002F",[727,60421,727],{"class":7745},[727,60423,56240],{"class":768},[14,60425,60426],{},"There are other combinators that can be used to enhance your custom selectors, but they should suffice to get you started.",[21,60428,60430],{"id":60429},"identifying-selectors-to-use","Identifying selectors to use",[14,60432,60433,60434,60439],{},"In order to use selectors, you'll first need to investigate which selectors will work for your use case. Generally, assuming you're not the developer of the site, ",[322,60435,60438],{"href":60436,"rel":60437},"https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fdevtools",[2245],"Chrome Devtools"," is the best tool to use to inspect the underlying code of the page. To open Devtools, right-click on the page and click \"Inspect\" in the context menu that appears. It should automatically drop you in the \"Elements\" tab, but if it doesn't, navigate there.",[14,60441,60442],{},"We recommend having some web development knowledge from this point, however, you do not need to fully understand the code that is displayed in order to extract a CSS selector provided you have read the sections above.",[14,60444,60445,60446,60449],{},"To jump to the code behind an element, right-click on the element on the page and click \"Inspect\" again within the context menu that appears. Provided it does not have an overlay, the window should jump to the section of the code that contains the element where you will be able to extract a selector. For a ",[807,60447,60448],{},"very"," specific selector, you can right-click on the element in the code, click \"copy\" and then \"copy selector\" - we wouldn't really recommend this method as some sites use frameworks that mean that the ID may change frequently and this would break your automation if the site even has a small update.",[21,60451,60453],{"id":60452},"using-css-in-your-steps","Using CSS in your steps",[14,60455,60456,60457,450,60459,60463,60464,60466],{},"Quite a few axiom.ai steps allow for custom CSS selectors to be used to target elements on the page as your automation runs, primarily the ",[322,60458,24592],{"href":59845},[322,60460,60462],{"href":60461},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002F#interact","Interact"," steps. For example, to use a custom CSS selector within the ",[322,60465,3639],{"href":6378}," step, perform the following steps:",[555,60468,60469,60472,60475,60478],{},[83,60470,60471],{},"Search for and add a \"Click element\" step to your automation.",[83,60473,60474],{},"Click \"Select\".",[83,60476,60477],{},"Click \"Custom\".",[83,60479,60480],{},"Enter your custom selector.",[21,60482,60484],{"id":60483},"dynamically-setting-a-custom-css-selector","Dynamically setting a custom CSS selector",[14,60486,60487],{},"While explicitly setting the custom CSS selector within your steps is useful for consistently interacting with an element on a page, there may be times when you need to dynamically set this using a data token. To get started, click \"Set selector from data\" within the custom CSS selector input within the step, this will prompt you to select a data token from your automation.",[14,60489,60490],{},"There may even be times where you need to loop through a list of custom selectors. In order to loop through a list of CSS selectors, you will first need to create a list of selectors. This can be useful when you may need to click through a list of items. For example:",[7092,60492,60493,60499],{},[7095,60494,60495],{},[7098,60496,60497],{},[7101,60498,13733],{},[7108,60500,60501,60506,60511],{},[7098,60502,60503],{},[7113,60504,60505],{},"list-item-1",[7098,60507,60508],{},[7113,60509,60510],{},"list-item-2",[7098,60512,60513],{},[7113,60514,60515],{},"list-item-3",[14,60517,60518],{},[807,60519,60520],{},"Tip: this may be stored in a Google Sheet for ease.",[14,60522,60523],{},"Once you have your list of custom CSS selectors, you can use the following pattern to loop through your list of selectors:",[555,60525,60526,60531,60539,60548],{},[83,60527,8350,60528,60530],{},[322,60529,92],{"href":8384}," step, select the sheet that contains your list of selectors.",[83,60532,8350,60533,60535,60536,60538],{},[322,60534,114],{"href":2296}," step, setting the ",[90,60537,139],{}," data token as the data to loop through.",[83,60540,8350,60541,3289,60543,60535,60545,60547],{},[322,60542,24592],{"href":59845},[322,60544,60462],{"href":60461},[90,60546,139],{}," token inside the \"Loop through data\" step as the custom CSS selector.",[83,60549,60550],{},"Add any other steps inside the loop.",[14,60552,60553],{},"This can be useful in situations where you have a list of items that you wish to click, perform actions, and then continue on to click on the next item of the list. This can be used to perform multiple actions on lists, for checkboxes, for example.",[21,60555,796],{"id":795},[14,60557,60558],{},"Learning how to take advantage of custom CSS selectors can be a powerful skill to have in your toolbox - whether this is for use within your axiom.ai automations, or generally in any web development adjacent field. This can enhance your automations to ensure consistent results on pages that may change frequently, or are not suitable to the standard features of the Selector Tool.",[21,60560,60562],{"id":60561},"further-reading","Further reading",[14,60564,60565],{},"If you're interested in learning more about CSS and CSS selectors, check out the resources below:",[80,60567,60568,60575],{},[83,60569,60570],{},[322,60571,60574],{"href":60572,"rel":60573},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002FReference",[2245],"Mozilla Developer Docs",[83,60576,60577],{},[322,60578,60581],{"href":60579,"rel":60580},"https:\u002F\u002Fwww.w3schools.com\u002Fcss\u002Fcss_intro.asp",[2245],"W3Schools",[21,60583,60585],{"id":60584},"knowledge-check-answers","Knowledge check answers",[14,60587,60588],{},[29,60589,60112],{},[14,60591,60592,60593,60595,60596,60598,60599,60601],{},"As we have a CSS selector using the ID (",[90,60594,60259],{},") this will be the highest specificity, followed by ",[90,60597,60237],{}," and finally the ",[90,60600,14],{}," selector.",[811,60603,57220],{},{"title":494,"searchDepth":495,"depth":495,"links":60605},[60606,60607,60610,60611,60612,60613,60614,60615,60616],{"id":50722,"depth":498,"text":50723},{"id":60111,"depth":498,"text":60112,"children":60608},[60609],{"id":60182,"depth":495,"text":60183},{"id":60298,"depth":498,"text":60299},{"id":60429,"depth":498,"text":60430},{"id":60452,"depth":498,"text":60453},{"id":60483,"depth":498,"text":60484},{"id":795,"depth":498,"text":796},{"id":60561,"depth":498,"text":60562},{"id":60584,"depth":498,"text":60585},"2025-02-06","Learn more about the best custom CSS selectors that can be used to enhance your web scrapers with axiom.ai",{"read":46726,"type":513,"tool":60620,"category":60621,"tags":60622,"location":46733,"featuredimg":60623,"landingimg":60624,"summary":60618,"video":523,"metaTitle":13693},[48366,46728],[48207],[58665,48365,60142],"\u002Fblog\u002Fcss-selector-large.webp","\u002Fblog\u002Fcss-selector-sq.webp",{"title":13693,"description":60618},"blog\u002Fbest-custom-css-selectors-for-web-scraping","d-06FRP2U99ZVt9B9ixSmuho8fnm1I6EV2unW3EKjy8",[48207],[513],[48366,46728],{"id":60632,"title":60633,"author":46205,"body":60634,"date":61758,"description":60638,"draft":26250,"extension":506,"meta":61759,"navigation":522,"path":61768,"seo":61769,"stem":61770,"__hash__":61771,"pinned":-1,"category":61772,"type":61773,"tool":61774},"blog\u002Fblog\u002Fblocking-resources.md","Speed up web scraping by blocking unnecessary resources",{"type":8,"value":60635,"toc":61734},[60636,60639,60642,60645,60652,60655,60658,60666,60669,60676,60680,60683,60725,60729,60732,60735,60785,60794,60798,60801,60804,60812,60816,60819,60828,60835,60838,60841,60845,60848,60851,60858,60861,60865,60868,60872,60875,60886,60892,60896,60899,60903,60909,60919,60922,60931,60946,60979,60983,60997,61001,61004,61007,61053,61056,61060,61067,61188,61192,61195,61198,61247,61250,61254,61257,61309,61312,61316,61414,61418,61421,61424,61526,61530,61533,61536,61547,61688,61692,61695,61701,61707,61710,61721,61724,61732],[14,60637,60638],{},"When scraping a website, you might wonder if blocking resources could speed things up. Running your scraper in headless mode skips rendering visual elements like CSS, images, and animations, making scraping faster. However, there's a catch: headless mode often triggers anti-bot measures like Cloudflare or CAPTCHAs, which can stop your scraper in its tracks.",[18,60640],{"alt":60641},"speed up web scraping by blocking resources",[14,60643,60644],{},"The idea of blocking resources is still valuable. You reduce bandwidth usage and improve loading times by skipping unnecessary assets such as images, videos, or ads. But is there a way to achieve this without relying solely on headless mode? Thankfully, yes!",[14,60646,60647,60648,60651],{},"With axiom.ai, you can use the ",[322,60649,60650],{"href":2300},"JavaScript step"," to run JS directly in the browser or app. Puppeteer is a built-in dependency, meaning you can leverage its library of functions to optimize and control the browser.",[14,60653,60654],{},"As a no-coder, I had never tried blocking resources, let alone with code. However, with modern generative AI tools, no-coders like me can now generate working code, boosting our skills while having fun. So, I'm going to give it a go!",[14,60656,60657],{},"In this guide, I'll explore:",[555,60659,60660,60663],{},[83,60661,60662],{},"Using simple JavaScript and Puppeteer commands.",[83,60664,60665],{},"Blocking specific resources like images, videos, and JavaScript.",[14,60667,60668],{},"The goal? To learn handy new techniques to speed up web scraping while keeping it simple. We want to use as few lines of code as possible, so it's easy for no-coders like myself to copy and paste.",[14,60670,60671,60672,60675],{},"Have I used ",[322,60673,55848],{"href":60674},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fpuppeteer"," before? Nope, never!",[21,60677,60679],{"id":60678},"what-resources-should-you-intercept","What resources should you intercept?",[14,60681,60682],{},"To speed up your scraping, consider intercepting the following resources. Videos and adverts are often the most significant contributors to slower performance and tracking apps.",[555,60684,60685,60691,60697,60703,60708,60714,60719],{},[83,60686,60687,60690],{},[29,60688,60689],{},"Videos",": These are bandwidth-heavy and often unnecessary for scraping.",[83,60692,60693,60696],{},[29,60694,60695],{},"Adverts",": Advertisements slow down loading times and unnecessarily consume resources.",[83,60698,60699,60702],{},[29,60700,60701],{},"Images",": Images can be blocked if you need text-based content.",[83,60704,60705,60707],{},[29,60706,58531],{},": You don’t need stylesheets for data scraping, but can you block them without causing issues?",[83,60709,60710,60713],{},[29,60711,60712],{},"Third-party tracking apps",": Analytics and tracking scripts can be safely blocked.",[83,60715,60716,60718],{},[29,60717,11031],{},": Disabling JavaScript sometimes improves speed, but beware, many sites rely on JavaScript for core functionality.",[83,60720,60721,60724],{},[29,60722,60723],{},"Fonts",": Custom fonts add unnecessary weight to page loads and can be safely blocked.",[21,60726,60728],{"id":60727},"how-do-you-identify-resources-to-block","How do you identify resources to block?",[14,60730,60731],{},"There are a few methods and tools you can use to identify which resources to block. To keep it simple use Chrome DevTools to examine resource paths such as headers, image URLs, and scripts.",[14,60733,60734],{},"To get started:",[555,60736,60737,60757,60769,60777],{},[83,60738,60739,60740],{},"Open Chrome DevTools:\n",[80,60741,60742],{},[83,60743,60744,60745,60748,60749,60752,60753,60756],{},"Right-click on the webpage and select ",[29,60746,60747],{},"Inspect",", or use the shortcut ",[90,60750,60751],{},"Ctrl + Shift + I"," (Windows\u002FLinux) or ",[90,60754,60755],{},"Cmd + Option + I"," (Mac).",[83,60758,60759,60760,60763,60764],{},"Navigate to the ",[29,60761,60762],{},"Network"," tab:\n",[80,60765,60766],{},[83,60767,60768],{},"This will show all the resources the browser is loading, including images, CSS, JavaScript, and third-party scripts.",[83,60770,60771,60772],{},"Filter by resource type:\n",[80,60773,60774],{},[83,60775,60776],{},"Use the filter options (e.g., \"Images,\" \"Scripts,\" \"Media\") to find the specific assets you might want to block.",[83,60778,60779,60780],{},"Analyze resource sizes:\n",[80,60781,60782],{},[83,60783,60784],{},"Check the \"Size\" column to identify large files like videos or unnecessary scripts that might slow down your scraper.",[14,60786,60787,60788,60793],{},"If you're new to ",[322,60789,60792],{"href":60790,"rel":60791},"https:\u002F\u002Fsupport.google.com\u002Fcampaignmanager\u002Fanswer\u002F2828688?hl=en",[2245],"Chrome DevTools",", plenty of tutorials are available online to help you get familiar with its features.",[21,60795,60797],{"id":60796},"can-i-break-something","Can I break something?",[14,60799,60800],{},"Yes, blocking certain resources can break a website's functionality. For example, blocking critical dependencies like JavaScript files or APIs can prevent the site from working properly. This could result in incomplete or missing data during scraping.",[14,60802,60803],{},"To avoid this, test your setup carefully:",[555,60805,60806,60809],{},[83,60807,60808],{},"Start by blocking non-essential resources like images, videos, and ads.",[83,60810,60811],{},"Gradually experiment with blocking more resources like CSS or JavaScript, ensuring the website still loads the content you need.",[21,60813,60815],{"id":60814},"first-i-will-try-standard-javascript","First I will try standard Javascript",[14,60817,60818],{},"I already knew I could hide elements by applying a CSS class with JavaScript. For example, with a single line of code like this, I can hide the header of a website:",[719,60820,60822],{"className":756,"code":60821,"language":758,"meta":494,"style":494},"document.getElementById('header-content').style.display = 'none';\n",[90,60823,60824],{"__ignoreMap":494},[727,60825,60826],{"class":729,"line":730},[727,60827,60821],{},[14,60829,60830,60831,60834],{},"First, I tried using this simple ",[322,60832,60833],{"href":55844},"JavaScript snippet"," to hide images, videos, and other elements. Now, a coder would have told me straight would not work! They would be right. There was no difference in the page load speed; why? The code was applied after the page load and not before.",[14,60836,60837],{},"To speed up scraping, I need to intercept resources before loading them. I initially hoped a line of JavaScript could achieve this, but it cannot. After asking ChatGPT some questions, it was clear I would need an additional JavaScript library to do what I wanted.",[14,60839,60840],{},"Thankfully, all is not lost; axiom.ai includes Puppeteer as a dependency, with which I can now do some neat tricks.",[21,60842,60844],{"id":60843},"why-we-will-use-puppetter","Why we will use Puppetter",[14,60846,60847],{},"We will use Puppeteer because axiom.ai already has the library installed. This lets us call Puppeteer functions directly in the JavaScript step without manually loading it, making it easier to get started.",[14,60849,60850],{},"Before writing this blog, I knew Puppeteer could intercept page requests, but I didn’t know how. I had never written any Puppeteer code before.",[14,60852,60853,60854,60857],{},"No problem! A quick chat with ChatGPT introduced me to the ",[90,60855,60856],{},"setRequestInterception"," method. This Puppeteer method intercepts network requests, giving us control over how resources like images, videos, and scripts load.",[14,60859,60860],{},"With this method, I can block unnecessary resources with just a few lines of code before they load. That’s exactly what I need to speed up my scraping workflow!",[21,60862,60864],{"id":60863},"how-to-get-started-and-replicate-these-experiments","How to get started and replicate these experiments",[14,60866,60867],{},"I tested all my Puppeteer scripts by quickly building a simple bot to check if they worked. When blocking images, I could see the site load without them when I clicked Run. To keep things simple, I judged success by observing whether the page loaded faster. If I saw a noticeable difference, I knew it was worth implementing.",[639,60869,60871],{"id":60870},"steps-to-test-your-setup","Steps to test your setup:",[14,60873,60874],{},"From the dashboard, click \"New Automation\".",[555,60876,60877,60880,60883],{},[83,60878,60879],{},"Use the step finder to add the \"JavaScript\" step. Since we're using Puppeteer functions, set this step to \"Run in App\".",[83,60881,60882],{},"Add the \"Go to Page\" step and enter a URL.",[83,60884,60885],{},"Finally, add a \"Wait\" step with a 5-second delay to prevent the bot from shutting down too quickly.",[14,60887,60888,60889,60891],{},"You can apply the JavaScript step using the code below to any of your ",[322,60890,23847],{"href":19716}," built in axiom.ai.",[21,60893,60895],{"id":60894},"brief-explanation-of-what-the-code-does","Brief explanation of what the code does",[14,60897,60898],{},"Let’s break down the code block below to understand each part. You’ll notice a clear pattern, and I’ll walk you through its purpose step by step.",[639,60900,60902],{"id":60901},"code-explanation","Code explanation",[14,60904,60905,60906,60908],{},"This line calls the Puppeteer function ",[90,60907,60856],{}," and prepares the bot to intercept page requests.",[719,60910,60913],{"className":756,"code":60911,"language":758,"meta":60912,"style":494},"await page.setRequestInterception(true);\n","Block image puppeter",[90,60914,60915],{"__ignoreMap":494},[727,60916,60917],{"class":729,"line":730},[727,60918,60911],{},[14,60920,60921],{},"Next, this line listens for page requests as the page loads. Puppeteer triggers the function for each request the webpage makes.",[719,60923,60925],{"className":756,"code":60924,"language":758,"meta":60912,"style":494},"page.on('request', request => {\n",[90,60926,60927],{"__ignoreMap":494},[727,60928,60929],{"class":729,"line":730},[727,60930,60924],{},[14,60932,60933,60934,60937,60938,60941,60942,60945],{},"Here, we determine which requests to block and which to allow. In this example, we block all image requests by checking the ",[90,60935,60936],{},"resourceType",". If the request is an image, we call ",[90,60939,60940],{},"request.abort()"," to block it. Otherwise, we call ",[90,60943,60944],{},"request.continue()"," to let it proceed.",[719,60947,60949],{"className":756,"code":60948,"language":758,"meta":60912,"style":494},"\n  if (request.resourceType() === 'image') {\n    request.abort();\n  } else {\n    request.continue();\n  }\n",[90,60950,60951,60955,60960,60965,60970,60975],{"__ignoreMap":494},[727,60952,60953],{"class":729,"line":730},[727,60954,1898],{"emptyLinePlaceholder":522},[727,60956,60957],{"class":729,"line":498},[727,60958,60959],{},"  if (request.resourceType() === 'image') {\n",[727,60961,60962],{"class":729,"line":495},[727,60963,60964],{},"    request.abort();\n",[727,60966,60967],{"class":729,"line":1895},[727,60968,60969],{},"  } else {\n",[727,60971,60972],{"class":729,"line":1901},[727,60973,60974],{},"    request.continue();\n",[727,60976,60977],{"class":729,"line":1973},[727,60978,9712],{},[639,60980,60982],{"id":60981},"what-this-code-does-overall","What this code does overall",[80,60984,60985,60988,60991,60994],{},[83,60986,60987],{},"Intercepts every network request as the page loads.",[83,60989,60990],{},"Checks the type of each requested resource (e.g., images, scripts, CSS).",[83,60992,60993],{},"Blocks images to reduce bandwidth usage and speed up page loading.",[83,60995,60996],{},"Allows all other resource types to load as usual.",[21,60998,61000],{"id":60999},"how-to-intercept-and-block-images-from-loading","How to intercept and block images from loading",[14,61002,61003],{},"First, I experimented with blocking images to see if it made a noticeable difference in load speed.",[14,61005,61006],{},"I tested a simple block of code that prevents all images from loading. I inserted the code into my JavaScript step and clicked Run. When the page loaded, no images appeared.",[719,61008,61010],{"className":756,"code":61009,"language":758,"meta":60912,"style":494},"await page.setRequestInterception(true);\n\n\u002F\u002F Block all image requests\npage.on('request', request => {\n  if (request.resourceType() === 'image') {\n    request.abort();\n  } else {\n    request.continue();\n  }\n});\n",[90,61011,61012,61016,61020,61025,61029,61033,61037,61041,61045,61049],{"__ignoreMap":494},[727,61013,61014],{"class":729,"line":730},[727,61015,60911],{},[727,61017,61018],{"class":729,"line":498},[727,61019,1898],{"emptyLinePlaceholder":522},[727,61021,61022],{"class":729,"line":495},[727,61023,61024],{},"\u002F\u002F Block all image requests\n",[727,61026,61027],{"class":729,"line":1895},[727,61028,60924],{},[727,61030,61031],{"class":729,"line":1901},[727,61032,60959],{},[727,61034,61035],{"class":729,"line":1973},[727,61036,60964],{},[727,61038,61039],{"class":729,"line":2052},[727,61040,60969],{},[727,61042,61043],{"class":729,"line":2058},[727,61044,60974],{},[727,61046,61047],{"class":729,"line":2064},[727,61048,9712],{},[727,61050,61051],{"class":729,"line":2087},[727,61052,17446],{},[14,61054,61055],{},"This simple test confirmed that blocking images significantly reduces the page's visual load. While I didn’t measure exact speed improvements, the difference was immediately noticeable.",[639,61057,61059],{"id":61058},"block-all-images-by-multiple-domain","Block all images by multiple domain",[14,61061,61062,61063,61066],{},"I refined my code to allow blocking images by domain. You can copy and paste this code into a JavaScript step, replacing ",[29,61064,61065],{},"\"Insert domain\""," with your desired domain.",[719,61068,61070],{"className":756,"code":61069,"language":758,"meta":60912,"style":494},"\u002F\u002F Enable request interception\nawait page.setRequestInterception(true);\n\n\u002F\u002F Define the domains from which to block all image requests\nconst blockedImageDomains = [\n  'jlr.scene7.com',\n  'anotherdomain.com',\n  'yetanotherdomain.com',\n  \u002F\u002F Add more domains as needed\n];\n\n\u002F\u002F Block all image requests from the specified domains\npage.on('request', request => {\n  const requestUrl = request.url();\n  const urlHostname = new URL(requestUrl).hostname;\n\n  if (\n    request.resourceType() === 'image' &&\n    blockedImageDomains.includes(urlHostname)\n  ) {\n    request.abort(); \u002F\u002F Block the image request\n  } else {\n    request.continue(); \u002F\u002F Allow all other requests\n  }\n});\n\n",[90,61071,61072,61077,61081,61085,61090,61095,61100,61105,61110,61115,61119,61123,61128,61132,61137,61142,61146,61151,61156,61161,61166,61171,61175,61180,61184],{"__ignoreMap":494},[727,61073,61074],{"class":729,"line":730},[727,61075,61076],{},"\u002F\u002F Enable request interception\n",[727,61078,61079],{"class":729,"line":498},[727,61080,60911],{},[727,61082,61083],{"class":729,"line":495},[727,61084,1898],{"emptyLinePlaceholder":522},[727,61086,61087],{"class":729,"line":1895},[727,61088,61089],{},"\u002F\u002F Define the domains from which to block all image requests\n",[727,61091,61092],{"class":729,"line":1901},[727,61093,61094],{},"const blockedImageDomains = [\n",[727,61096,61097],{"class":729,"line":1973},[727,61098,61099],{},"  'jlr.scene7.com',\n",[727,61101,61102],{"class":729,"line":2052},[727,61103,61104],{},"  'anotherdomain.com',\n",[727,61106,61107],{"class":729,"line":2058},[727,61108,61109],{},"  'yetanotherdomain.com',\n",[727,61111,61112],{"class":729,"line":2064},[727,61113,61114],{},"  \u002F\u002F Add more domains as needed\n",[727,61116,61117],{"class":729,"line":2087},[727,61118,59202],{},[727,61120,61121],{"class":729,"line":2140},[727,61122,1898],{"emptyLinePlaceholder":522},[727,61124,61125],{"class":729,"line":2154},[727,61126,61127],{},"\u002F\u002F Block all image requests from the specified domains\n",[727,61129,61130],{"class":729,"line":1529},[727,61131,60924],{},[727,61133,61134],{"class":729,"line":2178},[727,61135,61136],{},"  const requestUrl = request.url();\n",[727,61138,61139],{"class":729,"line":2187},[727,61140,61141],{},"  const urlHostname = new URL(requestUrl).hostname;\n",[727,61143,61144],{"class":729,"line":2533},[727,61145,1898],{"emptyLinePlaceholder":522},[727,61147,61148],{"class":729,"line":2551},[727,61149,61150],{},"  if (\n",[727,61152,61153],{"class":729,"line":2559},[727,61154,61155],{},"    request.resourceType() === 'image' &&\n",[727,61157,61158],{"class":729,"line":2565},[727,61159,61160],{},"    blockedImageDomains.includes(urlHostname)\n",[727,61162,61163],{"class":729,"line":2570},[727,61164,61165],{},"  ) {\n",[727,61167,61168],{"class":729,"line":2591},[727,61169,61170],{},"    request.abort(); \u002F\u002F Block the image request\n",[727,61172,61173],{"class":729,"line":2603},[727,61174,60969],{},[727,61176,61177],{"class":729,"line":2615},[727,61178,61179],{},"    request.continue(); \u002F\u002F Allow all other requests\n",[727,61181,61182],{"class":729,"line":2630},[727,61183,9712],{},[727,61185,61186],{"class":729,"line":2636},[727,61187,17446],{},[21,61189,61191],{"id":61190},"how-to-block-all-videos","How to block all videos",[14,61193,61194],{},"Websites increasingly feature video content. While streaming services and faster broadband have improved load speeds, videos can still slow down page loading.",[14,61196,61197],{},"To block video content, I modified my code by changing the resource type from image to media. Here’s the updated snippet:",[719,61199,61202],{"className":756,"code":61200,"language":758,"meta":61201,"style":494},"await page.setRequestInterception(true);\n\n\u002F\u002F Block all video (media) requests\npage.on('request', request => {\n  if (request.resourceType() === 'media') {\n    request.abort(); \u002F\u002F Block video\u002Faudio requests\n  } else {\n    request.continue(); \u002F\u002F Allow all other requests\n  }\n});\n","Block",[90,61203,61204,61208,61212,61217,61221,61226,61231,61235,61239,61243],{"__ignoreMap":494},[727,61205,61206],{"class":729,"line":730},[727,61207,60911],{},[727,61209,61210],{"class":729,"line":498},[727,61211,1898],{"emptyLinePlaceholder":522},[727,61213,61214],{"class":729,"line":495},[727,61215,61216],{},"\u002F\u002F Block all video (media) requests\n",[727,61218,61219],{"class":729,"line":1895},[727,61220,60924],{},[727,61222,61223],{"class":729,"line":1901},[727,61224,61225],{},"  if (request.resourceType() === 'media') {\n",[727,61227,61228],{"class":729,"line":1973},[727,61229,61230],{},"    request.abort(); \u002F\u002F Block video\u002Faudio requests\n",[727,61232,61233],{"class":729,"line":2052},[727,61234,60969],{},[727,61236,61237],{"class":729,"line":2058},[727,61238,61179],{},[727,61240,61241],{"class":729,"line":2064},[727,61242,9712],{},[727,61244,61245],{"class":729,"line":2087},[727,61246,17446],{},[14,61248,61249],{},"This adjustment prevents videos from loading, which can significantly reduce a webpage’s load time. The change is simple and can be easily applied in a JavaScript step.",[21,61251,61253],{"id":61252},"how-to-block-css-stylesheets","How to block CSS stylesheets",[14,61255,61256],{},"Next, I experimented with blocking CSS to see if it could speed up load times. Below, I’m sharing two scripts: one blocks all CSS, and the other targets specific stylesheets by URL.",[719,61258,61260],{"className":756,"code":61259,"language":758,"meta":61201,"style":494},"\nawait page.setRequestInterception(true);\n\n\u002F\u002F Block all CSS (stylesheet) requests\npage.on('request', request => {\n  if (request.resourceType() === 'stylesheet') {\n    request.abort(); \u002F\u002F Block CSS requests\n  } else {\n    request.continue(); \u002F\u002F Allow all other requests\n  }\n});\n",[90,61261,61262,61266,61270,61274,61279,61283,61288,61293,61297,61301,61305],{"__ignoreMap":494},[727,61263,61264],{"class":729,"line":730},[727,61265,1898],{"emptyLinePlaceholder":522},[727,61267,61268],{"class":729,"line":498},[727,61269,60911],{},[727,61271,61272],{"class":729,"line":495},[727,61273,1898],{"emptyLinePlaceholder":522},[727,61275,61276],{"class":729,"line":1895},[727,61277,61278],{},"\u002F\u002F Block all CSS (stylesheet) requests\n",[727,61280,61281],{"class":729,"line":1901},[727,61282,60924],{},[727,61284,61285],{"class":729,"line":1973},[727,61286,61287],{},"  if (request.resourceType() === 'stylesheet') {\n",[727,61289,61290],{"class":729,"line":2052},[727,61291,61292],{},"    request.abort(); \u002F\u002F Block CSS requests\n",[727,61294,61295],{"class":729,"line":2058},[727,61296,60969],{},[727,61298,61299],{"class":729,"line":2064},[727,61300,61179],{},[727,61302,61303],{"class":729,"line":2087},[727,61304,9712],{},[727,61306,61307],{"class":729,"line":2140},[727,61308,17446],{},[14,61310,61311],{},"Blocking CSS can sometimes improve load speed, especially when stylesheets are large or externally hosted. However, be cautious blocking essential CSS may break the webpage layout, making it harder to scrape structured content. I recommend blocking only external stylesheets related to the main web application you’re scraping. Use the code below to do this.",[639,61313,61315],{"id":61314},"how-to-block-css-style-sheets-by-url","How to block CSS style sheets by url",[719,61317,61319],{"className":756,"code":61318,"language":758,"meta":61201,"style":494},"\nawait page.setRequestInterception(true);\n\n\u002F\u002F Define the URLs of stylesheets to block\nconst blockedStylesheetUrls = [\n  'https:\u002F\u002Fexample.com\u002Fstyles\u002Fblocked-style.css',\n  'https:\u002F\u002Fanotherdomain.com\u002Fcss\u002Funwanted.css',\n  \u002F\u002F Add more stylesheet URLs as needed\n];\n\n\u002F\u002F Block specific stylesheet requests\npage.on('request', request => {\n  if (\n    request.resourceType() === 'stylesheet' &&\n    blockedStylesheetUrls.includes(request.url())\n  ) {\n    request.abort(); \u002F\u002F Block the stylesheet\n  } else {\n    request.continue(); \u002F\u002F Allow all other requests\n  }\n});\n",[90,61320,61321,61325,61329,61333,61338,61343,61348,61353,61358,61362,61366,61371,61375,61379,61384,61389,61393,61398,61402,61406,61410],{"__ignoreMap":494},[727,61322,61323],{"class":729,"line":730},[727,61324,1898],{"emptyLinePlaceholder":522},[727,61326,61327],{"class":729,"line":498},[727,61328,60911],{},[727,61330,61331],{"class":729,"line":495},[727,61332,1898],{"emptyLinePlaceholder":522},[727,61334,61335],{"class":729,"line":1895},[727,61336,61337],{},"\u002F\u002F Define the URLs of stylesheets to block\n",[727,61339,61340],{"class":729,"line":1901},[727,61341,61342],{},"const blockedStylesheetUrls = [\n",[727,61344,61345],{"class":729,"line":1973},[727,61346,61347],{},"  'https:\u002F\u002Fexample.com\u002Fstyles\u002Fblocked-style.css',\n",[727,61349,61350],{"class":729,"line":2052},[727,61351,61352],{},"  'https:\u002F\u002Fanotherdomain.com\u002Fcss\u002Funwanted.css',\n",[727,61354,61355],{"class":729,"line":2058},[727,61356,61357],{},"  \u002F\u002F Add more stylesheet URLs as needed\n",[727,61359,61360],{"class":729,"line":2064},[727,61361,59202],{},[727,61363,61364],{"class":729,"line":2087},[727,61365,1898],{"emptyLinePlaceholder":522},[727,61367,61368],{"class":729,"line":2140},[727,61369,61370],{},"\u002F\u002F Block specific stylesheet requests\n",[727,61372,61373],{"class":729,"line":2154},[727,61374,60924],{},[727,61376,61377],{"class":729,"line":1529},[727,61378,61150],{},[727,61380,61381],{"class":729,"line":2178},[727,61382,61383],{},"    request.resourceType() === 'stylesheet' &&\n",[727,61385,61386],{"class":729,"line":2187},[727,61387,61388],{},"    blockedStylesheetUrls.includes(request.url())\n",[727,61390,61391],{"class":729,"line":2533},[727,61392,61165],{},[727,61394,61395],{"class":729,"line":2551},[727,61396,61397],{},"    request.abort(); \u002F\u002F Block the stylesheet\n",[727,61399,61400],{"class":729,"line":2559},[727,61401,60969],{},[727,61403,61404],{"class":729,"line":2565},[727,61405,61179],{},[727,61407,61408],{"class":729,"line":2570},[727,61409,9712],{},[727,61411,61412],{"class":729,"line":2591},[727,61413,17446],{},[21,61415,61417],{"id":61416},"my-final-experiment-blocking-third-party-apps-and-javascript-files","My final experiment blocking third-party apps and JavaScript files",[14,61419,61420],{},"For my final experiment, I blocked third-party apps and JavaScript files. These resources often track data or power ads, and they can significantly slow down page load times.",[14,61422,61423],{},"This script blocks requests to third-party domains by filtering the URLs of the source files.",[719,61425,61427],{"className":756,"code":61426,"language":758,"meta":61201,"style":494},"\n\u002F\u002F Enable request interception\nawait page.setRequestInterception(true);\n\n\u002F\u002F Define the URLs of JavaScript files to block\nconst blockedScriptUrls = [\n  'https:\u002F\u002Fexample.com\u002Fscripts\u002Funwanted-script.js',\n  'https:\u002F\u002Fanotherdomain.com\u002Fjs\u002Ftracking.js',\n  \u002F\u002F Add more script URLs as needed\n];\n\n\u002F\u002F Block specific JavaScript requests\npage.on('request', request => {\n  if (\n    request.resourceType() === 'script' &&\n    blockedScriptUrls.includes(request.url())\n  ) {\n    request.abort(); \u002F\u002F Block the JavaScript file\n  } else {\n    request.continue(); \u002F\u002F Allow all other requests\n  }\n});\n",[90,61428,61429,61433,61437,61441,61445,61450,61455,61460,61465,61470,61474,61478,61483,61487,61491,61496,61501,61505,61510,61514,61518,61522],{"__ignoreMap":494},[727,61430,61431],{"class":729,"line":730},[727,61432,1898],{"emptyLinePlaceholder":522},[727,61434,61435],{"class":729,"line":498},[727,61436,61076],{},[727,61438,61439],{"class":729,"line":495},[727,61440,60911],{},[727,61442,61443],{"class":729,"line":1895},[727,61444,1898],{"emptyLinePlaceholder":522},[727,61446,61447],{"class":729,"line":1901},[727,61448,61449],{},"\u002F\u002F Define the URLs of JavaScript files to block\n",[727,61451,61452],{"class":729,"line":1973},[727,61453,61454],{},"const blockedScriptUrls = [\n",[727,61456,61457],{"class":729,"line":2052},[727,61458,61459],{},"  'https:\u002F\u002Fexample.com\u002Fscripts\u002Funwanted-script.js',\n",[727,61461,61462],{"class":729,"line":2058},[727,61463,61464],{},"  'https:\u002F\u002Fanotherdomain.com\u002Fjs\u002Ftracking.js',\n",[727,61466,61467],{"class":729,"line":2064},[727,61468,61469],{},"  \u002F\u002F Add more script URLs as needed\n",[727,61471,61472],{"class":729,"line":2087},[727,61473,59202],{},[727,61475,61476],{"class":729,"line":2140},[727,61477,1898],{"emptyLinePlaceholder":522},[727,61479,61480],{"class":729,"line":2154},[727,61481,61482],{},"\u002F\u002F Block specific JavaScript requests\n",[727,61484,61485],{"class":729,"line":1529},[727,61486,60924],{},[727,61488,61489],{"class":729,"line":2178},[727,61490,61150],{},[727,61492,61493],{"class":729,"line":2187},[727,61494,61495],{},"    request.resourceType() === 'script' &&\n",[727,61497,61498],{"class":729,"line":2533},[727,61499,61500],{},"    blockedScriptUrls.includes(request.url())\n",[727,61502,61503],{"class":729,"line":2551},[727,61504,61165],{},[727,61506,61507],{"class":729,"line":2559},[727,61508,61509],{},"    request.abort(); \u002F\u002F Block the JavaScript file\n",[727,61511,61512],{"class":729,"line":2565},[727,61513,60969],{},[727,61515,61516],{"class":729,"line":2570},[727,61517,61179],{},[727,61519,61520],{"class":729,"line":2591},[727,61521,9712],{},[727,61523,61524],{"class":729,"line":2603},[727,61525,17446],{},[21,61527,61529],{"id":61528},"a-combined-script-for-blocking-images-videos-and-urls","A combined script for blocking images, videos, and URLs",[14,61531,61532],{},"Here’s a script that combines all the functionality from the previous examples. With this single script, you can efficiently block images, videos, and specific URLs.",[14,61534,61535],{},"If you’re not a developer, don’t worry—it’s simple to use:",[555,61537,61538,61541,61544],{},[83,61539,61540],{},"Copy the code into a JavaScript step and set it to Run in App.",[83,61542,61543],{},"To block additional domains, add them to the blockedDomains array.",[83,61545,61546],{},"By default, the script blocks images and media.",[719,61548,61550],{"className":756,"code":61549,"language":758,"meta":61201,"style":494},"\n\u002F\u002F Define third-party script domains to block\nconst blockedScriptDomains = new Set([\n  'thirdparty.com',\n  'anotherdomain.net',\n  'yetanotherapp.org',\n  \u002F\u002F Add more domains as needed\n]);\n\npage.on('request', request => {\n  const requestUrl = request.url().toLowerCase();\n  const resourceType = request.resourceType();\n  let hostname = '';\n\n  try {\n    hostname = new URL(requestUrl).hostname;\n  } catch {\n    \u002F\u002F If URL parsing fails, proceed without blocking\n  }\n\n  if (\n    resourceType === 'image' ||\n    resourceType === 'media' ||\n    (resourceType === 'script' && blockedScriptDomains.has(hostname))\n  ) {\n    request.abort();\n  } else {\n    request.continue();\n  }\n});\n",[90,61551,61552,61556,61561,61566,61571,61576,61581,61585,61590,61594,61598,61603,61608,61613,61617,61622,61627,61632,61637,61641,61645,61649,61654,61659,61664,61668,61672,61676,61680,61684],{"__ignoreMap":494},[727,61553,61554],{"class":729,"line":730},[727,61555,1898],{"emptyLinePlaceholder":522},[727,61557,61558],{"class":729,"line":498},[727,61559,61560],{},"\u002F\u002F Define third-party script domains to block\n",[727,61562,61563],{"class":729,"line":495},[727,61564,61565],{},"const blockedScriptDomains = new Set([\n",[727,61567,61568],{"class":729,"line":1895},[727,61569,61570],{},"  'thirdparty.com',\n",[727,61572,61573],{"class":729,"line":1901},[727,61574,61575],{},"  'anotherdomain.net',\n",[727,61577,61578],{"class":729,"line":1973},[727,61579,61580],{},"  'yetanotherapp.org',\n",[727,61582,61583],{"class":729,"line":2052},[727,61584,61114],{},[727,61586,61587],{"class":729,"line":2058},[727,61588,61589],{},"]);\n",[727,61591,61592],{"class":729,"line":2064},[727,61593,1898],{"emptyLinePlaceholder":522},[727,61595,61596],{"class":729,"line":2087},[727,61597,60924],{},[727,61599,61600],{"class":729,"line":2140},[727,61601,61602],{},"  const requestUrl = request.url().toLowerCase();\n",[727,61604,61605],{"class":729,"line":2154},[727,61606,61607],{},"  const resourceType = request.resourceType();\n",[727,61609,61610],{"class":729,"line":1529},[727,61611,61612],{},"  let hostname = '';\n",[727,61614,61615],{"class":729,"line":2178},[727,61616,1898],{"emptyLinePlaceholder":522},[727,61618,61619],{"class":729,"line":2187},[727,61620,61621],{},"  try {\n",[727,61623,61624],{"class":729,"line":2533},[727,61625,61626],{},"    hostname = new URL(requestUrl).hostname;\n",[727,61628,61629],{"class":729,"line":2551},[727,61630,61631],{},"  } catch {\n",[727,61633,61634],{"class":729,"line":2559},[727,61635,61636],{},"    \u002F\u002F If URL parsing fails, proceed without blocking\n",[727,61638,61639],{"class":729,"line":2565},[727,61640,9712],{},[727,61642,61643],{"class":729,"line":2570},[727,61644,1898],{"emptyLinePlaceholder":522},[727,61646,61647],{"class":729,"line":2591},[727,61648,61150],{},[727,61650,61651],{"class":729,"line":2603},[727,61652,61653],{},"    resourceType === 'image' ||\n",[727,61655,61656],{"class":729,"line":2615},[727,61657,61658],{},"    resourceType === 'media' ||\n",[727,61660,61661],{"class":729,"line":2630},[727,61662,61663],{},"    (resourceType === 'script' && blockedScriptDomains.has(hostname))\n",[727,61665,61666],{"class":729,"line":2636},[727,61667,61165],{},[727,61669,61670],{"class":729,"line":2642},[727,61671,60964],{},[727,61673,61674],{"class":729,"line":2647},[727,61675,60969],{},[727,61677,61678],{"class":729,"line":4657},[727,61679,60974],{},[727,61681,61682],{"class":729,"line":4662},[727,61683,9712],{},[727,61685,61686],{"class":729,"line":1316},[727,61687,17446],{},[21,61689,61691],{"id":61690},"wrapping-up-is-writing-a-few-lines-of-code-worth-it","Wrapping up – is writing a few lines of code worth it?",[14,61693,61694],{},"To intercept requests and block resources, we use Puppeteer because it includes a built-in function for request interception. Fortunately, Puppeteer is part of axiom.ai, making the process simple and accessible.",[14,61696,61697,61698],{},"When blocking resources, it’s important to consider the potential impact. Blocking certain elements might break the website you’re trying to scrape. However, blocking images, videos, third-party apps, and fonts is usually safe and can significantly speed up ",[322,61699,61700],{"href":19716},"web scraping.",[14,61702,61703,61704,61706],{},"I should also mention ChatGPT. Without it, learning this would have been harder and taken much longer. ChatGPT truly makes coding accessible to no-coders. It’s especially helpful in breaking down and explaining what each part of the code does. We also intergrate ",[322,61705,521],{"href":19708}," into axiom.ai.",[14,61708,61709],{},"Final thoughts:",[555,61711,61712,61715,61718],{},[83,61713,61714],{},"Can a no-coder use Puppeteer for this? Yes! Even without coding experience, you can use simple Puppeteer scripts to enhance your scraping workflow.",[83,61716,61717],{},"Have I improved my skills? Absolutely, this process has been a great learning experience.",[83,61719,61720],{},"Can any no-coder do this without ChatGPT? Yes, it’s surprisingly simple when broken down step by step.",[14,61722,61723],{},"One question I’m still pondering: What happens if the site loads too quickly? Could that trigger anti-bot measures? Web scraping isn’t always straightforward, so I’ll need to consider this when building my next scraper. But I’m definitely using this new method I’ve learned!",[14,61725,61726,61727,61731],{},"FYI in a future ",[322,61728,61730],{"href":61729},"\u002Fdocs\u002Fno-code-tool\u002Frelease-notes","release"," of the axiom.ai [No-code tool](\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder,we're adding a settings feature to block resources.",[811,61733,4898],{},{"title":494,"searchDepth":495,"depth":495,"links":61735},[61736,61737,61738,61739,61740,61741,61744,61748,61751,61752,61755,61756,61757],{"id":60678,"depth":498,"text":60679},{"id":60727,"depth":498,"text":60728},{"id":60796,"depth":498,"text":60797},{"id":60814,"depth":498,"text":60815},{"id":60843,"depth":498,"text":60844},{"id":60863,"depth":498,"text":60864,"children":61742},[61743],{"id":60870,"depth":495,"text":60871},{"id":60894,"depth":498,"text":60895,"children":61745},[61746,61747],{"id":60901,"depth":495,"text":60902},{"id":60981,"depth":495,"text":60982},{"id":60999,"depth":498,"text":61000,"children":61749},[61750],{"id":61058,"depth":495,"text":61059},{"id":61190,"depth":498,"text":61191},{"id":61252,"depth":498,"text":61253,"children":61753},[61754],{"id":61314,"depth":495,"text":61315},{"id":61416,"depth":498,"text":61417},{"id":61528,"depth":498,"text":61529},{"id":61690,"depth":498,"text":61691},"2025-02-03",{"read":61760,"type":90,"tool":61761,"category":61762,"tags":61763,"location":46733,"featuredimg":61765,"landingimg":61766,"summary":61767},"10 min read",[46728],[48207],[61764],"resource blocking","\u002Fblog\u002Fblog-speed-up-long.webp","\u002Fblog\u002Fblog-speed-up-sq.webp","Learn how to use a few lines of code to block resources to speed up your web scraping tasks.","\u002Fblog\u002Fblocking-resources",{"title":60633,"description":60638},"blog\u002Fblocking-resources","hORBD-gsI93UJCP-K5WM9RvtgywJ0WZYzKXlcpuOznA",[48207],[90],[46728],{"id":61776,"title":61777,"author":48082,"body":61778,"date":61911,"description":61912,"draft":26250,"extension":506,"meta":61913,"navigation":522,"path":61921,"seo":61922,"stem":61923,"__hash__":61924,"pinned":-1,"category":61925,"type":61926,"tool":61927},"blog\u002Fblog\u002Fbot-master-2025.md","The search for the next Bot Master is on!",{"type":8,"value":61779,"toc":61904},[61780,61783,61786,61790,61793,61797,61800,61804,61807,61813,61816,61820,61823,61826,61844,61848,61851,61865,61870,61874,61877,61879,61881,61888,61895],[14,61781,61782],{},"We are searching for a new Bot Master who wants to demonstrate their automation building skills to the community!",[18,61784],{"alt":61785},"Become the Axiom bot master 2025",[21,61787,61789],{"id":61788},"what-is-this-thing","What is this thing?",[14,61791,61792],{},"We are looking for experienced bot builders to show off their talents and get featured on our blog. Have you got a business that runs part of their workflow with axiom.ai, or just an individual who really enjoys automating their life? We want to hear from you! We have seen some really neat things built with axiom.ai, including businesses that have been created using axiom.ai as a backend. This doesn't have to be anything new, it might just be something you use in your everyday life!",[21,61794,61796],{"id":61795},"when-does-it-happen","When does it happen?",[14,61798,61799],{},"Submissions will open on the 16th January 2025 and remain open until 28th February 2025 to give you plenty of opportunity to build something special. We are aiming to get in contact with winners around mid-March.",[21,61801,61803],{"id":61802},"what-can-we-win","What can we win?",[14,61805,61806],{},"We're giving one person the chance to win a $50 Amazon voucher, along with the opportunity to work with our team to develop a blog article for our website to showcase your work and talent, including a link back to your website, or blog. This blog article will be shared with our social media accounts, including on our Reddit community.",[14,61808,61809,61810,61812],{},"Five runner up submissions will each receive a $10 axiom.ai credit",[3335,61811,165],{}," applied to their account.",[14,61814,61815],{},"Results will be announced two weeks after submissions close to give our judges a chance to review all submissions. Winners will be contacted by email using the email provided during submission - this email should be the same as your axiom.ai account.",[21,61817,61819],{"id":61818},"are-there-any-criteria","Are there any criteria?",[14,61821,61822],{},"Yes, there are a few ground rules that need to be followed, along with some requirements.",[14,61824,61825],{},"Requirements:",[80,61827,61828,61831,61836,61841],{},[83,61829,61830],{},"You must have an active subscription with axiom.ai, free users are not eligible.",[83,61832,61833,61834],{},"Automation must be a business process automation",[3335,61835,8883],{},[83,61837,61838,61839,44],{},"axiom.ai must have the ability to run your automation or you must be able to provide a screen recording",[3335,61840,17430],{},[83,61842,61843],{},"The automation must be capable of a \"successful\" run within a reasonable timeframe.",[21,61845,61847],{"id":61846},"how-do-we-submit","How do we submit?",[14,61849,61850],{},"To submit your automation, you'll need to fill out the form below, we'll ask you for the following information:",[555,61852,61853,61856,61859,61862],{},[83,61854,61855],{},"Your axiom.ai email - just to confirm your account, we won't be using this for marketing.",[83,61857,61858],{},"Details about your automation - we want to know how it works, what it does and why it stands out.",[83,61860,61861],{},"Any requirements to run the automation.",[83,61863,61864],{},"The automation",[50804,61866],{"className":61867,"dataTfLive":61869},[61868],"submission-button","01JHQVSR4RW6P0CDM6SSQXYNAV",[61871,61872],"script",{"src":61873},"\u002F\u002Fembed.typeform.com\u002Fnext\u002Fembed.js",[811,61875,61876],{},".submission-button button { margin: 0 auto !important; display: block !important;}",[344,61878],{},[11,61880],{},[14,61882,61883,88,61885],{},[3335,61884,165],{},[807,61886,61887],{},"This does not have a monetary value and can not be exchanged for cash or a voucher.",[14,61889,61890,88,61892],{},[3335,61891,8883],{},[807,61893,61894],{},"Automation must not access illegal content, gambling sites or private content.",[14,61896,61897,88,61899],{},[3335,61898,17430],{},[807,61900,61901,61902,3342],{},"If we need to run the automation, and it accessed services behind a paywall or subscription, we may need you to provide us with login credentials. ",[322,61903,21057],{"href":486},{"title":494,"searchDepth":495,"depth":495,"links":61905},[61906,61907,61908,61909,61910],{"id":61788,"depth":498,"text":61789},{"id":61795,"depth":498,"text":61796},{"id":61802,"depth":498,"text":61803},{"id":61818,"depth":498,"text":61819},{"id":61846,"depth":498,"text":61847},"2025-01-21","We're announcing a new competition to showcase the best builders in our community",{"read":56152,"type":513,"tool":61914,"category":61915,"tags":61916,"location":46733,"featuredimg":61919,"landingimg":61920,"summary":61912,"video":523,"metaTitle":61777},[46728],[50552],[61917,61918],"bot building","competition","\u002Fblog\u002Fbot-master-landing.webp","\u002Fblog\u002Fbot-master-sq.webp","\u002Fblog\u002Fbot-master-2025",{"title":61777,"description":61912},"blog\u002Fbot-master-2025","U8ngARWMaQTjioCVTcDe578LSGvVij5N9IxX5xC1P7I",[50552],[513],[46728],{"id":61929,"title":61930,"author":48082,"body":61931,"date":62151,"description":62152,"draft":26250,"extension":506,"meta":62153,"navigation":522,"path":62162,"seo":62163,"stem":62164,"__hash__":62165,"pinned":-1,"category":62166,"type":62167,"tool":62168},"blog\u002Fblog\u002Fwhats-coming-2025.md","What's coming in 2025",{"type":8,"value":61932,"toc":62136},[61933,61940,61943,61947,61960,61967,61971,61974,61980,61984,61992,61999,62003,62006,62011,62014,62019,62023,62026,62029,62040,62044,62047,62050,62053,62056,62059,62062,62067,62072,62075,62078,62080,62083,62087,62090,62093,62097,62100,62108,62112,62119,62124,62126,62129],[14,61934,61935,61936,44],{},"Hi, everyone! 2024 was an exciting year here at axiom.ai and we are very proud of what we have released and what we have planned for 2025. We are going to begin with a 2024 recap, but if you are just interested in our future plans, skip ahead to ",[322,61937,61939],{"href":61938},"#whats-next","What's next",[18,61941],{"alt":61942},"New fetaures for axiom.ai in 2025",[21,61944,61946],{"id":61945},"what-we-were-up-to-last-year","What we were up to last year",[14,61948,61949,61950,61954,61955,61959],{},"We concentrated on implementing user requested features and improving the overall quality of the extension, and our documentation. We are delighted to have launched our improved ",[322,61951,61953],{"href":61952},"\u002Fdocs","documentation",", our ",[322,61956,61958],{"href":3324,"rel":61957},[2245],"Reddit"," community and general improvements throughout the tool!",[14,61961,61962,61963,61966],{},"This recap is some of our best new features and improvements, but the full list of features and improvements is much more than would fit in this post! Review our ",[322,61964,61965],{"href":61729},"Release Notes"," for a full list of changes.",[21,61968,61970],{"id":61969},"bot-detection-bypass","Bot detection bypass",[14,61972,61973],{},"We have all been there - you make the perfect automation and then you get hit with a Cloudflare verification screen that blocks progress once you hit the \"Run\" button. We wanted our users to get around this so we launched the Bypass Bot Detection option within your automation settings - this will automatically handle the \"verify you are human\" prompt that sites protected by Cloudflare display. This feature has been loved by our users and allows your automations to be run on sites that employ Cloudflare to prevent bot activity.",[14,61975,61976,61977],{},"Learn more: ",[322,61978,61979],{"href":51820},"Bot blocking",[21,61981,61983],{"id":61982},"snippets-and-templates","Snippets and templates",[14,61985,61986,61987,61991],{},"axiom.ai 4.0 brought along the introduction of ",[322,61988,61990],{"href":61989},"\u002Fdocs\u002Fno-code-tool\u002Fget-started#get-started-from-a-snippet","Snippets"," which allows you to get started even faster with common design patterns, such as scraping data and writing it to a Google Sheet - a common feature that we know people love to use axiom.ai for. You'll find Snippets in the Step Finder.",[14,61993,61994,61995,61998],{},"How can we go one step further, what would really help people get started? Guided Templates. We launched our ",[322,61996,61997],{"href":324},"Guided Templates"," that allow you to to quickly build an automation for some popular services, such as Instagram, Facebook, LinkedIn and Gmail. These templates will walk you through the entire set up process and teach you how the automation works - you can also build off these templates to build additional features into your automations.",[21,62000,62002],{"id":62001},"local-storage-cookies-and-proxies","Local storage, cookies and proxies",[14,62004,62005],{},"To make it easier to allow the automation to run on websites as if you were running it yourself, we added the ability to store your local storage and cookies within your automations. This can be super helpful when it comes to bringing your authentication sessions into your automations. Our users find this very helpful when managing social media accounts, but this can also be useful for managing general settings within a website.",[14,62007,61976,62008],{},[322,62009,62010],{"href":6540},"Learn how to store cookies and local storage",[14,62012,62013],{},"We launched proxy support in 4.2, allowing you to bring along your own proxy and run your automations through it rather than our IP addresses. This was a very popular feature and allowed users to do even more with their automations, like getting around geo-restrictions and organisational VPNs. We added the option to add basic authentication in 4.3, which allowed for the use of more secure proxies.",[14,62015,61976,62016],{},[322,62017,62018],{"href":51834},"Learn how to use a proxy",[21,62020,62022],{"id":62021},"step-management","Step management",[14,62024,62025],{},"Improving step management was on our agenda for 2024 and we made some changes and improvements to the overall experience that we are happy to have released. We made a bunch of updates to the Step Finder to allow you to more easily find and add steps to your automations.",[14,62027,62028],{},"We received feedback regarding moving, copying and removing steps from within the Builder itself. We made some changes to the Builder to make this options more accessible and easier to use.",[14,62030,62031,62032,2004,62034,2004,62036,62039],{},"Nested steps launched with axiom.ai 4.0, and has become an invaluable feature of the Builder. When combined with other steps launched this year, including the ",[322,62033,114],{"href":2296},[322,62035,4521],{"href":4520},[322,62037,62038],{"href":6250},"Try\u002Fcatch"," steps, nesting can be really useful for managing the structure of your automation.",[21,62041,62043],{"id":62042},"other-improvements","Other improvements",[14,62045,62046],{},"Here are some of the other improvements we made, this list is not a full list of improvements, just a small summary!",[14,62048,62049],{},"Power users! We hear you - we launched Keyboard Shortcuts just for you.",[14,62051,62052],{},"AI aficionados! We launched something for you, too - we launched GPT 4 support (spoiler: we are updating this in 2025).",[14,62054,62055],{},"We added the ability to set your maximum runtime, send run notifications to multiple email addresses and improvements to the instructions of most steps to make it even easier.",[21,62057,61939],{"id":62058},"whats-next",[14,62060,62061],{},"We have lots of exciting updates planned for 2025, some we can share, some you'll have to wait and see for yourself! Our main focus is providing a framework that you can use to scale up your automations. Axiom Cloud 2.0 will bring more concurrency, more customisation, and more control. Let's dive into some of the features we expect to bring to Axiom Cloud 2.0.",[14,62063,62064],{},[807,62065,62066],{},"Note: not all features may launch when Axiom Cloud 2.0 launches, features may change or be removed from our roadmap. Certain features may be tied to certain subscription tiers. Launch date is to be decided at a later date.",[8898,62068,62069],{},[14,62070,62071],{},"Want to test out or learn more about the next iteration of axiom.ai? Check out our Coming soon page for more details.",[21,62073,46828],{"id":62074},"concurrency",[14,62076,62077],{},"We know that concurrently can sometimes be a limiting factor when it comes to running your automations, so we want to remove that barrier and allow for the scaling up of your operations with axiom.ai. We are aiming to offer a 10X improvement over the current number of bots that you can run concurrently in-browser, and even more when your automation is run headless. Concurrency for desktop runs will also be included for users with powerful computers, or when running on a server.",[21,62079,52935],{"id":90},[14,62081,62082],{},"We love no-code and how simply it is to build really effective automations by dropping in steps. However, there are times when you may need to go beyond no-code - we plan on enabling the transition from no-code to code to give you more flexibility, customisation and control over your automations. Axiom already has great features for running your JavaScript in your automations, we hope to enable the next step. We'll continue to support Puppeteer and JavaScript, but hope to offer support for other frameworks and libraries - we will have more to share at a later date!",[21,62084,62086],{"id":62085},"proxies-and-bot-detection-bypass","Proxies and bot detection bypass",[14,62088,62089],{},"We launched proxy support in 2024 and promised more - we plan on bringing native proxy support to Axiom Cloud 2.0, allowing subscribers to quickly get started with a proxy rather than needing to set up a third-party proxy. We also plan on releasing proxy rotation options within your automation.",[14,62091,62092],{},"Our bot detection bypass was a big hit last year. The main feedback we received when we launched was: \"Why doesn't it work on the cloud?\". Good question - we hope to fix that this year with the launch of bot detection bypass for the cloud.",[21,62094,62096],{"id":62095},"data-management","Data management",[14,62098,62099],{},"Google Sheets is a fantastic tool that we integrate with to allow you to read and store your data, but we are aware that there are some limitations to this - including Google's habit of revoking the access token when you use it too often. Google Sheets will remain a great option for most automations but we recognise that there is sometimes a need for a more scalable solution. While we can not go into the details just yet, we plan on integrating with additional database services to give you more options and scalability when considering where to store your data. This will allow you to truly manage your data at scale when running your automations without the limitations of Google Sheets.",[14,62101,62102,62103,44],{},"Do you have a tool that you use to store your data that you'd love to see axiom.ai work with? ",[322,62104,62107],{"href":62105,"rel":62106},"https:\u002F\u002Fwww.reddit.com\u002Fr\u002Faxiom_ai\u002Fcomments\u002F1fptsst\u002Ffeedback_megathread",[2245],"Let us know",[21,62109,62111],{"id":62110},"community-and-content","Community and content",[14,62113,62114,62115,62118],{},"We believe our ",[322,62116,61958],{"href":3324,"rel":62117},[2245]," community has already grown into a great resource hub for support and sharing ideas - we hope to continue to expand this community to bring our users together to share ideas and help one another. We've already seen over 100 users join since the community was created! Come join us over there, we look forward to hearing from you.",[14,62120,62121,62122,44],{},"There are so many different ways that you can use axiom.ai, including with third-party tools to extend the functionality of your automations. We hope to develop new content that'll help you get started quicker with implementing new tools into your workflow. You can see our current guides that we have worked on in our ",[322,62123,8921],{"href":324},[21,62125,796],{"id":795},[14,62127,62128],{},"We are delighted with the warm reception that we received when we launched our new features and improvements and hope to continue releasing updates that delight you all. We wouldn't be able to do this without your feedback and ideas - thank you! We are very excited about this year and hope to have you along for the ride!",[14,62130,62131,62132,44],{},"If you have any feedback on either of the above points, drop a comment in our ",[322,62133,62135],{"href":62105,"rel":62134},[2245],"Feedback Megathread",{"title":494,"searchDepth":495,"depth":495,"links":62137},[62138,62139,62140,62141,62142,62143,62144,62145,62146,62147,62148,62149,62150],{"id":61945,"depth":498,"text":61946},{"id":61969,"depth":498,"text":61970},{"id":61982,"depth":498,"text":61983},{"id":62001,"depth":498,"text":62002},{"id":62021,"depth":498,"text":62022},{"id":62042,"depth":498,"text":62043},{"id":62058,"depth":498,"text":61939},{"id":62074,"depth":498,"text":46828},{"id":90,"depth":498,"text":52935},{"id":62085,"depth":498,"text":62086},{"id":62095,"depth":498,"text":62096},{"id":62110,"depth":498,"text":62111},{"id":795,"depth":498,"text":796},"2025-01-16","Learn more about what we have planned for axiom.ai in 2025",{"read":50549,"type":513,"tool":62154,"category":62156,"tags":62157,"location":46733,"featuredimg":62160,"landingimg":62161,"summary":62152,"video":523,"metaTitle":61930},[46728,62155,46802],"Selector tool",[50552],[2473,518,90,62158,62159],"cloud","desktop","\u002Fblog\u002Fnew-for-25.webp","\u002Fblog\u002Fnew-for-25-sq.webp","\u002Fblog\u002Fwhats-coming-2025",{"title":61930,"description":62152},"blog\u002Fwhats-coming-2025","eYx0rHMTxUA7PrLVYaeojr3SufrrTMP2okXFB7FKEEQ",[50552],[513],[46728,62155,46802],{"id":62170,"title":62171,"author":46205,"body":62172,"date":62722,"description":62176,"draft":26250,"extension":506,"meta":62723,"navigation":522,"path":62733,"seo":62734,"stem":62735,"__hash__":62736,"pinned":-1,"category":62737,"type":62738,"tool":62739},"blog\u002Fblog\u002Fno-code-web-scraping.md","Build a web scraper without writing a single line of code",{"type":8,"value":62173,"toc":62703},[62174,62177,62180,62183,62186,62189,62192,62229,62232,62235,62238,62241,62273,62276,62280,62283,62303,62306,62310,62313,62316,62319,62322,62326,62329,62364,62368,62371,62406,62410,62413,62444,62447,62450,62453,62460,62489,62493,62497,62500,62506,62510,62514,62517,62523,62527,62531,62534,62539,62543,62547,62552,62555,62561,62582,62585,62588,62623,62627,62630,62658,62660,62663,62666,62680,62683,62689,62691,62693],[14,62175,62176],{},"Tools like Python, Selenium, or Puppeteer are the go-to options for developers looking to scrape data from websites. But what if you're not a coder? Building a web scraper is a tad daunting. Thankfully, the no-code scraper market has evolved dramatically, offering powerful tools to create scrapers without writing a single line of code.",[18,62178],{"alt":62179},"Build a web scraper with a single loine of code",[14,62181,62182],{},"You can now bypass bot detection, scale your scrapers using concurrency, and achieve results comparable to those created with traditional coding. These advancements make no-code tools an increasingly viable option, even for developers who might typically favor coding their web scrapers.",[14,62184,62185],{},"This guide is for both non-technical users and developers. We'll explore the everyday challenges of web scraping, why no-code tools are gaining the edge, and which tools can help you create web scrapers quickly.",[14,62187,62188],{},"If you want to learn more, I will also demonstrate how to create a variety of scrapers for different use cases using axiom.ai, a no-code tool that allows you to combine steps to create custom web scrapers in seconds.",[14,62190,62191],{},"Here's a quick overview of what we'll cover and the scrapers we'll build.",[555,62193,62194,62200,62206,62212,62218,62224],{},[83,62195,62196],{},[322,62197,62199],{"href":62198},"#what-are-the-challenges-of-web-scraping","What are the challenges of web scraping?",[83,62201,62202],{},[322,62203,62205],{"href":62204},"#why-no-code-tools-now-have-the-edge","Why no-code now has the edge?",[83,62207,62208],{},[322,62209,62211],{"href":62210},"#how-to-pick-the-best-tool-for-web-scraping","How do you pick the best tool for web scraping?",[83,62213,62214],{},[322,62215,62217],{"href":62216},"#how-to-make-no-code-web-scrapers-with-axiom-ai","How to make no-code web scrapers with axiom.ai",[83,62219,62220],{},[322,62221,62223],{"href":62222},"#running-your-web-scrapers","Running your web scrapers",[83,62225,62226],{},[322,62227,61979],{"href":62228},"#bot-blocking",[14,62230,62231],{},"I'm Alex, co-founder of axiom.ai - let's dive in!",[21,62233,62199],{"id":62234},"what-are-the-challenges-of-web-scraping",[14,62236,62237],{},"Having all your data neatly extracted and in your Google Sheet feels great. But getting there can be a tricky process. Many websites block or confuse scrapers, making data extraction challenging.",[14,62239,62240],{},"Here are some of the most common challenges I encounter:",[80,62242,62243,62249,62255,62261,62267],{},[83,62244,62245,62248],{},[29,62246,62247],{},"Varying page templates:"," Pages within the same site can have different structures, requiring custom logic for each one.",[83,62250,62251,62254],{},[29,62252,62253],{},"CSS class obfuscation:"," Dynamic and unpredictable class names make locating elements harder.",[83,62256,62257,62260],{},[29,62258,62259],{},"Missing elements:"," Content might only load after user interactions or be hidden entirely from scrapers.",[83,62262,62263,62266],{},[29,62264,62265],{},"Anti-bot measures:"," Tools like Cloudflare and other CAPTCHA systems actively block automated access.",[83,62268,62269,62272],{},[29,62270,62271],{},"CDNs:"," Distributed networks and throttling mechanisms limit the rate of data extraction.",[14,62274,62275],{},"For coders, these issues mean hours spent debugging, writing exception-specific logic, and integrating tools like Puppeteer Stealth. It's an ongoing arms race to outsmart anti-scraping measures, requiring bucketloads of patience and persistence.",[21,62277,62279],{"id":62278},"why-no-code-tools-now-have-the-edge","Why no-code tools now have the edge",[14,62281,62282],{},"Web scraping has traditionally been the domain of coders, but that's no longer the case. No-code tools have matured, making it possible to assemble web scrapers using intuitive user interfaces quickly. These tools also offer advanced features like bot evasion with straightforward configuration. You can even run your scrapers on your desktop or in the cloud without setting up a server—no more \"PIP Install.\" Just click run.",[80,62284,62285,62291,62297],{},[83,62286,62287,62290],{},[29,62288,62289],{},"Easy assembly."," No-code tools now allow anyone to assemble simple or complex scrapers in minutes. You get all the functionality of programming languages but in a simplified, user-friendly format.",[83,62292,62293,62296],{},[29,62294,62295],{},"Powerful configuration."," No-code tools have leveled up. They now provide advanced options to optimize scrapers, including proxy usage and built-in anti-bot measures like Cloudflare evasion.",[83,62298,62299,62302],{},[29,62300,62301],{},"Effortless scalability."," Concurrency features let you deploy an entire army of scrapers. Managing a stack to run your scrapers on—well, that's now done for you. All you need to do is click run.",[14,62304,62305],{},"Does coding a web scraper and setting up your own server still make sense? No-code solutions offer a faster, simpler, and more efficient alternative, even for the most dedicated developers.",[21,62307,62309],{"id":62308},"how-to-pick-the-best-tool-for-web-scraping","How to pick the best tool for web scraping",[14,62311,62312],{},"When selecting a no-code web scraping tool, the complexity of your task should be your top consideration. If you only need to extract small amounts of data from straightforward or formulaic web pages, an AI-powered scraper or a tool with pre-built templates is likely sufficient.",[14,62314,62315],{},"However, not all web scraping tasks are that simple. For more complex use cases, such as automating browser interactions to access dynamic or hard-to-reach data, you'll need a tool that offers the flexibility to build custom scrapers.",[14,62317,62318],{},"For large-scale scraping projects involving hundreds of thousands or even millions of pages, enterprise-level solutions are often necessary to handle the scale.",[14,62320,62321],{},"To make choosing simpler, I've grouped web scraping tools into three main categories:",[639,62323,62325],{"id":62324},"_1-aitemplate-scraper-tools","1. AI\u002FTemplate scraper tools",[14,62327,62328],{},"These tools are ideal for quick scraping tasks. They rely on pre-built templates or AI-driven automation to scrape pre-defined data, like profile data.",[80,62330,62331,62337,62343,62358],{},[83,62332,62333,62336],{},[29,62334,62335],{},"Best For:"," Beginners, non-technical users, and those with straightforward needs.",[83,62338,62339,62342],{},[29,62340,62341],{},"Advantages:"," Fast setup, minimal learning curve.",[83,62344,62345,88,62348,11710,62353],{},[29,62346,62347],{},"Examples:",[322,62349,62352],{"href":62350,"rel":62351},"https:\u002F\u002Fwww.bardeen.ai\u002F",[2245],"Bardeen.ai",[322,62354,62357],{"href":62355,"rel":62356},"https:\u002F\u002Fwww.getmagical.com\u002F",[2245],"Magic",[83,62359,62360,62363],{},[29,62361,62362],{},"Limitations:"," Limited customization is less suited for dynamic or complex websites.",[639,62365,62367],{"id":62366},"_2-no-code-web-scrapers-with-builders","2. No-code web scrapers with builders",[14,62369,62370],{},"No-code tool tools allow you to configure custom scraping workflows, giving you more control. You can visually select elements on a page, define rules, handle pagination, and even integrate with APIs or automation platforms such as Zapier and Make.",[80,62372,62373,62378,62383,62401],{},[83,62374,62375,62377],{},[29,62376,62335],{}," Users with moderate to advanced requirements who need more flexibility.",[83,62379,62380,62382],{},[29,62381,62341],{}," Customization options, ability to handle dynamic content, tools for proxy management and anti-bot measures.",[83,62384,62385,62387,62388,2004,62391,59253,62396,44],{},[29,62386,62347],{}," Tools like ",[322,62389,3435],{"href":51689,"rel":62390},[2245],[322,62392,62395],{"href":62393,"rel":62394},"https:\u002F\u002Fwww.parsehub.com\u002F",[2245],"ParseHub",[322,62397,62400],{"href":62398,"rel":62399},"https:\u002F\u002Fwww.octoparse.com\u002F",[2245],"Octoparse",[83,62402,62403,62405],{},[29,62404,62362],{}," Slightly steeper learning curve than AI\u002Ftemplate tools.",[639,62407,62409],{"id":62408},"_3-enterprise-web-scraping-solutions","3. Enterprise web scraping solutions",[14,62411,62412],{},"Enterprise-grade tools handle large-scale, complex scraping projects and offer advanced features like data normalization, machine learning, and real-time integration with databases or analytics platforms.",[80,62414,62415,62420,62425,62439],{},[83,62416,62417,62419],{},[29,62418,62335],{}," Businesses or teams with significant data needs and technical expertise.",[83,62421,62422,62424],{},[29,62423,62341],{}," Scalability, robust anti-bot systems, and dedicated support.",[83,62426,62427,62387,62429,3289,62434],{},[29,62428,62347],{},[322,62430,62433],{"href":62431,"rel":62432},"https:\u002F\u002Fbrightdata.com\u002F",[2245],"Bright Data",[322,62435,62438],{"href":62436,"rel":62437},"https:\u002F\u002Foxylabs.io\u002F",[2245],"Oxylabs",[83,62440,62441,62443],{},[29,62442,62362],{}," Expensive and may require technical assistance to manage effectively.",[21,62445,62217],{"id":62446},"how-to-make-no-code-web-scrapers-with-axiomai",[14,62448,62449],{},"Let’s keep this simple so you can get started quickly; I will assume you have axiom.ai installed already.",[14,62451,62452],{},"I'll walk you through design patterns for common use cases. You can quickly replicate them using the step finder in the builder and customize them to suit your needs.",[14,62454,62455,62456,62459],{},"For an even easier setup, I’ll include links to ",[322,62457,325],{"href":62458},"\u002Fguides\u002F",". Once your scraper is ready, just click run to get started.",[555,62461,62462,62468,62474,62477,62483],{},[83,62463,62464,62465,44],{},"How to get started ",[322,62466,62467],{"href":19716},"web scraping",[83,62469,62470,62471,62473],{},"How to use the ",[322,62472,48366],{"href":19499}," to choose an element to scrape.",[83,62475,62476],{},"How to use the [No-code tool](\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder.",[83,62478,62479,62480,44],{},"How to ",[322,62481,62482],{"href":2670},"pass data between steps",[83,62484,62479,62485,44],{},[322,62486,62488],{"href":62487},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Frun","run your web scrapers",[639,62490,62492],{"id":62491},"_1-scrape-links-from-a-listing-page","1. Scrape links from a listing page",[592,62494],{"src":62495,"alt":62496},"\u002Fblog\u002Ftest-get-links.png","axiom.ai design pattern for scraping links from listing pages",[14,62498,62499],{},"Create your first no-code web scraper in just a few seconds! This scraper will extract a list of links and save them to a Google Sheet. Open axiom.ai's [no-code bot builder](\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fbuilder, then add the steps visualized above, replicating and configuring them as you go.",[14,62501,62502,62503,62505],{},"If you feel like cheating, we have a ",[322,62504,514],{"href":15981}," you can try.",[639,62507,62509],{"id":62508},"_2-loop-through-urls-scraping-web-pages","2. Loop through URLs, scraping web pages",[592,62511],{"src":62512,"alt":62513},"\u002Fblog\u002Fpage-scraper.webp","axiom.ai design pattern for scraping web pages",[14,62515,62516],{},"An everyday use case is looping through a list of URLs in a Google Sheet, scraping data from the pages, and writing it to a Google Sheet. To do this, add and configure the steps illustrated above. This scraper is best suited to webpages that share a standard template with structured data, like product pages in an e-commerce store.",[14,62518,62519,62520,62522],{},"Give the ",[322,62521,514],{"href":15981}," a try.",[639,62524,62526],{"id":62525},"_3-loop-through-urls-scraping-web-pages-using-ai-to-extract-unstructured-data","3. Loop through URLs, scraping web pages using AI to extract unstructured data.",[592,62528],{"src":62529,"alt":62530},"\u002Fblog\u002Fai-scraper.webp","axiom.ai design pattern for scraping unstructured data",[14,62532,62533],{},"This is a web scraper design pattern for extracting unstructured data. It will loop through URLs, scrape the body, and then use ChatGPT to extract the data you specify. This scraper works great when page layouts vary or when scraping multiple websites. You will need your own ChatGPT account and API key.",[14,62535,62536,62537,44],{},"To set this template up, you will need to scrape the \"body\" text or HTML. Use the options found in the step \"Page HTML\" or \"Page text .\" Alternatively, try the ",[322,62538,514],{"href":15981},[639,62540,62542],{"id":62541},"_4-extract-and-download-files","4. Extract and download files",[592,62544],{"src":62545,"alt":62546},"\u002Fblog\u002Ftemplate-file-downloader.webp","axiom.ai design pattern for downloading files",[14,62548,62549,62550,44],{},"Another common use case for web scraping is extracting files. This design template shows how you can use a bot to download files to a specified folder on your computer. You can try the template ",[322,62551,19857],{"href":10670},[21,62553,62223],{"id":62554},"running-your-web-scrapers",[14,62556,62557,62558,62560],{},"When you build your scraper with axiom.ai, the infrastructure is fully set up and managed for you. It's as simple as clicking run! You can ",[322,62559,784],{"href":62487}," your bots on the desktop, in the cloud, or on your own VPS.",[14,62562,62563,62564,62567,62568,62572,62573,62577,62578,62581],{},"Depending on your ",[322,62565,62566],{"href":3340},"subscription",", you can also run ",[322,62569,62571],{"href":62570},"\u002Fdocs\u002Ftutorials\u002Fadvanced-running-methods","multiple bots"," in the cloud and ",[322,62574,62576],{"href":62575},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run\u002Fautomation","schedule"," them on your desktop, VPS, or cloud setup. If you need custom infrastructure solutions, feel free to contact our ",[322,62579,62580],{"href":486},"support team"," with your requirements.",[21,62583,61979],{"id":62584},"bot-blocking",[14,62586,62587],{},"One of the most frustrating parts of web scraping is spending time building and perfecting your scraper, only to have it blocked by anti-bot measures. The website may stop loading and display a turnstile or CAPTCHA request instead. Thankfully, there are simple steps you can take to bypass these obstacles.",[555,62589,62590,62597,62603,62610,62618],{},[83,62591,62592,62593,44],{},"Try this if you encounter turnstile blocking by ",[322,62594,62596],{"href":62595},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fbypass-bot-detection#select-the-method-to-bypass-bot-blocking","Cloudflare",[83,62598,62599,62600,62602],{},"Integrate with the ",[322,62601,6548],{"href":6547}," service if you hit the traditional captcha.",[83,62604,62605,62606,62609],{},"Turn on ",[322,62607,62608],{"href":6540},"cookie sharing"," to share your session in the cloud.",[83,62611,62612,62613,62617],{},"For ",[322,62614,62616],{"href":62615},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Fchrome\u002Fprofile","Chrome Profile"," sharing, try this.",[83,62619,62620,62621,44],{},"Try this to add your custom ",[322,62622,51723],{"href":51834},[21,62624,62626],{"id":62625},"other-useful-features","Other useful features",[14,62628,62629],{},"axiom.ai offers a host of other features worth exploring. If you want to dive deeper into no-code web scraping and master axiom.ai, these resources might be helpful:",[555,62631,62632,62638,62645,62651],{},[83,62633,62634,62637],{},[322,62635,62636],{"href":380},"Custom CSS Selectors",": Learn how to target specific elements on a page for precise scraping.",[83,62639,62640,62644],{},[322,62641,62643],{"href":62642},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fget-data\u002Fconfiguring-your-scraper#number-of-attempts-when-results-not-found","Optimizing Scraper Speed",": Tips to make your scrapers faster and more efficient.",[83,62646,62647,62650],{},[322,62648,62649],{"href":11865},"Learn to Loop",": Master looping through lists or multiple pages for larger-scale scraping.",[83,62652,62653,62657],{},[322,62654,62656],{"href":62655},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogic","Using logic",": Master using logic in your no-code web scrapers.",[21,62659,796],{"id":795},[14,62661,62662],{},"Web scraping has evolved from a developer-exclusive skill to something anyone can do with no-code tools like axiom.ai. These tools also tackle the complex problems in web scraping, like bot detection and scalability, while simplifying setup and customization.",[14,62664,62665],{},"We covered:",[80,62667,62668,62671,62674,62677],{},[83,62669,62670],{},"The everyday challenges of web scraping.",[83,62672,62673],{},"How no-code tools now rival coded solutions",[83,62675,62676],{},"Practical design patterns and templates for tasks such as extracting links, looping through URLs, handling unstructured data, and downloading files.",[83,62678,62679],{},"Advanced features like bot-blocking and custom infrastructure options.",[14,62681,62682],{},"Have all the challenges been solved? Not yet. However, no-code tools have sped up the process, making web scraping easier. Whether handling small datasets or tackling large-scale projects, axiom.ai provides everything you need, but like anything new, there's a learning curve.",[14,62684,62685,62686,44],{},"Please share your input if you are a power scraper, coder or no-coder. Above all, we value our users and do our utmost to build the features you need. Please share features or feedback that can ",[322,62687,62688],{"href":486},"help shape axiom.ai",[344,62690],{},[11,62692],{},[14,62694,62695,62697],{},[344,62696],{},[807,62698,62699,62700,44],{},"Have you any tips and tricks you've learned while using axiom.ai to help others? We would love to hear from you over in our ",[322,62701,3326],{"href":8928,"rel":62702},[2245],{"title":494,"searchDepth":495,"depth":495,"links":62704},[62705,62706,62707,62712,62718,62719,62720,62721],{"id":62234,"depth":498,"text":62199},{"id":62278,"depth":498,"text":62279},{"id":62308,"depth":498,"text":62309,"children":62708},[62709,62710,62711],{"id":62324,"depth":495,"text":62325},{"id":62366,"depth":495,"text":62367},{"id":62408,"depth":495,"text":62409},{"id":62446,"depth":498,"text":62217,"children":62713},[62714,62715,62716,62717],{"id":62491,"depth":495,"text":62492},{"id":62508,"depth":495,"text":62509},{"id":62525,"depth":495,"text":62526},{"id":62541,"depth":495,"text":62542},{"id":62554,"depth":498,"text":62223},{"id":62584,"depth":498,"text":61979},{"id":62625,"depth":498,"text":62626},{"id":795,"depth":498,"text":796},"2025-01-09",{"read":48203,"type":513,"tool":62724,"category":62725,"tags":62726,"location":46733,"featuredimg":62730,"landingimg":62731,"summary":62732},[46728],[48207],[62727,58665,62728,62729],"scraper","bot blocking","scalability","\u002Fblog\u002Fno-code-web-scraping.webp","\u002Fblog\u002Fno-code-web-scraping-sq.webp","Discover why no-code tools are the smarter choice for web scraping and learn step-by-step how to create your own no-code web scraper effortlessly.","\u002Fblog\u002Fno-code-web-scraping",{"title":62171,"description":62176},"blog\u002Fno-code-web-scraping","LDAdnjW45gsCZUrsWTQwN_taps2imtpfxDAcE6Lyf2w",[48207],[513],[46728],{"id":62741,"title":62742,"author":48082,"body":62743,"date":63125,"description":63126,"draft":26250,"extension":506,"meta":63127,"navigation":522,"path":63135,"seo":63136,"stem":63137,"__hash__":63138,"pinned":-1,"category":63139,"type":63140,"tool":63141},"blog\u002Fblog\u002F5-methods-of-triggering-an-automation.md","5 Methods of Triggering an Automation",{"type":8,"value":62744,"toc":63116},[62745,62748,62751,62780,62783,62786,62789,62797,62800,62807,62809,62814,62817,62820,62826,62833,62835,62841,62848,62851,62866,62870,62881,62885,62888,62899,62905,62927,62930,62940,62947,62953,62955,62962,62965,62982,62987,62990,63013,63016,63022,63028,63032,63039,63052,63059,63065,63071,63075,63081,63089,63095,63099,63102],[18,62746],{"alt":62747},"Trigger axiom bots using APIs",[14,62749,62750],{},"Now that you have created your automation, it's time to learn about the different methods of triggering the automation. There are quite a few different methods of triggering your automations, which one you choose really depends on your use case and what works best for you and\u002For your team. We will review a few different methods of triggering your automations in this article:",[80,62752,62753,62759,62765,62770,62775],{},[83,62754,62755],{},[322,62756,62758],{"href":62757},"#manual","Manual",[83,62760,62761],{},[322,62762,62764],{"href":62763},"#scheduling","Scheduling",[83,62766,62767],{},[322,62768,3288],{"href":62769},"#zapier",[83,62771,62772],{},[322,62773,12139],{"href":62774},"#ifttt",[83,62776,62777],{},[322,62778,54245],{"href":62779},"#api-and-other-services",[14,62781,62782],{},"Each trigger method has it's own advantages and disadvantages and ultimately the one you choose will be determined by your needs. Let's dive into these methods and give a bit more detail to help you decide what works best for you.",[21,62784,62758],{"id":62785},"manual",[14,62787,62788],{},"Manually triggering your automations is one of the easiest ways to trigger your automation and requires no set up to get started. There are two methods of triggering your automation manually:",[555,62790,62791,62794],{},[83,62792,62793],{},"From the Builder, hit \"Run\".",[83,62795,62796],{},"From the Dashboard, hit \"Run\" on the automation you wish to run.",[14,62798,62799],{},"Manually triggering your automations has a lot of benefits, such as being able to test your automations and watch the run to diagnose any issues. This allows you to simplify a complex process into a single button click that can be run whenever you need.",[14,62801,62802],{},[807,62803,62804],{},[322,62805,62806],{"href":62487},"Documentation",[21,62808,62764],{"id":54331},[14,62810,62811,62812,3342],{},"Scheduling your automations increases the autonomy of your automations - say that fast 10 times in a row! This feature allows for the automatic triggering of your automations on a schedule that fits your needs. Availability and the frequency that you can set your schedule will depend on your current subscription plan, see ",[322,62813,50674],{"href":3340},[14,62815,62816],{},"Your scheduled automation can be set to start on a specific date and will continue to run at the frequency that you have set until you manually cancel the schedule. For example, if you set it to start on the 1st January at 1am with a frequency of 1 day, it'll first run on 1st of January at 1am, and then run every 24 hours after that.",[14,62818,62819],{},"To increase the autonomy of your automations, we run your scheduled automations on the cloud - this means that you don't need to have your computer turned on for the automation to run. This can be super helpful for doing behind the scenes tasks, like getting the previous days sales numbers so you can hit the ground running when you get into the office. We appreciate that there are times when you may wish to run these locally - you can change this at any time, but your computer will need to be turned on and your browser open for your automation to run successfully.",[14,62821,62822],{},[807,62823,62824],{},[322,62825,62806],{"href":62575},[14,62827,62828],{},[807,62829,62830,62831,3342],{},"This method of triggering automations uses paid features, see ",[322,62832,3341],{"href":3340},[21,62834,3288],{"id":48147},[14,62836,62837,62840],{},[322,62838,3288],{"href":48152,"rel":62839},[2245]," can be used to trigger your automations from a larger workflow. This allows you to access their library of over 7,000 integrations that can be used to pass information into an axiom.ai automation. Need to trigger an axiom.ai automation everytime a new lead comes into Salesforce? You can. Want to make a log of uploads to a YouTube channel? You can. Need to pull in order details from Amazon Seller Central into an axiom.ai automation? You guessed it - you can!",[14,62842,62843,62844,62847],{},"To get started, select your trigger from the list of apps available in Zapier and set up your Zapier flow like normal. For the example below, we are going to create a workflow that triggers an automation when there is a new post in our ",[322,62845,24359],{"href":8928,"rel":62846},[2245]," using an RSS feed. This automation will log the new post in a Google Sheet and trigger a Slack Workflow that'll notify our team of new posts.",[14,62849,62850],{},"Let's jump over to Zapier and do the following:",[555,62852,62853,62856,62863],{},[83,62854,62855],{},"Create a new \"Zap\".",[83,62857,62858,62859,62862],{},"Add the \"RSS\" app as the first step, set the \"Trigger event\" to \"New Item in Feed\" and configure as instructed - we are using ",[322,62860,55359],{"href":55359,"rel":62861},[2245]," RSS feed.",[83,62864,62865],{},"(Optional) Add a \"Filter\" step, and configure this to check the author name for anyone you may not want to be notified of posts from - in our case, we don't need notifications when we share new content!",[592,62867],{"src":62868,"alt":62869},"\u002Fblog\u002Freddit-filter-conditions.png","reddit step configuration showing \u002Fu\u002Fkarl_axiom filtered out",[555,62871,62872,62875,62878],{"start":1895},[83,62873,62874],{},"Add another step and search for \"axiom.ai\", set the \"Action event\" to \"Run an Axiom\".",[83,62876,62877],{},"Configure as instructed, setting the automation name to match the name of your automation within the extension and setting the output from the \"RSS\" step into your column inputs using the \"+\" on the right of each \"Input column\".",[83,62879,62880],{},"Click \"Publish\" when you are ready.",[592,62882],{"src":62883,"alt":62884},"\u002Fblog\u002Freddit-run-an-axiom-rss.png","reddit step configuration showing run an axiom configuration",[14,62886,62887],{},"Now, let's jump over to your axiom.ai automation.",[555,62889,62890,62893],{},[83,62891,62892],{},"Create a new automation.",[83,62894,62895,62896,62898],{},"Add the ",[322,62897,8895],{"href":6958}," step, configure the \"Test data\" input with a sample of the data you expect to receive. For our example, we used the following to replicate the data we are expecting: \"title, link, description, author\".",[14,62900,62901,62902,62904],{},"From this point, you can add any steps that you'd like to use within your automation to get to your end goal. Use the \"Insert data\" option to access the data that was received by the \"Receive data from another app\" step. For multiple rows, you will need to use a ",[322,62903,114],{"href":2296}," step to loop through each row of data to use the data within other steps. We have a few more things to add to complete our Reddit notifier.",[555,62906,62907,62915,62924],{"start":495},[83,62908,8350,62909,62911,62912,62914],{},[322,62910,3303],{"href":3302}," step, configure as instructed and click \"Insert data\" to select the ",[90,62913,24800],{}," from the dropdown - this will push the data received by the automation into your Google Sheet.",[83,62916,62917,62918,62920,62921,44],{},"We want to send this along to our customer support team to ensure that our users get the support they need, add a ",[322,62919,7722],{"href":18400}," step to send your data to a Slack Workflow. For more details on setting up the Slack Workflow, see our guide on ",[322,62922,62923],{"href":21216},"How to trigger a Slack Workflow with axiom.ai",[83,62925,62926],{},"Click \"Save\" when you're ready.",[14,62928,62929],{},"Now, head over to your Zap and hit \"Run\" to test, or create a new post on the subreddit.",[14,62931,62932,62933,62936,62937,62939],{},"Keep an eye out in Zapier for any errors that may have occurred and follow their instructions to resolve the issues. If the issue has occurred within axiom.ai, you'll find this error noted in the ",[322,62934,59461],{"href":62935},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fdashboard#run-reports"," of the automation. See our ",[322,62938,3313],{"href":3312}," guide for helpful tips on debugging your automations.",[14,62941,62942],{},[807,62943,62944],{},[322,62945,62806],{"href":62946},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fzapier",[14,62948,62949],{},[807,62950,62830,62951,3342],{},[322,62952,3341],{"href":3340},[21,62954,12139],{"id":48093},[14,62956,62957,62958,62961],{},"Similar to Zapier, ",[322,62959,12139],{"href":12137,"rel":62960},[2245]," unlocks a massive library of over 900 services that you can use to automate workflows and trigger your axiom.ai automations. Where IFTTT differs is in the services that it connects to - they offer various connections to social media platforms, such as Facebook, LINE, and Instagram, as well as IoT services like Hue, Honeywell, and Govee. You are only limited by your imagination when you combine axiom.ai and IFTTT.",[14,62963,62964],{},"Here are some ideas on how to use IFTTT and axiom.ai to get you started,",[80,62966,62967,62972,62977],{},[83,62968,62969,62970,1230],{},"Keeping a log of app updates using the IFTTT Apple App Store integration and axiom.ai's ",[322,62971,3303],{"href":3302},[83,62973,62974,62975,44],{},"Trigger an automation using the Alexa integration and axiom.ai's ",[322,62976,54245],{"href":53272},[83,62978,62979,62980,44],{},"Re-post and log your LinkedIn posts using the LinkedIn integration and axiom.ai's ",[322,62981,325],{"href":324},[14,62983,62984,62985,3342],{},"While axiom.ai does not have an official integration with IFTTT, triggering your automations is simple. See our guide on ",[322,62986,12128],{"href":12691},[14,62988,62989],{},"To get started, create your IFTTT workflow as normal - selecting a service you'd like to trigger your axiom.ai automation from for the \"If this\" portion of your workflow. In order to trigger your axiom.ai automation, you'll need to add a \"Webhooks\" action to your IFTTT flow. You'll need to configure this action as per the instructions below:",[555,62991,62992,62997,63002,63008],{},[83,62993,62994,62995,44],{},"Set the \"URL\" to our current endpoint: ",[90,62996,581],{},[83,62998,62999,63000,44],{},"Set the \"Method\" to ",[90,63001,627],{},[83,63003,63004,63005,44],{},"Set the \"Content type\" to ",[90,63006,63007],{},"application.json",[83,63009,63010,63011,12252],{},"Configure the \"Request body\" as per our ",[322,63012,12251],{"href":6720},[14,63014,63015],{},"Adding data from your trigger into the \"Request body\" field will allow you to send information from your service of choice for use within your axiom.ai automation.",[14,63017,63018],{},[807,63019,63020],{},[322,63021,62806],{"href":12691},[14,63023,63024],{},[807,63025,62830,63026,3342],{},[322,63027,3341],{"href":3340},[21,63029,63031],{"id":63030},"api-and-other-services","API and other services",[14,63033,63034,63035,63038],{},"In addition to our official Zapier and Make integrations, we offer the ability to trigger your axiom.ai automations from nearly any third-party service that offers the ability to send outbound webhooks. Using the ",[322,63036,63037],{"href":324},"axiom.ai API",", you can send data from a third-party service to be used within your automations. Common uses cases of this include:",[80,63040,63041,63044,63047],{},[83,63042,63043],{},"Connecting a service that we have yet to build an integration for.",[83,63045,63046],{},"Connecting to internal services that your organisation utilises.",[83,63048,63049,63050,6237],{},"Writing custom scripts that trigger your automations, batch files using ",[322,63051,54391],{"href":7029},[14,63053,63054,63055,63058],{},"Want to request a new integration? Add your thoughts to our ",[322,63056,62135],{"href":62105,"rel":63057},[2245]," over on Reddit.",[14,63060,63061],{},[807,63062,63063],{},[322,63064,62806],{"href":53272},[14,63066,63067],{},[807,63068,62830,63069,3342],{},[322,63070,3341],{"href":3340},[21,63072,63074],{"id":63073},"final-thoughts","Final thoughts",[14,63076,63077,63078,1230],{},"While each method does have it's advantages and disadvantages, there are some things that you should be aware of when using an integration, the API or a schedule - as automations that are triggered using these methods are run in the cloud by default, this means that you are unable to use steps that require the desktop application, such as the ",[322,63079,63080],{"href":7612},"Download a file",[14,63082,63083,63084,63088],{},"We have a guide available for running your automations that are triggered by an integration or the API on your local computer, see ",[322,63085,63087],{"href":63086},"\u002Fguides\u002Ftrigger-desktop","How to trigger a desktop run using webhooks"," for more details. Your computer will need to be turned on and your browser will need to be open for the automations to run. This is ideal for running your axiom.ai instance on a server.",[14,63090,63091,63092,46258],{},"When running your automations unattended, we recommend setting up run notifications to be alerted if your automation has an error - this will ensure that you can step in and fix the issues with your automation. Notifications can be sent via email or they can trigger a webhook to be consumed by another service. See ",[322,63093,63094],{"href":21046},"Learn how to set up notifications",[21,63096,63098],{"id":63097},"additional-reading","Additional reading",[14,63100,63101],{},"Want to dive into more content? Check out our guides below.",[80,63103,63104,63111],{},[83,63105,63106,63107],{},"Integrations: ",[322,63108,63110],{"href":63109},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations","\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002F",[83,63112,63113,63114],{},"API\u002Fthird-party service guides: ",[322,63115,62458],{"href":324},{"title":494,"searchDepth":495,"depth":495,"links":63117},[63118,63119,63120,63121,63122,63123,63124],{"id":62785,"depth":498,"text":62758},{"id":54331,"depth":498,"text":62764},{"id":48147,"depth":498,"text":3288},{"id":48093,"depth":498,"text":12139},{"id":63030,"depth":498,"text":63031},{"id":63073,"depth":498,"text":63074},{"id":63097,"depth":498,"text":63098},"2024-11-22","Learn five methods of triggering an axiom.ai automation. From manually triggering your run, setting up a schedule or triggering it from a third-party service.",{"read":56152,"type":513,"tool":63128,"category":63129,"tags":63130,"location":46733,"featuredimg":48209,"landingimg":48210,"summary":63126,"video":523,"metaTitle":62742,"related":63131},[48205],[50552],[829,830,62576,12139,48147,48173],[63132,63133,63134],{"path":53385,"format":58394},{"path":59395,"format":58394},{"path":59750,"format":58394},"\u002Fblog\u002F5-methods-of-triggering-an-automation",{"title":62742,"description":63126},"blog\u002F5-methods-of-triggering-an-automation","dRHuvwgcMKsn6KFDFUWmm3_gKZN406z93egDQhMtpGg",[50552],[513],[48205],{"id":63143,"title":63144,"author":48082,"body":63145,"date":63496,"description":63497,"draft":26250,"extension":506,"meta":63498,"navigation":522,"path":63506,"seo":63507,"stem":63508,"__hash__":63509,"pinned":-1,"category":63510,"type":63511,"tool":63512},"blog\u002Fblog\u002Fdebugging-like-a-pro.md","Debugging your browser automations like a pro",{"type":8,"value":63146,"toc":63480},[63147,63150,63153,63157,63160,63167,63171,63174,63178,63184,63188,63191,63195,63205,63209,63218,63222,63228,63231,63235,63239,63260,63275,63281,63331,63340,63344,63347,63351,63354,63358,63369,63376,63379,63393,63397,63401,63410,63414,63417,63423,63429,63435,63441,63445,63464,63466,63468,63478],[14,63148,63149],{},"As you begin to explore the world of browser automation you are likely to run into errors and issues with your automations - this is completely normal and is part of the learning process. Understanding the errors and issues that you are facing is key to being able to get back on track when something goes wrong.",[18,63151],{"alt":63152},"Learn to debug your browser automations",[21,63154,63156],{"id":63155},"what-is-debugging","What is debugging?",[14,63158,63159],{},"Debugging is the process of identifying, analyzing, and fixing errors or issues within a software program, or automation, to ensure it runs smoothly and functions as intended. It involves detecting where the code or automation fails or behaves unexpectedly and making the necessary corrections to improve performance and reliability.",[14,63161,63162,63163,63166],{},"In the context of automations, we want to understand which step has caused the issue, and why. For example, you may have a ",[322,63164,63165],{"href":6242},"get data from bot's current page"," step that has returned the error \"your chosen selectors have failed to find any content on page \u002F element not found\" - this tells us which step to review, and what went wrong, in this case, that the selected element was not found when the automation has run.",[21,63168,63170],{"id":63169},"what-is-error-handling","What is error handling?",[14,63172,63173],{},"Error handling is the process of anticipating, detecting, and responding to errors in a software program, or automation, to ensure it runs smoothly and can recover gracefully from unexpected issues. We want to be sure that if your automation runs into an error that it can be handled gracefully and prevent the automation from failure.",[21,63175,63177],{"id":63176},"why-is-debugging-and-error-handling-important","Why is debugging and error handling important?",[14,63179,63180,63181,63183],{},"Debugging and error handling is an underrated but very important part of building software, and building out your automations. While debugging is more concerned with getting back on track once an error has occurred, error handling can be used to gracefully handle errors ",[807,63182,59586],{}," they occur within your workflow. Knowing what to do when an error occurs can save a lot of time and effort compared to a trial-and-error method that looks a lot like finding a needle in a haystack.",[21,63185,63187],{"id":63186},"proactive-debugging-methods","Proactive debugging methods",[14,63189,63190],{},"There are steps that you can take before you run into errors in order to proactively prevent your automation from failing during it's runs. Investing time to implement preventative methods early in your development process can save time and effort in the longrun. Some of these actions may include catching errors during he run, adding additional data to your errors or logging debug information with JavaScript.",[21,63192,63194],{"id":63193},"optional-actions","Optional actions",[14,63196,63197,63198,63201,63202,1230],{},"There are a couple of steps that allow you to set their action to \"optional\". This can be used if you are working with an element on the page that is sometimes present, sometimes not. This can be useful to dismiss cookie popups, for example, as these may not always appear in every run. This will prevent your automation from failing if the button can not be found on the page when the automation is run. This option can be toggled within the ",[322,63199,63200],{"href":6378},"click element"," step, and soon the ",[322,63203,63204],{"href":7600},"enter text",[21,63206,63208],{"id":63207},"catching-errors-during-runs","Catching errors during runs",[14,63210,5070,63211,63214,63215,63217],{},[322,63212,63213],{"href":6250},"try\u002Fcatch"," step can be used to wrap steps that may cause an issue within your automation. Any steps included in the \"try\" section of this step will run as normal, however, if an error occurs this will trigger the steps that have been included in the \"catch\" section and your automation will not fail. There are various use cases for this, including running an additional set of steps if an error occurs because an interaction step cannot find an element on the page, catching an error from a ",[322,63216,16730],{"href":2300}," step, and catching errors from file handling steps to name a few.",[21,63219,63221],{"id":63220},"adding-error-metadata","Adding error metadata",[14,63223,5070,63224,63227],{},[322,63225,63226],{"href":21025},"add error metadata"," step can be used to add additional context to your errors. When placed before an step that could potentially run into an issue this gives you the opportunity to add a custom message to your errors. This can be helpful in automations that may have multiple versions of the same steps that carry out similar functions.",[14,63229,63230],{},"This step may be used to output the value of a variable token that you are passing into a step - in the event of an error in the step that you are passing data to, the data will be output within the error message. Being able to view the data that you are passing into a step can be really helpful in understanding why the step may have had an error.",[592,63232],{"src":63233,"alt":63234},"\u002Fblog\u002Ferror-add-error-metadata.jpg","automation add error metadata step",[21,63236,63238],{"id":63237},"debugging-with-javascript","Debugging with Javascript",[14,63240,63241,63242,63245,63246,63248,63249,63251,63252,63255,63256,63259],{},"When running your automations locally, you have access to the ",[90,63243,63244],{},"console.log()"," function, and all variants of it, through the ",[322,63247,16730],{"href":2300}," step. This can be used to output the tokens from your automation as the automation runs - you can use the ",[29,63250,9366],{}," option to insert your tokens into your JavaScript code. When your automation opens in a new Chromium window, right-click on the page, click ",[29,63253,63254],{},"inspect"," and navigate to the ",[29,63257,63258],{},"console"," tab.",[719,63261,63263],{"className":756,"code":63262,"language":758,"meta":494,"style":494},"\u002F\u002F Output scrape data\nconsole.log([scrape-data])\n",[90,63264,63265,63270],{"__ignoreMap":494},[727,63266,63267],{"class":729,"line":730},[727,63268,63269],{},"\u002F\u002F Output scrape data\n",[727,63271,63272],{"class":729,"line":498},[727,63273,63274],{},"console.log([scrape-data])\n",[14,63276,63277,63278,63280],{},"When combined with JavaScript code, this can be an even more powerful tool for debugging. From manipulating data, requesting information from APIs or working with the node.js filesystem API, you can use ",[90,63279,63244],{}," to keep track of the information that you are working with to help you debug your automations. For example, if you are adding a constant to the last column within a dataset of data that has been scraped from a page, you may wish to view the data before and after it's been manipulated and before it's passed onto the next step. See how we implemented this below:",[719,63282,63284],{"className":756,"code":63283,"language":758,"meta":494,"style":494},"var scrapeData = [scrape-data];\nvar data = 'example';\n\nconsole.log(scrapeData);\n\nscrapeData.forEach((item) => item.push(data));\n\nconsole.log(scrapeData);\n\nreturn scrapeData;\n",[90,63285,63286,63291,63296,63300,63305,63309,63314,63318,63322,63326],{"__ignoreMap":494},[727,63287,63288],{"class":729,"line":730},[727,63289,63290],{},"var scrapeData = [scrape-data];\n",[727,63292,63293],{"class":729,"line":498},[727,63294,63295],{},"var data = 'example';\n",[727,63297,63298],{"class":729,"line":495},[727,63299,1898],{"emptyLinePlaceholder":522},[727,63301,63302],{"class":729,"line":1895},[727,63303,63304],{},"console.log(scrapeData);\n",[727,63306,63307],{"class":729,"line":1901},[727,63308,1898],{"emptyLinePlaceholder":522},[727,63310,63311],{"class":729,"line":1973},[727,63312,63313],{},"scrapeData.forEach((item) => item.push(data));\n",[727,63315,63316],{"class":729,"line":2052},[727,63317,1898],{"emptyLinePlaceholder":522},[727,63319,63320],{"class":729,"line":2058},[727,63321,63304],{},[727,63323,63324],{"class":729,"line":2064},[727,63325,1898],{"emptyLinePlaceholder":522},[727,63327,63328],{"class":729,"line":2087},[727,63329,63330],{},"return scrapeData;\n",[14,63332,63333],{},[807,63334,63335,63336,63339],{},"Tip: you may require a ",[322,63337,63338],{"href":1292},"wait"," step at the end of your automation to ensure that you have time to review the console.",[21,63341,63343],{"id":63342},"reactive-debugging-methods","Reactive debugging methods",[14,63345,63346],{},"Sometimes we come across errors that we are not anticipating during automation runs and we will need to debug on-the-fly in order to get the automation running as we want it to. These will often cause the automation to fail, but can be used as a learning experience. There are various methods that can be used, including reviewing error messages as they occur or reviewing run reports that have been generated by your runs.",[21,63348,63350],{"id":63349},"in-builder-error-messages-and-debugger","In-builder error messages and debugger",[14,63352,63353],{},"If you have the builder open when you are running your automation, you will see errors popup at the top of the builder detailing what went wrong.",[592,63355],{"src":63356,"alt":63357},"\u002Fblog\u002Ferror-report.jpg","automation error report",[14,63359,63360,63361,63364,63365,63368],{},"You'll also find the debugger within the builder, there are a couple of methods of opening this: in the overflow menu on the top-right of the builder, click ",[29,63362,63363],{},"debugger",", or click ",[29,63366,63367],{},"debug"," on any error messages that appear in the builder. The side panel that appears will give you more contact on the error that you have within your automation - including the step number that encountered the issue.",[14,63370,63371,63372,63375],{},"For longer automations, you can toggle on the ",[29,63373,63374],{},"only show errors"," option to only show the steps with errors - there is often only one as the automation will stop when it encounters an error, but you may find some additional warnings that may help diagnose the issue.",[21,63377,7831],{"id":63378},"run-reports",[14,63380,63381,63382,63385,63386,63388,63389,63392],{},"Every automation run produces a ",[322,63383,63384],{"href":791},"run report"," that can be found within the ",[29,63387,792],{}," section of your dashboard in the axiom.ai Chrome extension. When an automation fails due to an error, or succeeds with warnings, these will show within your run report. From the run reports section of the dashboard, hit ",[29,63390,63391],{},"full report"," to learn more about the errors or warnings.",[592,63394],{"src":63395,"alt":63396},"\u002Fblog\u002Ferror-run-report.jpg","automation run report showing error",[21,63398,63400],{"id":63399},"displaying-variable-tokens-in-a-popup","Displaying variable tokens in a popup",[14,63402,5070,63403,63406,63407,63409],{},[322,63404,63405],{"href":2989},"display a message"," step is a small but powerful step for debugging, it allows you to output data as a popup within the builder so that you can see see the contents of a variable token. You can add a token to this step by clicking ",[29,63408,9366],{}," and selecting the variable token that you would like to display. This will display as a table when you insert a variable token and can be helpful when trying to visualize the data that you have within your automation, scrape data is a good example of data that could be displayed this way but any token may be used.",[21,63411,63413],{"id":63412},"understanding-the-structure-of-errors","Understanding the structure of errors",[14,63415,63416],{},"Understanding the structure of errors is an important skill to have, let's dive into the format of an axiom.ai error message and break it down into it's constitute parts.",[719,63418,63421],{"className":63419,"code":63420,"language":16520},[16518],"Error in step 4 - \"Enter text\": Couldn't find the element during run. Please reselect this element in the selector tool or use a custom selector.\n",[90,63422,63420],{"__ignoreMap":494},[14,63424,63425,63428],{},[29,63426,63427],{},"Error in step 4"," - there has been an error in step 4 of your automation, this give us a good start on where to look for any issues.",[14,63430,63431,63434],{},[29,63432,63433],{},"\"Enter text\": Couldn't find the element during run"," - the error message is telling us what went wrong, in this instance, that the element that has been selected has not been found on the page. This may be due to the page not loading correctly, or changing since the automation was set up.",[14,63436,63437,63440],{},[29,63438,63439],{},"Please reselect this element in the selector tool or use a custom selector"," - this is advice on how to resolve the error that has occurred - for this particular error we may need to revisit step 4 and re-select the elements on the page.",[21,63442,63444],{"id":63443},"finding-information-on-common-errors","Finding information on common errors",[14,63446,63447,63448,63451,63452,63455,63456,63459,63460,63463],{},"You can read up more on our common errors in our comprehensive ",[322,63449,63450],{"href":2203},"list of errors",", through our ",[322,63453,3326],{"href":3324,"rel":63454},[2245]," for free users, or by contacting ",[322,63457,63458],{"href":486},"customer support"," if you are a paid subscriber. You can also find our full documentation on ",[322,63461,63462],{"href":3312},"how to debug"," in our help center.",[344,63465],{},[11,63467],{},[14,63469,63470,63472],{},[344,63471],{},[807,63473,63474,63475,44],{},"Have you any tips and tricks that you have learned while using axiom.ai that you think would help other users? We would love to hear from you over in our ",[322,63476,3326],{"href":8928,"rel":63477},[2245],[811,63479,4898],{},{"title":494,"searchDepth":495,"depth":495,"links":63481},[63482,63483,63484,63485,63486,63487,63488,63489,63490,63491,63492,63493,63494,63495],{"id":63155,"depth":498,"text":63156},{"id":63169,"depth":498,"text":63170},{"id":63176,"depth":498,"text":63177},{"id":63186,"depth":498,"text":63187},{"id":63193,"depth":498,"text":63194},{"id":63207,"depth":498,"text":63208},{"id":63220,"depth":498,"text":63221},{"id":63237,"depth":498,"text":63238},{"id":63342,"depth":498,"text":63343},{"id":63349,"depth":498,"text":63350},{"id":63378,"depth":498,"text":7831},{"id":63399,"depth":498,"text":63400},{"id":63412,"depth":498,"text":63413},{"id":63443,"depth":498,"text":63444},"2024-11-07","Learn how to debug your axiom.ai automations like a pro by understanding error messages and using error handling steps to fix errors and issues within your automation.",{"metaTitle":63144,"read":53987,"type":513,"tool":63499,"category":63500,"tags":63501,"location":46733,"featuredimg":63504,"landingimg":63505,"summary":63497,"video":523},[46728],[50552],[55266,8316,63502,4887,63503],"try catch","debugging","\u002Fblog\u002Fdebugging-postbox.jpg","\u002Fblog\u002Fdebugging-sq.jpg","\u002Fblog\u002Fdebugging-like-a-pro",{"title":63144,"description":63497},"blog\u002Fdebugging-like-a-pro","42NCq1gVjvmeJEf3VZhJlGtQWZlyPKb-cpvpNYhw4Cc",[50552],[513],[46728],{"id":63514,"title":63515,"author":46205,"body":63516,"date":63937,"description":63938,"draft":26250,"extension":506,"meta":63939,"navigation":522,"path":63949,"seo":63950,"stem":63951,"__hash__":63952,"pinned":-1,"category":63953,"type":63954,"tool":63955},"blog\u002Fblog\u002Fui-automation.md","Is UI Automation just about testing or is there more to it?",{"type":8,"value":63517,"toc":63912},[63518,63521,63524,63527,63530,63534,63537,63540,63544,63547,63550,63553,63557,63560,63564,63567,63571,63574,63578,63581,63590,63593,63597,63601,63615,63620,63631,63639,63642,63646,63650,63661,63665,63676,63683,63686,63690,63694,63704,63708,63717,63721,63724,63730,63733,63737,63741,63755,63759,63767,63775,63778,63782,63786,63803,63807,63818,63826,63829,63833,63837,63852,63856,63866,63868,63872,63875,63898,63902,63905,63909],[14,63519,63520],{},"UI Automation is used to test website applications to ensure that when we come to use the software, it is working correctly and will perform the tasks we carry out via pointing and clicking.",[14,63522,63523],{},"But did you know those same principles and ideas can be used not just to test if a user interface is working, but also to automate the processes you do via the UI?",[18,63525],{"alt":63526},"How to automate the ui in chrome",[14,63528,63529],{},"UI automation can be used to test apps, but it can also be an alternative to API automation. In fact, you can use UI automation to automate your repetitive work on the desktop or in the browser via the UI. In this article, we will explore what UI automation is, the types of automation, and the different ui automation tools we can use.",[21,63531,63533],{"id":63532},"what-is-ui-automation","What is UI Automation",[14,63535,63536],{},"Web UI automation involves automating interactions with the graphical user interface (GUI) of an application on a website or desktop. That's right—UI automation uses software to replicate the clicks and interactions we perform, just like we would. Why would we want to do this? Originally, its primary use was to test applications to ensure that new features worked correctly, safeguarding against the release of bad code that could negatively affect a business.",[14,63538,63539],{},"While humans can perform these tests, using software is quicker and more efficient. For decades, software has been used to test and ensure the quality of applications. Innovators like axiom.ai realized that if bots could replicate our actions for testing, they could also be used to automate repetitive tasks. The apple had fallen from the tree: UI automation could free us from boring, repetitive tasks.",[21,63541,63543],{"id":63542},"what-can-you-use-ui-automation-for","What Can You Use UI Automation For?",[14,63545,63546],{},"So we know what UI automation is, but what cool things can we do with it? If you want to test an application or website, UI automation can be used to replicate human interactions. For example, you could build an automation to buy a product and check out on an e-commerce website. This is great for being able to test and ensure your checkout process is working.",[14,63548,63549],{},"But UI automation, as I mentioned, can do so much more. When used to automate work in the browser, the possibilities are almost endless. If an app has a UI, it can be automated, meaning we can virtually automate any task, whether it be in an app like a tax software or a social media platform. If there is a button or a series of actions you repeat, it's very likely you can automate your UI to do it for you.",[14,63551,63552],{},"And we have done just that. We have created UI automations to send DMs on Instagram, update shipping information in a logistics application, enter data into a CRM, and even to create websites in Webflow.",[21,63554,63556],{"id":63555},"how-to-go-about-ui-automation","How to go about UI automation",[14,63558,63559],{},"Like most things their is more than one way to do something UI automation is no different. The log and short of it is either you can learn to code and create UI automations programmatically or you can use Tools to create your automations. I would recommend choosing a tool over coding UI automations. Why simple because its quicker and easier to do at scale. Why build from scratch when someones made a tool to do the job. Sorry but I like being lazy.",[21,63561,63563],{"id":63562},"what-ui-automation-languages-are-there","What UI Automation languages are there?",[14,63565,63566],{},"If you are interest in coding an automation then you will not go wrong learning on of these automation first languages. There so many great online tutorials now and even chatGPT to help you learn. If you are determined to learn language which is not a bad thing I would go for Python, its a popular language and is not just used for automation.",[21,63568,63570],{"id":63569},"how-to-approach-ui-automation","How to Approach UI Automation",[14,63572,63573],{},"Like most things, there is more than one way to do UI automation. The long and short of it is that you can either learn to code and create UI automations programmatically or you can use tools to create your automations. I would recommend choosing a tool over coding UI automations. Why? Simply because it's quicker and easier to do at scale. Why build from scratch when someone has already made a tool to do the job? Sorry, but I like being lazy.",[21,63575,63577],{"id":63576},"what-ui-automation-languages-are-there-1","What UI Automation Languages Are There?",[14,63579,63580],{},"If you are interested in coding an automation, you can't go wrong learning one of these automation-first languages. There are so many great online tutorials now, and even ChatGPT can help you learn. If you are determined to learn a language, which is not a bad thing, I would go for Python. It's a popular language and is used for much more than just automation.",[639,63582,63584,63585],{"id":63583},"ui-automation-python","UI automation ",[322,63586,63589],{"href":63587,"rel":63588},"https:\u002F\u002Fwww.python.org",[2245],"Python",[14,63591,63592],{},"Python is a versatile and popular programming language widely used for automation, web development, data analysis, and more. It boasts a clean syntax and an extensive library ecosystem, making it an excellent choice for both beginners and experienced developers.",[592,63594],{"src":63595,"alt":63596},"\u002Fblog\u002Fui-automation-python.png","ui automation programming language python",[14,63598,63599],{},[29,63600,62341],{},[80,63602,63603,63606,63609,63612],{},[83,63604,63605],{},"Easy to learn and use, with a clean and readable syntax",[83,63607,63608],{},"Extensive library support, including libraries specifically for UI automation like Selenium, PyAutoGUI, and BeautifulSoup",[83,63610,63611],{},"Strong community support and abundant resources for learning and troubleshooting",[83,63613,63614],{},"Versatile, allowing you to use it for various tasks beyond automation, such as web development and data analysis",[14,63616,63617],{},[29,63618,63619],{},"Disadvantages:",[80,63621,63622,63625,63628],{},[83,63623,63624],{},"Performance may be slower compared to languages like C++ or Java",[83,63626,63627],{},"Requires programming knowledge to develop automation scripts",[83,63629,63630],{},"Depending on the complexity of the task, it may require more time to set up and maintain compared to using specialized UI automation tools",[21,63632,63584,63634],{"id":63633},"ui-automation-selenium",[322,63635,63638],{"href":63636,"rel":63637},"https:\u002F\u002Fwww.selenium.dev",[2245],"Selenium",[14,63640,63641],{},"Selenium is an open-source project encompassing various tools and libraries designed for automating web browsers. It features a playback tool that facilitates the creation of functional tests compatible with the majority of contemporary web browsers.",[592,63643],{"src":63644,"alt":63645},"\u002Fblog\u002Fui-automation-selenium.png","ui automation programming language selenium",[14,63647,63648],{},[29,63649,62341],{},[80,63651,63652,63655,63658],{},[83,63653,63654],{},"You can both write automated tests and automate web-based tasks",[83,63656,63657],{},"Open source license",[83,63659,63660],{},"Compatible with most browsers",[14,63662,63663],{},[29,63664,63619],{},[80,63666,63667,63670,63673],{},[83,63668,63669],{},"Big learning curve",[83,63671,63672],{},"Requires programming knowledge to develop automation or tests",[83,63674,63675],{},"Scripts may need updates following changes in the UI",[21,63677,63584,63679,63682],{"id":63678},"ui-automation-puppeteer-by-google",[322,63680,55848],{"href":59280,"rel":63681},[2245]," by Google",[14,63684,63685],{},"Puppeteer is software made by Google. It provides an API that allows developers to manipulate Chrome or Chromium browsers through the user interface by leveraging the DevTools Protocol. With Puppeteer, developers can script UI interactions within the browser, including button clicks, form submissions, and page navigation.",[592,63687],{"src":63688,"alt":63689},"\u002Fblog\u002Fui-automation-puppeteer.png","ui automation programming language puppeteer",[14,63691,63692],{},[29,63693,62341],{},[80,63695,63696,63698,63701],{},[83,63697,63654],{},[83,63699,63700],{},"Offers a well-documented and user-friendly API",[83,63702,63703],{},"Compatible with operating systems such as Windows, macOS, and Linux",[14,63705,63706],{},[29,63707,63619],{},[80,63709,63710,63713,63715],{},[83,63711,63712],{},"Limited to only Chrome or Chromium browsers",[83,63714,63672],{},[83,63716,63675],{},[21,63718,63720],{"id":63719},"what-ui-automation-tools-are-there","What UI Automation tools are there",[14,63722,63723],{},"If you are interested in UI automation but cannot code, take a look at these tools.",[21,63725,63584,63727],{"id":63726},"ui-automation-axiomai",[322,63728,3435],{"href":51689,"rel":63729},[2245],[14,63731,63732],{},"axiom.ai is a no-code automation tool designed to automate repetitive tasks in web applications. It provides an intuitive interface that allows users to create automation workflows without writing any code. This makes it accessible to both technical and non-technical users.",[592,63734],{"src":63735,"alt":63736},"\u002Fblog\u002Frpa-tool-axiom.ai.jpg","ui automation tool axiom.ai",[14,63738,63739],{},[29,63740,62341],{},[80,63742,63743,63746,63749,63752],{},[83,63744,63745],{},"No coding required, making it accessible for non-developers",[83,63747,63748],{},"User-friendly interface with drag-and-drop functionality",[83,63750,63751],{},"Can automate a wide range of web-based tasks",[83,63753,63754],{},"Regular updates and support from the development team",[14,63756,63757],{},[29,63758,63619],{},[80,63760,63761,63764],{},[83,63762,63763],{},"No support or desktop applications",[83,63765,63766],{},"Learning curve for users unfamiliar with automation tools like Zapier",[21,63768,63584,63770],{"id":63769},"ui-automation-leapwork",[322,63771,63774],{"href":63772,"rel":63773},"https:\u002F\u002Fwww.leapwork.com",[2245],"Leapwork",[14,63776,63777],{},"Leapwork is a no-code automation platform designed to make it easy for businesses to automate repetitive tasks and test applications without the need for programming skills. With its visual interface, users can create automation flows using a drag-and-drop approach, making automation accessible to both technical and non-technical users.",[592,63779],{"src":63780,"alt":63781},"\u002Fblog\u002Fleapworks.png","ui automation leapworks",[14,63783,63784],{},[29,63785,62341],{},[80,63787,63788,63791,63794,63797,63800],{},[83,63789,63790],{},"No coding required, making it accessible to non-developers",[83,63792,63793],{},"User-friendly visual interface with drag-and-drop functionality",[83,63795,63796],{},"Supports a wide range of applications and platforms, including web, desktop, and SAP",[83,63798,63799],{},"Comprehensive documentation and support resources",[83,63801,63802],{},"Integrates with various CI\u002FCD tools, making it suitable for DevOps workflows",[14,63804,63805],{},[29,63806,63619],{},[80,63808,63809,63812,63815],{},[83,63810,63811],{},"May have a learning curve for users unfamiliar with automation tools",[83,63813,63814],{},"Customization options might be limited compared to traditional coding solutions",[83,63816,63817],{},"Can be costly for smaller businesses or individual users",[21,63819,63584,63821],{"id":63820},"ui-automation-uipath",[322,63822,63825],{"href":63823,"rel":63824},"https:\u002F\u002Fwww.uipath.com",[2245],"UiPath",[14,63827,63828],{},"UiPath is a leading Robotic Process Automation (RPA) tool that enables businesses to automate repetitive tasks and processes. It provides a comprehensive platform with a visual interface that allows users to design automation workflows without writing any code, making it accessible for both technical and non-technical users.",[592,63830],{"src":63831,"alt":63832},"\u002Fblog\u002Fuipath.jpg","rpa tool UIpath",[14,63834,63835],{},[29,63836,62341],{},[80,63838,63839,63841,63843,63846,63849],{},[83,63840,63790],{},[83,63842,63748],{},[83,63844,63845],{},"Extensive library of pre-built automation activities",[83,63847,63848],{},"Strong community support and extensive documentation",[83,63850,63851],{},"Integrates with various applications and systems, including ERP, CRM, and custom applications",[14,63853,63854],{},[29,63855,63619],{},[80,63857,63858,63861,63864],{},[83,63859,63860],{},"Can be costly, especially for smaller businesses or individual users",[83,63862,63863],{},"May have a learning curve for users unfamiliar with RPA tools",[83,63865,63814],{},[14,63867,63723],{},[21,63869,63871],{"id":63870},"how-to-pick-a-tool-to-start-learning-ui-automation","How to pick a tool to start learning UI automation",[14,63873,63874],{},"There are some key factors to help you decide which tool to start learning for UI automation. So you do not get bogged down in ui automation challenges.",[555,63876,63877,63880,63883,63886,63889,63892,63895],{},[83,63878,63879],{},"Ease of use: What skill level does the tool require?",[83,63881,63882],{},"Programming: Do you want to learn a programming language or use a no-code tool?",[83,63884,63885],{},"Requirements: Do you need desktop or browser automation?",[83,63887,63888],{},"Documentation: Are there resources to learn from?",[83,63890,63891],{},"Pricing: Cost can be a big factor; enterprise tools often have hefty license fees.",[83,63893,63894],{},"Support: Do they support their customers well?",[83,63896,63897],{},"Reviews: What do their customer reviews say?",[21,63899,63901],{"id":63900},"ui-automation-or-api-automation","UI automation or API automation",[14,63903,63904],{},"One final thing to consider is if the task you wish to automate can be done with API automation. API automation can be more dependable than UI automation. However, not all tasks can be automated with an API, and that is the sweet spot for UI automation.",[21,63906,63908],{"id":63907},"wrapping-up-learning-ui-automation","Wrapping up learning UI automation.",[14,63910,63911],{},"There are a variety of ways to automate the UI, with programming languages such as Python or Puppeteer. There are tools that allow you to automate the UI without coding a single line, and there are tools for individuals or enterprise-scale businesses. The sweet spot for UI automation is automating tasks that API automation cannot. If you are looking to get into UI automation, perhaps just experiment before committing. In that case, it's worth looking at no-code solutions.",{"title":494,"searchDepth":495,"depth":495,"links":63913},[63914,63915,63916,63917,63918,63919,63923,63925,63927,63928,63930,63932,63934,63935,63936],{"id":63532,"depth":498,"text":63533},{"id":63542,"depth":498,"text":63543},{"id":63555,"depth":498,"text":63556},{"id":63562,"depth":498,"text":63563},{"id":63569,"depth":498,"text":63570},{"id":63576,"depth":498,"text":63577,"children":63920},[63921],{"id":63583,"depth":495,"text":63922},"UI automation Python",{"id":63633,"depth":498,"text":63924},"UI automation Selenium",{"id":63678,"depth":498,"text":63926},"UI automation Puppeteer by Google",{"id":63719,"depth":498,"text":63720},{"id":63726,"depth":498,"text":63929},"UI automation axiom.ai",{"id":63769,"depth":498,"text":63931},"UI automation Leapwork",{"id":63820,"depth":498,"text":63933},"UI automation UiPath",{"id":63870,"depth":498,"text":63871},{"id":63900,"depth":498,"text":63901},{"id":63907,"depth":498,"text":63908},"2024-05-19","UI automation can be used to test apps, but it can also be to automate tasks in those apps.",{"read":48203,"type":513,"tool":63940,"category":63941,"tags":63942,"location":46733,"featuredimg":63945,"landingimg":63946,"summary":63947,"video":523,"metaTitle":63948},[46728],[50552],[3974,11847,63943,63944],"downloads","text inputs","\u002Fblog\u002Fui-test-blog-post.jpg","\u002Fblog\u002Fui-test-blog-sq.jpg","Learn about how UI automation can be used to automate tasks and testing.","UI automation tools for testing and tasks","\u002Fblog\u002Fui-automation",{"title":63515,"description":63938},"blog\u002Fui-automation","qrHZ9hO5nyYAGY1DLZZvlXWuhyrGXJMyyg3SNR5YBg4",[50552],[513],[46728],{"id":63957,"title":63958,"author":46205,"body":63959,"date":64202,"description":64203,"draft":26250,"extension":506,"meta":64204,"navigation":522,"path":64215,"seo":64216,"stem":64217,"__hash__":64218,"pinned":-1,"category":64219,"type":64220,"tool":64221},"blog\u002Fblog\u002Fauto-clicker.md","How to make an auto clicker bot in minutes without code",{"type":8,"value":63960,"toc":64182},[63961,63964,63967,63971,63974,63978,63981,63985,63988,63992,63995,63999,64003,64006,64010,64025,64029,64033,64063,64067,64071,64080,64083,64086,64090,64097,64101,64105,64109,64131,64135,64138,64142,64152,64156,64170,64172,64175,64179],[14,63962,63963],{},"Frequent mouse clicks can be frustrating; automation is the solution. What if you could create auto-clicker bots in minutes without any coding and fully customize them to your needs? You could build auto-clickers suitable for any browser activity using our chrome extension.",[18,63965],{"alt":63966},"how to make an auto clicker with axiom.ai",[21,63968,63970],{"id":63969},"what-are-auto-clicker-bots","What are auto clicker bots",[14,63972,63973],{},"Auto clicker bots are software designed to automate clicking actions on a website. These bots simulate mouse clicks at a set interval or in response to certain conditions. They are handy for repetitive tasks where manual clicking is time-consuming.",[21,63975,63977],{"id":63976},"how-do-these-bots-work","How do these bots work",[14,63979,63980],{},"The bots operate by launching a Chrome browser window, loading a specified URL, and interacting with the webpage according to your defined steps.",[21,63982,63984],{"id":63983},"can-anyone-make-a-bot-to-automate-mouse-clicks","Can anyone make a bot to automate mouse clicks",[14,63986,63987],{},"axiom.ai's no-code bot-building tool enables anyone to automate browser actions easily. Users create combinations of steps to replicate the actions they wish to automate. It's as straightforward as point and click. No coding skills are required.",[21,63989,63991],{"id":63990},"what-else-could-i-do-with-a-bot","What else could I do with a bot",[14,63993,63994],{},"Bots can automate a wide range of tasks beyond simple button clicks. For instance, they can fill out web forms, interact with elements on a webpage, and send direct messages.",[21,63996,63998],{"id":63997},"how-to-make-a-basic-auto-clicker-bot","How to make a basic auto clicker bot",[639,64000,64002],{"id":64001},"_1-install-axiom","1. Install Axiom",[14,64004,64005],{},"To install Axiom and create an account, visit our Chrome Store page*.* While you're there, consider checking out some of our reviews. FYI, all new accounts receive 120 minutes of free runtime, with no credit card required at signup.",[639,64007,64009],{"id":64008},"_2-start-from-blank-to-make-your-autoclicker","2. Start from blank to make your autoclicker",[14,64011,64012,64013,64016,64017,64020,64021,64024],{},"To start creating your first autoclicker bot on axiom.ai, ",[807,64014,64015],{},"start from blank by clicking on"," '",[29,64018,64019],{},"New Automation'"," in the top right corner of the axiom.ai dashboard. Next, click ",[29,64022,64023],{},"'Add First Step'."," This action will open the step finder, where you'll add the steps needed to build your auto-clicker bot.",[592,64026],{"alt":64027,"src":64028},"axiom.ai making an auto-clicker with steps","\u002Fblog\u002Fautoclicker-blank.png",[639,64030,64032],{"id":64031},"_3-add-a-goto-page-step","3. Add a goto page step",[14,64034,64035,64036,64039,64040,64042,64043,64039,64046,64039,64049,64052,64053,64056,64057,64059,64060],{},"To begin building your autoclicker bot, add your first step by ",[807,64037,64038],{},"selecting the"," ",[29,64041,15508],{}," step. You can do this by ",[807,64044,64045],{},"entering",[29,64047,64048],{},"'Go to'",[807,64050,64051],{},"into the step finder search field"," or scrolling down to click ",[29,64054,64055],{},"'Interact'."," Select ",[29,64058,15508],{}," to add it as your first step. Once added, enter the page URL where you want to automate mouse clicks in the ",[29,64061,64062],{},"'Enter URL field'.",[592,64064],{"src":64065,"alt":64066},"\u002Fblog\u002Fadd-go-to-page-clicker.png","axiom.ai add go to page step",[639,64068,64070],{"id":64069},"_4-add-a-click-element-step","4. Add a click element step",[14,64072,64073,64074,64076,64077,64079],{},"Next, in the builder, click ",[29,64075,46614],{},"; the step finder will appear. Now, search for the 'Click element' step and add it to the bot you are making. Inside the step, click ",[29,64078,15576],{},", then point and click on the element you wish to click.",[592,64081],{"alt":64027,"src":64082},"\u002Fblog\u002Fauto-clicker-page-click.png",[14,64084,64085],{},"That is your basic bot. When you run it, the bot will open a page and click a button.",[639,64087,64089],{"id":64088},"_5-test-your-basic-bot","5. Test your basic bot",[14,64091,64092,64093,64096],{},"Assuming you have the desktop app installed, click run and select ",[29,64094,64095],{},"'Run w\u002F desktop app'."," You should see the bot opening a window and clicking the selected button. If the bot closes the window too quickly, add a 'Wait' step when testing at the end.",[21,64098,64100],{"id":64099},"how-to-enhance-your-bot","How to enhance your  bot",[639,64102,64104],{"id":64103},"_1-jump-step","1. Jump step",[592,64106],{"alt":64107,"src":64108},"axiom.ai adding a jump step step","\u002Fblog\u002Fauto-clicker-jump-step.png",[14,64110,64111,64112,64115,64116,64118,64119,64122,64123,64126,64127,64130],{},"If you want to click a button multiple times, add a ",[29,64113,64114],{},"'Jump'"," step below the 'Click element' step. In the ",[29,64117,64114],{}," step settings, select '",[29,64120,64121],{},"Jump'"," step and specify the ",[29,64124,64125],{},"'step number'"," from which you wish to repeat. Then, set the number of repetitions by adjusting ",[29,64128,64129],{},"'Maximum cycles'",". The jump step will repeat all the steps between it and the step it is jumping back to.",[639,64132,64134],{"id":64133},"_2-loop-through-data-step","2. Loop through data step",[14,64136,64137],{},"This step loops through data passed into from sources such as Google Sheets, one loop for each row of data. All steps can be nested into a loop steps.",[592,64139],{"alt":64140,"src":64141},"axiom.ai adding a loop step step","\u002Fblog\u002Fauto-clicker-loop.png",[14,64143,64144,64145,64147,64148,64151],{},"To wrap your steps into a ",[29,64146,15489],{}," step, highlight the steps you will move by clicking on the check box to the ",[807,64149,64150],{},"left of the step number",". A dark toolbar will appear at the top of the builder. In the toolbar, click 'Loop'; the step will be added, and the selected steps will be moved inside.",[639,64153,64155],{"id":64154},"_3-discovering-other-steps","3. Discovering other steps",[14,64157,64158,64159,64162,64163,64165,64166,64169],{},"axiom.ai's no-code bot builder features extensive steps that combine to create powerful browser automation bots. ",[807,64160,64161],{},"It includes steps for reading and writing data from various sources like webhooks, Google Sheets",", and CSVs, as well as for scraping and filtering data. Other steps cover web actions such as the ",[29,64164,15531],{}," and ",[29,64167,64168],{},"'Date picker'"," steps. Explore the builder's step finder or look on our website for a complete list of available steps.",[21,64171,796],{"id":795},[14,64173,64174],{},"Creating an auto clicker bot with axiom.ai' no-code platform is straightforward and requires no prior coding knowledge. You can automate repetitive mouse clicks by following simple steps to install the tool and start a new automation. Whether enhancing productivity or customizing browser interactions, axiom.ai equips you with the tools to build bots that save time and effort. Explore making even more powerful bots by experimenting with additional steps.",[21,64176,64178],{"id":64177},"do-you-have-your-idea-for-a-bot","Do you have your idea for a bot",[14,64180,64181],{},"If this guide only partially meets your needs and you have an idea for a bot you'd like to build, apply the skills you've learned and try it. If you need assistance, don't hesitate to contact our customer support team.",{"title":494,"searchDepth":495,"depth":495,"links":64183},[64184,64185,64186,64187,64188,64195,64200,64201],{"id":63969,"depth":498,"text":63970},{"id":63976,"depth":498,"text":63977},{"id":63983,"depth":498,"text":63984},{"id":63990,"depth":498,"text":63991},{"id":63997,"depth":498,"text":63998,"children":64189},[64190,64191,64192,64193,64194],{"id":64001,"depth":495,"text":64002},{"id":64008,"depth":495,"text":64009},{"id":64031,"depth":495,"text":64032},{"id":64069,"depth":495,"text":64070},{"id":64088,"depth":495,"text":64089},{"id":64099,"depth":498,"text":64100,"children":64196},[64197,64198,64199],{"id":64103,"depth":495,"text":64104},{"id":64133,"depth":495,"text":64134},{"id":64154,"depth":495,"text":64155},{"id":795,"depth":498,"text":796},{"id":64177,"depth":498,"text":64178},"2024-05-01","Learn how to make and use an auto clicker bot using axiom.ai's no-code bot builder",{"read":64205,"type":513,"tool":64206,"category":64207,"tags":64208,"location":46733,"featuredimg":64211,"landingimg":64212,"summary":64213,"video":523,"metaTitle":64214},"3 min read",[46728],[53990],[13865,64209,64210],"auto clicker","mouse clicks","\u002Fblog\u002Fautoclicker-post.jpg","\u002Fblog\u002Fautoclicker-sq.jpg","Learn how to make an auto clicker bot with axiom.ai a no-code browser automation tool.","auto clicker bot","\u002Fblog\u002Fauto-clicker",{"title":63958,"description":64203},"blog\u002Fauto-clicker","uCE-jd1JpSKb12H874k9Zw0S2nZ_st268ngMpzUPVjI",[53990],[513],[46728],{"id":64223,"title":64224,"author":46205,"body":64225,"date":64202,"description":64475,"draft":26250,"extension":506,"meta":64476,"navigation":522,"path":64486,"seo":64487,"stem":64488,"__hash__":64489,"pinned":-1,"category":64490,"type":64491,"tool":64492},"blog\u002Fblog\u002Fautomate-browser-actions.md","How to automate actions on a website with a bot",{"type":8,"value":64226,"toc":64453},[64227,64230,64233,64240,64244,64247,64251,64254,64258,64261,64265,64272,64276,64279,64282,64286,64289,64292,64295,64298,64302,64305,64311,64314,64317,64321,64324,64335,64339,64343,64346,64349,64352,64356,64360,64364,64367,64371,64375,64378,64382,64386,64389,64393,64397,64400,64404,64408,64411,64415,64419,64422,64426,64430,64433,64436,64440,64443,64446,64450],[14,64228,64229],{},"If you want to automate tasks performed in the browser, you should consider building a bot. You will be surprised how useful this can be - who wouldn't want an army of digital assistants to help handle their workload?",[18,64231],{"alt":64232},"how to automate wbesite actions with a bot",[14,64234,64235,64236,64239],{},"In this guide, we will teach you the basics of automating browser actions in just minutes, using ",[322,64237,3435],{"href":11248,"rel":64238},[2245],"’s no-code bot building tool.",[21,64241,64243],{"id":64242},"why-make-a-bot","Why make a bot?",[14,64245,64246],{},"Well, bots can take some of those repetitive, manual browser tasks off your hands, freeing up valuable time for other, more enjoyable things. Besides, watching the bots do your work is pretty amazing! What’s more, you’ll acquire useful automation skills.",[21,64248,64250],{"id":64249},"what-can-bots-automate","What can bots automate?",[14,64252,64253],{},"We’re teaching you how to make bots that can be used in the Chrome browser. These bots can automate a wide range of browser actions, from data entry to data scraping. We have users automating a multitude of different tasks, helping them to more efficiently manage their social media accounts, e-commerce stores, data migration, and more.",[21,64255,64257],{"id":64256},"how-do-bots-automate-in-the-browser","How do bots automate in the browser?",[14,64259,64260],{},"Simply put, bots mimic human behavior in Chrome. They click buttons and enter data into forms, replicating your web browser actions without getting bored, fed up, or frustrated.",[21,64262,64264],{"id":64263},"can-anyone-make-a-bot","Can anyone make a bot?",[14,64266,64267,64268,64271],{},"Our no-code, point-and-click bot builder has been created to be user-friendly from the ground up. You don't need any programming skills to make bots with ",[322,64269,3435],{"href":11248,"rel":64270},[2245],", but having a clear idea of what you want to automate will be helpful.",[21,64273,64275],{"id":64274},"what-skills-will-i-learn","What skills will I learn?",[14,64277,64278],{},"Learning how to automate your browser is becoming an increasingly valuable skill. As more and more work moves to the browser, being able to automate it will be an invaluable addition to anyone's CV. Learning to automate, instead of being automated, will empower you for the future. Of course it involves a learning curve: you'll have to get to grips with some of the key concepts of automation, from structuring it, to setting up loops and thinking like a programmer.",[14,64280,64281],{},"Once you master it, you won’t look back.",[21,64283,64285],{"id":64284},"start-by-breaking-your-bot-down-into-steps","Start by breaking your bot down into steps",[14,64287,64288],{},"It's always useful to plan before you get started. A plan helps reduce frustration and speeds up the process.",[14,64290,64291],{},"Start by breaking down the task into steps and then review it, simplifying the process as much as possible for your first bot.",[14,64293,64294],{},"For complex tasks, you may want to consider breaking them down into several steps, to be taken on by more than one bot.",[14,64296,64297],{},"Once you have a plan in place, you're ready to start building.",[21,64299,64301],{"id":64300},"start-from-blank-or-pick-a-template","Start from blank or pick a template",[14,64303,64304],{},"We offer a variety of templates to assist you with scraping, data entry, and social media management on platforms like Instagram. You can find all of our templates on our website. However, we believe it's important to teach you how to start from blank.",[14,64306,64307,64308,44],{},"We will assume that you have already created an account and installed ",[322,64309,3435],{"href":11248,"rel":64310},[2245],[14,64312,64313],{},"Open the chrome extension and double click ‘Create New Automation’.",[14,64315,64316],{},"You are now in our Axiom builder. Let’s take you through the basics.",[21,64318,64320],{"id":64319},"choose-a-starting-point","Choose a starting point",[14,64322,64323],{},"Select your first step to add. We suggest one of the following steps:",[555,64325,64326,64329,64332],{},[83,64327,64328],{},"If you have data in a Google Sheet, start with the ‘Read data from a Google Sheet’ step",[83,64330,64331],{},"If want to make a web scraper bot, start with the ‘Get data from URL’ step",[83,64333,64334],{},"If you want to enter data into a form, start with the ‘Go to’ page step",[592,64336],{"src":64337,"alt":64338},"\u002Fblog\u002Fadd-step-web-actions.jpg","adding steps in axiom.ai",[21,64340,64342],{"id":64341},"combine-steps","Combine steps",[14,64344,64345],{},"To make your bot perform tasks, you can combine different steps. For instance, if you need to read or write data, you may consider using ‘Google Sheet’ steps. Or, if you need to interact with a web page, or fill out forms, you can use the ‘Enter Text’ steps and click on the elements you wish to enter data into.",[14,64347,64348],{},"By replicating each step of your task, you can create a sequence of web actions for your bot to execute.",[14,64350,64351],{},"Have a browse through the different steps in our step finder.",[592,64353],{"src":64354,"alt":64355},"\u002Fblog\u002Fstep-finder-web-actions.jpg","select steps using the step finder in axiom.ai",[21,64357,64359],{"id":64358},"some-helpful-patterns-for-your-bot","Some helpful patterns for your bot",[639,64361,64363],{"id":64362},"a-simple-web-scraper-bot","A simple web scraper bot",[14,64365,64366],{},"Here we read URLs from a Google Sheet, loop through them, and write data to a Google Sheet.",[592,64368],{"src":64369,"alt":64370},"\u002Fblog\u002Fdp-scrape-urls-google-sheet.png","a design pattern for a bot that scrapes urls loaded from a Google Sheet made with axiom.ai",[639,64372,64374],{"id":64373},"web-page-interactions-bot","Web page interactions bot",[14,64376,64377],{},"Here we load a web page with a 'Go to page' step then click a button with a 'Click element' step.",[592,64379],{"src":64380,"alt":64381},"\u002Fblog\u002Fweb-actions-basic.png","a design pattern for a bot taht automates website actions made with axiom.ai",[639,64383,64385],{"id":64384},"data-entry-bot","Data entry bot",[14,64387,64388],{},"Here we read data from a sheet one row at a time. Enter the data then loop to repeat the process.",[592,64390],{"src":64391,"alt":64392},"\u002Fblog\u002Fdata-entry-basic.png","a design pattern for a bot that automates data entry made with axiom.ai",[21,64394,64396],{"id":64395},"how-to-loop-your-bots","How to loop your bots",[14,64398,64399],{},"There are loop steps and jump steps. These can be added from the start, or later. The loop step will loop through data from a source like a Google Sheet; the jump step loops for the amount of time you set it to.",[592,64401],{"src":64402,"alt":64403},"\u002Fblog\u002Floop-data-axiom.jpg","looping a bot with axiom.ai",[21,64405,64407],{"id":64406},"how-to-pass-data-between-steps-in-a-bot","How to pass data between steps in a bot",[14,64409,64410],{},"Steps that read or output some form of data like the ‘Get data’ step, can make their data available to other steps in the form of tokens. See this example of a Google Sheet passing a URL into a go to page step.",[592,64412],{"src":64413,"alt":64414},"\u002Fblog\u002Fpass-data-axiom.ai.jpg","pass data between steps in axiom.ai",[21,64416,64418],{"id":64417},"how-to-move-steps-in-a-bot","How to move steps in a bot",[14,64420,64421],{},"We have made it simple to move, edit and duplicate steps by simply clicking on a tick box inside the step. You’ll find the tick box to the left of the title.",[592,64423],{"src":64424,"alt":64425},"\u002Fblog\u002Fmove-steps-axiom-ai.jpg","How to move steps in axiom.ai",[21,64427,64429],{"id":64428},"test-as-you-go","Test as you go",[14,64431,64432],{},"We highly recommend testing your build by running your bot on the desktop app. Failed or stopped runs won't count towards the runtime limit, so you can test as much as you want.",[14,64434,64435],{},"While testing, it's important to observe the behavior of the bot and note at which point it breaks or doesn't behave as expected.",[21,64437,64439],{"id":64438},"ready-to-run","Ready to run!",[14,64441,64442],{},"Once you’re ready to run the bot, you can run it on your desktop, in the cloud. If you’re on a paid tier, you can also schedule your bots. So go ahead click run and watch your digital worker automate your repetitive browser actions.",[14,64444,64445],{},"Please note that if you build a bot on the desktop app when logged in, your session will be shared. However if you run the bot in the cloud, the session will not be shared.",[21,64447,64449],{"id":64448},"need-help","Need help?",[14,64451,64452],{},"If you get stuck or need help with building more complex bots, please don't hesitate to contact us via this link. Be sure to share with us your Axiom bot and as much supporting information as possible describing the web actions use wish to automate.",{"title":494,"searchDepth":495,"depth":495,"links":64454},[64455,64456,64457,64458,64459,64460,64461,64462,64463,64464,64469,64470,64471,64472,64473,64474],{"id":64242,"depth":498,"text":64243},{"id":64249,"depth":498,"text":64250},{"id":64256,"depth":498,"text":64257},{"id":64263,"depth":498,"text":64264},{"id":64274,"depth":498,"text":64275},{"id":64284,"depth":498,"text":64285},{"id":64300,"depth":498,"text":64301},{"id":64319,"depth":498,"text":64320},{"id":64341,"depth":498,"text":64342},{"id":64358,"depth":498,"text":64359,"children":64465},[64466,64467,64468],{"id":64362,"depth":495,"text":64363},{"id":64373,"depth":495,"text":64374},{"id":64384,"depth":495,"text":64385},{"id":64395,"depth":498,"text":64396},{"id":64406,"depth":498,"text":64407},{"id":64417,"depth":498,"text":64418},{"id":64428,"depth":498,"text":64429},{"id":64438,"depth":498,"text":64439},{"id":64448,"depth":498,"text":64449},"Learn how to automate Instagram in the browser with axiom.ai a no-code bot building tool",{"read":64205,"type":513,"tool":64477,"category":64478,"tags":64479,"location":46733,"featuredimg":64482,"landingimg":64483,"summary":64484,"video":523,"metaTitle":64485},[46728],[50552],[11847,64480,64481,1055,62467],"file uploads","file downloads","\u002Fblog\u002Fwebsite-actions-post.jpg","\u002Fblog\u002Fwebsite-actions-sq.jpg","Learn how web actions can be automated in the browser without code using axiom.ai an no-code browser automation tool","Automate web browser actions in chrome without code","\u002Fblog\u002Fautomate-browser-actions",{"title":64224,"description":64475},"blog\u002Fautomate-browser-actions","Aw0ju9KfUlIy9TEJJa95nGyLZxEWMqWfvu3UHiHIS0k",[50552],[513],[46728],{"id":64494,"title":64495,"author":46205,"body":64496,"date":64810,"description":64811,"draft":26250,"extension":506,"meta":64812,"navigation":522,"path":64821,"seo":64822,"stem":64823,"__hash__":64824,"pinned":-1,"category":64825,"type":64826,"tool":64827},"blog\u002Fblog\u002Ffill-out-forms-online.md","How to fill out forms online with a bot",{"type":8,"value":64497,"toc":64786},[64498,64501,64504,64507,64511,64514,64518,64521,64525,64528,64532,64539,64543,64550,64554,64557,64559,64562,64566,64573,64576,64582,64588,64592,64595,64601,64604,64629,64632,64636,64639,64642,64646,64649,64653,64656,64660,64663,64669,64673,64676,64679,64683,64686,64697,64703,64707,64710,64716,64719,64722,64726,64729,64733,64739,64741,64744,64747,64777,64780],[14,64499,64500],{},"Entering data and filling out lengthy forms rank among the most tedious tasks on the web. Transferring data from a Google Sheet into an input field can be monotonous. It's easy to become distracted or tired, leading to mistakes. Surely, I'm not the only one who has accidentally copied and pasted data from the wrong row.",[18,64502],{"alt":64503},"automate form filling with axiom.ai",[14,64505,64506],{},"Instead of enduring this dull routine of filling out forms, why not learn a new skill by creating a bot to automatically fill web forms? Let me show you how using our template as a starting point.",[21,64508,64510],{"id":64509},"what-is-a-form-filling-bot","What is a form-filling bot?",[14,64512,64513],{},"A form-filling bot isn't some high-tech robot equipped with arms, legs, and lasers, poised to take on the world of paperwork. Instead, it's clever software designed to tackle the mundane task of filling out online forms. Rather than having a human tediously type in data, a bot can swoop in, saving you from the time-consuming and soul-sucking drudgery of form-filling. And let's not forget that form-filling bots significantly boost efficiency. Since they never yawn, feel sleepy, or get bored, they're prone to making far fewer mistakes.",[21,64515,64517],{"id":64516},"how-do-bots-fill-forms","How do bots fill forms?",[14,64519,64520],{},"Bots, unlike humans, do not use keyboards to input data or mice to click 'submit.' Yet, they manage to fill in forms in a similar manner. Bots load web forms into the browser and interact with input fields to enter text. To submit a form, bots 'click' submit just like humans, but they achieve this through direct interaction with the browser's interface. They can mimic mouse actions by clicking on buttons, radio buttons, dropdown lists, and entering text. Furthermore, bots replicate keyboard behavior, navigating through form elements using tabbing or submitting forms with the return key.",[21,64522,64524],{"id":64523},"what-type-of-forms-could-bots-automate","What type of forms could bots automate?",[14,64526,64527],{},"Not all forms are the same, that is true. Some have just a couple of fields, others have pages to complete. But the underlying structure is all the same; form elements are made up of the same HTML elements and tend to follow a standard pattern. So the answer is yes, you can automate any type of form, from inputting social media posts into Amazon or Facebook to filling tax forms, a bot can do it.",[21,64529,64531],{"id":64530},"what-if-my-data-is-in-a-google-sheet-or-excel-sheet","What if my data is in a Google Sheet or Excel Sheet?",[14,64533,64534,64535,64538],{},"That simplifies the process; ",[322,64536,3435],{"href":11248,"rel":64537},[2245]," offers no-code options for reading, writing, filtering, and deleting data in Google Sheets. Just choose your sheet. For Excel users, while we're developing similar features, you can convert Excel sheets to Google Sheets in the interim.",[21,64540,64542],{"id":64541},"how-to-make-a-form-filling-bot-without-code","How to make a form-filling bot without code?",[14,64544,64545,64546,64549],{},"No coding skills or magic required! If you can use a mouse, you can build a bot using ",[322,64547,3435],{"href":11248,"rel":64548},[2245],"'s form filling software. Even better, I'll show you how to use our template for filling out forms online. This method allows you to quickly create a proof of concept in seconds, with the bot guiding you. Effortlessly, you can have a full bot built in minutes.",[639,64551,64553],{"id":64552},"install-axiom","Install Axiom",[14,64555,64556],{},"If you haven't installed Axiom yet, it consists of two components: a Chrome extension for building bots and a desktop app that allows you to run bots locally. To install Axiom, go to the Chrome Web Store, create your account, and then you'll be all set to use the template.",[639,64558,13919],{"id":13918},[14,64560,64561],{},"You will need to prepare a Google Sheet with some test data. Below is an example of how your data should be organized in rows. Obviously, tailor the data to fit the type of form you are automating.",[639,64563,64565],{"id":64564},"our-starting-point-will-be-a-template","Our starting point will be a template",[322,64567,64568,64569],{"href":7052,"target":51932},"\n  ",[592,64570],{"src":64571,"alt":64572},"\u002Fblog\u002Fform-filling-template.png","template for data entry and form filling",[14,64574,64575],{},"The starting point for this bot build will be a core template. Core templates are design patterns for bot builds that can be applied to any website or, in this case, any web form. Using a template gives beginners an idea of how to create an Axiom.",[322,64577,64568,64578],{"href":7052,"target":51932},[592,64579],{"src":64580,"alt":64581},"\u002Fblog\u002Fform-filling-design-pattern-for-bot.png","combine steps shown in diagram to automate forms",[14,64583,64584,64585],{},"This is the online data entry bot design pattern we will start with, and it can be installed from this ",[322,64586,64587],{"href":7052},"template page.",[639,64589,64591],{"id":64590},"the-bot-will-guide-you-on-how-to-set-it-up","The bot will guide you on how to set it up",[14,64593,64594],{},"Have your Google Sheet ready; let's get this bot-building started! If you have not already installed the template for form-filling, please do so now. Once installed, the bot will guide you through the setup process outlined below. Just follow the instructions—it's as simple as that.",[322,64596,64568,64597],{"href":7052,"target":51932},[592,64598],{"src":64599,"alt":64600},"\u002Fblog\u002Fform-start-set-up.png","axiom.ai will help you set up you data entry bot",[14,64602,64603],{},"The first goal is to select a couple of 'Enter Text' fields and the 'Submit' button so we can do a quick test run before building the complete bot.",[555,64605,64606,64609,64612,64618,64623,64626],{},[83,64607,64608],{},"Step 1: 'Read Data from a Google Sheet' - Add your Google Sheet and then set your sheet name.",[83,64610,64611],{},"Step 2.1: ‘Go to page’ - Enter URL, Add the site's URL for data entry.",[83,64613,64614,64615,64617],{},"Step 2.2: ‘Enter Text’ - Click 'Select' to choose the text field where the bot should enter text. Then, for 'Enter Text', either manually add data or select '",[727,64616,139],{},"' to choose a data column.",[83,64619,64620,64621,64617],{},"Step 2.3: ‘Enter Text’ - Click 'Select' to choose the text field where the bot should enter text. Then, for 'Enter Text', either manually add data or select '",[727,64622,139],{},[83,64624,64625],{},"Step 2.4: ‘Click element’ - Click 'Select' and choose the form submit button to test the bot.",[83,64627,64628],{},"Step 2.5: ‘Delete rows’ from Google Sheet - This step deletes a row from the Google Sheet, ensuring the bot iterates over the subsequent row on its next loop. Please add your Google Sheet and specify its name.",[14,64630,64631],{},"You are probably thinking this bot does not have enough 'Enter Text' steps. Remember, we are testing first.",[21,64633,64635],{"id":64634},"your-mvp-bot-for-web-form-filling-is-ready-to-test","Your MVP bot for web form filling is ready to test",[14,64637,64638],{},"So the idea behind making an MVP is to test first, then when we know it works with your web form, we use Axiom’s bot builder to add the additional fields.",[14,64640,64641],{},"It's best this way. Always test, then build.",[21,64643,64645],{"id":64644},"completing-the-bot","Completing the bot",[14,64647,64648],{},"Ready to complete the bot, but it seems dauntingly hard? Well, it's not at all. Using the step finder, you can take additional steps to complete the job. It’s as simple as stacking the steps to replicate the form one-for-one. We have steps for all the form elements, from clicking to selecting lists, date pickers, and entering text.",[639,64650,64652],{"id":64651},"using-the-bot-builder","Using the bot builder",[14,64654,64655],{},"If this is your first time using axiom.ai, rest assured. Our user interface is incredibly intuitive—just point and click. Let's start with the fundamentals. The first thing you'll want to grasp is how to select and add steps using the step finder.",[639,64657,64659],{"id":64658},"steps-to-use-when-automating-forms","Steps to use when automating forms",[14,64661,64662],{},"The steps you will most likely want to use are the 'Interact' steps. These steps automate website actions such as clicking buttons, entering text, selecting lists, and uploading files.",[322,64664,64568,64665],{"href":7052,"target":51932},[592,64666],{"src":64667,"alt":64668},"\u002Fblog\u002Fstep-build.png","axiom.ai add interact steps with the step finder",[639,64670,64672],{"id":64671},"adding-steps","Adding steps",[14,64674,64675],{},"To start adding steps, simply click 'add-sub-step' or click between the steps to open the step finder. Then, simply type 'Interact' into the search field of the step finder. We recommend running test runs as you build. Add some steps, test, add some more, test—you get the idea.",[14,64677,64678],{},"If you are interested in learning more about the steps available for building bots, follow this link.",[639,64680,64682],{"id":64681},"moving-and-deleting-steps","Moving and deleting steps",[14,64684,64685],{},"You may want to move and duplicate steps; this is pretty simple. See the image below: click on the tick box inside any step on the left to enter 'Move and Duplicate' mode. In this mode you can:",[555,64687,64688,64691,64694],{},[83,64689,64690],{},"Highlight a step or steps with a tick, click between steps to duplicate or move the selected steps.",[83,64692,64693],{},"Delete, enable, or disable selected steps.",[83,64695,64696],{},"Move selected steps in a loop.",[322,64698,64568,64699],{"href":7052,"target":51932},[592,64700],{"src":64701,"alt":64702},"\u002Fblog\u002Fmove-delete-steps-form-entry.png","axiom.ai move steps to change the order",[21,64704,64706],{"id":64705},"looping-the-bot-to-automatically-fill-web-forms","Looping the bot to automatically fill web forms",[14,64708,64709],{},"You may have noticed that the bots' interact steps, which handle text entry, are all inside the 'Loop through data.' This is because, by default, this bot is set up to loop through rows of data, one row at a time.",[322,64711,64568,64712],{"href":7052,"target":51932},[592,64713],{"src":64714,"alt":64715},"\u002Fblog\u002Floop-form-entry.png","axiom.ai loop your bot",[14,64717,64718],{},"To control the loop, don’t change any settings in the 'Delete rows from Google Sheet' step. We want to delete a single row with each loop.",[14,64720,64721],{},"To control the number of rows processed in each run, in step 1 'Read data from a Google Sheet', set the first row and last row to control the number of rows processed in a single run.",[21,64723,64725],{"id":64724},"test-and-run-your-automate-web-form-filling-bot","Test and Run your automate web form filling bot",[14,64727,64728],{},"For testing, we always urge users to first run bots on the desktop. This is because issues are best resolved by observing runs, which helps inform you about what the issue is. Once your bot is ready, you can run it in the cloud. You may need to add steps to log in or set the cookies to be shared in the cloud.",[21,64730,64732],{"id":64731},"quick-note-on-iframes","Quick note on Iframes",[14,64734,64735,64736,44],{},"When selecting elements, you'll see a cyan selector instead of an orange one. This means the elements you wish to interact with are in an iframe. Not to worry, you just need to turn on iframe support. See how ",[322,64737,19857],{"href":64738},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsettings\u002Ferror-handling\u002Fiframes",[21,64740,796],{"id":795},[14,64742,64743],{},"First up, core templates are an excellent starting point for creating bots to automate web form filling. They allow us to quickly develop a proof of concept without investing a lot of time in a new tool. We have also learned that we can use the step finder to add additional steps to the proof of concept; our initial bot can be fully customized to meet our needs. I have also learned that when selecting form elements on the page, if I see a blue selector, it's an iframe and I need to turn iframe support on. And yes, always test as steps are added.",[14,64745,64746],{},"Here’s a list of other core templates:",[555,64748,64749,64753,64758,64763,64768,64772],{},[83,64750,64751],{},[322,64752,48207],{"href":15104},[83,64754,64755],{},[322,64756,64757],{"href":24867},"Data entry from Zap",[83,64759,64760],{},[322,64761,64762],{"href":6142},"ChatGPT web scraper",[83,64764,64765],{},[322,64766,64767],{"href":10670},"How to automate downloads",[83,64769,64770],{},[322,64771,1541],{"href":1758},[83,64773,64774],{},[322,64775,64776],{"href":7052},"How to automate data entry from Google Sheet",[21,64778,64779],{"id":64177},"Do you have your idea for a bot?",[14,64781,64782,64783],{},"If this guide only partially meets your needs and you have an idea for a bot you'd like to build, apply the skills you've learned and try it. If you need assistance, don't hesitate to contact our ",[322,64784,64785],{"href":486},"customer support team.",{"title":494,"searchDepth":495,"depth":495,"links":64787},[64788,64789,64790,64791,64792,64798,64799,64805,64806,64807,64808,64809],{"id":64509,"depth":498,"text":64510},{"id":64516,"depth":498,"text":64517},{"id":64523,"depth":498,"text":64524},{"id":64530,"depth":498,"text":64531},{"id":64541,"depth":498,"text":64542,"children":64793},[64794,64795,64796,64797],{"id":64552,"depth":495,"text":64553},{"id":13918,"depth":495,"text":13919},{"id":64564,"depth":495,"text":64565},{"id":64590,"depth":495,"text":64591},{"id":64634,"depth":498,"text":64635},{"id":64644,"depth":498,"text":64645,"children":64800},[64801,64802,64803,64804],{"id":64651,"depth":495,"text":64652},{"id":64658,"depth":495,"text":64659},{"id":64671,"depth":495,"text":64672},{"id":64681,"depth":495,"text":64682},{"id":64705,"depth":498,"text":64706},{"id":64724,"depth":498,"text":64725},{"id":64731,"depth":498,"text":64732},{"id":795,"depth":498,"text":796},{"id":64177,"depth":498,"text":64779},"2024-04-14","Learn how to automate form filling tasks in the browser in minutes without code",{"read":53987,"type":513,"tool":64813,"category":64814,"tags":64815,"location":46733,"featuredimg":64817,"landingimg":64818,"summary":64819,"video":523,"metaTitle":64820},[46728],[58387],[48067,64816,1055],"form filling","\u002Fblog\u002Fwebform-post.jpg","\u002Fblog\u002Fwebform-sq.jpg","Learn how to automate form filling with axiom.ai a no-code bot building tool.","automate form filling","\u002Fblog\u002Ffill-out-forms-online",{"title":64495,"description":64811},"blog\u002Ffill-out-forms-online","x8ho3Nf7KDShjhHYeABK9NPG8FbD8CClU-tVWvyolRY",[58387],[513],[46728],{"id":64829,"title":64830,"author":46205,"body":64831,"date":65120,"description":65121,"draft":26250,"extension":506,"meta":65122,"navigation":522,"path":65132,"seo":65133,"stem":65134,"__hash__":65135,"pinned":-1,"category":65136,"type":65137,"tool":65138},"blog\u002Fblog\u002Frpa-tools.md","The best RPA tools for small and large businesses",{"type":8,"value":64832,"toc":65103},[64833,64836,64839,64842,64846,64849,64853,64856,64860,64867,64871,64878,64882,64885,64889,64892,64896,64899,64911,64915,64924,64927,64939,64943,64946,64950,64953,64965,64969,64981,64985,64997,65001,65013,65017,65020,65024,65027,65038,65040,65052,65056,65068,65072,65075,65079,65082,65084,65087,65091,65094,65097,65100],[14,64834,64835],{},"RPA tools can save businesses, both large and small, time and money by automating repetitive tasks that humans just don’t like doing. Unfortunately, RPA is not as simple as flicking a switch and having the process automated. If you have never worked with RPA tools before, you will need to learn a few things in order to pick the right tool for you and your business.",[18,64837],{"alt":64838},"The best RPA tools on the market",[14,64840,64841],{},"There are many tools to choose from, including those designed to serve mammoth enterprise companies, often subject to hefty license fees. Then there are the RPA tools targeted for SMEs, featuring low-code and no-code options, and even RPA tools with AI capabilities. By the end of this article, you should have a clear picture of which tool is right for you.",[21,64843,64845],{"id":64844},"what-is-rpa","What is RPA?",[14,64847,64848],{},"Robotic Process Automation (RPA) is a technology that automates mundane tasks humans typically perform on computers, like form filling and repetitive clicking. It involves programming software robots, or \"bots,\" to mimic human interactions with software, thereby handling tasks such as entering data, processing transactions, or generating reports. RPA saves time, reduces the likelihood of errors, and frees employees to focus on more creative and strategic tasks. While RPA is extensively used in large enterprises to enhance efficiency, its adoption in small businesses and SMEs, as well as in less tech-heavy industries, is less widespread.",[21,64850,64852],{"id":64851},"how-can-rpa-help-my-business","How can RPA help my business?",[14,64854,64855],{},"RPA can significantly boost your business by automating routine and repetitive tasks, allowing employees to focus on more complex and strategic activities. This shift can lead to increased productivity as bots work faster and can operate around the clock. Additionally, RPA improves accuracy by minimizing human errors in tasks like data entry, ultimately enhancing the quality of work and reducing the likelihood of costly mistakes. Implementing RPA also leads to cost savings by lowering the need for manual labor and reducing operational costs. Overall, RPA can streamline processes, increase efficiency, and offer a quick return on investment, making it a valuable tool for businesses looking to optimize operations.",[21,64857,64859],{"id":64858},"how-expensive-are-rpa-tools","How expensive are RPA tools?",[14,64861,64862,64863,64866],{},"The cost of RPA software tools can vary widely based on the scale of implementation, the complexity of the tasks, and the specific needs of a business. RPA costs can range from $10,000 to millions for enterprise customers once you factor in consultancy and license fees. Not hampered by the enterprise selection processes, enjoy a broader choice and more competitive pricing. This includes RPA agencies offering full services at a cost, open-source RPA products free from license fees (though development fees may apply), and self-serve RPA tools like ",[322,64864,3435],{"href":11915,"rel":64865},[2245],", which start at as little as $15 per month. This diversity ensures the tools servicing the small business sector are innovative and constantly evolving to meet customer needs.",[21,64868,64870],{"id":64869},"do-i-need-to-be-an-expert-to-use-rpa","Do I need to be an expert to use RPA?",[14,64872,64873,64874,64877],{},"If you choose the right tool, you will not need to be an expert to implement RPA technology to automate your business. Enterprise RPA vendors such as UiPath and Automation Anywhere allow you to run and manage your own bots; however, building complex automations will likely require hiring an agency with trained RPA engineers. For open-source tools like Robocorp, you would also need to hire an RPA engineer to implement any bots in your business. On the other hand, tools like ",[322,64875,3435],{"href":11915,"rel":64876},[2245]," are self-serve platforms designed to enable you to create your own bots to automate browser tasks. While there is a learning curve—since the browser can be a challenging environment for creating automations—you do not need to be a coder to use these tools.",[21,64879,64881],{"id":64880},"in-the-age-of-ai-is-rpa-still-relevant","In the Age of AI, is RPA still relevant?",[14,64883,64884],{},"AI is buzzing, but Robotic Process Automation (RPA) remains highly relevant and plays a crucial role in automation strategies. While AI introduces advanced capabilities like natural language processing, RPA excels at automating software interactions. What is truly exciting is the integration of AI with RPA, referred to as Intelligent Automation in enterprise settings. AI enhances RPA's capabilities by enabling it to handle more sophisticated tasks that involve unstructured data and adaptive responses. This merging of technologies allows businesses to automate an even broader spectrum of processes, increasing efficiency and innovation.",[21,64886,64888],{"id":64887},"types-of-rpa-tools-on-the-market","Types of RPA tools on the market",[14,64890,64891],{},"It will come as no surprise that there is an RPA tool to suit any type of business. From long-tail businesses looking to automate and empower themselves to mammoth enterprise companies looking to save time on millions of processes, there are probably three core categories to consider: self-serve, open-source, and enterprise.",[21,64893,64895],{"id":64894},"self-serve-rpa-tools","Self-serve RPA tools",[14,64897,64898],{},"Self-serve RPA tools that require no licensing fees can be a cost-effective option for businesses looking to automate simple processes without a significant initial investment. These tools are typically open-source or offer a freemium model where basic functionalities are free, and users only pay for premium features. Examples include:",[555,64900,64901],{},[83,64902,64903,64910],{},[29,64904,64905],{},[322,64906,64909],{"href":64907,"rel":64908},"https:\u002F\u002Fwww.microsoft.com\u002Fen-gb\u002Fpower-platform\u002Fproducts\u002Fpower-automate",[2245],"Microsoft Power Automate"," - Focusing on integrating and automating workflows across Microsoft applications, it's a powerful tool for businesses.",[592,64912],{"src":64913,"alt":64914},"\u002Fblog\u002Frpa-tool-microsoft-power-automate.jpg","rpa tool power automate",[555,64916,64917],{"start":498},[83,64918,64919,64923],{},[29,64920,64921],{},[322,64922,3435],{"href":50783}," - A no-code tool for anyone to create browser automations. Aimed at users who want to implement their own solutions. Charges based on runtime. Free to try.",[592,64925],{"src":63735,"alt":64926},"rpa tool axiom.ai",[555,64928,64929],{"start":495},[83,64930,64931,64938],{},[29,64932,64933],{},[322,64934,64937],{"href":64935,"rel":64936},"https:\u002F\u002Fwww.autohotkey.com\u002F",[2245],"AutoHotkey"," - Although not a traditional RPA tool, AutoHotkey allows for scripting and automation of the Windows GUI and can be used for simple automation tasks without any cost.",[592,64940],{"src":64941,"alt":64942},"\u002Fblog\u002Frap-auto-hotkey.jpg","rpa tool auto hotkey",[14,64944,64945],{},"These tools typically offer community support and documentation, enabling businesses to start automating with minimal assistance. However, for advanced features, enterprise-level security, and dedicated support, investing in a paid license might be necessary as your needs evolve.",[639,64947,64949],{"id":64948},"open-source-tools","Open Source Tools",[14,64951,64952],{},"Open-source RPA tools empower businesses with the flexibility of customization and the benefit of avoiding licensing fees. This makes them a popular choice for businesses that can develop solutions in-house, putting them in control of their automation technology. Here are several notable open-source RPA tools:",[555,64954,64955],{},[83,64956,64957,64964],{},[29,64958,64959],{},[322,64960,64963],{"href":64961,"rel":64962},"https:\u002F\u002Frobocorp.com\u002F",[2245],"Robocorp"," - A new entrant in the RPA market, Robocorp utilizes an open-source stack and is built on Python.",[592,64966],{"src":64967,"alt":64968},"\u002Fblog\u002Frobocorp.jpg","rpa tool robocorp",[555,64970,64971],{"start":498},[83,64972,64973,64980],{},[29,64974,64975],{},[322,64976,64979],{"href":64977,"rel":64978},"https:\u002F\u002Fgithub.com\u002Fsaucepleez\u002Ftaskt",[2245],"Taskt (formerly sharpRPA)"," - Taskt is built using C# and provides a user-friendly platform to automate Windows-based tasks. It's geared towards developers with a technical background.",[592,64982],{"src":64983,"alt":64984},"\u002Fblog\u002Ftaskt.jpg","rpa tool Taskt",[555,64986,64987],{"start":495},[83,64988,64989,64996],{},[29,64990,64991],{},[322,64992,64995],{"href":64993,"rel":64994},"https:\u002F\u002Faisingapore.org\u002Faiproducts\u002Ftagui\u002F",[2245],"TagUI"," - Designed to be a straightforward tool for automating web interactions and desktop applications. It uses simple syntax for scripting, which can be easily learned by those new to programming.",[592,64998],{"src":64999,"alt":65000},"\u002Fblog\u002Ftgaui.jpg","rpa tool tgaui",[555,65002,65003],{"start":1895},[83,65004,65005,65012],{},[29,65006,65007],{},[322,65008,65011],{"href":65009,"rel":65010},"https:\u002F\u002Fopenrpa.dk\u002Fopenrpa",[2245],"OpenRPA"," - An open-source RPA tool that offers a comprehensive suite for automation. OpenRPA is designed to be user-friendly, making it accessible for both technical and non-technical users.",[592,65014],{"src":65015,"alt":65016},"\u002Fblog\u002Fopenrpa.jpg","rpa tool OpenRPA",[14,65018,65019],{},"These tools generally have active communities and provide documentation to help users get started with automation. They are particularly suitable for organizations that have some technical expertise in-house and are looking to reduce costs.",[639,65021,65023],{"id":65022},"enterprise-rpa-tools","Enterprise RPA Tools",[14,65025,65026],{},"Enterprise Robotic Process Automation (RPA) tools support large-scale implementations, offering robust features that cater to complex automation needs, high levels of security, scalability, and comprehensive customer support. Here are some of the leading enterprise RPA tools:",[555,65028,65029],{},[83,65030,65031,65037],{},[29,65032,65033],{},[322,65034,63825],{"href":65035,"rel":65036},"https:\u002F\u002Fwww.uipath.com\u002F",[2245]," - One of the most popular RPA solutions, UiPath offers a highly intuitive and visual approach to building automation workflows. It supports a wide range of process complexity and integrates seamlessly with numerous enterprise systems.",[592,65039],{"src":63831,"alt":63832},[555,65041,65042],{"start":498},[83,65043,65044,65051],{},[29,65045,65046],{},[322,65047,65050],{"href":65048,"rel":65049},"https:\u002F\u002Fwww.blueprism.com\u002F",[2245],"BluePrism"," - Known for its strong enterprise-grade features, Blue Prism emphasizes security and compliance, making it a preferred choice for industries like banking and finance. It provides a model that is scalable and capable of handling a high volume of processes simultaneously.",[592,65053],{"src":65054,"alt":65055},"\u002Fblog\u002Fblueprism.jpg","rpa tool Blurprism",[555,65057,65058],{"start":495},[83,65059,65060,65067],{},[29,65061,65062],{},[322,65063,65066],{"href":65064,"rel":65065},"https:\u002F\u002Fwww.automationanywhere.com\u002F",[2245],"Automation Anywhere"," - This tool combines traditional RPA with cognitive elements like natural language processing and reading unstructured data. Automation Anywhere is user-friendly for non-developers and robust enough for complex enterprise tasks.",[592,65069],{"src":65070,"alt":65071},"\u002Fblog\u002Fautomationanywhere.jpg","rpa tool Automation Anywhere",[14,65073,65074],{},"These enterprise RPA tools provide not only the technology to automate tasks but also the analytical tools to monitor and optimize the performance of bots. They are typically backed by strong vendor support and a vast partner ecosystem to ensure successful deployment and operation.",[21,65076,65078],{"id":65077},"wrapping-up-choosing-the-right-rpa-tool-for-your-business","Wrapping up: Choosing the Right RPA Tool for Your Business",[14,65080,65081],{},"When choosing your solution, ignoring any specific feature requirements, there are three key considerations: cost, implementation, and security.",[639,65083,59119],{"id":59118},[14,65085,65086],{},"If you are a small business looking to implement RPA, enterprise solutions are likely not for you. While they offer excellent tools, the licensing fees and developer costs can be prohibitive. Small businesses with technical skills should look at self-serve tools or possibly explore open-source options. However, if you are a large-scale business looking to automate processes worth millions, enterprise solutions are most likely a good fit. That said, self-serve or RPA tools may be worth considering for smaller processes or for prototyping MVPs to quickly assess the impact of automation.",[639,65088,65090],{"id":65089},"implementation","Implementation",[14,65092,65093],{},"When it comes to implementation, if you are a citizen automator or enjoy tinkering with tools such as Zapier and e-commerce platforms, the self-serve market is a good fit. You can create bots and implement the solutions yourself without needing to code. However, if you lack technical skills, you may want to consider hiring a bot builder to create the automations for you. If you're a large company looking for a comprehensive review of your processes, implementation, and ongoing management of automations, then enterprise or open source solutions are ideal.",[639,65095,65096],{"id":57244},"Security",[14,65098,65099],{},"Security is perhaps the most important consideration, especially if customer data is part of the processes you wish to automate. Self-serve tools will most likely not come with the certifications that enterprise solutions offer. Security may even be a blocker for large companies using self-serve tools or open-source options. However, enterprise-grade security comes at a higher cost. When choosing a tool and considering your security needs, it’s essential to think about the data involved in the processes. If sensitive data is involved, you must select a secure tool. The good news is that security can be just as robust on self-serve, open-source, and enterprise platforms. For example, self-serve solutions and open-source options can be installed on your own computers, and with the right setup, processing data on your own network can meet the most stringent security requirements.",[14,65101,65102],{},"If you have not tried RPA before and are looking to create an MVP, self-serve tools can be a great way to get started without investing too much money and time, suitable for both large and small businesses.",{"title":494,"searchDepth":495,"depth":495,"links":65104},[65105,65106,65107,65108,65109,65110,65111,65115],{"id":64844,"depth":498,"text":64845},{"id":64851,"depth":498,"text":64852},{"id":64858,"depth":498,"text":64859},{"id":64869,"depth":498,"text":64870},{"id":64880,"depth":498,"text":64881},{"id":64887,"depth":498,"text":64888},{"id":64894,"depth":498,"text":64895,"children":65112},[65113,65114],{"id":64948,"depth":495,"text":64949},{"id":65022,"depth":495,"text":65023},{"id":65077,"depth":498,"text":65078,"children":65116},[65117,65118,65119],{"id":59118,"depth":495,"text":59119},{"id":65089,"depth":495,"text":65090},{"id":57244,"depth":495,"text":65096},"2024-04-03","What are the best RPA tools for small and large businesses and how to select ther right RPAL tool for yoou.",{"read":48203,"type":513,"tool":65123,"category":65124,"tags":65125,"location":46733,"featuredimg":65128,"landingimg":65129,"summary":65130,"video":523,"metaTitle":65131},[46728],[50552],[3974,65126,65127],"rpa","bots","\u002Fblog\u002Frpa-post.jpg","\u002Fblog\u002Frpa-sq.jpg","Find out what are the best RPA tools for small and large businesses and how to select ther right RPAL tool for yoou.","RPA tools for businesses large and small","\u002Fblog\u002Frpa-tools",{"title":64830,"description":65121},"blog\u002Frpa-tools","NsUaZIEft0aVwue6eblPI20AOrvtAl_O7zG5n6fMXpA",[50552],[513],[46728],{"id":65140,"title":65141,"author":46205,"body":65142,"date":65388,"description":64475,"draft":26250,"extension":506,"meta":65389,"navigation":522,"path":65398,"seo":65399,"stem":65400,"__hash__":65401,"pinned":-1,"category":65402,"type":65403,"tool":65404},"blog\u002Fblog\u002Finstagram-bots.md","How to create Instagram bots in minutes",{"type":8,"value":65143,"toc":65369},[65144,65147,65150,65153,65157,65160,65164,65167,65171,65174,65177,65181,65184,65188,65192,65195,65201,65205,65209,65212,65222,65226,65229,65238,65242,65245,65254,65258,65261,65265,65269,65272,65281,65285,65288,65291,65309,65313,65320,65324,65327,65329,65332,65335,65339,65347,65350,65353,65358,65362,65367],[14,65145,65146],{},"Instagram is one heck of a marketing platform, where influencers excel in driving product adoption and sales. However, behind the glitz and glamour lies the demanding work of constant navigating, uploading, liking, and copy-pasting, all essential for maintaining an active and engaging presence. For those looking to streamline these repetitive tasks, Instagram bots provide a practical solution by automating such interactions.",[18,65148],{"alt":65149},"How to create instagram bots to automate your dialy tasks",[14,65151,65152],{},"Keep reading to discover five Instagram bots that anyone can set up in minutes.",[21,65154,65156],{"id":65155},"what-is-an-instagram-bot","What is an Instagram bot?",[14,65158,65159],{},"It's a cousin of the robot; just like a robot, it has a program and carries out the tasks its program tells it to. It does not, however, have arms and legs; it cannot do backflips or shoot lasers. The bots mimic us when they are running, and it's like watching yourself do the work. Instagram opens up, and the bot starts interacting with the UI like we do. It is worth noting that you can use bots to automate any web-based app, not just Instagram.",[21,65161,65163],{"id":65162},"what-can-instagram-bots-automate","What can Instagram bots automate?",[14,65165,65166],{},"Significantly, our bots automate via the user interface in the browser app; we currently do not provide support to automate the mobile app. That still leaves us plenty to automate. You can use bots to automate various tasks, from interacting with posts and liking content to scraping search pages and sending DMs. You can also create bots to interact with features like Reels and Threads. If you keep scrolling, we have some Instagram bot templates for you, such as a bot that sends DMs.",[21,65168,65170],{"id":65169},"can-anyone-make-an-instagram-bot-in-five-minutes","Can anyone make an Instagram bot in five minutes?",[14,65172,65173],{},"We have a range of bot templates to select from, which can be set up in minutes to automate Instagram. To set them up, you will need a Google Sheet and an axiom.ai account. FYI, all new accounts come with 60 minutes of runtime, so you can test all these bot templates for free.",[14,65175,65176],{},"The best part is we guide you every step of the way. So, select a template from the ones listed below and start using Instagram bots.",[639,65178,65180],{"id":65179},"instagram-message-bot","Instagram message bot",[14,65182,65183],{},"This bot template automates Instagram Messages from profile pages, mimicking human interaction. It opens profile URLs from a Google Sheet in Chrome, checks for the 'Message' button, clicks it, types the Messages, and sends it, then moves to the next row in the Sheet.",[592,65185],{"alt":65186,"src":65187},"axiom.ai design pattern for automating messages in Instagram","\u002Fblog\u002Fdesign-pattern-automate-messages.png",[21,65189,65191],{"id":65190},"instagram-post-bot","Instagram Post bot",[14,65193,65194],{},"This Instagram bot posts content from a Google Sheet to your Instagram without requiring an API. The bot retrieves data from the Sheet, opens Instagram in Chrome, clicks 'create', and inputs the data into the Instagram post web form, which is your human actions. After clicking confirm, the bot removes the processed row from the Sheet.",[14,65196,65197,65198],{},"Click here to install an ",[322,65199,65200],{"href":13150},"Instagram Post bot.",[592,65202],{"alt":65203,"src":65204},"axiom.ai design pattern for automating post on Instagram","\u002Fblog\u002Finstgram-post-pot-design-pattern.png",[21,65206,65208],{"id":65207},"instagram-dm-and-like-bot","Instagram DM and like bot",[14,65210,65211],{},"This bot automates Instagram DMs from profile pages, mimicking human interaction. It opens profile URLs from a Google Sheet in Chrome, checks for the 'Message' button, clicks it, types the DM, and sends it. After that, the bot returns to the profile page, clicking on the first post and liking it.",[14,65213,65214,65215,65218],{},"Click here to install our NEW one-click setup ",[322,65216,65217],{"href":11193},"Instagram DM and like bot.",[592,65219],{"alt":65220,"src":65221},"axiom.ai design pattern for instgram dm and like bot","\u002Fblog\u002Fdesign-pattern-instagram.png",[21,65223,65225],{"id":65224},"instagram-search-bot","Instagram search bot",[14,65227,65228],{},"This bot automates Instagram search scraping: it takes search terms from a Google Sheet, appends them to Instagram's search URL, loads the search pages in Chrome, scrapes post links, saves them to a Sheet, deletes processed rows, and repeats with new search terms.",[14,65230,65197,65231,65234],{},[322,65232,65233],{"href":13415},"Instagram search bot.",[592,65235],{"alt":65236,"src":65237},"axiom.ai design pattern for scraping search bot","\u002Fblog\u002Fdesign-pattern-insta-search.png",[21,65239,65241],{"id":65240},"instagram-hashtag-scraper","Instagram hashtag scraper",[14,65243,65244],{},"This bot template scrapes Instagram hashtag pages using a bot. The bot opens a hashtag page in Chrome, collects links to all posts, and extracts each user's handle and profile link. It records the post URLs, handles, and profile URLs into a Google Sheet.",[14,65246,65197,65247,65250],{},[322,65248,65249],{"href":13664},"Instagram hashtag scraper bot.",[592,65251],{"alt":65252,"src":65253},"axiom.ai design pattern for scraping hashtags bot","\u002Fblog\u002Fdesign-pattern-scrape-hash-insta.png",[21,65255,65257],{"id":65256},"instagram-follow-and-message","Instagram follow and message",[14,65259,65260],{},"This bot template automates clicking 'follow' then sending a message. It opens profile URLs from a Google Sheet in Chrome, clicks 'follow' then sends a message.",[592,65262],{"alt":65263,"src":65264},"axiom.ai instagram bot that follows and send message","\u002Fblog\u002Finstagram-bot-send-message-follow-design-pattern.png",[21,65266,65268],{"id":65267},"instagram-scrape-users-from-likes","Instagram scrape users from likes",[14,65270,65271],{},"Our last Instagram bot scrapes post likes for user handles and profile links, limited to 100 per post by Instagram. It reads a post link from Google Sheets, opens it in Chrome, likes the post, and scrapes the user data. Afterwards, it deletes the row from Google Sheets and moves on to the next post.",[14,65273,65197,65274,65277],{},[322,65275,65276],{"href":20234},"Instagram scrape users from likes bot.",[592,65278],{"alt":65279,"src":65280},"axiom.ai instagram bot that scrapes user handles from likes","\u002Fblog\u002Fbot-scrape-likers-post-design-pattern.png",[21,65282,65284],{"id":65283},"can-i-make-a-custom-instagram-bot","Can I make a custom Instagram bot?",[14,65286,65287],{},"Yes, you can. Building a bot from scratch is simple enough and can take minutes when you know what you're doing. You could also customize a bot from the list of templates above. Adapting templates and studying their design patterns is an excellent way to learn axiom.ai.",[14,65289,65290],{},"Here are some vanilla-starter templates you may want to start with:",[555,65292,65293,65299],{},[83,65294,65295,65296],{},"Click to start with a basic ",[322,65297,65298],{"href":15104},"web scraper bot.",[83,65300,65301,65302,65305,65306],{},"Start with this ",[322,65303,65304],{"href":7052},"Enter data bot","3. Press to create a bot that ",[322,65307,65308],{"href":23565},"uploads files.",[21,65310,65312],{"id":65311},"can-axiomai-make-me-an-instagram-bot","Can axiom.ai make me an Instagram bot ?",[14,65314,65315,65316,65319],{},"We love making bots; we have made bots for pretty much all the social media platforms and beyond. Even better, we love a challenge, so if you have an idea for an Instagram bot template, reach out via ",[322,65317,65318],{"href":486},"support."," We may well build it for you.",[21,65321,65323],{"id":65322},"would-using-instagram-bots-get-me-blocked","Would using Instagram bots get me blocked?",[14,65325,65326],{},"Yes, you could be the honest answer, but if you use your bots responsibly to automate your work and don't exceed Instagram's web call limits, you will not encounter any issues. If you are the type of user looking to build a large-scale bot farm, then axiom.ai is not the tool for you.",[21,65328,796],{"id":795},[14,65330,65331],{},"In conclusion, Instagram bots offer a powerful solution for automating tedious, repetitive tasks on one of the most influential marketing platforms today. From scheduling posts and liking content to scraping data and automating direct messages, these bots can do it all, directly through the browser interface. We've shown that with a range of bot templates and a little guidance, anyone can start automating Instagram tasks in minutes, making their social media management more efficient and effective.",[14,65333,65334],{},"Whether you're a beginner looking to dive into the world of automation with pre-made templates or an experienced developer eager to build or customize your own bots, there's a path for you. axiom.ai provides the tools and support you need to harness the power of automation without the risk of getting blocked, as long as you operate within Instagram's guidelines.",[21,65336,65338],{"id":65337},"if-you-are-stuck-reach-out-and-we-will-help","If you are stuck, reach out, and we will help.",[14,65340,65341,65342,65346],{},"If you are unsure how to get started or need any assistance, please feel free to reach out to me at ",[322,65343,65345],{"href":65344},"mailto:alex@axiom.ai","alex@axiom.ai",". I would be more than happy to help you.",[14,65348,65349],{},"Let's make the digital world error-free and full of creativity together! 🚀",[14,65351,65352],{},"Try Axiom with two hours of free runtime.",[14,65354,65355],{},[322,65356,19124],{"href":13910,"rel":65357},[2245],[21,65359,65361],{"id":65360},"got-a-great-idea-for-a-bot-share-it-with-me","Got a great idea for a bot? Share it with me!",[14,65363,65364,65365,65346],{},"If you have an excellent idea, then you are in luck! New Axiom accounts come with 60 minutes of free runtime for experimentation. If you are unsure how to get started or need any assistance, please feel free to reach out to me at ",[322,65366,65345],{"href":65344},[14,65368,65349],{},{"title":494,"searchDepth":495,"depth":495,"links":65370},[65371,65372,65373,65376,65377,65378,65379,65380,65381,65382,65383,65384,65385,65386,65387],{"id":65155,"depth":498,"text":65156},{"id":65162,"depth":498,"text":65163},{"id":65169,"depth":498,"text":65170,"children":65374},[65375],{"id":65179,"depth":495,"text":65180},{"id":65190,"depth":498,"text":65191},{"id":65207,"depth":498,"text":65208},{"id":65224,"depth":498,"text":65225},{"id":65240,"depth":498,"text":65241},{"id":65256,"depth":498,"text":65257},{"id":65267,"depth":498,"text":65268},{"id":65283,"depth":498,"text":65284},{"id":65311,"depth":498,"text":65312},{"id":65322,"depth":498,"text":65323},{"id":795,"depth":498,"text":796},{"id":65337,"depth":498,"text":65338},{"id":65360,"depth":498,"text":65361},"2024-03-24",{"read":48203,"type":513,"tool":65390,"category":65391,"tags":65392,"location":46733,"featuredimg":65394,"landingimg":65395,"summary":65396,"video":523,"metaTitle":65397},[46728],[53990],[65127,12880,53417,1053,65393],"scrape","\u002Fblog\u002Finstagram-bots-post.jpg","\u002Fblog\u002Finstagram-sq.jpg","Learn how to automate Instagram in the browser with axiom.ai a no-code bot building tool.","Anyone can automate Instagram with bots","\u002Fblog\u002Finstagram-bots",{"title":65141,"description":64475},"blog\u002Finstagram-bots","IJrGMY1dO8HbHaAmgLzBpkSfv5JBIrZSVmeEKw2JqMI",[53990],[513],[46728],{"id":65406,"title":65407,"author":46205,"body":65408,"date":65701,"description":65702,"draft":26250,"extension":506,"meta":65703,"navigation":522,"path":65712,"seo":65713,"stem":65714,"__hash__":65715,"pinned":-1,"category":65716,"type":65717,"tool":65718},"blog\u002Fblog\u002Fdownload-files-from-a-link.md","How to download files from a URL in Chome",{"type":8,"value":65409,"toc":65672},[65410,65413,65416,65423,65427,65433,65437,65440,65444,65451,65455,65458,65462,65465,65469,65472,65475,65479,65482,65486,65490,65493,65497,65500,65503,65507,65511,65514,65519,65523,65526,65537,65541,65544,65548,65552,65554,65558,65562,65564,65578,65582,65585,65589,65593,65596,65605,65609,65612,65616,65619,65622,65626,65629,65633,65637,65640,65644,65651,65653,65656,65659,65662,65666,65670],[14,65411,65412],{},"Many of us work predominantly within a browser, frequently engaging in repetitive tasks like downloading files. However, these tasks can easily be automated, without having to write any code. Using our no-code bot-building tool, you can simply point and click to create a bot that automates file downloads from a URL to your computer or Google Drive or directly from a URL.",[18,65414],{"alt":65415},"How to autoamte file downloads with axiom.ai",[14,65417,65418,65419,65422],{},"Let us teach you how to build a bot, but if you're in a hurry, try using our ",[322,65420,65421],{"href":10670},"template for file downloads."," Give it a try, and work smarter!",[21,65424,65426],{"id":65425},"what-is-a-download-bot","What is a Download bot?",[14,65428,65429,65430,65432],{},"A download bot is a straightforward program you can create without coding to automate user interface interactions, specifically clicking and downloading files. This saves you time and effort. Such a bot operates within the Chrome browser, facilitating ",[322,65431,64481],{"href":18497}," to your local drive or Google Drive.",[21,65434,65436],{"id":65435},"what-could-i-use-these-download-bots-for","What could I use these download bots for?",[14,65438,65439],{},"You can use bots to download files, but what might not be so obvious is that you can create a bot to automate downloading files from behind a login. Yes, bots can download files from nearly any web application to your local folder or Google Drive. You can add steps for the bot to enter data and interact with buttons to generate files for downloading. File download bots are versatile, supporting many use cases from content migration to reporting and even social media or e-commerce.",[21,65441,65443],{"id":65442},"can-anyone-make-a-file-bot-to-download","Can anyone make a file bot to download?",[14,65445,65446,65447,65450],{},"Not a coder or have never automated anything before? Don't worry—it's quite simple and doesn't require writing a single line of code. axiom.ai offers a user-friendly point-and-click interface, making it quick and easy to set up a bot like this in just a few minutes. Plus, we're here to guide you through the process, especially if you use one of our ",[322,65448,65449],{"href":10670},"download file templates"," for local drive or Google Drive.",[21,65452,65454],{"id":65453},"how-do-the-bots-work","How do the bots work?",[14,65456,65457],{},"Guess what? The bots work just like you would—they open up the website URL you give them, click on the button, and download the file. They don't get bored or distracted like we do.",[21,65459,65461],{"id":65460},"make-your-download-bot-in-minutes","Make your download bot in minutes",[14,65463,65464],{},"So, if you love learning new tricks, read on! I will show you how to make a download bot for yourself, and it's pretty easy. By the end, you'll have picked up a new automation skill. Let's dive in and get you started on learning this new skill.",[21,65466,65468],{"id":65467},"getting-started-withaxiomaisbot-builder-interface","Getting started with axiom.ai's bot builder interface",[14,65470,65471],{},"If this is your first time using Axiom, don't worry. Our user interface is as simple as point-and-click. I'll walk you through it step by step. First off, the basics are very straightforward. You select steps that replicate the actions you wish to automate, combining those steps to create a bot that automates your task.",[14,65473,65474],{},"Lets teach you some basics first.",[639,65476,65478],{"id":65477},"starting-point","Starting point",[14,65480,65481],{},"In the following examples we will start from blank by clicking 'Add first step'.",[592,65483],{"alt":65484,"src":65485},"axiom.ai getting started making a bot","\u002Fblog\u002Faxiom-first-step.jpg",[639,65487,65489],{"id":65488},"use-the-step-finder-to-search-for-and-add-steps","Use the step finder to search for and add steps",[14,65491,65492],{},"The step finder will pop-up. We use this to find and select the steps we require to replicate our use case",[592,65494],{"alt":65495,"src":65496},"axiom.ai step finder ui","\u002Fblog\u002Fstep-finder.jpg",[14,65498,65499],{},"You can click 'Add step' or between steps to open the step finder.",[14,65501,65502],{},"This will be easy; we only need to add two steps to create a download bot. We can make three types of download bots, all without using any code. We can make bots to download files locally, to Google Drive, or from a URL.",[21,65504,65506],{"id":65505},"lets-start-with-a-bot-that-downloads-files-locally","Let's start with a bot that downloads files locally",[639,65508,65510],{"id":65509},"_1-add-your-first-step-go-to-page"," 1. Add your first step, 'Go to page'",[14,65512,65513],{},"Click the 'Add first step' button. Using the Step Finder search for 'Go to page' and click to add.",[555,65515,65516],{},[83,65517,65518],{},"Enter URL - Insert the url of the page you wish to download files from",[639,65520,65522],{"id":65521},"_2-add-your-final-step-download-files","2. Add your final step, 'Download files'",[14,65524,65525],{},"Click the 'Add step' button below the 'Go to page' step. Using the Step Finder search for 'Download files' and click to add.",[555,65527,65528,65531,65534],{},[83,65529,65530],{},"Select - Click 'Select' to choose the files to download",[83,65532,65533],{},"Folder - Set a folder to download into (please note currently only one new folder can be created at a time)",[83,65535,65536],{},"File name - Enter a name to save the files as",[592,65538],{"alt":65539,"src":65540},"axiom.ai making download file bot","\u002Fblog\u002Fdownload-bot.jpg",[14,65542,65543],{},"Thats it your download bot is complete. Ready to test.",[21,65545,65547],{"id":65546},"now-create-a-bot-that-downloads-files-onto-your-google-drive","Now create a bot that downloads files onto your Google Drive",[639,65549,65551],{"id":65550},"_1-add-your-first-step-go-to-page-1","1. Add your first step, 'Go to page'",[14,65553,65513],{},[555,65555,65556],{},[83,65557,65518],{},[639,65559,65561],{"id":65560},"_2-add-your-final-step-download-a-file-to-google-drive","2. Add your final step, 'Download a file to Google Drive'",[14,65563,65525],{},[555,65565,65566,65569,65572,65575],{},[83,65567,65568],{},"Select - Click 'Select' to choose the files to download.",[83,65570,65571],{},"Google Drive folder URL - Enter the URL of the folder in Google Drive to download to.",[83,65573,65574],{},"File name - Enter a name for the file on Google Drive. Leave blank to keep the existing filename.",[83,65576,65577],{},"Local folder - If you are using the desktop version of Axiom you can set a local folder here to use as an intermediate step for the file download",[592,65579],{"alt":65580,"src":65581},"axiom.ai making download file to google drive bot","\u002Fblog\u002Fdownload-drive.jpg",[14,65583,65584],{},"That's it. Your download to Google Drive bot is complete. Ready to test.",[21,65586,65588],{"id":65587},"now-make-a-bot-that-downloads-files-direct-from-a-url","Now make a bot that downloads files direct from a URL",[639,65590,65592],{"id":65591},"_1-add-your-final-step-download-file-from-url","1. Add your final step, 'Download file from URL'",[14,65594,65595],{},"Click the 'Add step' button below the 'Go to page' step. Using the Step Finder, search for 'Download files' and click to add.",[555,65597,65598,65601,65603],{},[83,65599,65600],{},"Enter URL - Enter the URL of a file to download",[83,65602,65533],{},[83,65604,65536],{},[592,65606],{"alt":65607,"src":65608},"axiom.ai making download file from URL bot","\u002Fblog\u002Fdownload-url-bot.jpg",[14,65610,65611],{},"Thats it your download from URL bot is complete. Ready to test.",[21,65613,65615],{"id":65614},"customising-bots-with-a-loop","Customising bots with a loop",[14,65617,65618],{},"If your bot needs to perform extra actions, like logging in or pressing a button before downloading a file, there's no need to fret. You can apply what you've learned to include more steps and tailor your bot perfectly to your needs.",[14,65620,65621],{},"Moreover, if you aim to have your bot cycle through pages or URLs to download files, you can effortlessly adapt your bot by incorporating a loop step. Just follow the design patterns in the image below to achieve this.",[639,65623,65625],{"id":65624},"loop-download-files-local","Loop download files local",[14,65627,65628],{},"The design pattern would look like this. Simply chnage the download step to meet your requirments.",[592,65630],{"alt":65631,"src":65632},"axiom.ai looping download bot","\u002Fblog\u002Ffile-download-bot-loop.jpg",[21,65634,65636],{"id":65635},"running-your-download-automation-locally-or-in-the-cloud","Running your download automation locally or in the cloud",[14,65638,65639],{},"As mentioned, these bots have constraints. If you plan to run the bot locally, use the 'Download files' step. To run your bot in the cloud, you'll need to use the 'Download files onto your Google Drive' step. You can also schedule your bots. Don't forget: All new users get 140 minutes of runtime for free to test their bots.",[21,65641,65643],{"id":65642},"short-of-time-why-not-start-with-a-template","Short of time, why not start with a template",[14,65645,65646,65647,65650],{},"If you're short on time, use our ",[322,65648,65649],{"href":10670},"'download files'"," template to start. It comes complete with a guided setup.",[21,65652,796],{"id":795},[14,65654,65655],{},"As always, there's more than one way to approach this. The key is choosing the best method that suits your needs, depending on whether you plan to run the bot on the cloud or your desktop. Once you've made that choice, you can create a working bot by combining a 'go to page' step with a download step. It's simple once you know how.",[14,65657,65658],{},"It's just one of many web actions you can automate in the browser.",[14,65660,65661],{},"If you want to learn more about working with files, check out our documentation. You can also learn more about our 'download file', 'download files', 'download to Google Drive', and finally 'download from URL' steps.",[21,65663,65665],{"id":65664},"got-a-great-idea-for-an-automation-share-it-with-me","Got a great idea for an automation? Share it with me!",[14,65667,65364,65668,65346],{},[322,65669,65345],{"href":65344},[14,65671,65349],{},{"title":494,"searchDepth":495,"depth":495,"links":65673},[65674,65675,65676,65677,65678,65679,65683,65687,65691,65694,65697,65698,65699,65700],{"id":65425,"depth":498,"text":65426},{"id":65435,"depth":498,"text":65436},{"id":65442,"depth":498,"text":65443},{"id":65453,"depth":498,"text":65454},{"id":65460,"depth":498,"text":65461},{"id":65467,"depth":498,"text":65468,"children":65680},[65681,65682],{"id":65477,"depth":495,"text":65478},{"id":65488,"depth":495,"text":65489},{"id":65505,"depth":498,"text":65506,"children":65684},[65685,65686],{"id":65509,"depth":495,"text":65510},{"id":65521,"depth":495,"text":65522},{"id":65546,"depth":498,"text":65547,"children":65688},[65689,65690],{"id":65550,"depth":495,"text":65551},{"id":65560,"depth":495,"text":65561},{"id":65587,"depth":498,"text":65588,"children":65692},[65693],{"id":65591,"depth":495,"text":65592},{"id":65614,"depth":498,"text":65615,"children":65695},[65696],{"id":65624,"depth":495,"text":65625},{"id":65635,"depth":498,"text":65636},{"id":65642,"depth":498,"text":65643},{"id":795,"depth":498,"text":796},{"id":65664,"depth":498,"text":65665},"2024-03-23","Learn how to create bots to automate file downloads from URLs using axiom.ai a no-code bot building tool",{"read":46726,"type":513,"tool":65704,"category":65705,"tags":65707,"location":46733,"featuredimg":65709,"landingimg":65710,"summary":65702,"video":523,"metaTitle":65711},[46728],[65706],"File automation",[65708,10668,65127],"uopload","\u002Fblog\u002Flink-download-post.jpg","\u002Fblog\u002Flink-download-sq.jpg","Automate file download from a URL with a bot","\u002Fblog\u002Fdownload-files-from-a-link",{"title":65407,"description":65702},"blog\u002Fdownload-files-from-a-link","apC4vUjgW-Fdq19-hmr65ZhzZ48E9l1yyb73SC5vFwI",[65706],[513],[46728],{"id":65720,"title":65721,"author":46205,"body":65722,"date":66041,"description":494,"draft":26250,"extension":506,"meta":66042,"navigation":522,"path":66051,"seo":66052,"stem":66053,"__hash__":66054,"pinned":-1,"category":66055,"type":66056,"tool":66057},"blog\u002Fblog\u002Fai-proofreader.md","A Dyslexic's Idea: AI Proofreading with axiom.ai and ChatGPT",{"type":8,"value":65723,"toc":66019},[65724,65728,65731,65733,65736,65740,65743,65746,65750,65753,65757,65760,65764,65767,65771,65774,65778,65786,65790,65793,65795,65799,65806,65814,65818,65821,65825,65832,65836,65841,65849,65853,65857,65862,65866,65874,65878,65883,65887,65898,65902,65907,65911,65925,65929,65934,65938,65954,65958,65963,65967,65980,65988,65992,65995,65999,66003,66006,66009,66013,66017],[21,65725,65727],{"id":65726},"automate-checking-a-website-for-typos-with-axiomai-and-chatgpt","Automate checking a website for typos with axiom.ai and ChatGPT",[14,65729,65730],{},"Hello there! I'd like to discuss a common issue that I face due to my dyslexia. While creating content for the axiom.ai website, I often make spelling mistakes which can be quite frustrating. Even after proofreading, sometimes those sneaky typos escape my attention and end up compromising the quality of our web pages.",[18,65732],{},[14,65734,65735],{},"After pondering, I realized the issue wasn't fixing typos, but the endless hours spent proofreading hundreds of pages. It's a thankless task. So, I wondered if I could create a bot to automate this process.",[21,65737,65739],{"id":65738},"which-problem-are-we-solving","Which problem are we solving?",[14,65741,65742],{},"Before discussing solutions, let's first understand the problem at hand. I have identified two tasks: finding the typos and fixing them. Fixing typos is a quick process. Therefore, for now, I will focus on finding the typos, as reading hundreds of pages to identify errors is a time-consuming task.",[14,65744,65745],{},"Let's automate typo detection. Can it be done? Hell yes!",[21,65747,65749],{"id":65748},"the-key-challenges","The key challenges",[14,65751,65752],{},"While brainstorming, I came across two main challenges. The first challenge is to extract data from web pages, which can be done through web scraping. The second challenge is to identify and correct any spelling or typing errors that may be present in the content, without spending too much time.",[21,65754,65756],{"id":65755},"solving-the-challenges","Solving the challenges",[14,65758,65759],{},"Here's my solution: I'll use a Google Sheet to maintain a list of links. I'll scrape those links using axiom.ai's ‘Get data from a URL’ step. Then, I'll pass the scraped data into our ChatGPT step. The AI will then check for any errors and provide recommendations. I will write these recommendations into the Google Sheet for later review and correction.",[21,65761,65763],{"id":65762},"how-to-make-the-proofreading-ai-with-axiomai-and-chatgpt","How to make the proofreading AI with axiom.ai and ChatGPT",[14,65765,65766],{},"Follow this guide, and you will have your AI proofreading set up and ready for testing in under 10 minutes.",[639,65768,65770],{"id":65769},"create-your-google-sheet","Create your Google Sheet",[14,65772,65773],{},"Create a new Google Sheet. You can do this in your Chrome browser by typing 'sheet.new' into the address bar. Don’t forget to name your sheet something descriptive, like 'Website Links’. Then, add some links to test your bot with.",[639,65775,65777],{"id":65776},"grab-your-chatgpt-api-key","Grab your ChatGPT API key",[14,65779,65780,65781],{},"Gab your Open AI Chat GPT API key here, this can be found on your Open AI ",[322,65782,65785],{"href":65783,"rel":65784},"https:\u002F\u002Fplatform.openai.com\u002Faccount\u002Fapi-keys",[2245],"account page.",[639,65787,65789],{"id":65788},"open-axiomai-in-your-chrome-browser","Open axiom.ai in your Chrome browser.",[14,65791,65792],{},"From axiom.ai's dashboard, click 'New Automation', then 'Add First Step'. Now, follow the guide below. In just seven steps, your AI bot will be complete.",[592,65794],{"alt":65484,"src":65485},[639,65796,65798],{"id":65797},"_1-add-a-read-data-from-a-google-sheet-step","1. Add a 'Read data from a Google Sheet' step",[14,65800,65801,65802,65805],{},"Use the Step Finder to search for ",[29,65803,65804],{},"‘Read data from a Google Sheet’"," and click on it. The step will be added to Axiom for you to configure.",[80,65807,65808,65811],{},[83,65809,65810],{},"Spreadsheet - Search for the Google Sheet you created. Once found, click to select",[83,65812,65813],{},"Sheet name - Choose the tab containing website links",[592,65815],{"alt":65816,"src":65817},"axiom.ai configuring read data from a Google Sheet step","\u002Fblog\u002Faxiom-read-from-gs.jpg",[639,65819,65820],{"id":46361},"2. Add a 'Loop through data' step",[592,65822],{"alt":65823,"src":65824},"axiom.ai find loop step in finder","\u002Fblog\u002Faxiom-step-finder-loop.jpg",[14,65826,65827,65828,65831],{},"Next, add a new step by entering ",[29,65829,65830],{},"‘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.",[639,65833,65835],{"id":65834},"_3-now-inside-the-loop-add-a-go-to-page-sub-step","3. Now inside the loop, add a 'Go to page' sub step",[14,65837,65801,65838,65805],{},[29,65839,65840],{},"‘Go to page’",[80,65842,65843],{},[83,65844,65845,65846,65848],{},"Enter url field, select ",[29,65847,7235],{}," and select the data from your Google Sheet, select the column containing the website links",[592,65850],{"alt":65851,"src":65852},"axiom.ai pass data into a go to URL step","\u002Fblog\u002Faxiom-data-go-to-page.jpg",[639,65854,65856],{"id":65855},"_4-still-inside-the-loop-add-a-get-data-from-bots-current-page-sub-step","4. Still inside the loop, add a 'Get data from bot's current page' sub step",[14,65858,65801,65859,65805],{},[29,65860,65861],{},"‘Get data from bot's current page'",[592,65863],{"alt":65864,"src":65865},"axiom.ai configure the scraper","\u002Fblog\u002Fscrape-proof-reading.png",[80,65867,65868,65871],{},[83,65869,65870],{},"Select - Point and click to select the text you wish to scrape. Make a single selection and choose an element that wraps around all the content to be proofed",[83,65872,65873],{},"Max Results - Set to 1",[639,65875,65877],{"id":65876},"_5-still-inside-the-loop-add-an-generate-text-with-chatgpt-sub-step","5. Still inside the loop, add an 'Generate text with ChatGPT' sub step",[14,65879,65801,65880,65805],{},[29,65881,65882],{},"‘Generate text with ChatGPT'",[592,65884],{"alt":65885,"src":65886},"axiom.ai set up ChatGPt step","\u002Fblog\u002Fchatgpt-proof.png",[80,65888,65889,65892],{},[83,65890,65891],{},"ChatGPT API key - Enter your API key",[83,65893,65894,65895,65897],{},"Prompt - Insert the text 'Check this text for spelling mistakes and grammar, return in bullet list compatible with spread sheet cell -' then click 'Insert data' followed by '",[727,65896,5975],{},"' to add the scraped data to check.'",[639,65899,65901],{"id":65900},"_6-still-inside-the-loop-add-an-append-or-merge-data-sub-step","6. Still inside the loop, add an 'Append or Merge Data' sub step",[14,65903,65801,65904,65805],{},[29,65905,65906],{},"‘Append or Merge Data'",[592,65908],{"alt":65909,"src":65910},"axiom.ai append data into one variable","\u002Fblog\u002Fappend-proof.png",[80,65912,65913,65919],{},[83,65914,65915,65916,65918],{},"Data A - Insert '",[727,65917,139],{},"' and select the column containing the URL",[83,65920,65921,65922,65924],{},"Data B - Insert '",[727,65923,14227],{},"'",[639,65926,65928],{"id":65927},"_7-still-inside-the-loop-add-a-write-data-to-a-google-sheet-sub-step","7. Still inside the loop, add a 'Write Data to a Google Sheet' sub step",[14,65930,65801,65931,65805],{},[29,65932,65933],{},"‘Write Data to a Google Sheet'",[592,65935],{"alt":65936,"src":65937},"axiom.ai write data to google sheet","\u002Fblog\u002Fwrite-proof-sheet.png",[80,65939,65940,65942,65945,65951],{},[83,65941,65810],{},[83,65943,65944],{},"Sheet name - Choose the tab you created",[83,65946,65947,65948,65924],{},"DATA - Select the '",[727,65949,65950],{},"appended-data",[83,65952,65953],{},"Clear data before writing | Add to existing data - Set this option to 'Add to existing' data'",[639,65955,65957],{"id":65956},"_8-still-inside-the-loop-add-a-delete-rows-from-a-google-sheet-sub-step","8. Still inside the loop, add a 'Delete rows from a Google Sheet' sub step",[14,65959,65801,65960,65805],{},[29,65961,65962],{},"‘Delete rows from a Google Sheet'",[592,65964],{"alt":65965,"src":65966},"axiom.ai delete row from sheet","\u002Fblog\u002Fdelete-proof-sheet.png",[80,65968,65969,65971,65974,65977],{},[83,65970,65810],{},[83,65972,65973],{},"Sheet name - Choose the tab you created for links",[83,65975,65976],{},"First row - Set to 1",[83,65978,65979],{},"Last row - Set to 1",[14,65981,65982,65983],{},"Don't forget this video shows you how to ",[322,65984,65987],{"href":65985,"rel":65986},"https:\u002F\u002Fyoutu.be\u002FWhq1hgwYxcY?si=Icr_VWmDVYLDKvJ9&t=115",[2245],"configure your bot.",[639,65989,65991],{"id":65990},"_8-running-the-ai-proofreader","8. Running the AI proofreader",[14,65993,65994],{},"You can run it on your desktop or in the cloud. Your final Axiom should resemble the design pattern shown below.",[592,65996],{"alt":65997,"src":65998},"axiom.ai ai proof reader design pattern","\u002Fblog\u002Fai-proof-reader-design.jpg",[21,66000,66002],{"id":66001},"conclusion-the-response-i-got-back-from-chatgpt","Conclusion - the response I got back from ChatGPT",[14,66004,66005],{},"I wasn't sure what to expect from ChatGPT, but it exceeded my expectations. It not only caught typos that I missed during my proofreading process, but it also suggested grammar corrections. The tool broke down errors line by line, which made it very easy to understand and learn from. And the best part was that ChatGPT provided explanations for each correction, which helped me fill in some educational gaps.",[14,66007,66008],{},"Not only does this bot save time proofreading, it also improves writing skills.",[21,66010,66012],{"id":66011},"got-a-great-idea-share-it-with-me","Got a great idea? Share it with me!",[14,66014,65364,66015,65346],{},[322,66016,65345],{"href":65344},[14,66018,65349],{},{"title":494,"searchDepth":495,"depth":495,"links":66020},[66021,66022,66023,66024,66025,66039,66040],{"id":65726,"depth":498,"text":65727},{"id":65738,"depth":498,"text":65739},{"id":65748,"depth":498,"text":65749},{"id":65755,"depth":498,"text":65756},{"id":65762,"depth":498,"text":65763,"children":66026},[66027,66028,66029,66030,66031,66032,66033,66034,66035,66036,66037,66038],{"id":65769,"depth":495,"text":65770},{"id":65776,"depth":495,"text":65777},{"id":65788,"depth":495,"text":65789},{"id":65797,"depth":495,"text":65798},{"id":46361,"depth":495,"text":65820},{"id":65834,"depth":495,"text":65835},{"id":65855,"depth":495,"text":65856},{"id":65876,"depth":495,"text":65877},{"id":65900,"depth":495,"text":65901},{"id":65927,"depth":495,"text":65928},{"id":65956,"depth":495,"text":65957},{"id":65990,"depth":495,"text":65991},{"id":66001,"depth":498,"text":66002},{"id":66011,"depth":498,"text":66012},"2024-01-02",{"read":53987,"type":513,"tool":66043,"category":66044,"tags":66045,"takeaways":523,"featuredimg":66047,"landingimg":66048,"summary":66049,"video":66050},[46728],[53990],[3974,19965,518,66046],"proof reading","\u002Fblog\u002Fai-reader-post.jpg","\u002Fblog\u002Fai-reader-sq.jpg","How to create an AI proofreader with axiom.ai and ChatGpt.","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FWhq1hgwYxcY?rel=0","\u002Fblog\u002Fai-proofreader",{"title":65721,"description":494},"blog\u002Fai-proofreader","0Y4G37E1KdB8m172F-10KVHPN_tDdk4b2wsG2aPak5I",[53990],[513],[46728],{"id":66059,"title":66060,"author":46205,"body":66061,"date":66312,"description":66065,"draft":26250,"extension":506,"meta":66313,"navigation":522,"path":66321,"seo":66322,"stem":66323,"__hash__":66324,"pinned":-1,"category":66325,"type":66326,"tool":66327},"blog\u002Fblog\u002Ffuture-of-ai-browser-automation.md","Launching soon: Axiom 4.0 Takes AI Browser Automation to the Next Level",{"type":8,"value":66062,"toc":66293},[66063,66066,66069,66072,66076,66079,66083,66086,66090,66094,66097,66101,66107,66110,66113,66117,66120,66123,66126,66130,66134,66137,66141,66144,66147,66151,66154,66157,66161,66164,66168,66171,66175,66178,66186,66189,66192,66196,66199,66207,66211,66214,66218,66221,66224,66228,66231,66235,66239,66242,66246,66249,66252,66272,66275,66279,66282],[14,66064,66065],{},"Meet Axiom 4.0, our enhanced Chrome browser automation tool. This update introduces significant changes, including a redesigned Axiom builder. We've removed the 'Interact’ step and introduced a new 'Loop' step for up to four levels of nesting. In addition, we've tweaked the Step Finder to make it a Notion-like UI experience and added several new logic steps based on user requests. This post will guide you through these new features and show you how to use them effectively.",[18,66067],{"alt":66068},"The future of browser automation",[14,66070,66071],{},"Before we begin, we’d like to express our gratitude to the team for persistently tackling complex problems and solving them. To our customers, thank you for taking the time to share your valued feedback! Please keep sending us feedback via our support form. We love your ideas.",[21,66073,66075],{"id":66074},"why-did-we-make-axiom-40","Why did we make Axiom 4.0?",[14,66077,66078],{},"In our eagerness to launch our product, we initially made some design choices in the builder that resulted in a more complex UI than necessary. These early mistakes became significant barriers to further improvements. With Axiom 4.0, we've addressed these issues, paving the way for a more streamlined and efficient tool. This marks the beginning of an even more dynamic and promising phase in our product's development.",[21,66080,66082],{"id":66081},"what-about-my-old-axioms","What about my old Axioms?",[14,66084,66085],{},"Don’t worry! All of your old Axioms will work in Axiom 4.0 and beyond. The ‘Interact’ step will still function even though it's been retired.",[21,66087,66089],{"id":66088},"ready-let-us-take-you-through-the-cool-new-stuff","Ready? Let us take you through the cool new stuff",[639,66091,66093],{"id":66092},"new-step-finder","New Step Finder",[14,66095,66096],{},"The first thing you will see are the new ‘Beginner snippets’. These are common design patterns used in most Axioms. A great way to start making an Axiom quickly. In the future, we’ll enable users to make and store their own snippets - another feature requested by users.",[592,66098],{"alt":66099,"src":66100},"axiom.ai design pattern web scraper","\u002Fblog\u002Fnew-step-finder.jpg",[14,66102,66103,66104,66106],{},"Find below our step categories. We’ve put the steps into categories, allowing you easily find the steps you need. However when using the Step Finder we encourage you to type into the Search bar and press return to add your ",[322,66105,7285],{"href":7353},", as you would in Notion. It’s way faster!",[14,66108,66109],{},"Top tip: to add multiple steps at once, simply add a star with a number - like this ‘Enter text *5’. Press return and you’ll see five ‘Enter text’ steps added to your Axiom.",[592,66111],{"alt":66099,"src":66112},"\u002Fblog\u002Fadd-multiple-steps.jpg",[639,66114,66116],{"id":66115},"introducing-nesting-with-our-new-loop-step","Introducing nesting with our new Loop step",[14,66118,66119],{},"We now have a brand new step called ‘Loop through data’. To find it, search for ‘Loop’ inside the Axiom Step Finder. It does exactly what it says on the tin, it loops any nested steps inside the loop.",[14,66121,66122],{},"The updated Axiom now offers enhanced flexibility compared to the previous version. With the new loop step, you can nest loops within each other, up to four levels deep. Crucially, unlike the old ‘Interact’ step, the ‘Loop’ step allows for the use of any type of step within it, significantly expanding the tool's functionality.",[14,66124,66125],{},"To find the step, type ‘Loop’ into the Step Finder.",[592,66127],{"alt":66128,"src":66129},"axiom.ai add loop step","\u002Fblog\u002Fadd-loop-step.jpg",[639,66131,66133],{"id":66132},"how-to-build-your-axioms-with-our-new-nesting-loop-step","How to build your Axioms with our new nesting loop step",[14,66135,66136],{},"Anyone looping through rows of data in a Google Sheet should now follow the below design patterns.",[639,66138,66140],{"id":66139},"design-pattern-for-looping-through-rows-of-data-and-scraping-content","Design pattern for looping through rows of data and scraping content",[14,66142,66143],{},"Now you can nest ‘Write data to a Google Sheet’ and ‘Delete row from a Google Sheet’ steps in the loop. They will write and delete once per loop. This means that if the bot stops or is interrupted for any reason, when the run resumes it will start from where it left off. Previously this design pattern would have required the addition of ‘Jump’ steps.",[592,66145],{"alt":66099,"src":66146},"\u002Fblog\u002Fweb-scraper-design-pattern.jpg",[639,66148,66150],{"id":66149},"design-pattern-for-looping-through-rows-and-entering-data","Design pattern for looping through rows and entering data",[14,66152,66153],{},"By keeping the ‘Delete row from Google Sheet’ step nested inside the loop, the bot will delete a single row once it has been completed. This means the bot will always start from the correct line of data to be processed.",[592,66155],{"alt":66099,"src":66156},"\u002Fblog\u002Fdata-entry-axiom.jpg",[639,66158,66160],{"id":66159},"new-steps","New steps",[14,66162,66163],{},"Logic handling was a big reason why we developed Axiom 4.0. The constraints of not being able to nest made adding logic steps difficult. With that blocker out of the way, these are the first of the new logic steps being added to Axiom.",[639,66165,66167],{"id":66166},"if-condition","If Condition",[14,66169,66170],{},"You can check if a value is true or false - without code - and then execute a series of steps.",[592,66172],{"alt":66173,"src":66174},"axiom.ai if condition","\u002Fblog\u002Fif-conditon.jpg",[14,66176,66177],{},"Some examples for use of the ‘If condition’ step:",[80,66179,66180,66183],{},[83,66181,66182],{},"Price monitoring - scrape price data and check against previous scrape for value change",[83,66184,66185],{},"Check if element is present - scrape the element if found do these steps",[639,66187,6251],{"id":66188},"try-catch",[14,66190,66191],{},"This step, requested by Axiom users, allows you to execute a specific set of steps if an error is thrown by Axiom.",[592,66193],{"alt":66194,"src":66195},"axiom.ai try catch","\u002Fblog\u002Ftry-catch.jpg",[14,66197,66198],{},"Some examples for use of the ‘Try \u002F Catch’ step:",[80,66200,66201,66204],{},[83,66202,66203],{},"Web forms - catch error and execute a different set of steps",[83,66205,66206],{},"Scraping web pages - catch page break error and try scraping again",[639,66208,66210],{"id":66209},"improved-ui-for-looping-moving-deleting-and-disabling-steps","Improved UI for looping, moving, deleting and disabling steps",[14,66212,66213],{},"You will notice the square icon to the left side of any step. Clicking on it allows you to move, duplicate, delete, loop or disable any step. A gray bar will appear at the top of the Axiom builder. Now you can move single steps or combinations.",[592,66215],{"alt":66216,"src":66217},"axiom.ai moving,copying and deleting steps","\u002Fblog\u002Fmove-bar.jpg",[14,66219,66220],{},"‘Duplicate’ steps are useful for duplicating segments of your Axiom.",[14,66222,66223],{},"Finally, you can select steps and wrap them in a ‘Loop’ step.",[639,66225,66227],{"id":66226},"jump-step","Jump step",[14,66229,66230],{},"This addresses a minor tweak customers have enquired about. You can now jump to sub-steps, not just steps.",[592,66232],{"alt":66233,"src":66234},"axiom.ai jump to sub steps","\u002Fblog\u002Fjump-step-sub-steps.jpg",[21,66236,66238],{"id":66237},"whats-new-under-the-hood-at-axiom","What's new under the hood at Axiom",[14,66240,66241],{},"We continued beyond just the builder under the hood. The engine has been stripped and rebuilt, improving performance and reliability. We have already released the new engine, and it's been powering Axiom 3.2 for some time. That is why we are now ready to launch version 4.0.",[21,66243,66245],{"id":66244},"whats-next-for-axiom","What’s next for Axiom?",[14,66247,66248],{},"We’re working on a smorgasbord of new features, but before we tell you more, please share your feedback with us. If there's a feature you’d like to see, please reach out, whether it’s a minor UI change, or a brand new feature.",[14,66250,66251],{},"Our next focus is onboarding and helping new users get started.",[80,66253,66254,66257,66260,66263,66266,66269],{},[83,66255,66256],{},"New user onboarding experience",[83,66258,66259],{},"AI bot quick builder",[83,66261,66262],{},"Video guided templates",[83,66264,66265],{},"More logic steps",[83,66267,66268],{},"Magic step recorder from browser interactions",[83,66270,66271],{},"Full feature debugger",[14,66273,66274],{},"If there are other features you’d like to see us focusing on, do tell us.",[21,66276,66278],{"id":66277},"when-are-we-launching","When are we launching?",[14,66280,66281],{},"As soon as possible. The release is complete and we are testing, testing, testing. With the help of some of our users - thank you - Axiom 4.0 will launch in the new year beginning of January!",[14,66283,66284,66285,2004,66287,450,66290,66292],{},"If you want to learn more about what you can do with Axiom, why not read these guides on how to ",[322,66286,46970],{"href":7515},[322,66288,66289],{"href":491},"ChatGPT web scraping",[322,66291,11532],{"href":10086},". They are tailored to use with Axiom 4.0.",{"title":494,"searchDepth":495,"depth":495,"links":66294},[66295,66296,66297,66309,66310,66311],{"id":66074,"depth":498,"text":66075},{"id":66081,"depth":498,"text":66082},{"id":66088,"depth":498,"text":66089,"children":66298},[66299,66300,66301,66302,66303,66304,66305,66306,66307,66308],{"id":66092,"depth":495,"text":66093},{"id":66115,"depth":495,"text":66116},{"id":66132,"depth":495,"text":66133},{"id":66139,"depth":495,"text":66140},{"id":66149,"depth":495,"text":66150},{"id":66159,"depth":495,"text":66160},{"id":66166,"depth":495,"text":66167},{"id":66188,"depth":495,"text":6251},{"id":66209,"depth":495,"text":66210},{"id":66226,"depth":495,"text":66227},{"id":66237,"depth":498,"text":66238},{"id":66244,"depth":498,"text":66245},{"id":66277,"depth":498,"text":66278},"2023-12-13",{"read":48203,"type":513,"tool":66314,"category":66315,"tags":66316,"featuredimg":66317,"landingimg":66318,"summary":66319,"video":66320},[46728],[50552],[19965,65126,518],"\u002Fblog\u002Faxiom-v4-wide.jpg","\u002Fblog\u002Faxiom-v4-sq.jpg","Meet Axiom 4.0, our enhanced Chrome browser automation tool","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FyxwfdkMm4KM?rel=0","\u002Fblog\u002Ffuture-of-ai-browser-automation",{"title":66060,"description":66065},"blog\u002Ffuture-of-ai-browser-automation","muh6OAC7QGnKvX6QQpP6d5vJ4h-SGpepL4aW8ar9WiU",[50552],[513],[46728],{"id":66329,"title":66330,"author":46205,"body":66331,"date":66686,"description":66687,"draft":26250,"extension":506,"meta":66688,"navigation":522,"path":66698,"seo":66699,"stem":66700,"__hash__":66701,"pinned":-1,"category":66702,"type":66703,"tool":66704},"blog\u002Fblog\u002Fdate-picker.md","How to automate date pickers without code",{"type":8,"value":66332,"toc":66664},[66333,66340,66342,66346,66349,66353,66356,66360,66363,66367,66370,66374,66378,66381,66385,66388,66392,66396,66399,66420,66424,66427,66431,66434,66437,66441,66444,66452,66456,66460,66463,66467,66481,66486,66491,66496,66500,66503,66514,66518,66523,66527,66530,66538,66546,66550,66553,66561,66566,66570,66573,66590,66596,66600,66603,66607,66611,66614,66617,66620,66623,66628,66631,66635,66642,66646,66657,66659],[14,66334,66335,66336,66339],{},"In this guide, we show you how to ",[322,66337,66338],{"href":7626},"automate date pickers"," using axiom.ai, without the need to write any code. Date pickers can be tricky HTML elements to automate, but they are often essential for automating reporting or posting content.",[18,66341],{},[21,66343,66345],{"id":66344},"why-are-date-pickers-tricky-to-automate","Why are date pickers tricky to automate?",[14,66347,66348],{},"Date pickers are not standardized, which means there are many different solutions available. Some popular options include jQuery's date picker, an old but reliable option, or bespoke pickers created with JavaScript tools like React or AngularJS. Standardizing date pickers would make browser automation much easier. Thankfully we have found ways to work around this.",[21,66350,66352],{"id":66351},"which-date-pickers-are-easiest-to-automate","Which date pickers are easiest to automate?",[14,66354,66355],{},"If the date picker you need to automate includes an input field where dates and times can be manually entered, then it's possible to automate this process.",[21,66357,66359],{"id":66358},"which-date-pickers-are-difficult-to-automate","Which date pickers are difficult to automate?",[14,66361,66362],{},"Date pickers that don't have an input field, or where the input field is disabled, blocking the user from inserting a date, are more challenging to automate. However this doesn't mean it's impossible.",[21,66364,66366],{"id":66365},"lets-learn-how-to-automate-a-date-picker-with-axiomai","Let's learn how to automate a date picker with axiom.ai",[14,66368,66369],{},"Start by checking if there is an input field for the start date. If you are able to type in the date by clicking inside the field, then you're in luck because this will be an easy task. However, if there is no such input field, don't worry. We'll show you how you can still automate a date picker without the need for code. Follow the steps below using axiom.ai's simple point-and-click interface.",[21,66371,66373],{"id":66372},"for-date-pickers-with-input-fields","For date pickers with input fields",[639,66375,66377],{"id":66376},"_1-add-an-enter-text-step","1. Add an 'Enter text' step",[14,66379,66380],{},"This step inputs the date into the date picker. Use the Step Finder to search for the 'Enter text' step and click to add it.",[592,66382],{"alt":66383,"src":66384},"axiom.ai find enter text step","\u002Fblog\u002Fenter-text-find-step.jpg",[14,66386,66387],{},"Click the 'Select text' field and select the input field you want to enter the date into.",[592,66389],{"alt":66390,"src":66391},"axiom.ai picking a date","\u002Fblog\u002Fpicking-date.jpg",[639,66393,66395],{"id":66394},"_2-adding-the-date-value","2. Adding the date value",[14,66397,66398],{},"To complete configuring the 'Enter text' step, you must include a date value in the 'Text' field. It will need to match the format used by the date picker. There are a few ways to do this:",[555,66400,66401,66404,66409,66414],{},[83,66402,66403],{},"Manually enter a value into the 'Text' field.",[83,66405,66406,66407,44],{},"Click on 'Insert data' and pull a value from a ",[322,66408,3913],{"href":8384},[83,66410,6209,66411,1230],{},[322,66412,66413],{"href":7626},"'Date and time'",[83,66415,66416,66417,1230],{},"Generate a date value with the ",[322,66418,66419],{"href":2300},"'Custom JavaScript'",[592,66421],{"alt":66422,"src":66423},"axiom.ai enter text date data","\u002Fblog\u002Fenter-text-date-data.jpg",[14,66425,66426],{},"Note: You will need to match the exact date format used by the date picker.",[21,66428,66430],{"id":66429},"for-date-pickers-without-input-fields","For date pickers without input fields",[14,66432,66433],{},"If we are unable to automate the date picker via an input field, we can try an alternative approach. Although it may require additional steps, it's not a complex process.",[14,66435,66436],{},"You will need to add steps to scrape the month displayed in the picker and check it against the month you want it to be. When they match, add a step to select the day you want.",[639,66438,66440],{"id":66439},"_1-add-a-click-element-step-to-your-bot","1. Add a 'Click Element' step to your bot",[14,66442,66443],{},"This step will open up the date picker we want to automate, so that axiom can interact with it.",[555,66445,66446,66449],{},[83,66447,66448],{},"Use the Step Finder to search for the 'Click Element' step and click on it",[83,66450,66451],{},"Next, click 'Select' and choose the button or input that launches the date picker window",[592,66453],{"alt":66454,"src":66455},"axiom.ai date picker click element","\u002Fblog\u002Fdp-i1.jpg",[639,66457,66459],{"id":66458},"_2-add-a-get-data-from-current-page-step","2. Add a 'Get data from current page' step",[14,66461,66462],{},"This step will scrape the current month's value for us.",[592,66464],{"alt":66465,"src":66466},"axiom.ai date picker get data","\u002Fblog\u002Fdp-i2.jpg",[555,66468,66469,66472,66475,66478],{},[83,66470,66471],{},"Use the Step Finder to search for the 'Get data from current page' step and click to add it",[83,66473,66474],{},"Click 'Select' and choose the month displayed in the selector",[83,66476,66477],{},"Set the 'Max results' setting to '1'.",[83,66479,66480],{},"In the 'Configure scraper', set 'No. of retry attempts when results not found' to '0'.",[14,66482,66483],{},[807,66484,66485],{},"Note: when using the Amazon scraper, you will need to use a custom CSS selector. Do this by clicking 'Select', then in Column A clicking on the arrow icon and selecting 'Custom Selector'.",[14,66487,66488],{},[807,66489,66490],{},"The selector we used for Amazon was:",[14,66492,66493],{},[90,66494,66495],{},".CalendarMonthGrid .CalendarMonthGrid_month__horizontal:nth-child(2) .CalendarMonth_caption",[639,66497,66499],{"id":66498},"_3-add-an-if-condition-step","3. Add an 'If condition' step",[14,66501,66502],{},"This step verifies the current scraped month against the desired month. If the months do not match, axiom executes the sub steps within the 'if' condition, which includes clicking the 'next month' button. It then returns to the scraping step to recheck the months. When the months match, the 'if' condition is bypassed, and the process advances to the next step of selecting the day.",[555,66504,66505,66508,66511],{},[83,66506,66507],{},"Set 'Data to check' to 'Scrape-data'",[83,66509,66510],{},"In 'Condition to check', hard code your month value or click 'Insert data' to pass in a value. Make sure the format matches the date picker format",[83,66512,66513],{},"In 'Reverse condition', tick the box to set to false",[592,66515],{"alt":66516,"src":66517},"axiom.ai date picker if condition","\u002Fblog\u002Fdp-i3.jpg",[14,66519,66520],{},[807,66521,66522],{},"Note: the next steps you add will be substeps. Add these nested within the 'If Condition' step.",[639,66524,66526],{"id":66525},"_4-add-a-click-element-sub-step","4. Add a 'Click Element' sub step",[14,66528,66529],{},"Staying within the 'If condition' step, it's time to add a sub step (click the white 'Add step' button).",[555,66531,66532,66535],{},[83,66533,66534],{},"Search for and click to add a 'Click Element' sub step",[83,66536,66537],{},"Select the next month button",[14,66539,66540,88,66543],{},[807,66541,66542],{},"Note: in this Amazon example, you will need to use a custom CSS attribute selector:",[90,66544,66545],{},"[aria-label=\"Move forward to switch to the next month.\"]",[639,66547,66549],{"id":66548},"_5-add-a-jump-to-step-sub-step","5. Add a 'Jump to step' sub step",[14,66551,66552],{},"Add a further sub step — 'Jump to step'. This step returns to the scraping step to recheck the month value.",[555,66554,66555,66558],{},[83,66556,66557],{},"Scroll up to your 'Get Data' step and note the step number.",[83,66559,66560],{},"Input this step number into the 'Jump to step' field.",[14,66562,66563],{},[807,66564,66565],{},"Note: that's the final sub step.",[639,66567,66569],{"id":66568},"_6-add-a-click-element-step-after-the-if-condition","6. Add a 'Click element' step after the 'If condition'",[14,66571,66572],{},"This step involves selecting the day you wish to set in the date picker. You will need to create a custom CSS selector.",[555,66574,66575,66578,66584,66587],{},[83,66576,66577],{},"Use the Step Finder to add a new 'Click Element' step",[83,66579,66580,66581,66583],{},"You will need to create a ",[322,66582,57823],{"href":380},". Click 'Select' then 'Custom'",[83,66585,66586],{},"Use the Chrome Inspector tool, inspect the date. Most dates have a date attribute — replicate the format",[83,66588,66589],{},"You can also pass in a selector from a Google sheet by clicking 'Insert data'",[14,66591,66592,66593,44],{},"In the image below you can see the date has an attribute we can use as a CSS class in square brackets: ",[90,66594,66595],{},"[aria-label=\"Tuesday, 19 December 2023\"]",[592,66597],{"alt":66598,"src":66599},"axiom.ai date picker css attribute","\u002Fblog\u002Fdate-picker-css.jpg",[14,66601,66602],{},"And you're done! This is what it should look like.",[592,66604],{"alt":66605,"src":66606},"axiom.ai date picker design pattern","\u002Fblog\u002Fdate-picker-steps.jpg",[21,66608,66610],{"id":66609},"the-double-date-picker","The double-date picker",[14,66612,66613],{},"To automate a double date picker like the one found on Amazon, you need to repeat the steps above for the start and end date.",[21,66615,5782],{"id":66616},"css-selectors",[14,66618,66619],{},"For this process, custom CSS selectors are needed. Thankfully, most date pickers have solid CSS selectors we can take advantage of when automating.",[14,66621,66622],{},"The Amazon date picker has a great selector to use for selecting days, for example this aria selector, which can be added to your axiom:",[14,66624,66625],{},[90,66626,66627],{},"[aria-label=\"Wednesday, November 8, 2023\"]",[14,66629,66630],{},"Selecting the month is a little more tricky. There are in fact 3 months listed in the code — the month before, the current month and the month after. They all have the same selector, so we need to work out a unique hierarchy, as seen in the example below:",[14,66632,66633],{},[90,66634,66495],{},[14,66636,66637,66638,66641],{},"In this case, we use an ",[90,66639,66640],{},"nth-child(2)"," selector, as it is the second child value we want.",[21,66643,66645],{"id":66644},"issues-you-may-encounter-with-date-pickers","Issues you may encounter with date pickers",[555,66647,66648,66651,66654],{},[83,66649,66650],{},"Bot isn't looping the scrape when the months don't match? Make sure the 'Jump step' is going to the correct step and the 'If step' is set to reverse condition: false",[83,66652,66653],{},"Not clicking the day? Make sure your selector is covering the correct month",[83,66655,66656],{},"Buttons not clicking and getting errors? You'll need to work on your CSS selectors",[21,66658,46678],{"id":46677},[14,66660,66661,66662],{},"Congratulations, you just built a bot to automate a date picker! If you find a troublesome date picker, share it with us to crack. We love a good bot-building challenge. Email us at ",[322,66663,3997],{"href":3996},{"title":494,"searchDepth":495,"depth":495,"links":66665},[66666,66667,66668,66669,66670,66674,66682,66683,66684,66685],{"id":66344,"depth":498,"text":66345},{"id":66351,"depth":498,"text":66352},{"id":66358,"depth":498,"text":66359},{"id":66365,"depth":498,"text":66366},{"id":66372,"depth":498,"text":66373,"children":66671},[66672,66673],{"id":66376,"depth":495,"text":66377},{"id":66394,"depth":495,"text":66395},{"id":66429,"depth":498,"text":66430,"children":66675},[66676,66677,66678,66679,66680,66681],{"id":66439,"depth":495,"text":66440},{"id":66458,"depth":495,"text":66459},{"id":66498,"depth":495,"text":66499},{"id":66525,"depth":495,"text":66526},{"id":66548,"depth":495,"text":66549},{"id":66568,"depth":495,"text":66569},{"id":66609,"depth":498,"text":66610},{"id":66616,"depth":498,"text":5782},{"id":66644,"depth":498,"text":66645},{"id":46677,"depth":498,"text":46678},"2023-12-12","A step-by-step guide on how to automate a date picker in the browser without code, including tricky pickers with no input field.",{"read":59051,"type":513,"tool":66689,"category":66690,"tags":66691,"featuredimg":66693,"landingimg":66694,"summary":66695,"video":66696,"metaTitle":66697},[46728],[50552],[7655,66692],"ui","\u002Fblog\u002Fdatepick-rect.jpg","\u002Fblog\u002Fdatepick-sq.jpg","A step-by-step guide on how to automate a date picker without code","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FtOJci-fiIB8?rel=0","automate date pickers without code","\u002Fblog\u002Fdate-picker",{"title":66330,"description":66687},"blog\u002Fdate-picker","L3hyD20vihSvWZdRxpoHOKxRhey8aSpLjlQgGKhUYHs",[50552],[513],[46728],{"id":66706,"title":66330,"author":46205,"body":66707,"date":66686,"description":67065,"draft":26250,"extension":506,"meta":67066,"navigation":522,"path":67073,"seo":67074,"stem":67075,"__hash__":67076,"pinned":-1,"category":67077,"type":67078,"tool":67079},"blog\u002Fblog\u002Fhow-to-automate-a-date-picker.md",{"type":8,"value":66708,"toc":67043},[66709,66714,66716,66718,66720,66722,66725,66727,66730,66733,66736,66738,66740,66743,66745,66748,66750,66752,66755,66771,66773,66776,66778,66781,66784,66787,66790,66798,66805,66808,66811,66813,66815,66828,66834,66839,66843,66845,66849,66852,66860,66863,66869,66874,66877,66880,66887,66893,66898,66906,66909,66912,66920,66926,66931,66935,66942,66962,66968,66971,66977,66985,66988,66991,66993,66996,66998,67001,67004,67007,67014,67017,67021,67024,67026,67036,67038],[14,66710,66335,66711,66339],{},[322,66712,66338],{"href":66713},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fdate-picker",[18,66715],{},[21,66717,66345],{"id":66344},[14,66719,66348],{},[21,66721,66352],{"id":66351},[14,66723,66724],{},"If the data picker you need to automate includes an input field where dates and times can be manually entered, then it’s possible to automate this process.",[21,66726,66359],{"id":66358},[14,66728,66729],{},"Date pickers that don’t have an input field or where the input field is disabled, blocking the user from inserting a date, are more challenging to automate. However this doesn’t mean it’s impossible.",[21,66731,66732],{"id":66365},"Let’s learn how to automate a date picker with axiom.ai",[14,66734,66735],{},"Start by checking if there is an input field for the start date. If you are able to type in the date by clicking inside the field, then you're in luck because this will be an easy task. However, if there is no such input field, don't worry. We'll show you how you can still automate a date picker without the need for code. Follow the steps below using axiom.ai’s simple point-and-click interface.",[21,66737,66373],{"id":66372},[639,66739,66377],{"id":66376},[14,66741,66742],{},"This step inputs the date into the date picker. Use the Step Finder to search for the ‘Enter text’ step and click to add it.",[592,66744],{"alt":66383,"src":66384},[14,66746,66747],{},"Click the ‘Select text’ field and select the input field you want to enter the date into.",[592,66749],{"alt":66390,"src":66391},[639,66751,66395],{"id":66394},[14,66753,66754],{},"To complete configuring the 'Enter text' step, you must include a date value in the 'Text' field. I will need to match the format used by the date picker. There are a few ways to do this:",[555,66756,66757,66759,66763,66767],{},[83,66758,66403],{},[83,66760,66406,66761,44],{},[322,66762,3913],{"href":8384},[83,66764,6209,66765,1230],{},[322,66766,66413],{"href":7554},[83,66768,66416,66769,1230],{},[322,66770,66419],{"href":2300},[592,66772],{"alt":66383,"src":66423},[14,66774,66775],{},"Note:  You will need to match the exact date format used by the date picker.",[21,66777,66430],{"id":66429},[14,66779,66780],{},"If we are unable to automate the date picker via an input field, we can try an alternative approach. Although it may require additional steps, it’s not a complex process, it simply requires a few extra steps.",[14,66782,66783],{},"You will need to add steps to scrape the month displayed in the picker and check against the month you want it to be. When they match, add a step to select the day you want.",[639,66785,66786],{"id":66439},"1. Add a ‘Click Element’ step to your bot",[14,66788,66789],{},"This step will open up the date picker we want to automate, so that Axiom can interact with it.",[555,66791,66792,66795],{},[83,66793,66794],{},"Use the Step Finder to search for the ‘Click Element’ step and click on it",[83,66796,66797],{},"Next, click ‘Select’ and choose the button or input that launches the date picker window",[14,66799,66800],{},[322,66801,66804],{"href":66802,"rel":66803},"https:\u002F\u002Fyoutu.be\u002FtOJci-fiIB8?si=Wys3-rpWoDghuwN7&t=152",[2245],"Unsure? watch here",[592,66806],{"alt":66807,"src":66455},"axiom.ai amazon date picker",[639,66809,66810],{"id":66458},"2. Add a ‘Get data from current page’ step",[14,66812,66462],{},[592,66814],{"alt":66807,"src":66466},[555,66816,66817,66820,66822,66825],{},[83,66818,66819],{},"Use the Step Finder to search for the ‘Get data from current page’ step and click to add it",[83,66821,66474],{},[83,66823,66824],{},"Set the ‘Max results’ setting to ‘1’.",[83,66826,66827],{},"In the 'Configure scraper', Set 'No. of retry attempts when results not found' to '0'.",[14,66829,66830],{},[322,66831,66804],{"href":66832,"rel":66833},"https:\u002F\u002Fyoutu.be\u002FtOJci-fiIB8?si=jUD5ASRYrhZ_L3vc&t=161",[2245],[14,66835,66836],{},[807,66837,66838],{},"Note: when using the Amazon scraper, you will need to use a custom CSS selector. Do this by clicking 'Select', then in Column A clicking on the arrow icon and selecting 'Custom Selector’.",[14,66840,66841],{},[807,66842,66490],{},[14,66844,66495],{},[639,66846,66848],{"id":66847},"_3-add-a-if-condition-step","3. Add a ‘If condition’ step",[14,66850,66851],{},"This step verifies the current scraped month against the desired month. If the months do not match, the Axiom executes the sub steps within the 'if' condition, which includes clicking the 'next month' button. It then returns to the scraping step to recheck the months. When the months match, the 'if' condition is bypassed, and the process advances to the next step of selecting the day.",[555,66853,66854,66856,66858],{},[83,66855,66507],{},[83,66857,66510],{},[83,66859,66513],{},[592,66861],{"alt":66862,"src":66517},"axiom.ai amazon date picker if condition",[14,66864,66865],{},[322,66866,66804],{"href":66867,"rel":66868},"https:\u002F\u002Fyoutu.be\u002FtOJci-fiIB8?si=id3DAJPgQzaNT64m&t=345",[2245],[14,66870,66871],{},[807,66872,66873],{},"Note: the next steps you add will be substeps. Add these nested within the ‘If Condition’ step.",[639,66875,66876],{"id":66525},"4. Add a ‘Click Element’ sub step",[14,66878,66879],{},"Staying within the ‘If condition’ step, it’s time to add a sub step (click the white ‘Add step’ button).",[555,66881,66882,66885],{},[83,66883,66884],{},"Search for and click to add a ‘Click Element’ sub step",[83,66886,66537],{},[14,66888,66889],{},[322,66890,66804],{"href":66891,"rel":66892},"https:\u002F\u002Fyoutu.be\u002FtOJci-fiIB8?si=FxG2fasy-0MpR0S1&t=404",[2245],[14,66894,66895],{},[807,66896,66897],{},"Note: in this Amazon example, you will need to use a custom CSS. Click 'Select' then 'Custom' and use:",[14,66899,66900],{},[807,66901,66902,66905],{},[727,66903,66904],{},"aria-label=\"Move forward to switch to the next month.\""," an attribute selector more about those below.",[639,66907,66908],{"id":66548},"5. Add a ‘Jump to step’ sub step",[14,66910,66911],{},"Add a further sub step - 'Jump to step'. This step returns to the scraping step to recheck the month value.",[555,66913,66914,66917],{},[83,66915,66916],{},"You will need to scroll up to your ‘Get Data’ step, and note the step number.",[83,66918,66919],{},"Input this step number into the ‘Jump to step’ field.",[14,66921,66922],{},[322,66923,66804],{"href":66924,"rel":66925},"https:\u002F\u002Fyoutu.be\u002FtOJci-fiIB8?si=uIag5bCpNuE9Pi4P&t=489",[2245],[14,66927,66928],{},[807,66929,66930],{},"Note: That's the final sub step",[639,66932,66934],{"id":66933},"_6-add-a-click-element-step-after-the-if-conditon","6. Add a 'Click element' step after the 'If conditon'",[14,66936,66937,66938],{},"This step involves selecting the day you wish to set in the date picker. You will need to create a custom CSS selector, and I will show you how to do this in the accompanying ",[322,66939,66941],{"href":66867,"rel":66940},[2245],"video.",[555,66943,66944,66947,66952,66960],{},[83,66945,66946],{},"Use the Step Finder to add a new ‘Click Element’ step",[83,66948,66949,66950,66583],{},"You will need create and a ",[322,66951,57823],{"href":380},[83,66953,6209,66954,66959],{},[322,66955,66958],{"href":66956,"rel":66957},"https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fdevtools\u002Fcss",[2245],"Chrome Inspector tool",", inspect the date. Most dates have a date attibute, replicate the format",[83,66961,66589],{},[14,66963,66964,66965,16247],{},"In the image below you can see the date has this attribute we can use as a css class in square brackets '",[727,66966,66967],{},"aria-label=\"Tuesday, 19 December 2023\"",[592,66969],{"alt":66970,"src":66599},"axiom.ai amazon date picker css atribute",[14,66972,66973],{},[322,66974,66804],{"href":66975,"rel":66976},"https:\u002F\u002Fyoutu.be\u002FtOJci-fiIB8?si=iFkt42Y2oQzn1Gsi&t=525",[2245],[14,66978,66979],{},[807,66980,66981,66982],{},"Note: in this Amazon example, the 'Custom' is: ",[727,66983,66984],{},"aria-label=\"Thursday, November 16, 2023\"",[14,66986,66987],{},"And you’re done! This is what it should look like.",[592,66989],{"alt":66990,"src":66606},"axiom.ai amazon date picker design pattern",[21,66992,66610],{"id":66609},[14,66994,66995],{},"To automate a double date picker like this one found on Amazon, you need to repeat the steps above for start and end date.",[21,66997,5782],{"id":66616},[14,66999,67000],{},"For this process, custom CSS selectors are needed. If you haven’t used these before, you can find out more here.",[14,67002,67003],{},"Thankfully, most date pickers have solid CSS selectors we can take advantage of when automating.",[14,67005,67006],{},"The Amazon date picker has a great selector to use for selecting days, for example this aria selector, which can be added to your Axiom:",[14,67008,67009],{},[807,67010,67011],{},[727,67012,67013],{},"aria-label=\"Wednesday, November 8, 2023",[14,67015,67016],{},"Selecting the month is a little more tricky. There are in fact 3 months listed in the code. The month before, current month and month after. They all have the same selector, so we need to work out a unique hierarchy, as seen in the example below:",[14,67018,67019],{},[807,67020,66495],{},[14,67022,67023],{},"In this case, we use an nth-child(2) selector, as it is the second child value we want.",[21,67025,66645],{"id":66644},[555,67027,67028,67031,67033],{},[83,67029,67030],{},"Bot isn’t looping the scrape when the months don’t match? Make sure the ‘Jump step’ is going to the correct step and the ‘If step’ is set to reverse condition: false",[83,67032,66653],{},[83,67034,67035],{},"Buttons not clicking and getting errors? You’lll need to work on your CSS selectors",[21,67037,46678],{"id":46677},[14,67039,67040,67041],{},"Congratulations, you just built a bot to automate a date picker! If you find a troublesome data picker, share it with us to crack. We love a good bot-building challenge. Email us on ",[322,67042,3997],{"href":3996},{"title":494,"searchDepth":495,"depth":495,"links":67044},[67045,67046,67047,67048,67049,67053,67061,67062,67063,67064],{"id":66344,"depth":498,"text":66345},{"id":66351,"depth":498,"text":66352},{"id":66358,"depth":498,"text":66359},{"id":66365,"depth":498,"text":66732},{"id":66372,"depth":498,"text":66373,"children":67050},[67051,67052],{"id":66376,"depth":495,"text":66377},{"id":66394,"depth":495,"text":66395},{"id":66429,"depth":498,"text":66430,"children":67054},[67055,67056,67057,67058,67059,67060],{"id":66439,"depth":495,"text":66786},{"id":66458,"depth":495,"text":66810},{"id":66847,"depth":495,"text":66848},{"id":66525,"depth":495,"text":66876},{"id":66548,"depth":495,"text":66908},{"id":66933,"depth":495,"text":66934},{"id":66609,"depth":498,"text":66610},{"id":66616,"depth":498,"text":5782},{"id":66644,"depth":498,"text":66645},{"id":46677,"depth":498,"text":46678},"In this guide, we show you how to automate date pickers using axiom.ai, without the need to write any code. Date pickers can be tricky HTML elements to automate, but they are often essential for automating reporting or posting content.",{"read":59051,"type":513,"tool":67067,"category":67068,"tags":67069,"featuredimg":66693,"landingimg":66694,"summary":66695,"video":66696},[46728],[58387],[67070,67071,67072],"time","date","web forms","\u002Fblog\u002Fhow-to-automate-a-date-picker",{"title":66330,"description":67065},"blog\u002Fhow-to-automate-a-date-picker","890aMNC337ajoPid2Omzscn4TmlXEX09DJhmkKEImLE",[58387],[513],[46728],{"id":67081,"title":67082,"author":46205,"body":67083,"date":67383,"description":67087,"draft":26250,"extension":506,"meta":67384,"navigation":522,"path":19675,"seo":67395,"stem":67396,"__hash__":67397,"pinned":-1,"category":67398,"type":67399,"tool":67400},"blog\u002Fblog\u002Fhow-to-scrape-product-details-from-amazon-books.md","How to scrape product details from Amazon Books with a bot",{"type":8,"value":67084,"toc":67364},[67085,67088,67091,67094,67100,67104,67111,67117,67121,67127,67131,67134,67138,67141,67145,67149,67152,67155,67158,67161,67164,67167,67171,67174,67177,67181,67184,67187,67190,67193,67196,67199,67202,67206,67210,67213,67217,67221,67224,67227,67234,67237,67240,67244,67247,67251,67254,67257,67260,67264,67268,67271,67274,67277,67283,67286,67289,67293,67296,67300,67303,67307,67314,67318,67321,67324,67327,67338,67343,67345,67348,67352],[14,67086,67087],{},"If you're looking to improve your product offerings or marketing strategies, it's important to gather data on bestselling books, popular genres, and emerging trends. Additionally, keeping tabs on your competitors' product listings, pricing strategies, and customer reviews can give you a competitive edge.",[18,67089],{"alt":67090},"How to scrape amazon product information",[14,67092,67093],{},"In this guide, we show you how to extract data from Amazon Books using a bot. You’ll learn how to scrape URLs from a list of top-selling books, and then filter them by ranking, and extract their Best Sellers Rank.",[14,67095,67096,67097,67099],{},"Don't worry if this example doesn't match your use case, because what you will learn in this guide will enable you to ",[322,67098,65393],{"href":15981}," any data from Amazon. For example, you can use the basis of this bot to scrape data from other product types, such as electrical goods or home furnishings.",[21,67101,67103],{"id":67102},"what-exactly-is-a-bot","What exactly is a bot?",[14,67105,67106,67107,44],{},"Axiom’s bots are powerful tools that you can delegate browser tasks to. Think of them as your very own digital helpers. They’re built using a simple step-by-step process - without the need for code - that replicates your actions in the Chrome browser, allowing you to automate a whole range of data gathering tasks in the ",[322,67108,67110],{"href":67109},"\u002Fautomate\u002Famazon-store","Amazon store",[14,67112,67113,67114],{},"The beauty of learning how to create bots is that they can be tailored to your specific requirements and scheduled to run independently, freeing up valuable time. They can even ",[322,67115,67116],{"href":19666},"automate Amazon posts.",[21,67118,67120],{"id":67119},"how-does-the-amazon-book-scraper-bot-work","How does the Amazon Book scraper bot work?",[14,67122,5070,67123,67126],{},[322,67124,67125],{"href":19692},"Amazon Book scraper"," bot mimics your actions in the browser. It navigates to a URL and extracts the links to books before proceeding to loop through the links to gather information on the best-selling rankings. Finally, it outputs the data and saves it to a Google Sheet. This guide teaches you specifically how to scrape Best Sellers book guides on Amazon.",[21,67128,67130],{"id":67129},"lets-learn-how-to-build-an-amazon-book-scraper-bot-with-axiomai","Let’s learn how to build an Amazon Book scraper bot with axiom.ai",[14,67132,67133],{},"Creating bots for Amazon scraping has never been easier thanks to axiom.ai's no-code bot builder. With our user-friendly no-code interface, you can create as many bots as you need without any coding knowledge. By following the simple steps below, you can make a fully functional bot that extracts Amazon data within minutes.",[639,67135,67137],{"id":67136},"_1-start-from-blank","1. Start from blank",[14,67139,67140],{},"To build your bot from scratch, click on 'Add first step’. This will open the step selector and you can start adding steps to your bot.",[592,67142],{"alt":67143,"src":67144},"axiom.ai add first step","\u002Fblog\u002Fadd-first-step.jpg",[639,67146,67148],{"id":67147},"_2-add-your-first-step-get-data-from-a-url","2. Add your first step: ‘Get data from a URL’",[14,67150,67151],{},"Use the Step Finder to search for ‘Get data from a URL’ and click on it. The step will be added to Axiom for you to configure.",[14,67153,67154],{},"In the field called 'URL', enter the URL of the Amazon Book listing page you wish to scrape data from. In this guide, we will be scraping best sellers in Women's Fantasy Fiction.",[14,67156,67157],{},"Next, we need to select the data we want to scrape. In this case, we require two columns of data: column A will contain the book listing number, and column B will contain the link to the book page.",[14,67159,67160],{},"For column A, by clicking ‘Select’ select the book ranking number on the first book, then repeat the action on subsequent books. Tip: don’t just select books 1, 2 and 3. Instead, scroll down the page and select Books 1, 5 and 20. This helps our AI understand the selectors.",[14,67162,67163],{},"Then click on ‘Add column’ to add column B. Use the ‘Link selector’ to click on the box around the books, again repeating the selection as above.",[14,67165,67166],{},"Press ‘Complete’ to save your selections. Your data output should look something like this:",[592,67168],{"alt":67169,"src":67170},"axiom.ai scrape data with get data from current url step","\u002Fblog\u002Fget-data-current-url-step.jpg",[14,67172,67173],{},"Now we need to set up the pager by clicking ‘Find pager’. Scroll down the Amazon page and select the pager button ‘Next page’ then click ‘Complete’.",[14,67175,67176],{},"Then click on ‘Confirm selector’ and then ‘Complete’. Lastly, set ‘Max results’ to 100.",[639,67178,67180],{"id":67179},"_3-remove-results-which-do-not-contain-certain-words","3. Remove results which do not contain certain words",[14,67182,67183],{},"In this example, we only want to scrape books listed at numbers 1, 20 and 50, so we’re going to pass the URLs we just scraped through a filter to remove all unwanted URLs.",[14,67185,67186],{},"Use the Step Finder to find and add the step ‘Remove results which do not contain certain words’.",[14,67188,67189],{},"In the ‘Data’ field, select ‘Scrape data’.",[14,67191,67192],{},"In ‘Words (comma separated)’ type 1,20,50.",[14,67194,67195],{},"In ‘Word matching mode’, select ‘Any’.",[14,67197,67198],{},"Select the ‘Match on word boundary’ box.",[14,67200,67201],{},"Finally, we only want to use the first column for our filter as the URLs also have numbers in. In ‘Columns (optional)’ switch the toggle on and set to 1.",[592,67203],{"alt":67204,"src":67205},"axiom.ai remove results that contain certain words step","\u002Fblog\u002Fremove-results.jpg",[639,67207,67209],{"id":67208},"_34-add-the-loop-through-data-step","34. Add the ‘Loop through data’ step",[14,67211,67212],{},"Use the Step Finder to find and add the step ‘Loop through data’. This step allows your bot to loop through the links we just scraped. Be sure to add the steps you want to repeat inside the loop as substeps.",[592,67214],{"alt":67215,"src":67216},"axiom.ai adding a loop step amazon scraper","\u002Fblog\u002Floop-step.jpg",[639,67218,67220],{"id":67219},"_5-add-the-go-to-page-sub-step","5. Add the ‘Go to page’ sub step",[14,67222,67223],{},"Staying within the ‘Loop through data’ step, it’s time to add a sub step (click the white ‘Add step’ button).",[14,67225,67226],{},"Use the Step Finder to search for ‘Go to page’ and click on it. The step will be added for you to configure.",[14,67228,67229,67230,67233],{},"In the 'Enter URL' field, click ‘Insert data’ and select ‘",[727,67231,67232],{},"matching-word-data?*&1","’.",[14,67235,67236],{},"In the data preview that appears, select only column ‘B’ with the URLs.",[592,67238],{"alt":67239,"src":65852},"axiom.ai pass data ionto a go to url step",[639,67241,67243],{"id":67242},"_6-add-the-current-url-sub-step","6. Add the ‘Current URL’ sub step",[14,67245,67246],{},"No configuration is needed for this step. It simply retrieves the current URL.",[639,67248,67250],{"id":67249},"_7-add-the-get-data-from-bots-current-page-sub-step","7. Add the ‘Get data from bot's current page’ sub step",[14,67252,67253],{},"For this guide, we want to scrape the best seller ranking, but of course you can make different data selections. Start by clicking ‘Select’ and then scroll the Amazon page until you see the Bestseller ranking. Then click on it, and click complete.",[14,67255,67256],{},"Leave Max results set to ‘1’.",[14,67258,67259],{},"To learn more about the selector tools, follow this link.",[639,67261,67263],{"id":67262},"_8-add-the-write-data-to-a-google-sheet-sub-step","8. Add the ‘Write data to a Google Sheet’ sub step",[592,67265],{"alt":67266,"src":67267},"axiom.ai write data to a google sheet step","\u002Fblog\u002Faxiom-write-data-gs.jpg",[14,67269,67270],{},"Now we’re going to write the data that we extracted from Amazon to a Google Sheet.",[14,67272,67273],{},"Use the Step Finder to search for 'Write data to a Google Sheet' and click to add it.",[14,67275,67276],{},"In the 'Spreadsheet URL' field, search for the Google Sheet you wish to use.",[14,67278,67279,67280,16247],{},"In the 'Sheet name' field, select 'Data'. In the 'Data' field, select '",[727,67281,67282],{},"interact-data",[14,67284,67285],{},"Finally, in the ‘Write options’ field, click the ‘Add to existing Data’ option.",[14,67287,67288],{},"If you do not wish to use a Google Sheet you could output to a CSV or Display Message - just add the relevant step.",[21,67290,67292],{"id":67291},"_9-ready-to-test","9. Ready to test",[14,67294,67295],{},"Almost there! Your Amazon bot should resemble the screenshot below.",[592,67297],{"alt":67298,"src":67299},"axiom.ai design pattern for Amazon book scraper","\u002Fblog\u002Famazon-book-desig-pattern.jpg",[14,67301,67302],{},"Now you’re ready to test your Amazon scraper with the desktop app, by clicking ‘Run w\u002Fdesktop app’.",[21,67304,67306],{"id":67305},"_10-running-the-bot","10. Running the bot",[14,67308,67309,67310],{},"You can run this Amazon bot in both the cloud and the desktop app. If you want to learn more about scheduling, ",[322,67311,67313],{"href":67312},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fschedule-and-run","click here.",[21,67315,67317],{"id":67316},"issues-you-may-encounter-with-the-amazon-bot","Issues you may encounter with the Amazon bot",[14,67319,67320],{},"If you’re experiencing any problems with running the bot, a great way to debug is by using ‘Display messages’ to examine the data at various stages of its transition through the bot.",[14,67322,67323],{},"For example, you could add a ‘Display messages’ step after a scraper to check that the data being scraped is output correctly.",[14,67325,67326],{},"Here are some other issues you may experience:",[555,67328,67329,67332,67335],{},[83,67330,67331],{},"‘Remove results’ step not returning any data? Check that ‘Columns (optional)’ is set to 1.",[83,67333,67334],{},"The bot isn’t looping through the book page links? Check that the ‘Go to page’ step has the data inserted properly.",[83,67336,67337],{},"Amazon page doesn’t load when running the bot? Try using just the desktop app and running it locally.",[14,67339,67340,67341],{},"Don't forget we offer excellent customer support. If you need help, ",[322,67342,487],{"href":486},[21,67344,46678],{"id":46677},[14,67346,67347],{},"Congratulations, you've learned how to build a bot to extract data from Amazon. With this newly acquired skill, you know how to scrape data, loop through actions, and extract data to a Google Sheet. You can make bots to scrape any website - the sky's the limit with your new AI super powers.",[21,67349,67351],{"id":67350},"what-else-can-i-automate-with-axiomai","What else can I automate with axiom.ai?",[14,67353,67354,67355,2004,67358,67361,67362,21423],{},"Axiom is a powerful browser automation tool. If you're excited, here are some ideas for other bots: such as ",[322,67356,67357],{"href":19666},"Automating amazon posting",[322,67359,67360],{"href":19692},"scraping Amazon"," including extracting ",[322,67363,5192],{"href":19662},{"title":494,"searchDepth":495,"depth":495,"links":67365},[67366,67367,67368,67378,67379,67380,67381,67382],{"id":67102,"depth":498,"text":67103},{"id":67119,"depth":498,"text":67120},{"id":67129,"depth":498,"text":67130,"children":67369},[67370,67371,67372,67373,67374,67375,67376,67377],{"id":67136,"depth":495,"text":67137},{"id":67147,"depth":495,"text":67148},{"id":67179,"depth":495,"text":67180},{"id":67208,"depth":495,"text":67209},{"id":67219,"depth":495,"text":67220},{"id":67242,"depth":495,"text":67243},{"id":67249,"depth":495,"text":67250},{"id":67262,"depth":495,"text":67263},{"id":67291,"depth":498,"text":67292},{"id":67305,"depth":498,"text":67306},{"id":67316,"depth":498,"text":67317},{"id":46677,"depth":498,"text":46678},{"id":67350,"depth":498,"text":67351},"2023-11-22",{"read":67385,"type":513,"tool":67386,"category":67387,"tags":67388,"featuredimg":67392,"landingimg":67393,"summary":67394},"19 min read",[46728],[48207],[67389,67390,67391],"amazon","products","asin","\u002Fblog\u002Famazon-books-hero.jpg","\u002Fblog\u002Famazon-books.jpg","A step-by-step guide that teaches you how to scrape Amazon Books with a bot",{"title":67082,"description":67087},"blog\u002Fhow-to-scrape-product-details-from-amazon-books","6RkufleBHeUB14SUfAsMfnjaXYfatY60CcSW9w5iO1I",[48207],[513],[46728],{"id":67402,"title":67403,"author":46205,"body":67404,"date":67764,"description":67408,"draft":26250,"extension":506,"meta":67765,"navigation":522,"path":1515,"seo":67775,"stem":67776,"__hash__":67777,"pinned":-1,"category":67778,"type":67779,"tool":67780},"blog\u002Fblog\u002Fhow-to-send-email-blast.md","How to send an email blast (From Gmail with a bot)",{"type":8,"value":67405,"toc":67738},[67406,67409,67412,67415,67417,67420,67423,67427,67433,67437,67440,67447,67451,67454,67458,67461,67463,67467,67471,67474,67477,67481,67484,67487,67490,67493,67496,67500,67502,67510,67512,67516,67519,67522,67526,67529,67534,67537,67541,67545,67548,67551,67554,67558,67562,67565,67568,67572,67575,67579,67582,67585,67588,67590,67594,67597,67600,67604,67606,67609,67612,67616,67619,67622,67625,67628,67631,67635,67639,67642,67645,67649,67652,67656,67659,67662,67665,67669,67672,67674,67677,67681,67685,67688,67691,67694,67697,67701,67704,67710,67714,67722,67728,67730,67733,67735],[14,67407,67408],{},"Sending email blasts from Gmail lets you send the right message to the right people at the right time. It can help personalize your marketing campaign, making it less intrusive for the receiver and boosting overall performance.",[18,67410],{"alt":67411},"How to send email blasts with axiom.ai",[14,67413,67414],{},"Learn how to send email blasts more efficiently by creating a browser bot that automates the process in Gmail, taking repetitive manual tasks off your hands. If you don’t use Gmail, don’t worry. You can use what you learn in this guide to automate email blasts on any web-based email platform. Let's dive in!",[21,67416,67103],{"id":67102},[14,67418,67419],{},"Axiom’s bots are powerful tools that you can delegate repetitive tasks, such as blast emailing, to. Think of them as your very own digital helpers. They’re built using a simple step-by-step process - without the need for code - that replicates your actions in the Chrome browser, allowing you to automate a whole range of tasks.",[14,67421,67422],{},"The beauty of learning how to create bots is that they can be tailored to your specific requirements and scheduled to run independently, freeing up valuable time.",[21,67424,67426],{"id":67425},"how-does-an-email-blast-bot-work","How does an email blast bot work?",[14,67428,67429,67432],{},[322,67430,67431],{"href":9272},"Gmail blast bots"," run in your Chrome browser and are built to mimic your actions, from logging into the app, to clicking the compose button. Once the compose form is open, the bot can populate it with text and files stored on your computer or in a Google Sheet.",[21,67434,67436],{"id":67435},"can-my-gmail-account-be-blocked","Can my Gmail account be blocked?",[14,67438,67439],{},"Gmail has daily send limits and if you exceed those limits, especially with a new account, there is a strong likelihood that your account will be blocked. We recommend staying within the limits. If you need to send more emails, you can use multiple accounts.",[14,67441,67442],{},[322,67443,67446],{"href":67444,"rel":67445},"https:\u002F\u002Fsupport.google.com\u002Fmail\u002Fanswer\u002F22839?hl=en-GB&ref_topic=7280460&sjid=15474505023042916918-EU",[2245],"Read Google's Policy here.",[21,67448,67450],{"id":67449},"lets-learn-how-to-build-a-email-blast-bot-with-axiomai","Let’s learn how to build a email blast bot with axiom.ai",[14,67452,67453],{},"In this example, we will guide you through the process of extracting data from a Google Sheet, looping through the rows, and using Gmail to compose and send new emails. This method can be applied to any web-based email app, including Outlook.",[639,67455,67457],{"id":67456},"_1-set-up-your-google-sheet","1. Set up your Google Sheet",[14,67459,67460],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering 'sheet.new' into the address bar. Don’t forget to name your sheet something like 'Gmail blast’. In the sheet, add some text data, with the email copy in one column and the name in another column, so you can personalize the message.",[592,67462],{"alt":67143,"src":67144},[639,67464,67466],{"id":67465},"_2-add-your-first-step-read-data-from-a-google-sheet","2. Add your first step: ‘Read data from a Google Sheet’",[592,67468],{"alt":67469,"src":67470},"axiom.ai adding a step","\u002Fblog\u002Ffinder-read.jpg",[14,67472,67473],{},"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.",[14,67475,67476],{},"In the 'Spreadsheet URL' field, you can search by name for the Google Sheet you created. Click on it to select.",[592,67478],{"alt":67479,"src":67480},"axiom.ai read data from a Google Sheet step","\u002Fblog\u002Fread-data-google-sheet-step.jpg",[14,67482,67483],{},"In the ‘Sheet name' field, click on the drop-down and select the correct tab.",[14,67485,67486],{},"In the ‘First cell’ field, toggle the switch and enter 'A1’. This setting tells the bot where to start reading data.",[14,67488,67489],{},"In the '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.",[14,67491,67492],{},"If you want to learn more about Google Sheet steps, watch these videos",[14,67494,67495],{},"(\u002Fguides\u002Fgoogle-sheets)",[639,67497,67499],{"id":67498},"_3-add-the-go-to-page-step","3. Add the ‘Go to page’ step",[14,67501,67226],{},[14,67503,67504,67505,67509],{},"In the 'Enter URL' field, cut and paste the Gmail URL: ",[322,67506,67507],{"href":67507,"rel":67508},"https:\u002F\u002Fmail.google.com\u002Fmail\u002Fu\u002F0\u002F#inbox?compose=new",[2245],". This step will open the Gmail compose email form by default.",[592,67511],{"alt":67239,"src":65852},[639,67513,67515],{"id":67514},"_4-add-the-loop-through-data-step","4. Add the ‘Loop through data’ step",[14,67517,67518],{},"Next, add a new step by entering ‘Loop through data’ into the Step Finder, and clicking to add it. This step will allow your bot to loop through the rows of emails in the Google Sheet. Make sure to add the steps you want to repeat, inside this loop.",[592,67520],{"alt":67521,"src":67216},"axiom.ai adding a loop step",[639,67523,67525],{"id":67524},"_5-add-a-split-a-name-into-columns-sub-step","5. Add a 'Split a name into columns' sub step",[14,67527,67528],{},"Staying within the ‘Loop through data’ step, it’s time to add a sub step, by clicking the white ‘Add step’ button. Search for and add the 'Split a name into columns' step.",[14,67530,67531,67532,16247],{},"In the data field, select '",[727,67533,139],{},[14,67535,67536],{},"Once you've added the step, you should see the names separated as shown in the image. These names can be used to personalize your emails.",[592,67538],{"alt":67539,"src":67540},"axiom.ai adding a split name step to gmail automation","\u002Fblog\u002Fsplit-name-step.jpg",[639,67542,67544],{"id":67543},"_6-add-an-enter-text-sub-step-for-the-to-field","6. Add an ‘Enter text’ sub step for the 'To' field",[14,67546,67547],{},"Add a further sub step by using the Step Finder to search for ‘Enter text’ and clicking on it.",[14,67549,67550],{},"When composing an email in Gmail, the cursor is automatically placed in the 'To' field, so no need to select the 'To' Field.",[14,67552,67553],{},"Click ‘Insert data’ to select the Google Sheet used to store your email addresses, then highlight the column with the email address for the blast.",[592,67555],{"alt":67556,"src":67557},"axiom.ai enter text step","\u002Fblog\u002Fenter-text-step.jpg",[639,67559,67561],{"id":67560},"_7-add-a-press-keys-sub-step-to-enter-email-address","7. Add a 'Press Key(s)' sub step to enter email address",[14,67563,67564],{},"Add a further sub step by using the Step Finder to search for ‘Press key(s)’ and clicking on it.",[14,67566,67567],{},"Inside the step, press record, then the 'Return tab' key. Then click 'Stop recording', and the return tab to move the cursor to the following field.",[592,67569],{"alt":67570,"src":67571},"axiom.ai adding a press keys step","\u002Fblog\u002Fpress-keys-step.jpg",[14,67573,67574],{},"This is an important step, as the return key press enters the email address into the field.",[639,67576,67578],{"id":67577},"_8-add-an-enter-text-sub-step-to-add-email-subject","8. Add an ‘Enter text’ sub step to add email subject",[14,67580,67581],{},"Add a further ‘Enter text’ sub step.",[14,67583,67584],{},"Again, no need to click 'Select' -  just add your subject line into the ‘Text’ field.",[14,67586,67587],{},"If you want to personalize it, you can also insert data from the 'Split a name into columns' step.",[592,67589],{"alt":67556,"src":67557},[639,67591,67593],{"id":67592},"_9-add-a-press-keys-sub-step-to-tab-to-the-email-body","9. Add a 'Press Key(s)' sub step to tab to the email body",[14,67595,67596],{},"Add another ‘Press Key(s)’ sub step by using the Step Finder to search for and add it.",[14,67598,67599],{},"Press record, then the 'tab' key.",[639,67601,67603],{"id":67602},"_10-add-an-enter-text-sub-step-to-add-email-body","10. Add an ‘Enter text’ sub step to add email body",[14,67605,67581],{},[14,67607,67608],{},"Again, no need to click 'Select' - just add your body copy into the ‘Text’ field.",[14,67610,67611],{},"If you want to personalize it, you can also insert data from the 'Split a name into columns' step. See the image below for an example.",[639,67613,67615],{"id":67614},"_11-add-a-click-element-sub-step-to-click-compose","11. Add a ‘Click element’ sub step to click compose",[14,67617,67618],{},"Add a ‘Click element’ sub step by using the Step Finder to search for and add it.",[14,67620,67621],{},"Click ‘Select’ and choose the ‘Compose’ button in Gmail.",[14,67623,67624],{},"Then click 'Custom' in the selector tool and tick the box 'Use element text instead of HTML'.",[14,67626,67627],{},"Finally click 'Send'.",[14,67629,67630],{},"This sends your email. Disable this step during testing.",[639,67632,67634],{"id":67633},"_12-add-a-wait-sub-step","12.  Add a ‘Wait’ sub step",[592,67636],{"alt":67637,"src":67638},"axiom.ai wait step","\u002Fblog\u002Fwait-step.jpg",[14,67640,67641],{},"Add a ‘Wait’ sub step by using the Step Finder to search for and add it.",[14,67643,67644],{},"In the field 'Set a time in milliseconds', input the number 1500. This step briefly pauses the bot to allow Gmail to send the email.",[639,67646,67648],{"id":67647},"_13-add-a-delete-rows-from-a-google-sheet-sub-step","13. Add a ‘Delete rows from a Google Sheet’ sub step",[14,67650,67651],{},"Add a further sub step, 'Delete rows from a Google Sheet', to delete the row of data just entered. This is to prevent the same row from being entered repeatedly. Search for the step using the Step Finder, and add it.",[592,67653],{"alt":67654,"src":67655},"axiom.ai delete rows from google sheet step","\u002Fblog\u002Faxiom-delete-rows-gs.jpg",[14,67657,67658],{},"Next, in ‘Spreadsheet URL’, upload the Google Sheet you are using as your data source.",[14,67660,67661],{},"For 'Sheet name' click on the drop-down and select the correct tab.",[14,67663,67664],{},"Then, in 'First row to delete' enter the number 1 and repeat this in 'Last row to delete', so that both are set to 1. The delete step ensures we do not email the same person repeatedly.",[639,67666,67668],{"id":67667},"_14-add-a-click-element-sub-step-to-open-a-new-email-form","14. Add a ‘Click element’ sub step to open a new email form",[14,67670,67671],{},"Add a final ‘Click element’ step to open the compose form, ready for the next email.",[14,67673,67621],{},[14,67675,67676],{},"Then click 'Custom' in the selector tool and tick the box 'Use element text instead of HTML', then click 'Complete'.",[592,67678],{"alt":67679,"src":67680},"axiom.ai click element step","\u002Fblog\u002Fclick-element-step.jpg",[639,67682,67684],{"id":67683},"_15-ready-to-test","15. Ready to test",[14,67686,67687],{},"Almost there! Your blast email bot should resemble the screenshot below.",[592,67689],{"alt":67637,"src":67690},"\u002Fblog\u002Fgmail-blast-design-patternv2.jpg",[14,67692,67693],{},"Now you’re ready to test your newly built bot, but before you do so, we recommend disabling the last ‘Click Element’ step added, allowing you to test without actually sending emails.",[14,67695,67696],{},"When you’re ready to test, use the desktop app, by clicking ‘Run with desktop app’.",[639,67698,67700],{"id":67699},"_16-running-the-bot","16. Running the bot",[14,67702,67703],{},"You can run the bot in the cloud and the desktop app. If you want to run the bot in the cloud, you will need to share the session or add login steps.",[14,67705,67706,67707,44],{},"To learn more about scheduling, ",[322,67708,67709],{"href":62575},"see here.",[21,67711,67713],{"id":67712},"issues-you-may-encounter-with-the-email-blast-bot","Issues you may encounter with the email blast bot",[555,67715,67716,67719],{},[83,67717,67718],{},"The bot seems confused and out of sync? Ensure the 'Return tab' is set in step 7 of the guide.",[83,67720,67721],{},"The wrong data is being submitted into a field? Re-select the 'Insert data' option in the corresponding 'Enter text' step.",[14,67723,67340,67724],{},[322,67725,487],{"href":67726,"rel":67727},"https:\u002F\u002Fwww.axiom.ai\u002Fcustomer-support",[2245],[21,67729,46678],{"id":46677},[14,67731,67732],{},"Congratulations, you've learned how to make a Gmail blast bot! With this newly acquired skill, you can save time on your emailing tasks and reach your customers more easily. You can apply the same pattern to any web-based email app, including Outlook. The sky's the limit with your new bot building super powers!",[21,67734,67351],{"id":67350},[14,67736,67737],{},"Axiom is a powerful browser automation tool. If you're excited, here are some ideas for other bots: extract data from your email app (such as Gmail), generate content, and send DMs on social media. We have steps to extract data and to generate text with AI.",{"title":494,"searchDepth":495,"depth":495,"links":67739},[67740,67741,67742,67743,67761,67762,67763],{"id":67102,"depth":498,"text":67103},{"id":67425,"depth":498,"text":67426},{"id":67435,"depth":498,"text":67436},{"id":67449,"depth":498,"text":67450,"children":67744},[67745,67746,67747,67748,67749,67750,67751,67752,67753,67754,67755,67756,67757,67758,67759,67760],{"id":67456,"depth":495,"text":67457},{"id":67465,"depth":495,"text":67466},{"id":67498,"depth":495,"text":67499},{"id":67514,"depth":495,"text":67515},{"id":67524,"depth":495,"text":67525},{"id":67543,"depth":495,"text":67544},{"id":67560,"depth":495,"text":67561},{"id":67577,"depth":495,"text":67578},{"id":67592,"depth":495,"text":67593},{"id":67602,"depth":495,"text":67603},{"id":67614,"depth":495,"text":67615},{"id":67633,"depth":495,"text":67634},{"id":67647,"depth":495,"text":67648},{"id":67667,"depth":495,"text":67668},{"id":67683,"depth":495,"text":67684},{"id":67699,"depth":495,"text":67700},{"id":67712,"depth":498,"text":67713},{"id":46677,"depth":498,"text":46678},{"id":67350,"depth":498,"text":67351},"2023-11-20",{"read":67766,"type":513,"tool":67767,"category":67768,"tags":67769,"featuredimg":67772,"landingimg":67773,"summary":67774},"22 min read",[46728],[53990],[1532,67770,67771],"gmail","bulk email","\u002Fblog\u002Fgmail-post.jpg","\u002Fblog\u002Fgmail-sq.jpg","A step-by-step guide that teaches you how to send an email blast with Gmail using a bot.",{"title":67403,"description":67408},"blog\u002Fhow-to-send-email-blast","VHJAO1cOpxmYjVPWtrrCotbK51Jk6rcFKQHQKEVQm3w",[53990],[513],[46728],{"id":67782,"title":67783,"author":46205,"body":67784,"date":68136,"description":68137,"draft":26250,"extension":506,"meta":68138,"navigation":522,"path":10086,"seo":68146,"stem":68147,"__hash__":68148,"pinned":-1,"category":68149,"type":68150,"tool":68151},"blog\u002Fblog\u002Fhow-to-automate-social-media-posts.md","How to automate social media posts with a bot",{"type":8,"value":67785,"toc":68114},[67786,67789,67792],[14,67787,67788],{},"How much time do you spend posting on your social media accounts? Keeping an audience engaged requires being consistently active on your social media platforms, which is time consuming. By automating social media posting, the repetitive manual tasks that took hours are now done within minutes. Using bots to take on your posting tasks is a great way to save time, improve efficiency and maximize the benefits of social media to your business.",[18,67790],{"alt":67791},"How to automate social media posts",[11197,67793,67794,67796,67812,67816,67822,67826,67841,67845,67848,67850,67853,67856,67859,67862,67866,67869,67872,67876,67878,67880,67882,67885,67887,67890,67892,67899,67901,67904,67906,67908,67910,67912,67914,67917,67921,67924,67927,67946,67949,67952,67955,67958,67962,67964,67970,67973,67975,67978,67982,67986,67989,67992,67995,67999,68006,68009,68013,68016,68019,68023,68025,68028,68031,68034,68040,68042,68046,68049,68051,68053,68055,68060,68064,68075,68080,68082,68085,68089],{},[21,67795,67103],{"id":67102},[14,67797,67798,67799,2004,67802,2004,67804,67807,67808,67811],{},"axiom.ai’s bots are powerful tools that you can delegate repetitive tasks to. Think of them as your very own digital helpers. They’re built using a simple step-by-step process - without the need for code - that replicates your actions in the Chrome browser, allowing you to automate a whole range of tasks including posting on soical media websites including ",[322,67800,67801],{"href":19666},"Amazon Posts",[322,67803,1058],{"href":1302},[322,67805,67806],{"href":10103},"Twitter(X)"," and many others including ",[322,67809,67810],{"href":13150},"Instagram.","\nThe beauty of learning how to create bots is that they can be tailored to your specific requirements and scheduled to run independently, freeing up valuable time.",[21,67813,67815],{"id":67814},"how-do-social-media-posting-bots-work","How do social media posting bots work?",[14,67817,67818,67819,67821],{},"Social media automation ",[322,67820,65127],{"href":324}," run in your Chrome browser and are built to mimic your actions, from logging into the app and opening up the post form. Once open, your bot can populate it from text and files stored on your computer or in a Google Sheet.",[21,67823,67825],{"id":67824},"what-would-you-recommend-using-a-social-media-posting-bot-for","What would you recommend using a social media posting bot for?",[14,67827,67828,67829,2004,67832,2004,67834,67837,67838,67840],{},"You can build bots to handle posting to a wide range of web applications, including ",[322,67830,67831],{"href":19666},"Amazon posts",[322,67833,1058],{"href":1302},[322,67835,67836],{"href":10103},"Twitter or X posts",", Tiktok posts, Pinterest, LinkedIn, Tumblr, Reddit, YouTube, Snapchat, WeChat, Weibo, Tencent, ",[322,67839,11534],{"href":13150}," and more.",[21,67842,67844],{"id":67843},"lets-learn-how-to-build-a-bot-that-posts-to-social-media","Let’s learn how to build a bot that posts to social media",[14,67846,67847],{},"Use axiom.ai’s simple point-and-click interface to create as many social media posting bots as you want. By following the steps below, you'll have a working bot in no time.",[639,67849,67457],{"id":67456},[14,67851,67852],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering 'sheet.new' into the address bar.",[14,67854,67855],{},"Don’t forget to name your sheet something like 'Instagram Posts’.",[14,67857,67858],{},"Set up your sheet with the post text in one column and paths to your post images in another.",[14,67860,67861],{},"Set up a second tab on your sheet titled ‘Posted’. In this the bot will record when a post was submitted.",[639,67863,67865],{"id":67864},"_2-start-from-blank","2. Start from blank",[14,67867,67868],{},"To build your social media bot from scratch, click on 'Start blank’. This will open the step selector and you can start adding steps to your bot.",[592,67870],{"alt":67871,"src":67144},"axiom.ai add first step to build a social media bot",[639,67873,67875],{"id":67874},"_3-add-your-first-step-read-data-from-a-google-sheet","3. Add your first step: ‘Read data from a Google Sheet’",[592,67877],{"alt":67469,"src":67470},[14,67879,67473],{},[592,67881],{"alt":67479,"src":67480},[14,67883,67884],{},"In the field called 'Spreadsheet URL', you can search for and upload the Google Sheet you are using as your data source, by name. Once found, click on it to select.",[14,67886,67661],{},[14,67888,67889],{},"In the 'First cell' field, toggle the switch and enter 'A1’. This setting tells the bot where to start reading data.",[14,67891,67489],{},[14,67893,67894,67895,44],{},"If you want to ",[322,67896,67898],{"href":67897},"\u002Fguides\u002Fgoogle-sheets","learn more about Google Sheet steps, watch these videos",[639,67900,67515],{"id":67514},[14,67902,67903],{},"Next, add a new step by entering ‘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.",[592,67905],{"alt":67521,"src":67216},[639,67907,67220],{"id":67219},[14,67909,67223],{},[592,67911],{"alt":67239,"src":65852},[14,67913,67226],{},[14,67915,67916],{},"In the 'Enter URL' field, cut and paste your social media URL. This step will open your platform of choice.",[639,67918,67920],{"id":67919},"_6-add-further-sub-steps-needed-for-the-data-entry","6. Add further sub steps needed for the data entry",[14,67922,67923],{},"Continuing within the same step, add further sub steps. You’ll need to add a combination of sub steps that will enter data into the inputs found in the form you want to automate.",[14,67925,67926],{},"You can choose from the following steps:",[555,67928,67929,67934,67939],{},[83,67930,67931,67933],{},[322,67932,3639],{"href":6378}," - for radio buttons (option buttons), toggles and checkboxes",[83,67935,67936,67938],{},[322,67937,5314],{"href":7600}," - for entering data into inputs",[83,67940,67941,67945],{},[322,67942,67944],{"href":67943},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fupload-file","Upload file","- for uploading files such as images",[14,67947,67948],{},"Use the Step Finder to find and add the right combination of steps for your task.",[14,67950,67951],{},"You will then need to configure each step. Click ‘Select’ to tell it which element to interact with, and the ‘Insert data’ to pass data from the Google Sheet.",[14,67953,67954],{},"The order will likely look something like this: a ‘Click element’ step to initiate post generation, and ‘Enter text’ step to add title and body, and an ‘Upload file’ step to attach image files. A final ‘Click element’ step will be needed to submit the post.",[14,67956,67957],{},"Top tip: you may need to include a ‘Wait’ steps to allow the page to load image files, before the bot progresses on to the next step.",[639,67959,67961],{"id":67960},"_7-add-a-delete-rows-from-a-google-sheet-sub-step","7. Add a ‘Delete rows from a Google Sheet’ sub step",[592,67963],{"alt":67654,"src":67655},[14,67965,67966,67967,67969],{},"Using the Step Finder, search for ",[322,67968,15755],{"href":15140},", and add it. This is to delete the row of data just entered, preventing the same row from being entered repeatedly.",[14,67971,67972],{},"In ‘Spreadsheet URL’, upload the Google Sheet you are using as your data source.",[14,67974,67661],{},[14,67976,67977],{},"Then, in 'First row to delete' enter the number 1 and repeat this in 'Last row to delete', so that both are set to 1. The delete step ensures we do not repost the same content repeatedly.",[639,67979,67981],{"id":67980},"_8-add-a-get-date-and-time-sub-step","8. Add a ‘Get date and time’ sub step",[592,67983],{"alt":67984,"src":67985},"axiom.ai get time and date step automating social media","\u002Fblog\u002Fget-time-date.jpg",[14,67987,67988],{},"Add a ‘Get date and time’ sub step by using the Step Finder to search for and add it.",[14,67990,67991],{},"In ‘Select date’, select ‘Current’.",[14,67993,67994],{},"In ‘Select format’, select the date format you require.",[639,67996,67998],{"id":67997},"_9-add-append-or-merge-data-sub-step","9. Add ‘Append or Merge Data’ sub step",[14,68000,8350,68001,68005],{},[322,68002,68004],{"href":68003},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fappend-or-merge-data","‘Append or Merge Data’"," sub step by using the Step Finder to search for and add it.",[14,68007,68008],{},"In ‘Data A’, select the post title column in your source Google Sheet.",[592,68010],{"alt":68011,"src":68012},"axiom.ai append merge data step","\u002Fblog\u002Fappend-merge-data.jpg",[14,68014,68015],{},"In ‘Data B’ add the current date and time to record the time your post was submitted.",[14,68017,68018],{},"In ‘Append mode’, select ‘Vertical’.",[639,68020,68022],{"id":68021},"_10-add-write-data-to-a-google-sheet-sub-step","10. Add ‘Write data to a Google Sheet’ sub step",[592,68024],{"alt":67266,"src":67267},[14,68026,68027],{},"Add a ‘Write data to a Google Sheet’ sub step by using the Step Finder to search for and add it.",[14,68029,68030],{},"In the 'Spreadsheet URL' field, search for the Google Sheet you created at the beginning of this tutorial.",[14,68032,68033],{},"In the 'Sheet name' field, select 'Posted'.",[14,68035,68036,68037,16247],{},"In the 'Data' field, select '",[727,68038,68039],{},"append-data",[14,68041,67285],{},[639,68043,68045],{"id":68044},"_10-ready-to-test","10. Ready to test",[14,68047,68048],{},"Before you test, we recommend disabling the last ‘Click Element’ step added, allowing you to test without actually posting.",[14,68050,67696],{},[639,68052,67306],{"id":67305},[14,68054,67703],{},[14,68056,68057,68058,44],{},"If you want to learn more about scheduling, ",[322,68059,67709],{"href":62575},[21,68061,68063],{"id":68062},"issues-you-may-encounter-with-social-media-posting-bot","Issues you may encounter with social media posting bot",[555,68065,68066,68069,68072],{},[83,68067,68068],{},"‘Enter text’ steps not working? Try reselecting and making sure you’ve inserted the data.",[83,68070,68071],{},"Bot working on the desktop app, but not when run in the cloud? Add Login steps.",[83,68073,68074],{},"Bot doesn’t wait for the image to upload? You may want to use Wait steps to ensure the automation is in sync with the page.",[14,68076,68077,68078],{},"Don't forget we offer excellent customer support. If you need help, get in touch. ",[322,68079,46674],{"href":486},[21,68081,46678],{"id":46677},[14,68083,68084],{},"Congratulations, you've learned how to make and use a social media posting bot. With this newly acquired skill, you have built a tool to automate content input and posting, helping you keep your audience engaged. You can use this tool across multiple social media platforms. The sky's the limit with your new super powers!",[21,68086,68088],{"id":68087},"what-else-can-i-automate-with-axiom","What else can I automate with Axiom?",[14,68090,68091,68092,2004,68094,450,68097,68100,68101,2427,68104,2004,68107,68110,68111],{},"Axiom is a powerful browser automation tool. If you're excited, here are some ideas for social media bots: such as ",[322,68093,67357],{"href":19666},[322,68095,68096],{"href":1302},"Automating Facebook posting",[322,68098,68099],{"href":46739},"automating DMs on Instagram."," We also have these social media templates, ",[322,68102,68103],{"href":10103},"Twitter posting",[322,68105,68106],{"href":1320},"Facebook posting",[322,68108,68109],{"href":13150},"Instagram Posts"," and finally ",[322,68112,68113],{"href":11193},"Insatgram DMs.",{"title":494,"searchDepth":495,"depth":495,"links":68115},[68116,68117,68118,68119,68133,68134,68135],{"id":67102,"depth":498,"text":67103},{"id":67814,"depth":498,"text":67815},{"id":67824,"depth":498,"text":67825},{"id":67843,"depth":498,"text":67844,"children":68120},[68121,68122,68123,68124,68125,68126,68127,68128,68129,68130,68131,68132],{"id":67456,"depth":495,"text":67457},{"id":67864,"depth":495,"text":67865},{"id":67874,"depth":495,"text":67875},{"id":67514,"depth":495,"text":67515},{"id":67219,"depth":495,"text":67220},{"id":67919,"depth":495,"text":67920},{"id":67960,"depth":495,"text":67961},{"id":67980,"depth":495,"text":67981},{"id":67997,"depth":495,"text":67998},{"id":68021,"depth":495,"text":68022},{"id":68044,"depth":495,"text":68045},{"id":67305,"depth":495,"text":67306},{"id":68062,"depth":498,"text":68063},{"id":46677,"depth":498,"text":46678},{"id":68087,"depth":498,"text":68088},"2023-11-19","A step-by-step guide that teaches you how to post on social media using a bot.",{"read":68139,"type":513,"tool":68140,"category":68141,"tags":68142,"featuredimg":68144,"landingimg":68145,"summary":68137},"20 min read",[46728],[53990],[13413,68143,67389,10102,12880],"facebook","\u002Fblog\u002Fsocial-media-hero.jpg","\u002Fblog\u002Fsocial-media-sq.jpg",{"title":67783,"description":68137},"blog\u002Fhow-to-automate-social-media-posts","VEAod-pu-YYodDPR4Q10mFEMIj8Qh8BKhgvn7Bo0rFU",[53990],[513],[46728],{"id":68153,"title":68154,"author":46205,"body":68155,"date":68525,"description":68159,"draft":26250,"extension":506,"meta":68526,"navigation":522,"path":1302,"seo":68534,"stem":68535,"__hash__":68536,"pinned":-1,"category":68537,"type":68538,"tool":68539},"blog\u002Fblog\u002Fhow-to-automate-facebook-posts.md","How to automate facebook posts",{"type":8,"value":68156,"toc":68503},[68157,68160,68163,68166,68170,68173,68177,68180,68184,68187,68190,68196,68198,68209,68213,68220,68222,68226,68230,68232,68239,68241,68243,68249,68255,68261,68263,68268,68270,68272,68278,68281,68286,68292,68296,68299,68301,68307,68310,68314,68321,68323,68328,68334,68338,68343,68348,68352,68359,68363,68370,68377,68384,68388,68392,68399,68403,68409,68411,68417,68423,68429,68433,68436,68440,68447,68453,68457,68460,68466,68470,68481,68484,68486,68489,68491],[14,68158,68159],{},"Using Facebook is a crucial day-to-day business activity for many of us, but creating posts across multiple accounts, whether for your own businesses or for clients, can be time consuming. 🤖 Bots are incredibly helpful in freeing up time and saving us from the tedious and repetitive tasks we tend to encounter while using a browser.",[18,68161],{"alt":68162},"How to automate facebook posts with axiom.ai",[14,68164,68165],{},"In this guide, we show you how to build a bot that can automate your Facebook posts directly in the browser. The design pattern you will learn can be applied to post from a profile. It can also be used to automate posts directly from Facebook Business pages. Get ready to dive in and discover the joy of using bots!",[21,68167,68169],{"id":68168},"what-exactly-is-a-facebook-bot","What exactly is a Facebook bot?",[14,68171,68172],{},"It’s like having your own digital assistant that you can delegate your Facebook tasks to. axiom.ai’s bots are highly customizable, and you can use them to automate almost anything in the browser, without having to use code. The beauty of learning to create bots is that they can be tailored to your specific requirements by mimicking your actions.",[21,68174,68176],{"id":68175},"how-does-a-facebook-bot-work","How does a Facebook bot work?",[14,68178,68179],{},"Facebook bots run in your Chrome browser and are built to mimic your actions, from logging into the app, clicking the menu button, and posting. Once the post form is open, your bot can populate it from files and text stored on your computer or in a Google Sheet.",[21,68181,68183],{"id":68182},"lets-learn-how-to-build-a-bot-to-automate-facebook-posts","Let’s learn how to build a bot to automate Facebook posts",[14,68185,68186],{},"With axiom.ai's no-code bot builder, you can create bots for posting on Facebook without having to code. Instead, use a simple point-and-click interface to create as many Facebook bots as you want. By following the steps below, you'll have a working bot automating your posts in no time.",[14,68188,68189],{},"The steps below outline how to use Google Sheets to store your posts, pass the data into your bot, and automate posting in the browser. The bot will click the “What’s on your mind” input field to open the post web form. You can also adapt what you learn here to post from Facebook Business pages.",[14,68191,68192,68193,68195],{},"If you're eager to start, why not give this\n",[322,68194,15982],{"href":1320}," a try?",[639,68197,67457],{"id":67456},[14,68199,68200,68201,68204,68205,68208],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering ",[29,68202,68203],{},"'sheet.new'"," into the address bar. Don’t forget to name your sheet something like ",[29,68206,68207],{},"'Facebook Posts’",". In the sheet, add some text data, with the text in one column and paths to your post images in another.",[639,68210,68212],{"id":68211},"_2-add-first-step","2. Add first step",[14,68214,68215,68216,68219],{},"To build your bot from scratch, click on ",[29,68217,68218],{},"'Add first step’",". This will open the step selector and you can start adding steps to your bot.",[592,68221],{"alt":67143,"src":67144},[639,68223,68225],{"id":68224},"_3-add-the-step-read-data-from-a-google-sheet","3. Add the step: ‘Read data from a Google Sheet’",[14,68227,65801,68228,65805],{},[29,68229,65804],{},[592,68231],{"alt":67469,"src":67470},[14,68233,68234,68235,68238],{},"In the field called ",[29,68236,68237],{},"'Spreadsheet URL'",", you can search for and upload the Google Sheet you are using as your data source, by name. Once found, click on it to select.",[14,68240,67661],{},[592,68242],{"alt":67479,"src":67480},[14,68244,8233,68245,68248],{},[29,68246,68247],{},"'First cell'"," field, toggle the switch and enter 'A1’. This setting tells the bot where to start reading data.",[14,68250,8233,68251,68254],{},[29,68252,68253],{},"'Last cell'"," field, click the toggle switch and enter 'A1'. 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.",[14,68256,68257,68258,44],{},"If you want to learn more about Google Sheet steps, ",[322,68259,68260],{"href":67897},"watch these videos",[639,68262,67515],{"id":67514},[14,68264,65827,68265,68267],{},[29,68266,65830],{}," 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.",[592,68269],{"alt":67521,"src":67216},[639,68271,67220],{"id":67219},[14,68273,68274,68275,68277],{},"Staying within the ",[29,68276,65830],{}," step, it’s time to add a sub step (click the white ‘Add step’ button).",[592,68279],{"alt":67239,"src":68280},"\u002Fblog\u002Fgo-to-page-blank.jpg",[14,68282,65801,68283,68285],{},[29,68284,65840],{}," and click on it. The step will be added for you to configure.",[14,68287,8233,68288,68291],{},[29,68289,68290],{},"'Enter URL'"," field, cut and paste the Facebook URL. This step will open Facebook.",[639,68293,68295],{"id":68294},"_5-add-a-click-element-sub-step","5. Add a ‘Click element’ sub step",[14,68297,68298],{},"Continuing within the same step, add a further sub step. Use the Step Finder to search for ‘Click element’ and click on it.",[592,68300],{"alt":67679,"src":67680},[14,68302,68303,68304,68306],{},"Next, click ",[29,68305,15663],{}," and choose the “What’s on your mind” input field.",[14,68308,68309],{},"This click opens the post form.",[639,68311,68313],{"id":68312},"_6-add-an-enter-text-sub-step","6. Add an ‘Enter text’ sub step",[14,68315,68316,68317,68320],{},"Add a further sub step by using the Step Finder to search for ",[29,68318,68319],{},"‘Enter text’"," and clicking on it.",[592,68322],{"alt":67556,"src":67557},[14,68324,68303,68325,68327],{},[29,68326,15663],{}," to highlight the “What's on your mind” text and click confirm.",[14,68329,68330,68331,68333],{},"Then click ",[29,68332,7235],{}," to select the Google Sheet used to store your posts, then highlight the column with the text for the post.",[639,68335,68337],{"id":68336},"_7-add-click-element-sub-step","7. Add ‘Click element’ sub step",[14,68339,68316,68340,68320],{},[29,68341,68342],{},"‘Click element’",[14,68344,68330,68345,68347],{},[29,68346,15663],{}," and choose the icon for uploading images: the green picture icon.",[639,68349,68351],{"id":68350},"_8-add-upload-a-file-sub-step","8. Add ‘Upload a file’ sub step",[14,68353,68354,68355,68358],{},"Add a further sub step by using the Step Finder to search for the ",[29,68356,68357],{},"‘Upload a file’"," step and clicking on it.",[592,68360],{"alt":68361,"src":68362},"axiom.ai file upload step","\u002Fblog\u002Ffile-upload-step.jpg",[14,68364,68365,68366,68369],{},"Next, select the grey ",[29,68367,68368],{},"‘Add photos\u002Fvideos’"," area pictured below.",[14,68371,68372,68373,68376],{},"Then, in ",[29,68374,68375],{},"‘File path’",", click ‘Insert data’ and select the column in your Google Sheet with the file path.",[14,68378,68379,68380,8155,68382,68347],{},"Next, in ",[29,68381,68342],{},[29,68383,15663],{},[639,68385,68387],{"id":68386},"_9-add-click-element-sub-step-to-click-on-post","9. Add ‘Click element’ sub step to click on Post",[14,68389,68316,68390,68320],{},[29,68391,68342],{},[14,68393,68394,68395,68398],{},"Select and highlight the blue ",[29,68396,68397],{},"‘Post’"," button in Facebook. Click ‘Confirm’ and hey presto, you have built your Facebook bot.",[639,68400,68402],{"id":68401},"_10-finally-add-the-delete-rows-from-a-google-sheet-sub-step","10 Finally, Add the ‘Delete rows from a Google Sheet’ sub step",[14,68404,68405,68406,68408],{},"Add a further sub step, ",[29,68407,15755],{},", to delete the row of data just entered. This is to prevent the same row from being entered repeatedly. Search for the step using the Step Finder, and add it.",[592,68410],{"alt":67654,"src":67655},[14,68412,68379,68413,68416],{},[29,68414,68415],{},"‘Spreadsheet URL’",", upload the Google Sheet you are using as your data source.",[14,68418,62612,68419,68422],{},[29,68420,68421],{},"'Sheet name'"," click on the drop-down and select the correct tab.",[14,68424,68372,68425,68428],{},[29,68426,68427],{},"'First row to delete'"," enter the number 1 and repeat this in 'Last row to delete', so that both are set to 1.",[639,68430,68432],{"id":68431},"_11-ready-to-test","11. Ready to test",[14,68434,68435],{},"And that’s it! Your bot should look something like the below.",[592,68437],{"alt":68438,"src":68439},"axiom.ai facebook post design pattern","\u002Fblog\u002Ffb-post-design-pattern.jpg",[14,68441,68442,68443,68446],{},"Before you test, we recommend disabling the last ",[29,68444,68445],{},"‘Click Element’"," step added, allowing you to test without actually posting.",[14,68448,68449,68450,44],{},"When you’re ready to test, use the desktop app, by clicking ",[29,68451,68452],{},"‘Run with desktop app’",[639,68454,68456],{"id":68455},"_12-running-the-bot","12. Running the bot",[14,68458,68459],{},"You can run the bot in the cloud and the desktop app. If you want to learn more about scheduling, see here.",[14,68461,68462,68463],{},"Please note that if you build a bot on the desktop app when logged in, your session will be shared. However if you run the bot in the cloud, the session will not be shared. Learn how to work around this ",[322,68464,68465],{"href":993},"here.",[21,68467,68469],{"id":68468},"issues-you-may-encounter-with-your-facebook-bot","Issues you may encounter with your Facebook bot",[555,68471,68472,68475,68478],{},[83,68473,68474],{},"The file isn’t uploading? Try reselecting the upload file element in step 8.",[83,68476,68477],{},"The file is uploading, but the bot clicks post before it's finished? You may want to use ‘Wait’ steps to ensure the automation is in sync with the page.",[83,68479,68480],{},"The post button isn’t clicking? Try using the text selector.",[14,68482,68483],{},"Don't forget we offer excellent customer support. If you need help, get in touch. (\u002Fcustomer-support)",[21,68485,46678],{"id":46677},[14,68487,68488],{},"🥳 Congratulations, you've learned how to make and use a bot to extract reports! With this newly acquired skill 👩‍🎓, you know how to automate scraping data, downloading files and sending emails. The sky's the limit with your new AI 🦸 super powers.",[21,68490,68088],{"id":68087},[14,68492,68493,68494,68497,68498,68500,68501],{},"If you're excited, here are some ideas for other bots: extract data from your email app (such as ",[322,68495,1534],{"href":68496},"\u002Fblog\u002Fhow-to-scrape-emails","), generate content, and send direct messages on ",[322,68499,11534],{"href":11193},". We have steps to extract data with AI and to generate text with AI. Take a look at our templates ",[322,68502,68465],{"href":324},{"title":494,"searchDepth":495,"depth":495,"links":68504},[68505,68506,68507,68522,68523,68524],{"id":68168,"depth":498,"text":68169},{"id":68175,"depth":498,"text":68176},{"id":68182,"depth":498,"text":68183,"children":68508},[68509,68510,68511,68512,68513,68514,68515,68516,68517,68518,68519,68520,68521],{"id":67456,"depth":495,"text":67457},{"id":68211,"depth":495,"text":68212},{"id":68224,"depth":495,"text":68225},{"id":67514,"depth":495,"text":67515},{"id":67219,"depth":495,"text":67220},{"id":68294,"depth":495,"text":68295},{"id":68312,"depth":495,"text":68313},{"id":68336,"depth":495,"text":68337},{"id":68350,"depth":495,"text":68351},{"id":68386,"depth":495,"text":68387},{"id":68401,"depth":495,"text":68402},{"id":68431,"depth":495,"text":68432},{"id":68455,"depth":495,"text":68456},{"id":68468,"depth":498,"text":68469},{"id":46677,"depth":498,"text":46678},{"id":68087,"depth":498,"text":68088},"2023-11-12",{"read":68527,"type":513,"tool":68528,"category":68529,"tags":68530,"featuredimg":68531,"landingimg":68532,"summary":68533},"18 min read",[46728],[53990],[53417,68143,11532,1055],"\u002Fblog\u002FFB-LONG.jpg","\u002Fblog\u002FFB.jpg","Thanks to automation, repetitive inputting of data can be delegated to bots.",{"title":68154,"description":68159},"blog\u002Fhow-to-automate-facebook-posts","yGJ5dfWqKoncgQhZjjz5bXHOJ_sGurPRcw-wF0XrWsM",[53990],[513],[46728],{"id":68541,"title":68542,"author":46205,"body":68543,"date":68856,"description":494,"draft":26250,"extension":506,"meta":68857,"navigation":522,"path":7515,"seo":68866,"stem":68867,"__hash__":68868,"pinned":-1,"category":68869,"type":68870,"tool":68871},"blog\u002Fblog\u002Fhow-to-automate-data-entry.md","How to automate data entry with a bot",{"type":8,"value":68544,"toc":68835},[68545,68549,68552,68555,68558,68562,68565,68569,68572,68576,68579,68583,68586,68589,68592,68596,68598,68601,68605,68609,68611,68613,68615,68619,68623,68625,68629,68638,68647,68653,68655,68659,68661,68663,68672,68676,68681,68683,68685,68687,68689,68700,68704,68706,68715,68719,68728,68730,68739,68743,68747,68749,68753,68757,68761,68763,68765,68769,68775,68781,68788,68790,68796,68800,68804,68815,68819,68821,68824,68826],[21,68546,68548],{"id":68547},"why-automate-data-entry-with-bots","Why automate data entry with bots?",[14,68550,68551],{},"Who wouldn’t want to automate data entry? 🥱 It’s rather a tedious manual task, after all, and one that the average employee spends a significant amount of time on 🕥. Due to its repetitive nature, it can be challenging to maintain focus, resulting in errors.",[18,68553],{"alt":68554},"how to automate data entry",[14,68556,68557],{},"Thanks to automation, repetitive inputting of data can be delegated to bots, eliminating errors, increasing productivity, and freeing up valuable time. 🤖 Bots will never get bored like me or you, and watching them do their thing in the browser is just magical. Read on to learn how to build your very own data entry bot.",[21,68559,68561],{"id":68560},"what-exactly-is-a-data-entry-bot","What exactly is a data entry bot?",[14,68563,68564],{},"It’s like having your own digital assistant 🦾 that you can delegate your data entry tasks to. axiom.ai’s bots are highly customizable, and you can use them to automate almost anything in the browser, without having to use code. The beauty of learning to create bots is that they can be tailored to your specific requirements by mimicking your actions.",[21,68566,68568],{"id":68567},"what-would-you-recommend-using-a-data-entry-bot-for","What would you recommend using a data entry bot for?",[14,68570,68571],{},"If you are manually entering data into a web app in the Chrome browser, then the data entry task can be automated. Our customers are automating data entry into thousands of different web apps, ranging from 💡 social media platforms, to 💡 e-commerce and listing apps, to 💡 CRM and legacy web apps.",[21,68573,68575],{"id":68574},"how-does-a-data-entry-bot-work","How does a data entry bot work?",[14,68577,68578],{},"Data entry bots run in your Chrome browser and are built to mimic your actions, from logging into web apps, entering data into webforms, and submitting it. It can pull your data for inputting from sources such as Google Sheets, CSVs and web hooks. What’s more, if you have multiple data entry tasks, you can run multiple bots, and schedule them to run day and night.",[21,68580,68582],{"id":68581},"lets-learn-how-to-build-a-data-entry-bot-with-axiomai","Let’s learn how to build a data entry bot with axiom.ai",[14,68584,68585],{},"With axiom.ai's no-code bot builder, you can create bots for data entry use cases without having to code. Instead, use a simple point-and-click interface to create as many data entry bots as you want. By following the steps below, you'll have a working bot inputting rows upon rows of data into your web app in no time.",[14,68587,68588],{},"In this example, we’re going to show you how to take data from a Google Sheet and enter it into a webform. However, you can easily adapt this design pattern to any data source.",[14,68590,68591],{},"👇👇👇👇",[14,68593,68192,68594,68195],{},[322,68595,15982],{"href":7052},[639,68597,67457],{"id":67456},[14,68599,68600],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering 'sheet.new' into the address bar. Don’t forget to name your sheet something like 'Data’. Then add some data to test your bot with.",[639,68602,68604],{"id":68603},"_1-add-first-step","1. Add first step",[14,68606,68215,68607,68219],{},[29,68608,68218],{},[592,68610],{"alt":67143,"src":67144},[639,68612,67875],{"id":67874},[592,68614],{"alt":67469,"src":67470},[14,68616,65801,68617,65805],{},[29,68618,65804],{},[14,68620,68234,68621,68238],{},[29,68622,68237],{},[592,68624],{"alt":67479,"src":67480},[14,68626,62612,68627,68422],{},[29,68628,68421],{},[14,68630,8233,68631,68633,68634,68637],{},[29,68632,68247],{}," field, toggle the switch and enter ",[29,68635,68636],{},"'A1’",". This setting tells the bot where to start reading data.",[14,68639,8233,68640,68642,68643,68646],{},[29,68641,68253],{}," field, click the toggle switch and enter ",[29,68644,68645],{},"'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.",[14,68648,68649,68650,44],{},"If you want to learn more about Google Sheet steps, watch ",[322,68651,68652],{"href":67897},"these videos",[639,68654,67515],{"id":67514},[14,68656,65827,68657,68267],{},[29,68658,65830],{},[592,68660],{"alt":67521,"src":67216},[639,68662,67220],{"id":67219},[14,68664,68274,68665,68667,68668,68671],{},[29,68666,65830],{}," step, it’s time to add a sub step (click the white ",[29,68669,68670],{},"‘Add step’"," button).",[14,68673,65801,68674,68285],{},[29,68675,65840],{},[14,68677,68234,68678,68680],{},[29,68679,68290],{},", cut and paste the URL to the site you want to input data.",[592,68682],{"alt":67239,"src":65852},[639,68684,67920],{"id":67919},[14,68686,67923],{},[14,68688,67926],{},[555,68690,68691,68694,68697],{},[83,68692,68693],{},"Enter text - for entering data into inputs",[83,68695,68696],{},"Select list - for automating drop-down menus",[83,68698,68699],{},"Click element - Use for radio buttons (option buttons), toggles and checkboxes",[592,68701],{"alt":68702,"src":68703},"axiom.ai add the steps required to replicate your actions","\u002Fblog\u002Finteract-steps.jpg",[14,68705,67948],{},[14,68707,68708,68709,68711,68712,68714],{},"You will then need to configure each step. Click ",[29,68710,15663],{}," to tell it which element to interact with, and the ",[29,68713,7235],{}," to pass data from the Google Sheet.",[639,68716,68718],{"id":68717},"_7-add-the-click-element-sub-step-to-submit-the-form","7. Add the ‘Click element’ sub step to submit the form",[14,68720,68721,68722,68724,68725,68727],{},"Still within the ",[29,68723,65830],{}," step, add the ",[29,68726,68342],{}," sub step to submit the form. Add it, then click ‘Select’ to highlight the submit button in the web form and click confirm.",[592,68729],{"alt":67679,"src":67680},[14,68731,68732,68733,769,68735,68738],{},"Top tip: If the submit button has unique text, use the custom select option. Click ",[29,68734,15663],{},[29,68736,68737],{},"‘Custom’"," and tick the box labeled ‘Use text by element instead of html’.",[639,68740,68742],{"id":68741},"_8-add-the-delete-rows-from-a-google-sheet-sub-step","8. Add the ‘Delete rows from a Google Sheet’ sub step",[14,68744,68405,68745,68408],{},[29,68746,15755],{},[592,68748],{"alt":67654,"src":67655},[14,68750,68379,68751,68416],{},[29,68752,68415],{},[14,68754,62612,68755,68422],{},[29,68756,68421],{},[14,68758,68372,68759,68428],{},[29,68760,68427],{},[639,68762,67292],{"id":67291},[14,68764,68435],{},[592,68766],{"alt":68767,"src":68768},"axiom.ai data entry design pattern","\u002Fblog\u002Fdesign-pattern-data.jpg",[14,68770,68771,68772,44],{},"Now you’re ready to test in the Axiom desktop app, by clicking ",[29,68773,68774],{},"‘Run’",[14,68776,68777,68778,68780],{},"You may want to test without actually submitting the form. You can do so by disabling the ",[29,68779,68445],{}," set up in step 7. See how in the image below:",[14,68782,68783,68784,68787],{},"When you’ve finished testing and you want to increase the size of your loop, edit the ",[29,68785,68786],{},"‘Last cell’"," field mentioned in step 3 and run again.",[639,68789,67306],{"id":67305},[14,68791,68792,68793],{},"You can run this bot in the cloud and the desktop app. If you want to learn more about scheduling, ",[322,68794,68795],{"href":67312},"See here.",[14,68797,68462,68798],{},[322,68799,68465],{"href":993},[21,68801,68803],{"id":68802},"issues-you-may-encounter-with-your-data-entry-bot","Issues you may encounter with your data entry bot",[555,68805,68806,68809,68812],{},[83,68807,68808],{},"The bot is looping through the same row? Check that step 8 is correctly configured and is deleting rows in the Google sheet.",[83,68810,68811],{},"Data is entered in the wrong input? You may want to use ‘Wait’ steps to ensure the automation is in sync with the page load.",[83,68813,68814],{},"Content is loading as you automate form? You may want to use ‘Wait’ steps to ensure the automation is in sync with the page.",[14,68816,67340,68817],{},[322,68818,487],{"href":486},[21,68820,46678],{"id":46677},[14,68822,68823],{},"👩‍🎓 Congratulations, you've learned how to make and use a data entry bot to input data into web forms. With this newly acquired skill, you know how to automate data entry into any web app and how to loop through large volumes of data. The sky's the limit with your new super powers. 🧙 👩‍🚀 👩‍🔬",[21,68825,68088],{"id":68087},[14,68827,68493,68828,68830,68831,68500,68833],{},[322,68829,1534],{"href":68496},", generate content, and send direct messages on ",[322,68832,11534],{"href":11193},[322,68834,68465],{"href":324},{"title":494,"searchDepth":495,"depth":495,"links":68836},[68837,68838,68839,68840,68841,68853,68854,68855],{"id":68547,"depth":498,"text":68548},{"id":68560,"depth":498,"text":68561},{"id":68567,"depth":498,"text":68568},{"id":68574,"depth":498,"text":68575},{"id":68581,"depth":498,"text":68582,"children":68842},[68843,68844,68845,68846,68847,68848,68849,68850,68851,68852],{"id":67456,"depth":495,"text":67457},{"id":68603,"depth":495,"text":68604},{"id":67874,"depth":495,"text":67875},{"id":67514,"depth":495,"text":67515},{"id":67219,"depth":495,"text":67220},{"id":67919,"depth":495,"text":67920},{"id":68717,"depth":495,"text":68718},{"id":68741,"depth":495,"text":68742},{"id":67291,"depth":495,"text":67292},{"id":67305,"depth":495,"text":67306},{"id":68802,"depth":498,"text":68803},{"id":46677,"depth":498,"text":46678},{"id":68087,"depth":498,"text":68088},"2023-11-07",{"read":68858,"type":513,"tool":68859,"category":68860,"tags":68861,"featuredimg":68864,"landingimg":68865,"summary":68533},"13 min read",[46728],[58387],[68862,64816,67072,68863,1055],"bot","data input","\u002Fblog\u002Fdata-entry-long.jpg","\u002Fblog\u002Fdata-entry.jpg",{"title":68542,"description":494},"blog\u002Fhow-to-automate-data-entry","eibpmJZAVlLEpillHs3_B_4V1x8a3pjVcAbu_LjyGC0",[58387],[513],[46728],{"id":68873,"title":68874,"author":46205,"body":68875,"date":68856,"description":69070,"draft":26250,"extension":506,"meta":69071,"navigation":522,"path":10652,"seo":69077,"stem":69078,"__hash__":69079,"pinned":-1,"category":69080,"type":69081,"tool":69082},"blog\u002Fblog\u002Fhow-to-automate-downloadin-a-file-from-a-website.md","How to automate downloading a file from a website",{"type":8,"value":68876,"toc":69054},[68877,68884,68887,68890,68893,68897,68900,68903,68911,68914,68918,68921,68925,68928,68930,68934,68936,68941,68945,68953,68956,68966,68969,68973,68975,68979,68982,68986,68989,68993,68995,68999,69007,69011,69015,69034,69036,69043,69045],[14,68878,68879,68880,68883],{},"If your job or business requires you to spend lots of time ",[322,68881,68882],{"href":18497},"downloading files"," from websites, you might want to consider automating this process with axiom.ai’s no-code bots.",[14,68885,68886],{},"The reason for automating repetitive browser tasks such as file downloading is simple: it saves you time and money. Instead of spending time on repetitive, manual tasks yourself, or employing someone to do so, they’re taken care of by easy-to-build bots.",[18,68888],{"alt":68889},"How to automate file downloads from a website",[14,68891,68892],{},"Read on to learn how to make your very own customized bot to help you reduce manual effort and save valuable time.",[21,68894,68896],{"id":68895},"what-exactly-is-a-bot-and-how-does-it-work","What exactly is a bot and how does it work?",[14,68898,68899],{},"Axiom’s bots are powerful tools that you can delegate browser tasks to. Think of them as your very own digital assistant. They’re built using a simple step-by-step process - without the need for code - that replicates your actions in the Chrome browser, allowing you to automate all sorts of repetitive tasks, including file downloading.",[14,68901,68902],{},"The beauty of learning how to create bots is that they can be tailored to your specific requirements. If you have several file downloading tasks, you can run multiple bots, either on demand or scheduling them according to your preference.",[21,68904,68906,68907,68910],{"id":68905},"what-would-you-recommend-using-a-file-download-bot-for","What would you recommend using a ",[322,68908,68909],{"href":10670},"file download"," bot for?",[14,68912,68913],{},"Customizing bots to fit your specific use case is easy with our platform. If you are manually downloading files from websites in the Chrome browser, then these tasks can be automated. To give an example, you can build bots to assist you with downloading report files, CSV files or image files, making migrating sites or carrying out research a breeze.",[639,68915,68917],{"id":68916},"lets-learn-how-to-build-a-file-download-bot-with-axiomai","Let’s learn how to build a file download bot with axiom.ai",[14,68919,68920],{},"Use axiom.ai’s simple point-and-click interface to create as many file download bots as you want. By following the steps below, you'll have a working bot in no time.",[14,68922,68192,68923,68195],{},[322,68924,15982],{"href":10670},[639,68926,68927],{"id":65509},"1. Add your first step: ‘Go to page’",[592,68929],{"alt":67143,"src":67144},[14,68931,65801,68932,65805],{},[29,68933,65840],{},[592,68935],{"alt":67239,"src":65852},[14,68937,68234,68938,68940],{},[29,68939,68290],{},", paste the URL for the web page you would like to download files from. This step will open up the web page.",[639,68942,68944],{"id":68943},"_2-add-the-download-file-step","2. Add the ‘Download File’ step",[14,68946,65801,68947,68952],{},[29,68948,68949],{},[322,68950,68951],{"href":7612},"‘Download File’"," and click on it to add the step to Axiom.",[592,68954],{"alt":67239,"src":68955},"\u002Fblog\u002Fdownload-file-step.jpg",[14,68957,68958,68959,68965],{},"Note: If you want to download multiple files at once, add the ",[29,68960,68961],{},[322,68962,68964],{"href":68963},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-files","‘Download Files’"," step, instead.",[14,68967,68968],{},"Here you can select the file you want to download, and choose the location you would like it to download to.",[639,68970,68972],{"id":68971},"_3-ready-to-test","3. Ready to test",[14,68974,68435],{},[592,68976],{"alt":68977,"src":68978},"axiom.ai deisgn pattern donwload file","\u002Fblog\u002Fdownload-file-d-pattern.jpg",[14,68980,68981],{},"Now you’re ready to test it, by clicking ‘Run’.",[639,68983,68985],{"id":68984},"_4-running-the-bot","4. Running the bot",[14,68987,68988],{},"You can run this bot on the desktop app. If you want to download files in the cloud you will need to use the Google Drive download step.",[14,68990,68462,68991],{},[322,68992,68465],{"href":993},[21,68994,68803],{"id":68802},[21,68996,68998],{"id":68997},"troubleshooting-the-file-download-axiom","Troubleshooting the file download axiom",[80,69000,69001,69004],{},[83,69002,69003],{},"Files open in a browser window - Try setting the Force download option in the step.",[83,69005,69006],{},"Files not downloading - Check the folder write permissions on your computer.",[14,69008,67340,69009],{},[322,69010,487],{"href":486},[21,69012,69014],{"id":69013},"alternative-file-download-steps","Alternative file download steps",[555,69016,69017,69022,69028],{},[83,69018,69019,69021],{},[322,69020,10559],{"href":68963}," - Axiom desktop only",[83,69023,69024,69021],{},[322,69025,69027],{"href":69026},"\u002Fdocs\u002Fno-code-tool\u002Freference\u002Fsteps\u002Fdownload-file-from-url","Download files from a URL directly",[83,69029,69030,69033],{},[322,69031,69032],{"href":1698},"Download files to a Google Drive"," - Cloud or Desktop",[21,69035,46678],{"id":46677},[14,69037,69038,69039,69042],{},"Congratulations, you've learned how to make and use a ",[322,69040,69041],{"href":18497},"file downloading"," bot. With this newly acquired skill, you know how to download single or multiple files and set the download location. The sky's the limit with your new super powers.",[21,69044,68088],{"id":68087},[14,69046,69047,69048,68830,69050,68500,69052],{},"If you're excited, here are some ideas for other bots: extract data from your email app such as ",[322,69049,1534],{"href":68496},[322,69051,11534],{"href":11193},[322,69053,68465],{"href":324},{"title":494,"searchDepth":495,"depth":495,"links":69055},[69056,69057,69065,69066,69067,69068,69069],{"id":68895,"depth":498,"text":68896},{"id":68905,"depth":498,"text":69058,"children":69059},"What would you recommend using a file download bot for?",[69060,69061,69062,69063,69064],{"id":68916,"depth":495,"text":68917},{"id":65509,"depth":495,"text":68927},{"id":68943,"depth":495,"text":68944},{"id":68971,"depth":495,"text":68972},{"id":68984,"depth":495,"text":68985},{"id":68802,"depth":498,"text":68803},{"id":68997,"depth":498,"text":68998},{"id":69013,"depth":498,"text":69014},{"id":46677,"depth":498,"text":46678},{"id":68087,"depth":498,"text":68088},"If your job or business requires you to spend lots of time downloading files from websites, you might want to consider automating this process with axiom.ai’s no-code bots.",{"read":50549,"type":513,"tool":69072,"category":69073,"tags":69074,"featuredimg":69075,"landingimg":69076,"summary":68533},[46728],[65706],[10668,68909],"\u002Fblog\u002Fautomate-downloads-longv2.jpg","\u002Fblog\u002Fautomate-downloads.jpg",{"title":68874,"description":69070},"blog\u002Fhow-to-automate-downloadin-a-file-from-a-website","_8McSf1zStdrCjXhcGiY0W1Fq6lb49IkvcgP_SfWmZ4",[65706],[513],[46728],{"id":69084,"title":69085,"author":46205,"body":69086,"date":68856,"description":69090,"draft":26250,"extension":506,"meta":69355,"navigation":522,"path":69363,"seo":69364,"stem":69365,"__hash__":69366,"pinned":-1,"category":69367,"type":69368,"tool":69369},"blog\u002Fblog\u002Fhow-to-automate-reporting.md","How to automate reporting",{"type":8,"value":69087,"toc":69332},[69088,69091,69094,69098,69101,69105,69108,69112,69115,69119,69125,69129,69136,69139,69141,69143,69145,69149,69152,69156,69161,69165,69168,69185,69187,69190,69194,69208,69221,69227,69236,69239,69242,69247,69252,69256,69263,69267,69277,69280,69284,69286,69291,69295,69299,69303,69314,69318,69320,69322,69324],[14,69089,69090],{},"Do you spend a lot of time logging into multiple web apps to generate and download reports? If so, read on. We’ll teach you how to make a bot to automate that process, and distribute your reports, saving you valuable time.",[18,69092],{"alt":69093},"Autyomate reporting in the browser with axiom.ai",[21,69095,69097],{"id":69096},"what-exactly-is-a-reporting-bot","What exactly is a reporting bot?",[14,69099,69100],{},"It’s like having your own digital assistant. axiom.ai’s 🤖 bots are highly customizable, and you can use them to automate almost anything in the browser. The beauty of learning to create bots is that they can be tailored to your specific requirements by mimicking your actions. Who wouldn't want an army of personalized digital assistants at their disposal?",[21,69102,69104],{"id":69103},"why-would-you-want-to-automate-downloading-reports-with-bots","Why would you want to automate downloading reports with bots?",[14,69106,69107],{},"The reason for automating repetitive browser tasks such as reporting is simple: it saves you time and money. Instead of spending the time on repetitive, manual tasks yourself, or employing someone to do so, they’re taken care of by easy to build, no-code bots. Our first ever customer used Axiom to automate Amazon reporting, and it truly revolutionized their workflow.",[21,69109,69111],{"id":69110},"what-use-cases-would-you-recommend-using-a-reporting-bot-for","What use cases would you recommend using a reporting bot for?",[14,69113,69114],{},"Customizing bots to fit your specific use case is easy with our platform. If you're an agency, you can create bots that log into multiple accounts and download reports from each, across numerous platforms. In e-commerce, we have customers who build bots to download reports from platforms like Amazon. You can either run bots on demand or schedule them according to your preference.",[21,69116,69118],{"id":69117},"how-does-a-reporting-bot-work","How does a reporting bot work?",[14,69120,69121,69122,69124],{},"Reporting bots run in your Chrome browser, and are set up to mimic your actions, from logging into web apps, to entering date ranges and then clicking to generate reports. Finally, the bot can ",[322,69123,10668],{"href":10670}," reports and if you want it to go the extra mile, it can distribute them to team members via email.",[21,69126,69128],{"id":69127},"lets-learn-how-to-build-a-reporting-bot-with-axiomai","Let’s learn how to build a reporting bot with axiom.ai",[14,69130,69131,69132,69135],{},"With axiom.ai's no-code bot builder, you can create bots for reporting without having to code. Use our simple point-and-click interface to create as many reporting bots as you want. If you follow the steps below, you'll have a working bot ",[322,69133,69134],{"href":10670},"downloading"," reports by the time you get to the end of this article.",[14,69137,69138],{},"👇🧑‍🎓",[639,69140,68604],{"id":68603},[14,69142,67140],{},[592,69144],{"alt":67143,"src":67144},[639,69146,69148],{"id":69147},"_2-add-your-first-step-go-to-page","2. Add your first step ‘Go to page’",[14,69150,69151],{},"Use the Step Finder to search for ‘Go to page’ and click on it. The step will be added to Axiom for you to configure.",[592,69153],{"alt":69154,"src":69155},"axiom.ai add the 'go to page'# step","\u002Fblog\u002Fgo-to-page-generic.jpg",[14,69157,8233,69158,69160],{},[29,69159,68290],{}," field, cut and paste the URL for the site you want to download the report from.",[639,69162,69164],{"id":69163},"_2-add-steps-to-generate-your-report","2. Add steps to generate your report",[14,69166,69167],{},"Next, you will need to add a combination of steps to automate generating the report in your chosen system.",[14,69169,69170,69171,2004,69175,450,69179,10697],{},"The main steps you will find useful are the ",[29,69172,69173],{},[322,69174,68445],{"href":6378},[29,69176,69177],{},[322,69178,15531],{"href":7600},[29,69180,69181,69184],{},[322,69182,69183],{"href":7554},"‘Get date and time’","’",[592,69186],{"alt":68702,"src":68703},[14,69188,69189],{},"Add the steps you need to replicate your interactions with the browser. For example, if you need to enter a date to set the data range you may require the following steps:",[592,69191],{"alt":69192,"src":69193},"axiom.ai add the steps required to download report","\u002Fblog\u002Fsteps-report.jpg",[639,69195,69197,69198,69203,69204,11139],{"id":69196},"_3-next-add-the-download-file-step-or-the-get-data-from-bots-current-page-step","3. Next add the ",[29,69199,69200],{},[322,69201,69202],{"href":7612},"‘Download file’"," step or the ",[29,69205,69206],{},[322,69207,15650],{"href":6242},[14,69209,69210,69211,69213,69214,69220],{},"If you want to download a report file, add a ",[29,69212,69202],{}," step (alternatively, you can use the ",[29,69215,69216,69217,69184],{},"‘Download to ",[322,69218,69219],{"href":1698},"Google Drive"," step).",[14,69222,69223,69224,1230],{},"If you want to scrape the report data, add a ",[29,69225,69226],{},"‘Get data’",[639,69228,69230,69231],{"id":69229},"how-to-configure-download-file","How to configure ",[29,69232,69233,69184],{},[322,69234,69235],{"href":10670},"‘Download file",[14,69237,69238],{},"First select the file to download, then the folder to download too. You can set your own file name by adding it into the input field.",[592,69240],{"alt":69241,"src":68955},"axiom.ai download file step",[639,69243,69230,69245,11139],{"id":69244},"how-to-configure-get-data-from-bots-current-page-step",[29,69246,15650],{},[14,69248,13969,69249,69251],{},[29,69250,15663],{}," to tell the bot what data to scrape, and select it using our point and click selector tool.",[592,69253],{"alt":69254,"src":69255},"axiom.ai get data off current page step","\u002Fblog\u002Fget-data-current-page.jpg",[14,69257,69258,69259,69262],{},"Set the ",[29,69260,69261],{},"‘Max results’"," setting to the number of rows you would like to scrape.",[639,69264,69266],{"id":69265},"_4-send-email-optional","4. Send email (optional)",[14,69268,69269,69270,69273,69274,69276],{},"If you’d like to email your scraped data to team members, add the ",[29,69271,69272],{},"‘Send email’"," step, then insert email addresses in the address field. Add your subject, then, click ",[29,69275,7235],{}," to include your scraped data in the email body.",[592,69278],{"alt":69254,"src":69279},"\u002Fblog\u002Fsend-an-email.jpg",[639,69281,69283],{"id":69282},"_5-ready-to-test","5. Ready to test",[14,69285,68435],{},[14,69287,69288,69289,44],{},"Now you’re ready to test with the desktop app, by clicking ",[29,69290,68774],{},[639,69292,69294],{"id":69293},"_6-running-the-bot","6. Running the bot",[14,69296,68792,69297],{},[322,69298,68795],{"href":62575},[21,69300,69302],{"id":69301},"issues-you-might-encounter-with-your-reporting-bot","Issues you might encounter with your reporting bot",[555,69304,69305,69308,69311],{},[83,69306,69307],{},"Report taking too long to generate on the webpage? You may need to add a wait step to let the report generate before the scrape or download.",[83,69309,69310],{},"File not downloading? Check that your selected folder has the correct write permissions.",[83,69312,69313],{},"Bot working on the desktop but not the cloud? You may need to add login steps. See here.",[14,69315,67340,69316],{},[322,69317,487],{"href":486},[21,69319,46678],{"id":46677},[14,69321,68488],{},[21,69323,68088],{"id":68087},[14,69325,68493,69326,68830,69328,68500,69330],{},[322,69327,1534],{"href":68496},[322,69329,11534],{"href":11193},[322,69331,68465],{"href":324},{"title":494,"searchDepth":495,"depth":495,"links":69333},[69334,69335,69336,69337,69338,69352,69353,69354],{"id":69096,"depth":498,"text":69097},{"id":69103,"depth":498,"text":69104},{"id":69110,"depth":498,"text":69111},{"id":69117,"depth":498,"text":69118},{"id":69127,"depth":498,"text":69128,"children":69339},[69340,69341,69342,69343,69345,69347,69349,69350,69351],{"id":68603,"depth":495,"text":68604},{"id":69147,"depth":495,"text":69148},{"id":69163,"depth":495,"text":69164},{"id":69196,"depth":495,"text":69344},"3. Next add the ‘Download file’ step or the ‘Get data from bot's current page’ step",{"id":69229,"depth":495,"text":69346},"How to configure ‘Download file’",{"id":69244,"depth":495,"text":69348},"How to configure ‘Get data from bot's current page’ step",{"id":69265,"depth":495,"text":69266},{"id":69282,"depth":495,"text":69283},{"id":69293,"depth":495,"text":69294},{"id":69301,"depth":498,"text":69302},{"id":46677,"depth":498,"text":46678},{"id":68087,"depth":498,"text":68088},{"read":69356,"type":513,"tool":69357,"category":69358,"tags":69360,"featuredimg":69361,"landingimg":69362,"summary":68533},"11 min read",[46728],[69359],"Website monitoring",[68862,10668,1532,23110],"\u002Fblog\u002Fautomate-reporting-long.jpg","\u002Fblog\u002Fautomate-reporting.jpg","\u002Fblog\u002Fhow-to-automate-reporting",{"title":69085,"description":69090},"blog\u002Fhow-to-automate-reporting","Uzwnd4BaM_NDSlWNmWVOBZOzuCXxqszSwy-WP8GPsr0",[69359],[513],[46728],{"id":69371,"title":69372,"author":46205,"body":69373,"date":69635,"description":69636,"draft":26250,"extension":506,"meta":69637,"navigation":522,"path":69646,"seo":69647,"stem":69648,"__hash__":69649,"pinned":-1,"category":69650,"type":69651,"tool":69652},"blog\u002Fblog\u002Fcreate-a-bot-to-automate-tasks.md","How to create a bot to automate tasks for you",{"type":8,"value":69374,"toc":69613},[69375,69378,69381,69388],[14,69376,69377],{},"If you want to automate tasks performed in the browser, you should consider creating a bot. You will be surprised how useful this can be - who wouldn't want an army of AI digital assistants to help handle their workload?",[18,69379],{"alt":69380},"Create bots to automate tasks in the browser",[14,69382,69383,69384,69387],{},"In this guide, we will teach you the basics of creating your own 🤖 bot in just minutes, using ",[322,69385,69386],{"href":61952},"Axiom’s"," no-code bot building tool.",[11197,69389,69390,69392,69395,69397,69399,69401,69404,69406,69410,69412,69415,69418,69421,69423,69426,69428,69430,69432,69434,69447,69452,69454,69456,69458,69460,69462,69471,69475,69477,69479,69483,69486,69489,69492,69496,69498,69501,69504,69506,69510,69515,69519,69522,69526,69529,69532,69536,69541,69545,69547,69550,69552,69555,69557,69562,69564,69566,69570,69572,69579,69581,69583,69589,69595,69598,69604,69606],{},[21,69391,64243],{"id":64242},[14,69393,69394],{},"Well, bots can take some of those repetitive, manual browser tasks off your hands, freeing up valuable time for other, more enjoyable things. Besides, watching the bots do your work is pretty amazing! What’s more, you’ll acquire useful 👩‍🎓 automation skills.",[21,69396,64250],{"id":64249},[14,69398,64253],{},[21,69400,64257],{"id":64256},[14,69402,69403],{},"Simply put, bots mimic human behavior in Chrome. They click buttons and enter data into forms, except they don't get bored, fed up, or frustrated.",[21,69405,64264],{"id":64263},[14,69407,64267,69408,64271],{},[322,69409,3435],{"href":61952},[21,69411,64275],{"id":64274},[14,69413,69414],{},"Learning how to automate your browser is becoming an increasingly valuable skill . As more and more work moves to the browser, being able to automate it will be an invaluable addition to anyone's CV.",[14,69416,69417],{},"Learning to automate, instead of being automated, will empower you for the future. Of course it involves a learning curve: you'll have to get to grips with some of the key concepts of automation, from structuring it, to setting up loops and thinking like a programmer.",[14,69419,69420],{},"👨🏾‍🎓 Once you master it, you won’t look back.",[21,69422,64285],{"id":64284},[14,69424,69425],{},"It's always useful to plan before you get started. 💡 A plan helps reduce frustration and speeds up the process.",[14,69427,64291],{},[14,69429,64294],{},[14,69431,64297],{},[21,69433,64301],{"id":64300},[14,69435,69436,69437,69439,69440,2004,69442,16767,69444,69446],{},"We offer a variety of  ",[322,69438,325],{"href":324},". to assist you with ",[322,69441,519],{"href":15104},[322,69443,1055],{"href":7052},[322,69445,11532],{"href":11193}," management on platforms like Instagram. You can find all of our templates on our website. However, we believe it's important to teach you how to start from scratch.",[14,69448,64307,69449,44],{},[322,69450,3435],{"href":13910,"rel":69451},[2245],[14,69453,64313],{},[592,69455],{"alt":65484,"src":65485},[14,69457,64316],{},[21,69459,64320],{"id":64319},[14,69461,64323],{},[555,69463,69464,69466,69468],{},[83,69465,64328],{},[83,69467,64331],{},[83,69469,69470],{},"If you want to enter data into a form, start with the ‘Interact’ step or, in the new version of Axiom, the ‘Go to’ page",[592,69472],{"alt":69473,"src":69474},"axiom.ai selecting step to build your bot","\u002Fblog\u002Faxiom-step-finder.png",[21,69476,64342],{"id":64341},[14,69478,64345],{},[592,69480],{"alt":69481,"src":69482},"axiom.ai combine steps to make your bot","\u002Fblog\u002Faxiom-combine-steps.jpg",[14,69484,69485],{},"By replicating each step of your task, you can create a sequence of actions for your bot to execute.",[14,69487,69488],{},"Have a browse through the  different steps in our step finder.",[14,69490,69491],{},"Here's a neat trick on how to add multiple steps of the same type. By adding '*8' after the step name I can add 8 steps instead of one.",[592,69493],{"alt":69494,"src":69495},"axiom.ai adding multiple steps","\u002Fblog\u002Faxiom-multi-step.jpg",[21,69497,64359],{"id":64358},[14,69499,69500],{},"If you're not sure where to begin 🤷‍♀️, try using one of these beginner bot design patterns, and replicate it with the step finder to create a basic bot. 💪🏽",[639,69502,69503],{"id":64362},"A simple web scraper bot 🤖",[14,69505,64366],{},[592,69507],{"alt":69508,"src":69509},"axiom.ai design pattern for scraping bot","\u002Fblog\u002Fscraper-design-pattern.jpg",[14,69511,69512],{},[322,69513,69514],{"href":15104},"Try this web scraping template",[639,69516,69518],{"id":69517},"web-actions-bot","Web actions bot 🤖",[14,69520,69521],{},"Here we show a simple bot automating some web actions.",[592,69523],{"alt":69524,"src":69525},"axiom.ai design pattern for website actions","\u002Fblog\u002Fweb-actions-design-pattern.jpg",[639,69527,69528],{"id":64384},"Data entry bot 🤖",[14,69530,69531],{},"Here we read data from a sheet a sheet and enter it into a form.",[592,69533],{"alt":69534,"src":69535},"axiom.ai design pattern for data entry bot","\u002Fblog\u002Faxiom-data-entry-design-pattern.jpg",[14,69537,69538],{},[322,69539,69540],{"href":7052},"Try this data entry template",[21,69542,69544],{"id":69543},"how-to-loop-your-bots-️","How to loop your bots ♻️",[592,69546],{"alt":65823,"src":65824},[14,69548,69549],{},"There are loop steps and jump steps. These can be added from the start, or later. The loop step will loop through data from a source like a Google Sheet; the jump step loops for the number of times you set it to. Make sure to add the steps you want to repeat inside the loop.",[21,69551,64407],{"id":64406},[14,69553,69554],{},"Steps that read or output some form of data like the ‘Get data’ step, make their data available to other steps in the form of tokens. See this example of a Google Sheet token passing a URL into a go to page step.",[592,69556],{"alt":67239,"src":65852},[14,69558,69559],{},[322,69560,69561],{"href":2670},"Read more about passing data here",[21,69563,64418],{"id":64417},[14,69565,64421],{},[592,69567],{"alt":69568,"src":69569},"axiom.ai moving steps","\u002Fblog\u002Faxiom-move.jpg",[21,69571,64429],{"id":64428},[14,69573,69574,69575,69578],{},"We highly recommend testing your build by running your bot on the desktop app. ",[29,69576,69577],{},"Failed or stopped runs"," won't count towards the runtime limit, so you can test as much as you want.",[14,69580,64435],{},[21,69582,64439],{"id":64438},[14,69584,69585,69586,44],{},"Once you’re ready to run the bot 🥳, you can run it on your desktop, in the cloud or on a VPS. If you’re on a paid tier, you can also ",[322,69587,69588],{"href":67312},"schedule your bots.",[14,69590,69591,69592],{},"Please note that if you build a bot on the desktop app when logged in, your session will be shared. However if you run the bot in the cloud, the session will not be shared. Learn how to work around ",[322,69593,69594],{"href":993},"this here.",[14,69596,69597],{},"The screenshots in this guide are from Axiom v4. If you're using v3, your experience may differ but the methods remain true. However, the interact step is being phased out in favor of the loop step.",[14,69599,69600,69601],{},"Would you like to test the latest version before it is officially released? ",[322,69602,69603],{"href":486},"Contact support.",[21,69605,64449],{"id":64448},[14,69607,69608,69609,69612],{},"If you get stuck or need help with building more complex bots 💁🏻\n, please don't hesitate to contact us\n",[322,69610,69611],{"href":486},"via this link",". Be sure to share with us your Axiom bot and as much supporting information as possible.",{"title":494,"searchDepth":495,"depth":495,"links":69614},[69615,69616,69617,69618,69619,69620,69621,69622,69623,69624,69629,69630,69631,69632,69633,69634],{"id":64242,"depth":498,"text":64243},{"id":64249,"depth":498,"text":64250},{"id":64256,"depth":498,"text":64257},{"id":64263,"depth":498,"text":64264},{"id":64274,"depth":498,"text":64275},{"id":64284,"depth":498,"text":64285},{"id":64300,"depth":498,"text":64301},{"id":64319,"depth":498,"text":64320},{"id":64341,"depth":498,"text":64342},{"id":64358,"depth":498,"text":64359,"children":69625},[69626,69627,69628],{"id":64362,"depth":495,"text":69503},{"id":69517,"depth":495,"text":69518},{"id":64384,"depth":495,"text":69528},{"id":69543,"depth":498,"text":69544},{"id":64406,"depth":498,"text":64407},{"id":64417,"depth":498,"text":64418},{"id":64428,"depth":498,"text":64429},{"id":64438,"depth":498,"text":64439},{"id":64448,"depth":498,"text":64449},"2023-10-25","Learn how to automation the browser",{"read":68527,"type":513,"tool":69638,"category":69639,"tags":69640,"location":46733,"featuredimg":69643,"landingimg":69644,"summary":69645},[46728],[50552],[68862,69641,69642],"automate","task","\u002Fblog\u002Fmake-a-bot-hero.jpg","\u002Fblog\u002Fmake-a-bot-landing.jpg","Learn how to automate the browser","\u002Fblog\u002Fcreate-a-bot-to-automate-tasks",{"title":69372,"description":69636},"blog\u002Fcreate-a-bot-to-automate-tasks","SVH1PQCUcNGzSdbOW1FpO6Hrz0wRm0HHte4fsAd1cJg",[50552],[513],[46728],{"id":69654,"title":69655,"author":46205,"body":69656,"date":70044,"description":70045,"draft":26250,"extension":506,"meta":70046,"navigation":522,"path":491,"seo":70056,"stem":70057,"__hash__":70058,"pinned":-1,"category":70059,"type":70060,"tool":70061},"blog\u002Fblog\u002Fchatgpt-web-scraping.md","ChatGPT web scraping (with a bot)",{"type":8,"value":69657,"toc":70018},[69658,69661,69666,69670,69672,69675,69679,69682,69686,69689,69693,69696,69700,69703,69707,69715,69719,69727,69730,69734,69740,69742,69758,69760,69762,69766,69768,69770,69772,69777,69781,69785,69790,69794,69796,69798,69802,69806,69810,69822,69824,69828,69831,69851,69855,69860,69864,69867,69871,69874,69881,69885,69888,69890,69899,69906,69911,69918,69922,69924,69927,69930,69945,69948,69950,69955,69958,69962,69967,69971,69974,69978,69982,69999,70003,70005,70008,70012],[14,69659,69660],{},"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.",[14,69662,69663,69664],{},"If you want to dive straight in, why not start with the ",[322,69665,19712],{"href":6142},[21,69667,69669],{"id":69668},"why-would-you-want-to-scrape-websites-with-a-chatgpt-bot","Why would you want to scrape websites with a ChatGPT bot?",[18,69671],{},[14,69673,69674],{},"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.",[21,69676,69678],{"id":69677},"what-scraping-use-case-would-you-recommend-using-a-chatgpt-bot-for","What scraping use case would you recommend using a ChatGPT bot for?",[14,69680,69681],{},"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.",[21,69683,69685],{"id":69684},"what-exactly-is-a-chatgpt-bot-web-scraper","What exactly is a ChatGPT bot web scraper?",[14,69687,69688],{},"🧠 ➕ 🤖 A ChatGPT web scraper bot combines browser automation technology and AI ChatGPT tech. It's like a robot, but for the browser.",[21,69690,69692],{"id":69691},"how-do-you-make-a-chatgpt-scraper","How do you make a ChatGPT scraper?",[14,69694,69695],{},"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.",[21,69697,69699],{"id":69698},"how-does-a-chatgpt-scraper-work","How does a ChatGPT scraper work?",[14,69701,69702],{},"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!",[21,69704,69706],{"id":69705},"do-i-need-my-own-chat-gpt-api-key","Do I need my own Chat GPT API key?",[14,69708,69709,69710],{},"You probably already have one, but they are simple to get hold of if you don't. Just follow 🔐 OpenAI's ",[322,69711,69714],{"href":69712,"rel":69713},"https:\u002F\u002Fhelp.openai.com\u002Fen\u002Farticles\u002F4936850-where-do-i-find-my-secret-api-key",[2245],"instructions.",[21,69716,69718],{"id":69717},"is-it-legal-to-scrape-websites","Is it legal to scrape websites?",[14,69720,69721,69722],{},"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 ",[322,69723,69726],{"href":69724,"rel":69725},"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",[2245],"publicly available online.",[14,69728,69729],{},"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.",[21,69731,69733],{"id":69732},"lets-learn-how-to-build-a-chatgpt-scraper-bot-with-axiomai","Let’s learn how to build a ChatGPT scraper bot with axiom.ai",[14,69735,69736,69737,69739],{},"If you want to short cut the process why not try the ",[322,69738,514],{"href":6142}," or read on to learn more!",[639,69741,67457],{"id":67456},[14,69743,69744,69745,68204,69747,69750,69751,69754,69755,44],{},"🏁 Create a new Google Sheet. You can do this in your Chrome browser by entering ",[29,69746,68203],{},[29,69748,69749],{},"'Websites to scrape’",". Add two tabs; one named ",[29,69752,69753],{},"‘URLs’"," and another named ",[29,69756,69757],{},"‘Data’",[639,69759,67865],{"id":67864},[592,69761],{"alt":65484,"src":65485},[14,69763,68215,69764,68219],{},[29,69765,68218],{},[639,69767,67875],{"id":67874},[14,69769,67473],{},[592,69771],{"alt":65816,"src":65817},[14,69773,68234,69774,69776],{},[29,69775,68237],{},", you can search for the Google Sheet you created by name. Once found, click on it to select.",[14,69778,62612,69779,68422],{},[29,69780,68421],{},[14,69782,8233,69783,68248],{},[29,69784,68247],{},[14,69786,8233,69787,69789],{},[29,69788,68253],{}," 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.",[14,69791,67894,69792,44],{},[322,69793,67898],{"href":67897},[639,69795,67515],{"id":67514},[592,69797],{"alt":65823,"src":65824},[14,69799,65827,69800,65831],{},[29,69801,65830],{},[592,69803],{"alt":69804,"src":69805},"axiom.ai configure loop step","\u002Fblog\u002Faxiom-step-loop.jpg",[639,69807,69809],{"id":69808},"_5-add-the-go-to-url-step-inside-the-loop","5. Add the ‘Go to url’ step inside the loop",[14,69811,62895,69812,69814,69815,69818,69819,69821],{},[29,69813,15508],{}," step, in the ",[29,69816,69817],{},"'URL’"," field, select ",[29,69820,7235],{}," and select the data from your Google Sheet, so that the bot knows which data to loop through.",[592,69823],{"alt":67239,"src":65852},[639,69825,69827],{"id":69826},"_6-add-the-get-data-from-bots-current-page-step","6. Add the ‘Get data from bot's current page’ step",[592,69829],{"alt":65864,"src":69830},"\u002Fblog\u002Faxiom-get-data-current-page.jpg",[14,69832,69833,69834,69837,69838,69840,69841,69843,69844,69847,69848,44],{},"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 ",[29,69835,69836],{},"‘body’",". Select it by clicking ",[29,69839,15663],{}," and in column A, selecting ‘Custom selector’ and typing in the word ",[29,69842,69836],{},". Then click on ",[29,69845,69846],{},"‘Confirm selector’"," and then ",[29,69849,69850],{},"‘Complete’",[592,69852],{"alt":69853,"src":69854},"axiom.ai adding a custom selector","\u002Fblog\u002Fcustom-selector-choice-body.jpg",[14,69856,69258,69857,69859],{},[29,69858,69261],{}," setting to ‘1’.",[639,69861,69863],{"id":69862},"_7-add-the-extract-data-with-chatgpt-step","7. Add the ‘Extract data with ChatGPT’ step",[14,69865,69866],{},"You will need to enter your API key for this step to work, so make sure you have it to hand.",[592,69868],{"alt":69869,"src":69870},"axiom.ai adding the ChatGPT step","\u002Fblog\u002Faxiom-chatgpt-data-extract.jpg",[14,69872,69873],{},"Then, in the Data field, set it to ‘Scrape data’.",[14,69875,69876,69877,69880],{},"Next, in the ",[29,69878,69879],{},"‘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.",[639,69882,69884],{"id":69883},"_8-write-data-to-a-google-sheet","8. Write data to a Google Sheet",[14,69886,69887],{},"Now we’re going to write the data that ChatGPT AI extracted, to a Google Sheet.",[592,69889],{"alt":67266,"src":67267},[14,69891,13969,69892,69895,69896,69898],{},[29,69893,69894],{},"'Add a new step'",". In the ",[29,69897,68237],{}," field, search for the sheet you created at the beginning of this tutorial.",[14,69900,8233,69901,69818,69903,44],{},[29,69902,68421],{},[29,69904,69905],{},"'Data'",[14,69907,68036,69908,16247],{},[727,69909,69910],{},"chat-gpt",[14,69912,69913,69914,69917],{},"Finally, in the ‘Write options’ field, click the ",[29,69915,69916],{},"‘Add to existing Data’"," option.",[639,69919,69921],{"id":69920},"_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",[592,69923],{"alt":67654,"src":67655},[14,69925,69926],{},"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’.",[14,69928,69929],{},"In 'Spreadsheet URL' click to add the spreadsheet.",[14,69931,69932,69933,69936,69937,69940,69941,69944],{},"Then, in  ",[29,69934,69935],{},"‘First row to delete'"," enter the number 1 and repeat this in ",[29,69938,69939],{},"'Last row to delete'",", so that both are set to ",[29,69942,69943],{},"'1'",". We only want to delete one row per loop.",[14,69946,69947],{},"Set the ‘Sheet name’ to the original spreadsheet set up.",[639,69949,68045],{"id":68044},[14,69951,69952,69953,44],{},"👩‍🔬 Now you’re ready to test with the desktop app, by clicking ",[29,69954,68774],{},[14,69956,69957],{},"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.",[639,69959,69961],{"id":69960},"_11-running-the-bot","11. Running the bot",[14,69963,69964,69965,44],{},"🚀🚀🚀🚀🚀 You can run this bot in the cloud and the desktop app. If you want to learn more about scheduling, ",[322,69966,67313],{"href":62487},[21,69968,69970],{"id":69969},"design-pattern-for-your-bot","Design pattern for your bot",[14,69972,69973],{},"Your assembled ChatGPT bot should resemble this image.",[592,69975],{"alt":69976,"src":69977},"axiom.ai design pattern for a ChatGPT web scraper","\u002Fblog\u002Faxiom-chat-gpt-scraper-d-pattern.jpg",[21,69979,69981],{"id":69980},"issues-you-may-encounter-with-your-chatgpt-web-scraper","Issues you may encounter with your ChatGPT web scraper",[555,69983,69984,69993,69996],{},[83,69985,69986,69987,69989,69990,57625],{},"The bot only scrapes 10 rows, In the ",[29,69988,12820],{}," change the ",[29,69991,69992],{},"'last cell'",[83,69994,69995],{},"ChatGPT returns no data, try adjusting your extract values",[83,69997,69998],{},"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",[14,70000,67340,70001],{},[322,70002,487],{"href":486},[21,70004,46678],{"id":46677},[14,70006,70007],{},"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. 🦸",[21,70009,70011],{"id":70010},"what-else-can-i-automate-with-chatgpt-and-axiom","What else can I automate with ChatGPT and Axiom?",[14,70013,70014,70015],{},"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 ",[322,70016,70017],{"href":324},"templates.",{"title":494,"searchDepth":495,"depth":495,"links":70019},[70020,70021,70022,70023,70024,70025,70026,70027,70040,70041,70042,70043],{"id":69668,"depth":498,"text":69669},{"id":69677,"depth":498,"text":69678},{"id":69684,"depth":498,"text":69685},{"id":69691,"depth":498,"text":69692},{"id":69698,"depth":498,"text":69699},{"id":69705,"depth":498,"text":69706},{"id":69717,"depth":498,"text":69718},{"id":69732,"depth":498,"text":69733,"children":70028},[70029,70030,70031,70032,70033,70034,70035,70036,70037,70038,70039],{"id":67456,"depth":495,"text":67457},{"id":67864,"depth":495,"text":67865},{"id":67874,"depth":495,"text":67875},{"id":67514,"depth":495,"text":67515},{"id":69808,"depth":495,"text":69809},{"id":69826,"depth":495,"text":69827},{"id":69862,"depth":495,"text":69863},{"id":69883,"depth":495,"text":69884},{"id":69920,"depth":495,"text":69921},{"id":68044,"depth":495,"text":68045},{"id":69960,"depth":495,"text":69961},{"id":69969,"depth":498,"text":69970},{"id":69980,"depth":498,"text":69981},{"id":46677,"depth":498,"text":46678},{"id":70010,"depth":498,"text":70011},"2023-10-24","Learn how to create a bot that utilizes AI to scrape websites.",{"read":68858,"type":513,"tool":70047,"category":70048,"tags":70049,"location":46733,"featuredimg":70053,"landingimg":70054,"video":70055,"summary":70045},[46728],[48207],[518,70050,57469,70051,70052],"chatGPT","structured data","unstructured data","\u002Fblog\u002Fchatcpt-scraper-hero.jpg","\u002Fblog\u002Fchatcpt-scraper.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F8Llq6EYiSuo?rel=0",{"title":69655,"description":70045},"blog\u002Fchatgpt-web-scraping","y8p426fL2QwXRVsiyat7fPFWSARTndnHwdz5M9PRkao",[48207],[513],[46728],{"id":70063,"title":70064,"author":46205,"body":70065,"date":70044,"description":70069,"draft":26250,"extension":506,"meta":70394,"navigation":522,"path":68496,"seo":70401,"stem":70402,"__hash__":70403,"pinned":-1,"category":70404,"type":70405,"tool":70406},"blog\u002Fblog\u002Fhow-to-scrape-emails.md","How to scrape emails from a website (with chatGpt)",{"type":8,"value":70066,"toc":70368},[70067,70070,70073,70076,70081,70085,70088,70092,70095,70099,70102,70106,70109,70113,70116,70120,70123,70125,70129,70136,70140,70147,70149,70154,70156,70160,70162,70164,70166,70170,70174,70178,70184,70188,70193,70198,70201,70203,70211,70213,70215,70217,70229,70233,70235,70237,70239,70241,70245,70247,70249,70251,70260,70266,70274,70276,70278,70287,70289,70295,70298,70304,70306,70311,70313,70315,70319,70321,70323,70325,70329,70341,70345,70347,70350,70354,70361],[14,70068,70069],{},"✉️ Scraping emails from websites can be challenging since they may not be present or in consistent locations on webpages. 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 AI to scrape emails from websites.",[18,70071],{"alt":70072},"How to scrape emails with ai",[14,70074,70075],{},"This guide is for the new version of Axiom v4 🧨, which is coming soon. Email support if you’d like to try it. This guide applies to both versions of Axiom. If using the Axiom v3 use the interact step instead of the loop.",[14,70077,70078,70079],{},"Looking for a ChatGPT web scraper try this ",[322,70080,19712],{"href":6142},[21,70082,70084],{"id":70083},"why-would-you-want-to-scrape-emails-from-websites","Why would you want to scrape emails from websites?",[14,70086,70087],{},"To install this Gmail template click 'Install template'. If you are a new user click 'Install Chrome extension' you will be need to create a Free axiom.ai account before you can edit the template.",[21,70089,70091],{"id":70090},"why-use-chatgpt","Why use ChatGPT?",[14,70093,70094],{},"No one webpage is the same, and this is especially true if you want to scrape thousands of websites for emails. Traditional scraper tools rely on CSS Selectors to locate specific content and so to scrape at scale, you’d need to set thousands of individual selectors or use complicated code. That's where AI comes in handy, capable of finding content regardless of structure. AI’s can go to any webpage and search for data such as email, dates, and URLs - you simply need to tell it what to look for.",[21,70096,70098],{"id":70097},"what-exactly-is-a-chatgpt-bot","What exactly is a ChatGPT bot?",[14,70100,70101],{},"A ChatGPT web scraper bot 🧠 ➕ 🤖 combines browser automation technology and AI ChatGPT tech. It's like a robot, but for the browser",[21,70103,70105],{"id":70104},"how-does-the-email-scraper-bot-work","How does the email scraper bot work?",[14,70107,70108],{},"The bot does the hard graft 🤖 🦾 - it's a digital version of you. This digital assistant works through a list of URLs from a Google Sheet, visits each page, and extracts the data you need using its AI capabilities. The bot then writes the scraped data (in this case email addresses) to another Google Sheet, leaving you with plenty of free time to sit back and enjoy a cup of coffee!",[21,70110,70112],{"id":70111},"do-i-need-my-own-chatgpt-api-key","Do I need my own ChatGPT API Key?",[14,70114,70115],{},"You probably already have one, but they are simple to get hold of if you don't. Just follow OpenAI's instructions.",[21,70117,70119],{"id":70118},"is-it-legal-to-scrape-thousands-of-websites-for-emails","Is it legal to scrape thousands of websites for emails?",[14,70121,70122],{},"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 publicly available online.",[14,70124,69729],{},[21,70126,70128],{"id":70127},"how-do-you-make-an-email-scraper-bot","How do you make an email scraper bot?",[14,70130,70131,70132,70135],{},"With axiom.ai's no-code bot builder, you can create bots for web scraping without having to code. Use a simple point and click interface to create as many bots as you want! If you follow the steps below, you'll have a working bot using ChatGPT to extract ",[322,70133,70134],{"href":1515},"emails"," in no time.",[21,70137,70139],{"id":70138},"lets-learn-how-to-build-a-bot-to-scrape-emails","Let’s learn how to build a bot to scrape emails",[14,70141,70142,70143],{},"We also have a template you can ",[322,70144,70146],{"href":70145},"\u002Fguides\u002Fchatgpt-web-scraper.html","try.",[639,70148,67457],{"id":67456},[14,70150,68200,70151,70153],{},[29,70152,68203],{}," into the address bar. Don’t forget to name your sheet something like 'Websites to scrape’. Add two tabs; one named ‘URLs’ and another named ‘Data’.",[639,70155,67865],{"id":67864},[14,70157,68215,70158,68219],{},[29,70159,68218],{},[639,70161,67875],{"id":67874},[592,70163],{"alt":67469,"src":67470},[14,70165,67473],{},[14,70167,68234,70168,69776],{},[29,70169,68237],{},[14,70171,62612,70172,68422],{},[29,70173,68421],{},[14,70175,8233,70176,68248],{},[29,70177,68247],{},[14,70179,8233,70180,68642,70182,68646],{},[29,70181,68253],{},[29,70183,68645],{},[14,70185,67894,70186,44],{},[322,70187,67898],{"href":67897},[639,70189,70190,70191,11139],{"id":67514},"4. Add the ",[29,70192,65830],{},[14,70194,65827,70195,70197],{},[29,70196,65830],{}," 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.",[592,70199],{"alt":70200,"src":67216},"axiom.ai adding a  loop step",[639,70202,69809],{"id":69808},[14,70204,62895,70205,69814,70207,69818,70209,69821],{},[29,70206,15508],{},[29,70208,69817],{},[29,70210,7235],{},[592,70212],{"alt":67239,"src":65852},[639,70214,69827],{"id":69826},[592,70216],{"alt":65864,"src":69830},[14,70218,69833,70219,69837,70221,69840,70223,69843,70225,69847,70227,44],{},[29,70220,69836],{},[29,70222,15663],{},[29,70224,69836],{},[29,70226,69846],{},[29,70228,69850],{},[14,70230,69258,70231,69859],{},[29,70232,69261],{},[639,70234,69863],{"id":69862},[14,70236,69866],{},[592,70238],{"alt":69869,"src":69870},[14,70240,69873],{},[14,70242,69876,70243,69880],{},[29,70244,69879],{},[639,70246,69884],{"id":69883},[14,70248,69887],{},[592,70250],{"alt":67266,"src":67267},[14,70252,13969,70253,70255,70256,69895,70258,69898],{},[29,70254,46614],{}," in the loop and search for ",[29,70257,15711],{},[29,70259,68237],{},[14,70261,8233,70262,69818,70264,44],{},[29,70263,68421],{},[29,70265,69905],{},[14,70267,8233,70268,69818,70270,44],{},[29,70269,69905],{},[29,70271,65924,70272,65924],{},[727,70273,69910],{},[14,70275,67285],{},[639,70277,69921],{"id":69920},[14,70279,70280,70281,70283,70284,44],{},"Add the step ",[29,70282,15755],{}," 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 ",[29,70285,70286],{},"‘Delete rows from a Google Sheet’",[592,70288],{"alt":67654,"src":67655},[14,70290,70291,70292,70294],{},"In ",[29,70293,68237],{}," click to add the spreadsheet.",[14,70296,70297],{},"Then, in 'First row to delete' enter the number 1 and repeat this in 'Last row to delete', so that both are set to 1. We only want to delete one row per loop.",[14,70299,69258,70300,70303],{},[29,70301,70302],{},"‘Sheet name’"," to the original spreadsheet set up.",[639,70305,68045],{"id":68044},[14,70307,69288,70308,44],{},[29,70309,70310],{},"‘Run w\u002Fdekstop app’",[14,70312,69957],{},[639,70314,69961],{"id":69960},[14,70316,68792,70317,44],{},[322,70318,67313],{"href":62575},[21,70320,69970],{"id":69969},[14,70322,69973],{},[592,70324],{"alt":69976,"src":69977},[21,70326,70328],{"id":70327},"issues-you-may-encounter-with-your-email-scraper","Issues you may encounter with your email scraper",[555,70330,70331,70337,70339],{},[83,70332,69986,70333,69989,70335,57625],{},[29,70334,12820],{},[29,70336,69992],{},[83,70338,69995],{},[83,70340,69998],{},[14,70342,67340,70343],{},[322,70344,487],{"href":486},[21,70346,46678],{"id":46677},[14,70348,70349],{},"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. 🦸",[21,70351,70353],{"id":70352},"what-else-can-i-automate-with-chatgpt-and-axiomai","What else can I automate with ChatGPT and axiom.ai?",[14,70355,70356,70357,70360],{},"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. If you are looking to do an ",[322,70358,70359],{"href":1515},"email blast on Gmail"," we have a gudie for that.",[14,70362,70363,70364],{},"If you want to read more about ",[322,70365,70367],{"href":70366},"\u002Fblog\u002Fchatgpt-bot-ai-automation","browser automation and AI read this post.",{"title":494,"searchDepth":495,"depth":495,"links":70369},[70370,70371,70372,70373,70374,70375,70376,70377,70390,70391,70392,70393],{"id":70083,"depth":498,"text":70084},{"id":70090,"depth":498,"text":70091},{"id":70097,"depth":498,"text":70098},{"id":70104,"depth":498,"text":70105},{"id":70111,"depth":498,"text":70112},{"id":70118,"depth":498,"text":70119},{"id":70127,"depth":498,"text":70128},{"id":70138,"depth":498,"text":70139,"children":70378},[70379,70380,70381,70382,70383,70384,70385,70386,70387,70388,70389],{"id":67456,"depth":495,"text":67457},{"id":67864,"depth":495,"text":67865},{"id":67874,"depth":495,"text":67875},{"id":67514,"depth":495,"text":67515},{"id":69808,"depth":495,"text":69809},{"id":69826,"depth":495,"text":69827},{"id":69862,"depth":495,"text":69863},{"id":69883,"depth":495,"text":69884},{"id":69920,"depth":495,"text":69921},{"id":68044,"depth":495,"text":68045},{"id":69960,"depth":495,"text":69961},{"id":69969,"depth":498,"text":69970},{"id":70327,"depth":498,"text":70328},{"id":46677,"depth":498,"text":46678},{"id":70352,"depth":498,"text":70353},{"read":68858,"type":513,"tool":70395,"category":70396,"tags":70397,"location":46733,"featuredimg":70398,"landingimg":70399,"summary":70400},[46728],[48207],[1532,67770,70050],"\u002Fblog\u002Femail-scraper-hero.jpg","\u002Fblog\u002Femail-scraper-box.jpg","We'll show you how to create a bot that utilizes AI to scrape emails.",{"title":70064,"description":70069},"blog\u002Fhow-to-scrape-emails","-Q5EIJKLU3bE_CtNGzbPv1ulCxBlICYgtWgovYW_IS4",[48207],[513],[46728],{"id":70408,"title":70409,"author":70410,"body":70411,"date":70683,"description":70684,"draft":26250,"extension":506,"meta":70685,"navigation":522,"path":70366,"seo":70692,"stem":70693,"__hash__":70694,"pinned":-1,"category":70695,"type":70696,"tool":70697},"blog\u002Fblog\u002Fchatgpt-bot-ai-automation.md","AI Automation - building bots with ChatGPT","Simon Williams",{"type":8,"value":70412,"toc":70668},[70413,70417,70420,70423,70426,70429,70432,70435,70439,70443,70447,70450,70453,70456,70459,70463,70466,70469,70472,70476,70479,70482,70486,70489,70493,70496,70499,70502,70506,70509,70512,70516,70519,70522,70525,70528,70531,70534,70537,70540,70543,70547,70551,70554,70560,70564,70567,70570,70574,70577,70580,70583,70587,70590,70593,70596,70599,70602,70609,70612,70616,70619,70622,70625,70628,70631,70634,70637,70640,70643,70645,70648,70662],[21,70414,70416],{"id":70415},"what-is-chatgpt","What is ChatGPT?",[14,70418,70419],{},"For those who have been away on Mars for the the past few months, ChatGPT is an \"LLM\" (Large Language Model) which is capable of a wide array of natural language processing tasks.",[18,70421],{"alt":70422},"How to use ChatGPT in your browser automations",[14,70424,70425],{},"Essentially, it is a large probabilistic model, trained on all the data on the internet. It works by predicting the next word in a sentence, based on the previous words it has seen.",[14,70427,70428],{},"You can think of this a little like a fancy autocomplete - but ChatGPT goes well beyond anything we've seen before.",[14,70430,70431],{},"ChatGPT's understanding of context can be downright spooky at times; you can give it instructions and it appears to understand and be able to follow them. It is even capable even of writing correct code (as long as the task you give it is well defined enough).",[14,70433,70434],{},"The ability for ChatGPT to \"understand\" your input and perform tasks based on a natural language specification is what makes it such an impressive piece of technology.",[14,70436,69663,70437],{},[322,70438,19712],{"href":6142},[21,70440,70442],{"id":70441},"what-can-chatgpt-do-to-automate-tasks","What can ChatGPT do to automate tasks?",[639,70444,70446],{"id":70445},"generating-text","Generating text",[14,70448,70449],{},"At the moment, ChatGPT works by taking a text input and by outputting text in response. If you have a task that relies on text generation, then ChatGPT is able to perform these straight away - things like generating marketing materials from prompts, filling out email text, or automatically translating from one language to another.",[14,70451,70452],{},"It's worth noting that some of these use-cases are frowned upon. Even without the advent of powerful generative text tools, we all have to deal with the headache of spam. Adding more spam to this already towering pile may save you some time, but won't necessarily make the world a better place!",[14,70454,70455],{},"If you want your marketing to make an impact, you'll generally want to spend time and effort crafting your messages to cut through the noise and resonate with your customers.",[14,70457,70458],{},"Where ChatGPT can helpful is in assisting you to flesh out your ideas into full prose. ChatGPT writes quite competently, so if you're not a professional writer this can be pretty handy! However, it's difficult to automate completely.",[639,70460,70462],{"id":70461},"structuring-data","Structuring data",[14,70464,70465],{},"One of ChatGPT's most powerful features is its ability to take a piece of text and to reformat it into a different structure.",[14,70467,70468],{},"For example, you can give ChatGPT a prompt containing some unstructured text and ask it to extract certain data in the structure you specify. ChatGPT is sophisticated enough to be able to understand and follow these instructions.",[14,70470,70471],{},"The result? A task that's extremely hard using standard web scraping techniques - the extraction of unstructured data - becomes a relatively simple matter.",[592,70473],{"src":70474,"alt":70475},"\u002Fblog\u002Fchatgpt-data-structure.png","Using ChatGPT to extract structure unstructured data",[14,70477,70478],{},"A downside of this is that writing the prompt can be a little painstaking. Luckily, the prompt design can be generalised to the point that the prompt structure can be implemented automatically into a tool like axiom.ai.",[14,70480,70481],{},"This is a screenshot from our upcoming release that shows some beta ChatGPT integration, using it as an AI data extractor (there'll be a lot more to come):",[592,70483],{"src":70484,"alt":70485},"\u002Fblog\u002Fchat-gpt-integration.png","Upcoming axiom.ai integration of ChatGPT for extracting unstructured data",[14,70487,70488],{},"This basic ability seems like it can be expanded in quite a number of ways. ChatGPT is capable of answering mathematics questions, performing data analysis functions, and more. Applying this to unstructured data seems to create a lot of potential for powerful automation capabilities. Think of how the Star Trek computer works and you'll have an idea of why this could be exciting.",[639,70490,70492],{"id":70491},"automatically-building-automations","Automatically building automations",[14,70494,70495],{},"This may be the most obviously interesting case for AI automation, although at this stage there are some limitations to how far you can go.",[14,70497,70498],{},"Essentially, this works the same way as the previous data structuring example. You provide a set of steps to ChatGPT in natural language, and it generates an output in code that will run the automation for you.",[14,70500,70501],{},"ChatGPT is more than happy to output JSON if you ask for it, and it doesn't take much to get it to understand what you want:",[592,70503],{"src":70504,"alt":70505},"\u002Fblog\u002Fchatgpt-generate-automation.png","Example of ChatGPT generating automation steps in structured JSON",[14,70507,70508],{},"As this is a structured output, it then becomes possible to automatically translate these steps into any other similar DSL - including axiom.ai's. What's not to like? Extending this technology really is the Holy Grail for automation. Simply tell the computer what you want, in plain English, and it'll do it for you, no complex configuration or technical knowledge required!",[14,70510,70511],{},"Eagle-eyed readers may note some oddities in the above example - we'll explore the problems with this methodology below. Although exciting, there are still some significant issues to overcome. But who knows how rapidly this capability will advance? We're certainly keeping an eye on it, and will be implementing these techniques into axiom.ai in the near future.",[639,70513,70515],{"id":70514},"questions-and-answers","Questions and answers",[14,70517,70518],{},"ChatGPT was fundamentally designed as a back-and-forth process which automatically stores all your previous questions and incorporates them into ChatGPT's next responses. This gives it an awareness of context which works amazingly with its natural language processing abilities.",[14,70520,70521],{},"As a result, ChatGPT is the best chatbot software ever, and you are certainly going to see this aspect of the technology proliferate widely.",[14,70523,70524],{},"The context-learning features of ChatGPT (Open AI call it \"few-shot learning\") mean anyone can update its knowledge with new information and prime it to answer in a particular way. That can go as far as you like - you can even do things like paste entire pieces of documentation into the bot and have it pick out answers for you!",[14,70526,70527],{},"This means that with some creativity, it's absolutely possible to use ChatGPT right now to search through large volumes of documentation and the general web, to help you understand what you need to do to build a bot. This is a newly developing field which is called \"prompt engineering\", a field which is likely to become increasingly important as AI tools proliferate.",[14,70529,70530],{},"However, there are limitations.",[14,70532,70533],{},"On the technical side, there is a limit to prompt size, which can make it rather awkward if there's a lot of info to parse. Meanwhile, on the side of the user, it can be quite difficult to know what information ChatGPT even has available, or what question to ask.",[14,70535,70536],{},"To solve these issues, we're currently working on our own fine-tuned ChatGPT model. Fine-tuning is a more detailed way of training a bot to answer questions, and one that's more efficient than few-shot learning. Unfortunately, it's also a more technical approach and requires a large number of examples to be effective.",[14,70538,70539],{},"When done well, however, this fined tuned \"automation guru\" model will able to answer questions specifically about a wide variety of browser automation problems.",[14,70541,70542],{},"We have spent years in this space and have acquired a huge amount of knowledge in that time. Now, with ChatGPT, we have a way to encode this knowledge into software that is able to converse in a natural way. Watch this space!",[21,70544,70546],{"id":70545},"what-are-the-downsides-and-limitations-of-chatgpt","What are the downsides and limitations of ChatGPT?",[639,70548,70550],{"id":70549},"falsehoods-and-hallucinations","Falsehoods and hallucinations",[14,70552,70553],{},"A major issue in ChatGPT is its desire to \"hallucinate\" results, i.e. fabricate plausible looking text that is either false or nonsensical. When it comes to automations that need to run consistently, this is a tricky issue that needs to be addressed - quite apart from the valid societal concerns raised by relying on machines that can \"lie\" like this.",[14,70555,70556,70557,70559],{},"There are ways around this problem. The more advanced models made available by Open AI appear to be able to understand when you tell them ",[29,70558,57147],{}," to output false results, something we find remarkable. Consider these two examples:",[592,70561],{"src":70562,"alt":70563},"\u002Fblog\u002Fchatgpt-hallucination.png","Example of ChatGPT hallucinating data",[14,70565,70566],{},"Whoops! It seems ChatGPT is a little overeager to answer our question, and has gone on a flight of fancy.",[14,70568,70569],{},"Let's see if we can fix that:",[592,70571],{"src":70572,"alt":70573},"\u002Fblog\u002Fchatgpt-truthful.png","Example of fixing a case of hallucination in ChatGPT with a more precise prompt",[14,70575,70576],{},"That's better! Here we've told ChatGPT not to make things up, and as a result the hallucinations have vanished. What's fascinating about this is that it appears that - at least on some level - ChatGPT is able to understand that some extrapolations are more justified than others.",[14,70578,70579],{},"In other words, it's capable of knowing when it's lying.",[14,70581,70582],{},"We have been implementing a few of these \"anti-disinformation\" countermeasures into our ChatGPT integration, but even so it's something to watch out for. It may not be possible yet to 100% guarantee that the answers ChatGPT is producing are accurate.",[639,70584,70586],{"id":70585},"running-costs","Running costs",[14,70588,70589],{},"ChatGPT is not particularly expensive, but it can't be denied that running a large number of queries will start to stack up the costs.",[14,70591,70592],{},"ChatGPT works by using a token-based system; a token is approximately one word and one space. Both the prompt and ChatGPT's response to it are charged, so the longer these prompts are, the more expensive they get.",[14,70594,70595],{},"The cost is barely worth worrying about for relatively infrequent use, such as having ChatGPT on hand as a kind of assistant to ask information, correct code, and other similar tasks.",[14,70597,70598],{},"However, when it comes to full automation tasks, this can get a little more sticky. Invoking ChatGPT on thousands of pieces of data will rack up the charges, particularly when that data is substantial (as is the case for many web pages, for example).",[14,70600,70601],{},"Some pages are even so large that the currently available models aren't able to process them, although Open AI are addressing this with ChatGPT 4, which allows a higher maximum token limit.",[14,70603,70604,70605,70608],{},"ChatGPT can also be a little slow. When integrating ChatGPT into axiom to perform ",[322,70606,70607],{"href":491},"scraping tasks","using the AI to parse text automatically is considerably slower than using the visual scraper alone. This is partially because of ChatGPT's response times, which can take a few seconds, and partially because you need to scrape the page data anyway in order to pass it to ChatGPT. ChatGPT does not store up to date data automatically, and doesn't have a 1-1 record of all data on every site available for retrieval, so the scrape is required for accurate results.",[14,70610,70611],{},"Ultimately, whether it's worth using this tool or not depends on your use case. ChatGPT excels at pulling unstructured data from pages, or pages where the data you want can be placed in a number of different configurations. For many websites, however, the data is reasonably well structured using HTML code, which makes visual scraping tools perfectly sufficient for the task - and these tools are generally faster and less expensive to run.",[639,70613,70615],{"id":70614},"specifying-complexity","Specifying complexity",[14,70617,70618],{},"ChatGPT is extremely impressive and can look magical, or like there's really a person in there thinking through your problem. But it's important to remember that this is not the case. ChatGPT can only produce a useful result if it's given enough context to generate a completion.",[14,70620,70621],{},"For simple tasks, this works superbly. But as the task you need to perform gets more and more complex, ChatGPT's apparent ability begins to degrade. Hallucinations increase, and you have greater and greater trouble controlling the output. What's going on?",[14,70623,70624],{},"ChatGPT is not an expert on any particular task, but is a large model built from all the existing expertise that's available on the internet.",[14,70626,70627],{},"This leads to a critical difference between human and machine. A human's understanding is based on general principles, which the human can then extrapolate to solve new problems.",[14,70629,70630],{},"LLMs do not work like this. Instead, they are using your question as a set of inputs to weight the probability distrubtions of previously digested data. That means the output is only as good as the input, unlike with a real expert, who will be able to take very vague specifications and use their understanding to build a solution.",[14,70632,70633],{},"The upshot of this is that ChatGPT does not possess any understanding of your particular problem, unless you are capable of explaining it to the AI. Once you fully understand your task, you are able to tell ChatGPT what to do and it will produce the result you're after - code, data, whatever it is. But if you do not yet fully understand the steps involved, ChatGPT won't be able to either.",[14,70635,70636],{},"It's also an unfortunate fact that as tasks increase in complexity, the proportion of the work that is specification (as opposed to implementation) increases. Very complex tasks are almost entirely specification problems - the main challenge is in breaking down a requirement into smaller, more well-defined steps that can be solved indivually.",[14,70638,70639],{},"This can mean that a good visual UI with context specific help, one designed to help you with specifying your problem as well as building it, is probably still superior to the state of the art in generative AI. At least for now...",[14,70641,70642],{},"In any case, we'll be watching this space for further advancements! One thing that's certainly true about AI is that it's impossible to predict how rapidly it will advance in the future.",[21,70644,46678],{"id":46677},[14,70646,70647],{},"ChatGPT is a remarkable tool and we're investigating several implementations into axiom.ai in the near future, to help with the following use cases:",[80,70649,70650,70653,70656,70659],{},[83,70651,70652],{},"Extracting unstructured data (coming soon!)",[83,70654,70655],{},"Scaffolding automations",[83,70657,70658],{},"Customer support assistance",[83,70660,70661],{},"Locating selectors",[14,70663,70664,70665],{},"In conjunction with working on improvements in the vital art of user experience, we're hoping that this technology can make it easier than ever for anyone to build bots and automation with AI. In the meantime, why not learn how to create a ",[322,70666,70667],{"href":491},"ChatGPT web scraper?",{"title":494,"searchDepth":495,"depth":495,"links":70669},[70670,70671,70677,70682],{"id":70415,"depth":498,"text":70416},{"id":70441,"depth":498,"text":70442,"children":70672},[70673,70674,70675,70676],{"id":70445,"depth":495,"text":70446},{"id":70461,"depth":495,"text":70462},{"id":70491,"depth":495,"text":70492},{"id":70514,"depth":495,"text":70515},{"id":70545,"depth":498,"text":70546,"children":70678},[70679,70680,70681],{"id":70549,"depth":495,"text":70550},{"id":70585,"depth":495,"text":70586},{"id":70614,"depth":495,"text":70615},{"id":46677,"depth":498,"text":46678},"2023-04-05","An overview of what ChatGPT can do for you when building bots and automating using the browser - how AI can help with web scraping, form filling and other tasks.",{"read":70686,"type":513,"tool":70687,"category":70688,"tags":70689,"location":46733,"featuredimg":70690,"landingimg":70691,"layout":18631,"summary":70684},"15 min read",[46728],[48207],[518,70050,57469,70051,70052],"\u002Fblog\u002Faxiom-and-chaptgpt.jpg","\u002Fblog\u002Faxiom-and-chat-gpt-blog.jpg",{"title":70409,"description":70684},"blog\u002Fchatgpt-bot-ai-automation","WVupOOOnrsxhZquYd1i0H2zXBjnC_F2QaQbmaGqYAFg",[48207],[513],[46728],{"id":70699,"title":70700,"author":46205,"body":70701,"date":70990,"description":70991,"draft":26250,"extension":506,"meta":70992,"navigation":522,"path":71002,"seo":71003,"stem":71004,"__hash__":71005,"pinned":-1,"category":71006,"type":71007,"tool":71008},"blog\u002Fblog\u002Fautomate-chrome-browser.md","Top tips for web automation in the chrome browser",{"type":8,"value":70702,"toc":70977},[70703,70710,70713,70716,70720,70723,70726,70740,70744,70747,70751,70758,70761,70765,70769,70772,70775,70786,70789,70793,70796,70799,70802,70819,70823,70826,70830,70833,70836,70840,70844,70847,70861,70865,70868,70872,70875,70878,70882,70886,70889,70897,70901,70904,70908,70911,70914,70925,70929,70932,70936,70939,70942,70950,70954,70957,70959,70971,70974],[14,70704,70705,70706,70709],{},"There's nothing quite like the magic of seeing a bot automate Chrome and do your boring, repetitive tasks for you. Happily, anyone can automate the browser with ",[322,70707,3435],{"href":51689,"rel":70708},[2245],"'s no-code tool – you really don't need to know how to code. Sure, sometimes you'll need to have the patience to learn a new skill, but these top tips will help you take your web automation skills from novice to pro status quickly.",[18,70711],{"alt":70712},"how to automate the chrome browser with axiom.ai",[14,70714,70715],{},"This post includes methods for speeding up web scraping 🚀, web automation with key presses ⌨️, and appending data from separate steps in axiom.ai's builder.",[21,70717,70719],{"id":70718},"_1-how-to-select-button-clicks-using-text","1. How to select button clicks using text",[14,70721,70722],{},"When using the 'Click Element' step to automate button clicks, did you know that if a button has unique text (such as \"Send Message\"), you can select the button by its text instead of using a CSS selector? By using this option, Axiom will search for the string rather than a CSS selector to find the element on the page.",[14,70724,70725],{},"It's really simple:",[555,70727,70728,70731,70734,70737],{},[83,70729,70730],{},"Click \"Select\" in your \"Click Element\" step",[83,70732,70733],{},"Click on 'Custom'",[83,70735,70736],{},"Tick the box labeled \"Use element text instead of HTML”",[83,70738,70739],{},"Enter the text inside the box and click \"Complete”",[592,70741],{"src":70742,"alt":70743},"\u002Fblog\u002Ftext-slector-chrome-blog.jpg","How to select button clicks using text with axiom.ai",[14,70745,70746],{},"This trick is often used when automating Instagram. For instance, an annoying pop-up that can only be closed with a 'Not Now' button appears during runtime when running an Instagram bot. Since it cannot be selected using the selector tool, the text method should be used instead. This method works perfectly and allows the pop-up that appears on Instagram to be removed every time.",[21,70748,70750],{"id":70749},"_2-how-to-prevent-errors-when-buttons-are-not-always-present","2. How to prevent errors when buttons are not always present",[14,70752,70753,70754,70757],{},"In the 'Click element' step, there is a useful checkbox labeled 'Optional click' that you may have overlooked. Check this box if the button you are selecting is not always present. Normally, ",[322,70755,3435],{"href":51689,"rel":70756},[2245]," will throw an error stopping your bot if a button is missing. This option is particularly useful if you are creating an automation that loops through pages in Chrome clicking buttons.",[14,70759,70760],{},"To use the Optional click open your click element step and tick the box.",[592,70762],{"src":70763,"alt":70764},"\u002Fblog\u002Foptional-click.jpg","continue on error in axiom.ai",[21,70766,70768],{"id":70767},"_3-how-to-keep-axiom-running-despite-errors","3. How to keep Axiom running despite errors",[14,70770,70771],{},"Occasionally, when automating a browser, your bot may encounter an error that halts its run - for instance, an empty selector when scraping data. In such cases, you may want your bot to keep running, ignoring the error.",[14,70773,70774],{},"To achieve this, simply tick the ‘Continue on Error’ box. Here’s how to find it:",[555,70776,70777,70780,70783],{},[83,70778,70779],{},"Click on the menu icon with three dots located in the top right corner",[83,70781,70782],{},"Click on \"Settings\"",[83,70784,70785],{},"Click \"Continue on error\" in the sidebar and tick the box",[592,70787],{"src":70788,"alt":70764},"\u002Fblog\u002Fcontinue-on-error.jpg",[21,70790,70792],{"id":70791},"_4-how-to-speed-up-your-web-scraper-in-chrome","4. How to speed up your web scraper in Chrome",[14,70794,70795],{},"We have worked really hard on our scraping tool, and we think it's pretty good. It has undergone many updates, so you may not have noticed the configuration options we recently added. These options can be used to optimize your scrapers and make them run even faster.",[14,70797,70798],{},"Warning: If you run the scraper too quickly, it may execute before the data is fully loaded. Some experimentation may be required to determine the optimal speed for the site you are using or your internet connection.",[14,70800,70801],{},"In the \"Get data\" step, look for the \"Configuration\" section and click to expand your options. These are the settings you will see:",[555,70803,70804,70807,70810,70813,70816],{},[83,70805,70806],{},"Wait time between scrolls (ms) - if scraping a content of a page (not a listing) reduce this down to 2000",[83,70808,70809],{},"No. of retry attempts when results not found - if your page loads quickly and no additional content is loading try as low as 0",[83,70811,70812],{},"Minimum wait before scraping (ms) - we often leave this unchanged, would recommend focusing on step 1-2",[83,70814,70815],{},"Page number to start scraping on - N\u002FA",[83,70817,70818],{},"Force a re-scrape - Untick unless you get an issue with missing page data after the first page",[592,70820],{"src":70821,"alt":70822},"\u002Fblog\u002Fconfig-scraper.jpg","speed your web scraping up in axiom.ai",[14,70824,70825],{},"Experiment and see what works best!",[21,70827,70829],{"id":70828},"_5-how-to-use-the-keyboard-to-unstick-your-automations","5. How to use the keyboard to unstick your automations",[14,70831,70832],{},"There are times when automating the browser using the ‘Click element’ or ‘Enter text’ step just does not work. That's when the Keypress step can prove to be very handy. This step lets you record keystrokes, which is useful because a tab can switch between inputs, a down arrow can scroll the page down, and a return can click a button. If you ever get stuck, give this step a try.",[14,70834,70835],{},"To use the \"Press Key(s)\" step, add the step, click \"Record\", and type the key(s).",[592,70837],{"src":70838,"alt":70839},"\u002Fblog\u002Fblog-press-keys-axiom.jpg","automate chrome with a key press using axiom.ai",[21,70841,70843],{"id":70842},"_6-how-to-get-the-last-day-of-the-previous-month-as-a-variable","6. How to get the last day of the previous month as a variable",[14,70845,70846],{},"Getting the last day of the month is a useful feature for automating report generation. Our date and time step includes a neat feature that allows you to do this in seconds. Here’s how to use it:",[555,70848,70849,70852,70855,70858],{},[83,70850,70851],{},"Add new step in the builder and search for ‘Get and date time’",[83,70853,70854],{},"Select \"custom\"",[83,70856,70857],{},"Choose 'Last day of previous month' from the select list",[83,70859,70860],{},"Choose your preferred format",[592,70862],{"src":70863,"alt":70864},"\u002Fblog\u002Flast-day-month.jpg","get the last day of the month using axiom.ai",[14,70866,70867],{},"A word to the wise: if you ever use the date or time to write file names, remember that a '\u002F' is not permitted. Instead, use dashes '-'.",[21,70869,70871],{"id":70870},"_7-how-to-upload-or-download-files-in-the-cloud","7. How to upload or download files in the cloud",[14,70873,70874],{},"Axiom features steps for uploading and downloading files via our desktop app. Recently, we added two new steps that allow you to upload or download files to your Google Drive, which is incredibly convenient. And yes, they work in the cloud!",[14,70876,70877],{},"To use the Google Drive steps, simply click the ‘+’ button, search for ‘Google Drive’, and add the step you wish to use.",[592,70879],{"src":70880,"alt":70881},"\u002Fblog\u002Fgoogle-drive-files.jpg","manage files in the cloud with google drive using axiom.ai",[21,70883,70885],{"id":70884},"_8-how-to-tell-axiom-to-switch-to-a-new-window-or-pop-up","8. How to tell Axiom to switch to a new window or pop up",[14,70887,70888],{},"This is a common issue that people get stuck with when creating an Axiom. If you automate a click that opens a new tab or pop-up, Axiom does not automatically switch to that new window. It is important to explicitly tell Axiom to switch to the new window (both tabs and pop-ups are considered new windows). If you do not do this, your Axiom will not work. Fortunately, we have a step to help you accomplish this task:",[555,70890,70891,70894],{},[83,70892,70893],{},"Add a new step and search for “Switch browser tab”",[83,70895,70896],{},"Set the tab selection to \"Last opened\" or specify a tab number (1 being the first tab in the browser)",[592,70898],{"src":70899,"alt":70900},"\u002Fblog\u002Fswitch-tabs.jpg","how to switch tabs in axiom.ai",[14,70902,70903],{},"This step is pretty easy to use; just leave it on the \"newest tab\" setting. However, remember that you may need to add another one of these steps to go back to the original window! We also have steps for closing a tab.",[21,70905,70907],{"id":70906},"_9-how-to-join-two-separate-pieces-of-data-in-axiom","9. How to join two separate pieces of data in Axiom",[14,70909,70910],{},"If you are building an Axiom and you want to join the data output of different steps, you can use the handy Append step. This allows you to join data either vertically or horizontally.",[14,70912,70913],{},"To do this, simply:",[555,70915,70916,70919,70922],{},[83,70917,70918],{},"Add a new step in the builder and search for “Append”",[83,70920,70921],{},"Select the sources for 'Data A' and 'Data B'",[83,70923,70924],{},"Choose whether you want to append the data vertically or horizontally. ‘Horizontal’ adds the second set of data as new columns, while ‘vertical’ adds it as new rows.",[592,70926],{"src":70927,"alt":70928},"\u002Fblog\u002Fappend-data-step-blog.jpg","how to append data in axiom.ai",[14,70930,70931],{},"You can chain multiple append steps together if you need to join more than one data source. To do this, choose the previous ‘Append’ step as the ‘Data A’ source and add your new data to ‘Data B’.",[21,70933,70935],{"id":70934},"_10-how-to-combine-several-axioms-into-one","10. How to combine several Axioms into one",[14,70937,70938],{},"Axiom comes complete with a ‘Run Another Axiom’ step. This allows you to import Axioms into a single controller Axiom. This step is really useful for building complex Axioms with many steps. It can be handy to break complex Axioms down into several parts that you can run independently and maintain.",[14,70940,70941],{},"To use the ‘Run Another Axiom’ step simply:",[555,70943,70944,70947],{},[83,70945,70946],{},"Add a new step in the builder and search for “Run”",[83,70948,70949],{},"Inside the step, select the Axiom you want to load",[592,70951],{"src":70952,"alt":70953},"\u002Fblog\u002Fanother-axiom.jpg","how to run multi axioms inside another axiom with axiom.ai",[14,70955,70956],{},"During runtime, any external Axioms will be triggered in the order they appear.",[21,70958,46678],{"id":46677},[14,70960,70961,70962,70965,70966,70968,70969,44],{},"We hope you find these tips useful for developing your axioms and improving your browser automation skills. If you are interested in learning more, you can watch ",[322,70963,70964],{"href":324},"our video guides"," or read our ",[322,70967,61953],{"href":61952},". Also keep an eye on our release notes to discover new features and ",[322,70970,51664],{"href":61729},[14,70972,70973],{},"Please always feel free to reach out and ask support if you need it.",[14,70975,70976],{},"Keep an eye out for tips on structuring your Axioms, coming soon.",{"title":494,"searchDepth":495,"depth":495,"links":70978},[70979,70980,70981,70982,70983,70984,70985,70986,70987,70988,70989],{"id":70718,"depth":498,"text":70719},{"id":70749,"depth":498,"text":70750},{"id":70767,"depth":498,"text":70768},{"id":70791,"depth":498,"text":70792},{"id":70828,"depth":498,"text":70829},{"id":70842,"depth":498,"text":70843},{"id":70870,"depth":498,"text":70871},{"id":70884,"depth":498,"text":70885},{"id":70906,"depth":498,"text":70907},{"id":70934,"depth":498,"text":70935},{"id":46677,"depth":498,"text":46678},"2023-03-28","There's nothing quite like the magic of seeing a bot automate Chrome and do your boring, repetitive tasks for you. Happily, anyone can automate the browser with axiom.ai's no-code tool – you really don't need to know how to code. Sure, sometimes you'll need to have the patience to learn a new skill, but these top tips will help you take your web automation skills from novice to pro status quickly.",{"read":61760,"type":513,"tool":70993,"category":70994,"tags":70995,"location":46733,"featuredimg":523,"landingimg":70999,"summary":71000,"video":71001},[46728],[50552],[70996,70997,70998],"button clicks","keyboard actions","chrome","\u002Fblog\u002Ftop-tips.png","Learn how to automate the Chrome browser - take your browser automation skills from novice to pro quickly","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FTPF54t24Cjo?rel=0","\u002Fblog\u002Fautomate-chrome-browser",{"title":70700,"description":70991},"blog\u002Fautomate-chrome-browser","FcqHiwyr3mah8na2YmEz2mViS-rDSCFQb0WOVmLklpE",[50552],[513],[46728],{"id":71010,"title":71011,"author":46205,"body":71012,"date":71414,"description":71415,"draft":26250,"extension":506,"meta":71416,"navigation":522,"path":71427,"seo":71428,"stem":71429,"__hash__":71430,"pinned":-1,"category":71431,"type":71432,"tool":71433},"blog\u002Fblog\u002Fautomate-translations-in-youtube-studio.md","How to translate titles and descriptions in YouTube Studio",{"type":8,"value":71013,"toc":71388},[71014,71017,71019,71022,71026,71029,71032,71039,71043,71046,71050,71053,71057,71060,71064,71067,71070,71073,71076,71080,71083,71087,71091,71094,71097,71100,71114,71116,71119,71123,71125,71128,71131,71134,71137,71141,71144,71150,71154,71158,71161,71169,71173,71176,71180,71188,71192,71200,71204,71215,71219,71227,71230,71234,71238,71241,71245,71259,71263,71271,71275,71292,71295,71299,71302,71306,71317,71320,71324,71327,71330,71333,71336,71347,71349,71353,71356,71359,71362,71367,71369,71372,71376,71381,71385],[14,71015,71016],{},"Translating your YouTube descriptions (the title and text describing your content) into other languages is likely to increase your views. Yet translation is costly and time consuming, and let’s face it, many of us simply don’t bother. But what if you could do it with a bot using Google Translate?",[18,71018],{},[14,71020,71021],{},"In this guide, we’ll teach you how to automate translating your YouTube descriptions without a single line of code, using Axiom’s no-code bot building tool. If you’re interested in learning more about browser automation and how it can be used to automate tasks throughout the YouTube ecosystem, this guide is a great starting point.",[21,71023,71025],{"id":71024},"why-build-a-bot","Why build a bot?",[14,71027,71028],{},"Have you ever seen a bot do your work for you? This was one user’s reaction on Twitter:",[14,71030,71031],{},"“Help! I’m addicted to writing bots with @browserbots that make my job and life easier”",[14,71033,71034,71035,71038],{},"YouTube automation ",[29,71036,71037],{},"frees up time and resources normally spent on routine tasks that can instead be used to focus on growing and scaling your business."," Of course there’s a learning curve when it comes to building bots, but once mastered, you can automate much more than just translations for YouTube.",[21,71040,71042],{"id":71041},"what-is-a-bot","What is a bot?",[14,71044,71045],{},"A bot is a program that automatically performs tasks for you on the Internet. Like a physical robot, you’ll need to give it instructions, telling it how to automate translating descriptions in YouTube Studio.",[21,71047,71049],{"id":71048},"how-are-bots-made-using-axiomai","How are bots made using axiom.ai?",[14,71051,71052],{},"With the help of Axiom’s no-code bot builder, you can easily make bots that combine steps to replicate your actions in YouTube Studio. You can build as many bots as you want for any web-based application, not just YouTube, without a single line of code!",[21,71054,71056],{"id":71055},"can-anyone-make-a-bot-to-automate-actions-in-youtube-studio","Can anyone make a bot to automate actions in YouTube Studio?",[14,71058,71059],{},"The answer is yes! You don’t need to know how to code. If you’re completely new to this, keep following the guide and by the end you’ll have made a bot that automates translations in YouTube Studio. Don’t forget that all new accounts get 2 free hours of runtime to test your bots - no credit card required.",[21,71061,71063],{"id":71062},"how-does-the-bot-automate-translations-in-youtube-studio","How does the bot automate translations in YouTube Studio?",[14,71065,71066],{},"The bot you’re about to make will read a YouTube ID from a Google Sheet, as well as the text and language you want to translate it into.",[14,71068,71069],{},"Then the bot will load the Google Translate page into a browser, paste the text into the translate box and click translate. Once that's done, the bot scrapes the translated text.",[14,71071,71072],{},"Its next action is to use the YouTube ID to open the correct video’s ‘translate’ page. It then clicks ‘create translation’, sets the language, enters the translation and saves.",[14,71074,71075],{},"And it won’t stop there: it will continue looping through any additional rows in the Google Sheet.",[21,71077,71079],{"id":71078},"what-else-can-you-automate-using-bots-in-youtube-studio","What else can you automate using bots in YouTube Studio?",[14,71081,71082],{},"YouTube Studio users have plenty of repetitive tasks that bots can automate. For example, extracting data for reporting or even creating new posts. Plus you can extend the same bot to multiple YouTube accounts.",[21,71084,71086],{"id":71085},"get-started-the-first-steps-for-building-your-bot","Get started: the first steps for building your bot",[639,71088,71090],{"id":71089},"set-up-google-sheet","Set up Google Sheet",[14,71092,71093],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering the shortcut 'sheet.new', presuming you already have an account.",[14,71095,71096],{},"First, name your sheet something like 'Automate YouTube translations’, then set up two tabs titled 'Translate' and 'Translated.’",[14,71098,71099],{},"Add data to the ‘Translate’ tab on your sheet. Each translation should be added to a new row, in this format:",[80,71101,71102,71105,71108,71111],{},[83,71103,71104],{},"Column A: add the YouTube video ID",[83,71106,71107],{},"Column B: add the title you wish to translate",[83,71109,71110],{},"Column C: add the description you wish to translate",[83,71112,71113],{},"Column D: specify the language you wish to translate the text into (Match how the languages are listed on Google Translate).",[639,71115,15190],{"id":15189},[14,71117,71118],{},"To build your bot from scratch, click on 'Start blank.’",[592,71120],{"src":71121,"alt":71122},"\u002Fblog\u002Fstartfromblank.png","Start from blank - build a bot to automate amazon posts",[639,71124,7154],{"id":7153},[14,71126,71127],{},"Find the ‘Read data from a Google Sheet’ step (you can use the search function to do so). Add the step to Axiom for you to configure.",[14,71129,71130],{},"In the field called 'Spreadsheet', you can search for the Google Sheet you created. Once found, click to select.",[14,71132,71133],{},"For 'Sheet name' click on the drop-down and select the tab 'Translate'.",[14,71135,71136],{},"On the first cell, toggle the switch and enter 'A1'. This setting tells the bot where to start reading data.",[592,71138],{"src":71139,"alt":71140},"\u002Fblog\u002Fg-sheet-youtube.png","set up your google sheet to automate youtube studio translations for titles and descriptions",[14,71142,71143],{},"On the last cell, click the toggle switch and enter 'AD1'. You have limited the bot to read a single row. We can set the bot to loop later on.",[14,71145,71146,71147],{},"If you want to learn more about ",[322,71148,71149],{"href":67897},"Google Sheet steps watch these videos.",[21,71151,71153],{"id":71152},"part-one-automate-translations-of-titles-and-descriptions-using-google-translate","Part One: Automate translations of titles and descriptions using Google Translate",[639,71155,71157],{"id":71156},"_1-add-an-loop-through-data-step","1. Add an ‘Loop through data’ step",[14,71159,71160],{},"This ‘interact’ step will be used to automate Google Translate by inputting data and extracting the resulting translations.",[14,71162,71163,71164],{},"In the ‘Enter URL’ field, enter the URL for Google Translate ",[322,71165,71168],{"href":71166,"rel":71167},"https:\u002F\u002Fwww.google.com\u002Fsearch?q=google+translate",[2245],"https:\u002F\u002Fwww.google.com\u002Fsearch?q=google+translate ",[639,71170,71172],{"id":71171},"_2-set-up-sub-steps","2. Set up sub-steps",[14,71174,71175],{},"Now add the following sub-steps to populate the google translate form.",[592,71177],{"src":71178,"alt":71179},"\u002Fblog\u002Ftranslate.png","Enter the text to be tranlated into Google Translate",[555,71181,71182,71185],{},[83,71183,71184],{},"Add a new sub-step called ‘Enter Text’. Click ‘Select’ then select the ‘Enter text’ field on the Google Translate page. Click on ‘Insert Data’ and pass the title text to be translated.",[83,71186,71187],{},"Add a ‘Click Element’ sub-step and select the language drop down.",[592,71189],{"src":71190,"alt":71191},"\u002Fblog\u002Fselect-lang-ui.png","Select the language to tranlate the text to",[555,71193,71194,71197],{"start":495},[83,71195,71196],{},"Add an ‘Enter Text’ step, click ‘Select Data’ and choose the column with the language choice, ensuring it matches Google’s own language listing.",[83,71198,71199],{},"Add a ‘Press Key(s)’ step and record a return to submit the choice made in step 3",[592,71201],{"src":71202,"alt":71203},"\u002Fblog\u002Fgetdata-translate.png","scrape translated content",[555,71205,71206,71209,71212],{"start":1901},[83,71207,71208],{},"Add a ‘Get data from a webpage’ step and select the translated title",[83,71210,71211],{},"Add a ‘Click element’ sub-step and select the ‘x’ to clear the translated text ready to input the description text for translation",[83,71213,71214],{},"Then add an ‘Enter Text’ sub-step, click on the yellow ‘Enter data’ button and select the column with the description in the data preview that appears on-click.",[592,71216],{"src":71217,"alt":71218},"\u002Fblog\u002Fsteps-translate.png","add last steps to automate Google Translate",[555,71220,71221,71224],{"start":2058},[83,71222,71223],{},"Now add a ‘Get data from a webpage’ sub-step. Select the translated description.",[83,71225,71226],{},"Add a ‘Display a message’ step, insert data from ‘Interact’ step to check it’s working. Hit run to test it. The content should appear in a pop up like this add image",[14,71228,71229],{},"Awesome work! You have built the first part of the bot. We will now teach you how to pass the translated titles and descriptions to the next ‘Interact’ step that will automate the translations.",[21,71231,71233],{"id":71232},"part-two-automate-translations-in-youtube-studio","Part Two: Automate translations in YouTube Studio",[639,71235,71237],{"id":71236},"_1-add-a-new-loop-through-data-below-display-a-message-step","1. Add a new ‘Loop through data’ below ‘Display a message’ step",[14,71239,71240],{},"This ‘Interact’ step will be used to automate the generation of the translations in YouTube. Once set up, it will select the language and enter the translated title and description.",[592,71242],{"src":71243,"alt":71244},"\u002Fblog\u002Furl-youtube-stuido.png","add url to the sub step",[555,71246,71247],{},[83,71248,71249,71250,71254,71255],{},"In the ‘Enter URL’ add this partial URL ‘",[322,71251,71252],{"href":71252,"rel":71253},"https:\u002F\u002Fstudio.YouTube.com\u002Fvideo\u002F",[2245],", then click on ‘Insert data’ and select the Google Sheet variable. The data preview will slide up: select the unique YouTube ID. Then add ‘\u002Ftranslations’. Congratulations! You have learned to construct URLs with variables. A very useful trick for automating the browser. Your URL should look a little like this: ",[322,71256,71257],{"href":71257,"rel":71258},"https:\u002F\u002Fstudio.YouTube.com\u002Fvideo\u002FPebeNFAKbEU\u002Ftranslations",[2245],[592,71260],{"src":71261,"alt":71262},"\u002Fblog\u002Fclick-select-youtube.png","Add click step and select add lanuage in youtube",[555,71264,71265,71268],{"start":498},[83,71266,71267],{},"Next, we need to use a ‘Click Element’ sub-step and click on ‘ADD LANGUAGE’",[83,71269,71270],{},"Then input the language used for the translation. Use the ‘Enter Text’ sub-step, then click ‘Enter data’ and select the language.",[592,71272],{"src":71273,"alt":71274},"\u002Fblog\u002Fkeypress-youtube-studio.png","Add a Press Key step",[555,71276,71277,71280,71283,71286,71289],{"start":1895},[83,71278,71279],{},"Now add a ‘Press Key(s)’’ step. Record a press of the ‘Return’ key to submit the language.",[83,71281,71282],{},"Now add a ‘Click Element’, select ‘ADD’ in the Title & Description column. The language fields will appear in a pop-up.",[83,71284,71285],{},"Now add two ‘Enter Text’ steps for the ‘Title’ and ‘Description’ fields. Pass the content from the Google Sheet by selecting 'Insert data’ then in the preview that pops up, select the title and description. If you see no data preview, column A should be the title and column B the description.",[83,71287,71288],{},"Add ‘Click Element’ step to publish the translation. Note you will need to add some text to make the button active when selecting it.",[83,71290,71291],{},"Add a ‘Wait’ step of 3000ms to ensure the content saves.",[14,71293,71294],{},"Okay, you’re almost done and getting good at building bots!",[21,71296,71298],{"id":71297},"loop-the-bot","Loop the bot",[14,71300,71301],{},"All you need to do now is to set the bot up to loop.",[592,71303],{"src":71304,"alt":71305},"\u002Fblog\u002Fyoutube-loop.png","How to loop your youtube studio axiom",[555,71307,71308,71311,71314],{},[83,71309,71310],{},"Add a ‘Write data to a Google Sheet’ step and select the sheet called ‘Translated.’ Pass the Google Sheet data to log the completed translations.",[83,71312,71313],{},"Add ‘Delete Google Sheet’ step and choose the ‘Translated’ sheet to remove the completed row so that the bot loops onto a new row.",[83,71315,71316],{},"Finally, add ‘Jump to another step’’ and enter the number of steps to jump to (in this case 1) and enter the number of loops you want in ‘Maximum cycles’.",[14,71318,71319],{},"The bot is now ready and will loop through its tasks. You can automate!",[21,71321,71323],{"id":71322},"test-run-your-youtube-studio-bot","Test run your Youtube Studio bot",[14,71325,71326],{},"Before you do a test run, cdisable the sub-step that clicks ‘Publish’. If not, make sure you do this now.",[14,71328,71329],{},"It's best practice to test every bot to check it’s production-ready. With the ‘Publish’ button disabled, you can do a test run that will not add a translation.",[14,71331,71332],{},"We recommend test running your bot with the desktop app.",[14,71334,71335],{},"Things to check for:",[555,71337,71338,71341,71344],{},[83,71339,71340],{},"Is the text translated?",[83,71342,71343],{},"Is the text entered in the correct language?",[83,71345,71346],{},"Is the translation saving?",[14,71348,46654],{},[21,71350,71352],{"id":71351},"debugging-your-youtube-studio-bot","Debugging your Youtube Studio bot",[14,71354,71355],{},"If you experience any issues with the bot not clicking buttons, try re-selecting the button or text input. To change the selection, move the cursor slowly over the object and re-select.",[14,71357,71358],{},"The Click step also has a handy feature that allows you to select the button by the text, which can resolve many issues.",[14,71360,71361],{},"If the Publish button is clicked, but the Translation is not saving. Make sure you have added the 'Wait' at the end of the sub-step in the second 'Interact' step.",[14,71363,71364,71365],{},"Don't forget we have excellent customer support. If you need help, get in touch.",[322,71366,46674],{"href":486},[21,71368,46678],{"id":46677},[14,71370,71371],{},"Bots can save you hours of time and resources normally spent on repetitive tasks. Now you’ve built and run your first bot, why not use your new super power to automate other tasks? Another popular use of Axiom in the YouTube ecosystem is to automate the Add text",[21,71373,71375],{"id":71374},"axiom-support","Axiom Support",[14,71377,71378,71379],{},"If you do get stuck or need some guidance, we are here to help. Simply post your request here ",[322,71380,46674],{"href":486},[21,71382,71384],{"id":71383},"need-to-scale-your-youtube-sutido-bot","Need to scale your YouTube Sutido bot?",[14,71386,71387],{},"If you have multiple YouTube accounts to manage, with hundreds of videos to translate, one bot may not be enough. You can run two or three bots concurrently with our Pro Max and Ultimate subscriptions.",{"title":494,"searchDepth":495,"depth":495,"links":71389},[71390,71391,71392,71393,71394,71395,71396,71401,71405,71408,71409,71410,71411,71412,71413],{"id":71024,"depth":498,"text":71025},{"id":71041,"depth":498,"text":71042},{"id":71048,"depth":498,"text":71049},{"id":71055,"depth":498,"text":71056},{"id":71062,"depth":498,"text":71063},{"id":71078,"depth":498,"text":71079},{"id":71085,"depth":498,"text":71086,"children":71397},[71398,71399,71400],{"id":71089,"depth":495,"text":71090},{"id":15189,"depth":495,"text":15190},{"id":7153,"depth":495,"text":7154},{"id":71152,"depth":498,"text":71153,"children":71402},[71403,71404],{"id":71156,"depth":495,"text":71157},{"id":71171,"depth":495,"text":71172},{"id":71232,"depth":498,"text":71233,"children":71406},[71407],{"id":71236,"depth":495,"text":71237},{"id":71297,"depth":498,"text":71298},{"id":71322,"depth":498,"text":71323},{"id":71351,"depth":498,"text":71352},{"id":46677,"depth":498,"text":46678},{"id":71374,"depth":498,"text":71375},{"id":71383,"depth":498,"text":71384},"2022-10-11","Learn how to use browser automation to translate titles and descriptions in YouTube Studio with a bot.",{"read":68527,"type":513,"tool":71417,"category":71418,"tags":71419,"location":46733,"featuredimg":71422,"landingimg":71423,"summary":71424,"metaTitle":71425,"video":71426},[46728],[53990],[71420,71421],"translation","translate","\u002Fblog\u002Famazon-post-large.png","\u002Fblog\u002Ftranslate-youtube.jpg","Learn how to build a bot step by step.","How to automate translation of titles and descriptions in YouTube Studio","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fy43BPE7IDwU?rel=0","\u002Fblog\u002Fautomate-translations-in-youtube-studio",{"title":71011,"description":71415},"blog\u002Fautomate-translations-in-youtube-studio","k7kJ2By7Vl91jXVt15gdsYbL2v5son7GVCyZKw__HTQ",[53990],[513],[46728],{"id":71435,"title":71436,"author":71437,"body":71438,"date":71578,"description":71579,"draft":26250,"extension":506,"meta":71580,"navigation":522,"path":71589,"seo":71590,"stem":71591,"__hash__":71592,"pinned":-1,"category":71593,"type":71594,"tool":71595},"blog\u002Fblog\u002Falternatives-to-selenium.md","Alternatives to Selenium","axiom.ai Team",{"type":8,"value":71439,"toc":71569},[71440,71443],[14,71441,71442],{},"Selenium is perhaps synonymous with browser automation - more than any other framework or tool, it helped develop and popularise automating your browser. It’s been around since 2004, and for a long time, it was the only real game in town.",[18,71444,71446,71449,71452,71456,71463,71466,71469,71472,71475,71479,71483,71499,71503,71519,71523,71553,71557,71560,71563],{"alt":71445},"Alternative to selenium like axiom.ai",[14,71447,71448],{},"::",[14,71450,71451],{},"As of 2022 that’s no longer the case - you’re practically spoilt for choice!",[21,71453,71455],{"id":71454},"no-code-alternative","No-code alternative",[14,71457,71458,71459,71462],{},"If you’re looking for a no-code alternative, ",[322,71460,3435],{"href":51689,"rel":71461},[2245]," is a good bet! 😉",[14,71464,71465],{},"Nevertheless, we don’t consider no-code tools like axiom a like-for-like alternative.",[14,71467,71468],{},"Firstly, axiom is Chrome-specific, and you may be using Selenium to automate or test multiple browsers.",[14,71470,71471],{},"Secondly, although axiom allows JavaScript, you may need the power and flexibility of a full programming and scripting environment that Selenium offers.",[14,71473,71474],{},"Consequently, we’re going to focus on the closest coding frameworks to Selenium by featureset, whilst pruning the list to focus on software that’s mature, with a well-supported ecosystem.",[21,71476,71478],{"id":71477},"similar-framework-alternatives","Similar framework alternatives",[639,71480,71482],{"id":71481},"cross-browser-compatible","Cross-browser compatible",[80,71484,71485],{},[83,71486,71487,71488],{},"Playright\n",[80,71489,71490,71493,71496],{},[83,71491,71492],{},"Playright is probably the closest framework by featureset - we consider it the more ‘modern’ version of Selenium.",[83,71494,71495],{},"✅ Cross-browser support (Chromium, FireFox, webkit), backed by Microsoft, Most similar to Selenium, Gaining momentum quickly",[83,71497,71498],{},"❌ Relatively new - the ecosystem is not as fully developed as Selenium, or even puppeteer.",[639,71500,71502],{"id":71501},"chrome-nodejs-focused","Chrome + node.js focused",[80,71504,71505],{},[83,71506,71507,71508],{},"Puppeteer\n",[80,71509,71510,71513,71516],{},[83,71511,71512],{},"The official automation framework for Chrome, backed by Google. Puppeteer has a well-developed ecosystem and benefits from the popularity of Chrome",[83,71514,71515],{},"✅ Backed by Google, Mature Software with popular ecosystem, Integrates well with Chrome’s ecosystem of tooling + the node.js ecosystem",[83,71517,71518],{},"❌ Only supports Chrome. Does not allow automation of extensions.",[639,71520,71522],{"id":71521},"testing-frameworks","Testing frameworks",[80,71524,71525,71539],{},[83,71526,71527,71528],{},"Cypress\n",[80,71529,71530,71533,71536],{},[83,71531,71532],{},"A popular batteries-included test automation framework with a simple developer experience.",[83,71534,71535],{},"✅ Simple install + A fully-featured test environment. Dashboard GUI to manage your tests. Debugger integration. Automatically manages waiting. Supports multiple browsers",[83,71537,71538],{},"❌ Freemium product, not free framework. Testing only.",[83,71540,71541,71542],{},"Testcafe\n",[80,71543,71544,71547,71550],{},[83,71545,71546],{},"Another popular batteries-included test automation framework with a simple developer experience!",[83,71548,71549],{},"✅ Similar to Cypress - Simple install, fully featured test environment + Dashboard GUI + Supports multiple browsers. A stronger emphasis on the ‘test-recorder’ to record tests without writing code.",[83,71551,71552],{},"❌  Testing only.",[21,71554,71556],{"id":71555},"more-alternatives","More alternatives",[14,71558,71559],{},"Perhaps none of these suggestions are exactly what you’re looking for.",[14,71561,71562],{},"In which case, this GitHub list is a pretty good resource to find other tools and frameworks that might suite you better:",[14,71564,71565],{},[322,71566,71567],{"href":71567,"rel":71568},"https:\u002F\u002Fgithub.com\u002Fangrykoala\u002Fawesome-browser-automation",[2245],{"title":494,"searchDepth":495,"depth":495,"links":71570},[71571,71572,71577],{"id":71454,"depth":498,"text":71455},{"id":71477,"depth":498,"text":71478,"children":71573},[71574,71575,71576],{"id":71481,"depth":495,"text":71482},{"id":71501,"depth":495,"text":71502},{"id":71521,"depth":495,"text":71522},{"id":71555,"depth":498,"text":71556},"2022-09-22","Selenium is the grandaddy of browser automation, but it's no longer the only game in town.",{"read":70686,"type":513,"tool":71581,"category":71582,"tags":71583,"location":46733,"featuredimg":71587,"landingimg":71588,"summary":71579},[46728],[50552],[71584,71585,71586],"selenium","cypress","testing frameworks","\u002Fblog\u002Fselenium-alternatives.jpg","\u002Fblog\u002Fselenium-alternatives-thumb.jpg","\u002Fblog\u002Falternatives-to-selenium",{"title":71436,"description":71579},"blog\u002Falternatives-to-selenium","QMdliKxzFF0z5d2AaHCDeXFyq-sbT6XbKrHvQOn_Fg4",[50552],[513],[46728],{"id":71597,"title":71598,"author":71599,"body":71600,"date":71578,"description":71604,"draft":26250,"extension":506,"meta":71848,"navigation":522,"path":71856,"seo":71857,"stem":71858,"__hash__":71859,"pinned":-1,"category":71860,"type":71861,"tool":71862},"blog\u002Fblog\u002Fpuppeteer-vs-selenium.md","Puppeteer vs Selenium","Axiom Team",{"type":8,"value":71601,"toc":71843},[71602,71605,71608,71611,71614,71617,71628,71631,71635,71750,71754,71759,71789,71794,71828,71832,71835,71838],[14,71603,71604],{},"As you might expect from us as the builders of a browser automation product, we know a thing or two about browser automation frameworks!",[14,71606,71607],{},"Puppeteer and Selenium are two of the most popular. The venerable Selenium is perhaps the best known  - it’s been around since 2004.",[18,71609],{"alt":71610},"Puppeteer vs selenium which one to choose?",[14,71612,71613],{},"Puppeteer is a relative newcomer, having launched in 2017, but as of  2022 it’s mature software with a developed ecosystem.",[14,71615,71616],{},"In contrast to axiom’s no-code approach, each framework is designed for building automations with code, and are often used for automating test cases.",[14,71618,71619,71620,71627],{},"A fun-fact is that Axiom is built on puppeteer! But that doesn’t mean we show favouritism - Selenium and Selenium IDE were the original tools which inspired axiom, so will always have a special place in our hearts ",[29,71621,71622,44],{},[322,71623,71626],{"href":71624,"rel":71625},"https:\u002F\u002Femojipedia.org\u002Fred-heart\u002F",[2245],"❤️"," It’s likely that Selenium will always be synonymous with browser automation.",[14,71629,71630],{},"Here’s our summary of both frameworks - it may help you choose which one is best for you.",[21,71632,71634],{"id":71633},"comparison","Comparison",[7092,71636,71637,71647],{},[7095,71638,71639],{},[7098,71640,71641,71643,71645],{},[7101,71642],{},[7101,71644,55848],{},[7101,71646,63638],{},[7108,71648,71649,71660,71671,71681,71691,71702,71713,71736],{},[7098,71650,71651,71654,71657],{},[7113,71652,71653],{},"Released",[7113,71655,71656],{},"2017",[7113,71658,71659],{},"2004",[7098,71661,71662,71665,71668],{},[7113,71663,71664],{},"Browser Platform",[7113,71666,71667],{},"Chrome, Chromium and Chromiium-derived browsers like Brave",[7113,71669,71670],{},"Selenium webdriver supported across FireFox, Chrome, Internet Explorer, Safari, Edge, Opera",[7098,71672,71673,71676,71679],{},[7113,71674,71675],{},"License",[7113,71677,71678],{},"Apache 2.0",[7113,71680,71678],{},[7098,71682,71683,71686,71688],{},[7113,71684,71685],{},"Developed & Maintained by",[7113,71687,7311],{},[7113,71689,71690],{},"Open-source community",[7098,71692,71693,71696,71699],{},[7113,71694,71695],{},"Programming Language(s)",[7113,71697,71698],{},"JavaScript & TypeScript",[7113,71700,71701],{},"Written in Java, but contains official bindings for Java, Python, JavScript, Ruby, C#. More languages are supported with 3rd party libraries.",[7098,71703,71704,71707,71710],{},[7113,71705,71706],{},"No-code Solution \u002F Builder",[7113,71708,71709],{},"Chrome DevTools now let’s you export puppeteer scripts. There are also unofficial chrome extensions which try to do the same.",[7113,71711,71712],{},"Official ‘Selenium IDE’ Available for Chrome and FireFox",[7098,71714,71715,71718,71727],{},[7113,71716,71717],{},"Pros",[7113,71719,71720,71721,71723,71724,71726],{},"✅  Simpler architecture & setup - JavaScript library only ",[344,71722],{},"✅  Strong integration with Chrome ecosystem ",[344,71725],{},"✅ Tight integration with node.js ecosystem",[7113,71728,71729,71730,71732,71733,71735],{},"✅ Supports multiple browsers ",[344,71731],{}," ✅ Supports testing browser extensions",[344,71734],{}," ✅ Native support for multiple programming languages",[7098,71737,71738,71741,71747],{},[7113,71739,71740],{},"Cons",[7113,71742,71743,71744,71746],{},"❌ Chromium-only ",[344,71745],{},"❌ Poor support for testing browser extensions",[7113,71748,71749],{},"❌ More complex - requires language bindings + webdriver",[21,71751,71753],{"id":71752},"which-framework-is-right-for-me","Which framework is right for me?",[14,71755,71756],{},[29,71757,71758],{},"Reasons to use Selenium:",[80,71760,71761,71768,71775,71786],{},[83,71762,71763,71764,71767],{},"You have a ",[807,71765,71766],{},"testing-focused"," project",[83,71769,71770,71771,71774],{},"You need to support ",[807,71772,71773],{},"multiple browsers","  - e.g cross-browser testing",[83,71776,71777,71778,71781],{},"You need to automate or test ",[807,71779,71780],{},"browser extensions.",[80,71782,71783],{},[83,71784,71785],{},"Although axiom’s automations are built on puppeteer, we need to use Selenium to test the Chrome extension!",[83,71787,71788],{},"You like to code outside the JavaScript ecosystem - e.g. Using Python or Java",[14,71790,71791],{},[29,71792,71793],{},"Reasons to use Puppeteer:",[80,71795,71796,71803,71806,71809],{},[83,71797,71798,71799,71802],{},"You have an ",[807,71800,71801],{},"automation-focused"," project (including scraping)",[83,71804,71805],{},"You need a simpler architecture and setup (e.g. fewer dependencies + manage all dependencies with npm)",[83,71807,71808],{},"You’re building on the node.js ecosystem",[83,71810,71811,71812],{},"Your project is focused on Chrome, and you’d like to take advantage of the chrome ecosystem:\n",[80,71813,71814,71817,71825],{},[83,71815,71816],{},"Chrome’s in-built puppeteer recorder",[83,71818,71819,71820],{},"Chrome’s headless mode\n",[80,71821,71822],{},[83,71823,71824],{},"Puppeteer’s ‘stealth’ project, which (tries to) prevent headless detection",[83,71826,71827],{},"Chrome’s remote desktop",[21,71829,71831],{"id":71830},"neither-of-these-seem-like-a-good-fit-for-me","Neither of these seem like a good fit for me!",[14,71833,71834],{},"If neither of these seem like a good fit, luckily there’s plenty of other ways to automate the browser (including axiom.ai of course 😉).",[14,71836,71837],{},"This GitHub list is a pretty good resource to find other tools and frameworks that might suite you better:",[14,71839,71840],{},[322,71841,71567],{"href":71567,"rel":71842},[2245],{"title":494,"searchDepth":495,"depth":495,"links":71844},[71845,71846,71847],{"id":71633,"depth":498,"text":71634},{"id":71752,"depth":498,"text":71753},{"id":71830,"depth":498,"text":71831},{"read":70686,"type":513,"tool":71849,"category":71850,"tags":71851,"location":46733,"featuredimg":71853,"landingimg":71854,"summary":71855},[46728],[48207],[71584,71852,46947],"puppeteer","\u002Fblog\u002Fpup-v-sel.jpg","\u002Fblog\u002Fpup-v-sel-thumb.jpg","Puppeteer and Selenium are amongst the most popular browser automation framworks. Which one is right for you?","\u002Fblog\u002Fpuppeteer-vs-selenium",{"title":71598,"description":71604},"blog\u002Fpuppeteer-vs-selenium","VI1YW_ZkQbgPmDrlPeWWX8vQXmdA6E1PF4cQABL9JEQ",[48207],[513],[46728],{"id":71864,"title":71865,"author":46205,"body":71866,"date":72227,"description":72228,"draft":26250,"extension":506,"meta":72229,"navigation":522,"path":19666,"seo":72236,"stem":72237,"__hash__":72238,"pinned":-1,"category":72239,"type":72240,"tool":72241},"blog\u002Fblog\u002Famazon-posts.md","How to automate Amazon Posts",{"type":8,"value":71867,"toc":72202},[71868,71871,71874,71878,71881,71884,71894,71896,71899,71901,71904,71906,71909,71913,71916,71920,71923,71927,71936,71945,71949,71958,71961,71965,71968,71971,71974,71978,71981,71985,71988,71990,71994,71997,71999,72002,72005,72008,72012,72020,72024,72027,72031,72034,72037,72040,72046,72049,72053,72056,72060,72063,72066,72069,72073,72076,72080,72083,72087,72090,72093,72097,72103,72106,72109,72112,72116,72120,72123,72126,72129,72132,72135,72139,72142,72145,72147,72149,72160,72162,72166,72168,72170,72173,72179,72181,72187,72193,72195],[14,71869,71870],{},"In this guide, we’ll show you how to automate an Amazon Post in the Beta app. If you’re interested in learning more about browser automation and how it can be used to automate tasks throughout the Amazon ecosystem, this guide is a great starting point. It’s a simple bot that can be built in under five minutes - even if you’re a novice!",[18,71872],{"alt":71873},"how to automate Amazon posts with axiom.ai",[21,71875,71877],{"id":71876},"why-learn-to-build-bots-to-automate-amazon-posts","Why learn to build bots to automate Amazon Posts?",[14,71879,71880],{},"Have you ever seen a bot do your work for you? This was one user’s reaction:",[14,71882,71883],{},"“Axiom is a wonderful no-code solution for automation. When my first Axiom worked successfully, I was so happy I did a little dance!” 💃👇",[14,71885,71886,71887,71889,71890],{},"Amazon automation ",[29,71888,71037],{}," Of course there’s a learning curve when it comes to building bots, but once mastered, you can automate much more than just ",[322,71891,71893],{"href":71892},"\u002Fblog\u002Fwhat-is-amazon-automation","Amazon Posts.",[21,71895,71042],{"id":71041},[14,71897,71898],{},"A bot is a program that automatically performs tasks for you on the Internet. Like a physical robot, it needs instructions, so you need to  give it a set of instructions that tell it how to automate creating Amazon Posts.",[21,71900,71049],{"id":71048},[14,71902,71903],{},"With the help of Axiom’s no-code bot builder, you can easily make bots that combine steps to replicate  your actions.. You can build as many bots as you want for any web-based application, not just Amazon. Without a single line of code!",[21,71905,64264],{"id":64263},[14,71907,71908],{},"The answer is yes! You don’t need to know how to code. If you’re completely new to this, keep following the guide and by the end you’ll have made a bot that automates Amazon Posts. We’re here to help if you get stuck.",[21,71910,71912],{"id":71911},"how-do-bots-automate-amazon-posts","How do bots automate Amazon Posts?",[14,71914,71915],{},"The bot you’re about to make will automate the same web actions you perform when creating an Amazon Post. Bots work just like you: they open the browser window, click on the new post button, upload an image and insert the text before finally clicking the ‘Post’ button to complete the task.",[21,71917,71919],{"id":71918},"what-else-can-you-automate-using-bots-in-amazon","What else can you automate using bots in Amazon?",[14,71921,71922],{},"Don’t stop at your first bot, build yourself a workforce! Bots can be used to automate a range of tasks on Amazon from uploading an inventor to downloading reports. You can even automate posting to other social media platforms such as Facebook, Twitter or Instagram (add link to post). Once you master the art of bot building, you'll be able to automate any task.",[21,71924,71926],{"id":71925},"dive-in-and-make-a-bot-to-automate-amazon-posts","Dive in and make a bot to automate Amazon posts",[14,71928,71929,71930],{},"Before you start, you need to install axiom.ai’s desktop app as this automation requires files to be uploaded. ",[29,71931,71932],{},[322,71933,71935],{"href":71934},"\u002Fguide-part-two","Click here to install.(opens new window)",[14,71937,71938,71939,44],{},"Currently, bots can only work with files on the desktop. If you would like to see this feature on the cloud or elsewhere, ",[29,71940,71941],{},[322,71942,71944],{"href":71943},"\u002Froadmap","please vote here (opens new window)",[639,71946,71948],{"id":71947},"_1-install-axiomai-in-your-chrome-browser","1. Install axiom.ai in your Chrome browser",[14,71950,71951,71952,44],{},"If you haven’t yet installed axiom.ai and created an account, please go to the Chrome store and ",[29,71953,71954],{},[322,71955,71957],{"href":13910,"rel":71956},[2245],"install Axiom now (opens new window)",[14,71959,71960],{},"By the way, we give all new users 2 hours of free runtime. This means you can build and run this bot a couple of times on us 🙂",[639,71962,71964],{"id":71963},"_2-set-up-your-google-sheet","2. Set up your Google Sheet",[14,71966,71967],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering the shortcut 'sheet.new'.",[14,71969,71970],{},"First name your sheet 'Automate posting on Amazon', then add two new tabs to the sheet titled 'Post' and 'Posted.’",[14,71972,71973],{},"Finally add data to the ‘Post’ tab on your sheet. Each Post should be on a new row. In Colum A add the image path, Column B add the caption and lastly in Column C add upto 10 ASINS separated by commas.",[639,71975,71977],{"id":71976},"_3-launch-amazon-post-and-open-axiomai","3. Launch Amazon Post and open axiom.ai",[14,71979,71980],{},"First, make sure you’re logged into Amazon Post in your Chrome browser. Then open up axiom.ai and click the '+ New Automation' button. You’re now going to start combining steps to build your automation.",[639,71982,71984],{"id":71983},"_4-start-from-blank","4. Start from blank",[14,71986,71987],{},"To build your bot from scratch, click on 'Start blank.'",[592,71989],{"src":71121,"alt":71122},[639,71991,71993],{"id":71992},"_5-add-your-first-step-read-data-from-a-google-sheet","5. Add your first step, ‘Read data from a Google Sheet’",[14,71995,71996],{},"Using the Step Finder, click ‘Read data from a Google Sheet’. The step will be added to Axiom for you to configure.",[14,71998,71130],{},[14,72000,72001],{},"For 'Sheet name' click on the drop-down and select the tab 'Post' with the test data.",[14,72003,72004],{},"On the first cell, toggle the switch and enter 'A1'. This setting tells the bot where to start reading data. In the example below, you would start with 'My first automated post' as the column titles fill row one.",[14,72006,72007],{},"On the last cell, click the toggle switch and enter 'AC1'. You have limited the bot to read a single row. We will set the boot to loop later on.",[592,72009],{"src":72010,"alt":72011},"\u002Fblog\u002Fgoogle-sheet-post.png","set up your google sheet to automate amazon posts",[14,72013,72014,72015],{},"If you want to learn more about Google Sheet steps ",[29,72016,72017],{},[322,72018,72019],{"href":67897},"watch these videos.(opens new window)",[639,72021,72023],{"id":72022},"_6-loop-through-data","6. Loop through data",[14,72025,72026],{},"Click ‘Add a step’ below the ‘Read’ step. Using the Step Finder, click on 'Loop through data' to add the step.",[592,72028],{"src":72029,"alt":72030},"\u002Fblog\u002Finteract-post.png","Use axiom.ai's interact step to automate creating an amazon post",[14,72032,72033],{},"In the ‘Go to Url’ add Amazon’s Post url.",[14,72035,72036],{},"Inside the Interact step, click on the 'Add a sub step' button. The Interact step features a set of sub steps for automating browser actions like clicking a button.",[14,72038,72039],{},"Add the 'Click element' sub step.",[14,72041,72042,72043,72045],{},"Then, click on 'Select' and use our selector tool to highlight the ‘Create Post’ button on ",[322,72044,19691],{"href":19675}," and click confirm.",[14,72047,72048],{},"Well done, you have automated a web action!",[639,72050,72052],{"id":72051},"_7-add-further-sub-steps","7. Add further sub steps",[14,72054,72055],{},"Your browser window should now be on the Create Post page. Add an 'Upload file’ sub step and select the button 'Upload image'.",[592,72057],{"src":72058,"alt":72059},"\u002Fblog\u002Fimport-image-to-post.png","Use axiom.ai's Upload Step to automate image uploads to automate Amazon Post",[14,72061,72062],{},"In 'File path' click on the yellow icon 'Insert data' and select ‘Google-Sheet-Data’. A data preview will open. Select column A with the image path and save and close the preview.",[14,72064,72065],{},"Next, add a new sub-step called 'Enter text' and select the ‘Caption’ text field.",[14,72067,72068],{},"Now pass your caption from the sheet into the 'Enter text' step. Next, click on the yellow icon 'Insert data' and select 'Google-Sheet-Data'. A data preview will open. Select column B and save and close the preview.",[592,72070],{"src":72071,"alt":72072},"\u002Fblog\u002Fcaption-amazon-post.png","Use axiom.ai's Enter Text Step to automate text entry to the captions on Amazon Post",[14,72074,72075],{},"Add one more 'Enter text' sub-step to pass in the ASINs from column C of the spreadsheet.",[639,72077,72079],{"id":72078},"_8-now-add-a-sub-step-to-submit-the-new-amazon-post","8. Now add a sub-step to submit the new Amazon Post",[14,72081,72082],{},"Add a last sub-step 'Click Element' and select the 'Submit for review' button.",[639,72084,72086],{"id":72085},"_9-add-a-wait-sub-step-after-the-submit","9. Add a wait sub-step after the submit",[14,72088,72089],{},"Just for good measure, add a 'wait' sub-step after the bot clicks submit. Wait steps pause the bot to allow web apps time to finish saving. You may need to increase the wait if uploading a very large image.",[592,72091],{"src":72092,"alt":72072},"\u002Fblog\u002Fwait-post.png",[639,72094,72096],{"id":72095},"_10-add-a-new-step-write-data-to-a-google-sheet-to-record-posts-sent","10. Add a new step ‘Write data to a Google Sheet’ to record Posts sent",[14,72098,72099,72100,72102],{},"Add a new step (",[807,72101,57147],{}," a sub step) below the ‘Interact’ step by choosing ‘Write data to a Google Sheet’.",[14,72104,72105],{},"In the ‘Spreadsheet url’ field, search for the sheet you previously created.",[14,72107,72108],{},"For ‘Sheet Name’, select the tab called 'Posted'. This tab will keep a record of the Posts sent.",[14,72110,72111],{},"To do this in 'Data' select ‘Google-Sheet-data’.",[639,72113,72115],{"id":72114},"_11-delete-rows-from-a-google-sheet","11. Delete rows from a Google Sheet",[592,72117],{"src":72118,"alt":72119},"\u002Fblog\u002Fdelete-rows.png","Delete rows after posted in your Google Sheet",[14,72121,72122],{},"Add the step ‘Delete rows from a Google Sheet' to delete the row of data that has been used to create the post. This is to prevent it from being posted repeatedly.",[14,72124,72125],{},"Using the Step Finder, search for and click ‘Delete rows from a Google Sheet’ in 'Spreadsheet url' to add the spreadsheet.",[14,72127,72128],{},"Then, in ‘First row to delete’ enter the number ‘1’ and repeat this in ‘Last row to delete’.",[14,72130,72131],{},"Set the ‘Sheet name’ to 'Post'.",[14,72133,72134],{},"Well done! The bot is complete and ready to test 👍",[21,72136,72138],{"id":72137},"test-run-your-amazon-post-bot","Test run your Amazon Post bot",[14,72140,72141],{},"Before you do a test run, check that you disabled the sub-step that clicks ‘Post’. If not, make sure you do this now.",[14,72143,72144],{},"It's best practice to test every bot to check it’s production-ready. With the ‘Post’ button disabled, you can do a test run that will not send a Post.",[14,72146,46648],{},[14,72148,71335],{},[555,72150,72151,72154,72157],{},[83,72152,72153],{},"Does the image upload into the Post?",[83,72155,72156],{},"Is the text entered into the Post?",[83,72158,72159],{},"Is the Post saving?",[14,72161,46654],{},[21,72163,72165],{"id":72164},"debugging-your-amazon-post-bot","Debugging your Amazon Post bot",[14,72167,71355],{},[14,72169,71358],{},[14,72171,72172],{},"If the submit button is clicked, but the Post is not saving. Make sure you have added the wait in step 9, increasing the time until the Post saves.",[14,72174,72175,72176,72178],{},"Don't forget we have excellent customer support. If you need help, ",[322,72177,487],{"href":486},"(opens new window)**",[21,72180,46678],{"id":46677},[14,72182,72183,72184,72186],{},"Now you’ve built and run your first bot automating ",[322,72185,19691],{"href":19692},", why not use your new super power to automate other tasks? Another popular use of Axiom in the Amazon ecosystem is to automate the download of reports.",[14,72188,72189,72190],{},"If you do get stuck or need some guidance, we are here to help. Simply post your ",[322,72191,72192],{"href":486},"request here.",[21,72194,67351],{"id":67350},[14,72196,67354,72197,67361,72199,21423],{},[322,72198,67360],{"href":19692},[322,72200,72201],{"href":19675},"scraping Amazon book",{"title":494,"searchDepth":495,"depth":495,"links":72203},[72204,72205,72206,72207,72208,72209,72210,72223,72224,72225,72226],{"id":71876,"depth":498,"text":71877},{"id":71041,"depth":498,"text":71042},{"id":71048,"depth":498,"text":71049},{"id":64263,"depth":498,"text":64264},{"id":71911,"depth":498,"text":71912},{"id":71918,"depth":498,"text":71919},{"id":71925,"depth":498,"text":71926,"children":72211},[72212,72213,72214,72215,72216,72217,72218,72219,72220,72221,72222],{"id":71947,"depth":495,"text":71948},{"id":71963,"depth":495,"text":71964},{"id":71976,"depth":495,"text":71977},{"id":71983,"depth":495,"text":71984},{"id":71992,"depth":495,"text":71993},{"id":72022,"depth":495,"text":72023},{"id":72051,"depth":495,"text":72052},{"id":72078,"depth":495,"text":72079},{"id":72085,"depth":495,"text":72086},{"id":72095,"depth":495,"text":72096},{"id":72114,"depth":495,"text":72115},{"id":72137,"depth":498,"text":72138},{"id":72164,"depth":498,"text":72165},{"id":46677,"depth":498,"text":46678},{"id":67350,"depth":498,"text":67351},"2022-09-15","A guide showing you how to make a bot without code to automate Amazon Posts.",{"read":50549,"type":513,"tool":72230,"category":72231,"tags":72232,"location":46733,"featuredimg":71422,"landingimg":72233,"summary":72234,"metaTitle":72235},[46728],[53990],[53417,67389,11532],"\u002Fblog\u002Famaazon-post.jpg","A step by step guide showing you how to make bots without code to automate sending Amazon posts in the browser","How to automate an Amazon Posts without code",{"title":71865,"description":72228},"blog\u002Famazon-posts","Md9GpNAkjTceu8XcB9BbShsRGZMBerwiApV_mCqkFZg",[53990],[513],[46728],{"id":72243,"title":72244,"author":70410,"body":72245,"date":72524,"description":72525,"draft":26250,"extension":506,"meta":72526,"navigation":522,"path":71892,"seo":72536,"stem":72537,"__hash__":72538,"pinned":-1,"category":72539,"type":72540,"tool":72541},"blog\u002Fblog\u002Fwhat-is-amazon-automation.md","What is Amazon Automation?",{"type":8,"value":72246,"toc":72508},[72247,72250,72256,72259,72262,72265,72268,72272,72275,72278,72282,72285,72288,72291,72298,72312,72315,72319,72322,72330,72333,72337,72345,72348,72351,72355,72362,72365,72368,72372,72375,72378,72381,72384,72387,72391,72394,72397,72400,72411,72415,72418,72421,72424,72432,72436,72439,72442,72445,72448,72452,72455,72458,72469,72473,72476,72479,72482,72486,72489,72492,72498,72500],[14,72248,72249],{},"Amazon automation refers to a wide-ranging set of technologies, processes and services that automatically perform tasks in your business. There are a number of approaches to this, including automated order fulfilment systems, end-to-end services and specialised software.",[14,72251,72252,72255],{},[322,72253,72254],{"href":19666},"Amazon automation"," is a useful string to have in your bow at all ends of the spectrum.",[14,72257,72258],{},"For the big players, these tools allow them to operate more efficiently at scale. As your business grows larger, finding ways of streamlining processes become more and more important.",[18,72260],{"alt":72261},"What is amazon automation?",[14,72263,72264],{},"For the individual seller or small business, time is often very limited and you always have too much to do. Without the luxury of having a dedicated team to perform certain tasks, automation take a vital role in helping things run more smoothly.",[14,72266,72267],{},"In this article we’ll discuss many of the tasks you might want to automate, and the ways you can automate them. In particular, we’ll be looking at the role software bots can play in the larger automation ecosystem, and how they can reach areas that other tools find hard to scratch.",[21,72269,72271],{"id":72270},"order-fulfilment","Order fulfilment",[14,72273,72274],{},"It goes without saying (but I will anyway) that the main task involved in selling products is to actually get those products to your customers. It’s true that you could use the tried and true method of buying stock, storing it in your garage, filling out shipping labels by hand and then taking it to a post office. But doing all this yourself requires significant investments in space and in time.",[14,72276,72277],{},"Luckily, in 2022 this facet of automation is well-developed. The major way bots can help here is via a process called automated dropshipping, which we’ll cover below, but there are certainly other tempting options in this space. For completeness, let’s take a look at them first.",[639,72279,72281],{"id":72280},"fulfilled-by-amazon-fba","Fulfilled by Amazon (FBA)",[14,72283,72284],{},"FBA is the silverback gorilla of the Amazon automation world, the first one that any business should consider when considering how to automate their Amazon processes.",[14,72286,72287],{},"So what actually is FBA? Well, it’s simple: as the name suggests, you outsource the fulfilment of the order for Amazon to take care of. Amazon will handle inventory, packaging, and managing delivery and returns; a complete service from order to door. As you might imagine, this takes a huge amount of work out of selling products.",[14,72289,72290],{},"FBA products also qualify for Amazon Prime and its free shipping options, as well as providing assurance to your customers that any order they place with you will be well-managed.",[14,72292,72293,72294,72297],{},"While this a great option for new and smaller ",[322,72295,72296],{"href":19675},"Amazon sellers",", bear in mind that there are costs associated with FBA. These include:",[80,72299,72300,72303,72306,72309],{},[83,72301,72302],{},"Basic fees to fulfil each order",[83,72304,72305],{},"Costs to store your products (particularly over a long period of time)",[83,72307,72308],{},"Returns processing fees",[83,72310,72311],{},"Extra costs for large items",[14,72313,72314],{},"In addition to this you have to managing supplying Amazon with your inventory, which involves correctly labelling and shipping your products to an Amazon warehouse. This work can quickly ramp up! If you want to avoid this hassle, your best option is to try dropshipping, which we’ll cover below.",[639,72316,72318],{"id":72317},"third-party-logistics-services","Third party logistics services",[14,72320,72321],{},"There are other similar services to FBA, offered by third parties. These are usually called third party logistics services, or 3PL. They have a couple of advantages for larger businesses or those with well-developed brands:",[80,72323,72324,72327],{},[83,72325,72326],{},"Ability to access your products physically in storage",[83,72328,72329],{},"Store independence, allowing you to fulfil with other ecosystems besides Amazon within the same process",[14,72331,72332],{},"For the smaller seller these perks are unlikely to be necessary.",[639,72334,72336],{"id":72335},"the-amazon-automation-store","The Amazon Automation Store",[14,72338,5070,72339,72341,72342,72344],{},[322,72340,72254],{"href":19675}," is a true end-to-end solution: a third party that essentially runs your entire ",[322,72343,67110],{"href":67109}," for you! For a price, of course.",[14,72346,72347],{},"As well as order fulfilment services, these companies and products are likely to offer further automation options such as listings optimisation, inventory management, order reports and tracking and so on. At their best, these stores are run by experienced professionals who have gone through the arduous process of running stores many times, and can help you avoid many of the pitfalls associated with creating an online store.",[14,72349,72350],{},"The Automation Store is not necessarily “automation” in the technical sense that we might normally think about it. In fact, under the hood the automation store could be doing everything manually! But from your perspective as a store owner, it doesn’t much matter - in the end, everything does get done for you.",[639,72352,72354],{"id":72353},"are-amazon-automation-stores-a-scam","Are Amazon Automation Stores a scam?",[14,72356,72357,72358,72361],{},"As contracting with an ",[322,72359,72360],{"href":67109},"Amazon Automation Store"," is essentially handing over the keys to the kingdom, there are unfortunately scammers operating in this space. You should think carefully before considering such a hands-off approach.",[14,72363,72364],{},"Particular red flags include charging a large amount of money upfront or asking for a large percentage of your profits. This is because one mecahnism for a scam involves asking for a money to be forwarded to “buy stock”, and then to create fake orders using this money which they then extract their % fee from. The result is that you will essentially be paid back only a proportion of your initial investment before sales mysteriously dry up; the scammer keeps the rest, having done nothing.",[14,72366,72367],{},"In the end, for most sellers the best option is to use FBA or 3PL along with other automated software tools, such as bots, to streamline other parts of your business.",[639,72369,72371],{"id":72370},"automated-dropshipping","Automated dropshipping",[14,72373,72374],{},"Dropshipping involves taking an order from Amazon and then fulfilling the order elsewhere, at a different store. This second store then handles the fulfilment of the order.",[14,72376,72377],{},"The usual way of achieving this is to simply take the order using the Amazon store, and then manually fulfil it on a different store by creating an order on behalf of your customer and entering their address as the shipping option. This is particlarly tempting when you want to supply niche products and find Amazon’s FBA or other third parties too expensive for your taste, or in any situation where collecting and sending products to an Amazon warehouse is simply too time consuming. It’s also a great option if you want to only purchase stock at the point of order, which reduces your financial risk as you don’t need to buy goods ahead of time.",[14,72379,72380],{},"However, manually fulfilling orders like this is still time consuming and is hard to scale up, particularly if this is a side hustle for you. The solution, again, is automation - in this case, automatically creating the order with the third party store when a customer makes a purchase.",[14,72382,72383],{},"There are a number of dropshipping tools available for Amazon, but usually these rely on an existing integration between web store platforms. The advantage of this is that they are very simple to set up, but whether you can do so often depends on the technology the fulfilling store is using. If it’s a Shopify site, great! If it’s a more niche platform… well, you might struggle to get things to work.",[14,72385,72386],{},"If this is the case, bots to the rescue! The bot will essentially replicate the manual steps that you take yourself when creating the order, and so do not require any special tool or integration. As long as you can fulfil the order manually using the UI, so can the bot.",[21,72388,72390],{"id":72389},"product-listing-optimization","Product Listing optimization",[14,72392,72393],{},"Making sure your products rank for the right keywords is obviously important if you want to make consistent sales.",[14,72395,72396],{},"This is another huge area where automation flourishes, and there are dedicated tools to help with this, for example Helium10 and Zoof. These tools are able to collect masses of metadata on your products and indicate how well they’re ranking on Amazon. You can monitor any changes to keywords here from within their dashboard and track their effects on rankings and sales.",[14,72398,72399],{},"It’s also common to use bots to assist in this process. Here are some ideas we’ve seen:",[80,72401,72402,72405,72408],{},[83,72403,72404],{},"Check Amazon search for your product ranking and write this to a sheet",[83,72406,72407],{},"Automatically bulk-update keywords",[83,72409,72410],{},"Find competitor products on the store and compare their rankings, price etc. with yours",[21,72412,72414],{"id":72413},"automated-report-collation","Automated report collation",[14,72416,72417],{},"This is something we have seen a lot of Axiom users tackling. Amazon provides a lot of great reporting functionality, and third party automation tools provide even more. This is great, but the price of all this power is that masses of data can be generated, and processing these then becomes another large manual task.",[14,72419,72420],{},"If you find yourself manually downloading reports, or finding data and copying and pasting into spreadsheets to summarise what’s happening with your products, then bots just might be able to help you out.",[14,72422,72423],{},"You can, for example, build bots that can:",[80,72425,72426,72429],{},[83,72427,72428],{},"Automatically download reports from Amazon each day and organise them into folders",[83,72430,72431],{},"Scrape data from reporting tools and paste it into sheets",[21,72433,72435],{"id":72434},"ppc-management","PPC management",[14,72437,72438],{},"PPC stands for “Pay per click” and these tools help you manage your advertisement campaigns within the Amazon ecosystem.",[14,72440,72441],{},"As with many ad systems, the Amazon “Sponsored” content can be a labyrinth to navigate. Amazon PPC operates using a bidding system, where advertisers set their budget and place bids on keywords in order to be given a good ranking. The more competitive the keyword and the larger the prospective audience, the more expensive the bid. Finding good keywords which maximise the efficiency of your bid’s cost to views ratio is a complex job.",[14,72443,72444],{},"The main function that PPC automation tools bring is the ability to dynamically adjust your bids so that your products are always being served to the best possible audience for your bid price. This can save a huge amount of both manual work and money!",[14,72446,72447],{},"We’d recommend leaving this facet of automation to a dedicated tool. While you could in theory create a bot to help with PPC management, it would likely be much slower to react. In a space where siezing the moment is of the utmost importance, this isn’t ideal.",[21,72449,72451],{"id":72450},"feedback-management","Feedback management",[14,72453,72454],{},"These products retrieve reviews from Amazon and help you filter and organise them all, as well as providing other extra functionality.",[14,72456,72457],{},"Bots can assist with this in a couple of ways:",[80,72459,72460,72463,72466],{},[83,72461,72462],{},"Retrieve review data and store it in reports automatically",[83,72464,72465],{},"Bulk or auto respond to reviews - this can be particularly powerful when paired with metadata from the backend",[83,72467,72468],{},"Automatically upvote new reviews, questions or answers",[21,72470,72472],{"id":72471},"automating-on-a-budget","Automating on a budget",[14,72474,72475],{},"One thing to bear in mind about automation tools is that the more specialised software you install, and the more power you gain access to, the higer your costs can be. Large platforms that can do everything under the sun are usually reserved for big companies with big operations budgets, and that can leave the smaller sellers struggling to complete.",[14,72477,72478],{},"One advantage that bots have here is that they are a general solution rather than being a specialised system. This allows you to automate a wide variety of tasks without special software or integrations needing to be built to handle them - and the cost of those integrations is always passed onto the consumer.",[14,72480,72481],{},"Bots also allow you to start small and scale up, rather than buying into a large software package which may contain many features you don’t yet need. This can be a great help as you’re bootstrapping your business.",[21,72483,72485],{"id":72484},"summing-up","Summing up",[14,72487,72488],{},"In this article we’ve covered what we consider the most important facets of Amazon automation from a general perspective, as well as providing a few ideas on how you might be able to use bots to supercharge your processes. 🚀",[14,72490,72491],{},"If anything here sounded interesting, why not sign up to axiom and have a go?",[14,72493,72494,72495,72497],{},"Or if you’ve got a cool idea, send us an email at ",[322,72496,3997],{"href":3996}," - maybe we can help you build something amazing.",[21,72499,67351],{"id":67350},[14,72501,67354,72502,2004,72504,67361,72506,21423],{},[322,72503,67357],{"href":19666},[322,72505,67360],{"href":19692},[322,72507,72201],{"href":19675},{"title":494,"searchDepth":495,"depth":495,"links":72509},[72510,72517,72518,72519,72520,72521,72522,72523],{"id":72270,"depth":498,"text":72271,"children":72511},[72512,72513,72514,72515,72516],{"id":72280,"depth":495,"text":72281},{"id":72317,"depth":495,"text":72318},{"id":72335,"depth":495,"text":72336},{"id":72353,"depth":495,"text":72354},{"id":72370,"depth":495,"text":72371},{"id":72389,"depth":498,"text":72390},{"id":72413,"depth":498,"text":72414},{"id":72434,"depth":498,"text":72435},{"id":72450,"depth":498,"text":72451},{"id":72471,"depth":498,"text":72472},{"id":72484,"depth":498,"text":72485},{"id":67350,"depth":498,"text":67351},"2022-08-15","A deep dive into all the major tasks you can automate in your Amazon store, and how software bots can fit in.",{"read":70686,"type":513,"tool":72527,"category":72528,"tags":72529,"location":46733,"featuredimg":72533,"landingimg":72534,"summary":72525,"metaTitle":72535},[46728],[53990],[67389,69641,72530,72531,72532],"fulfilment","FBA","dropshipping","\u002Fblog\u002Famazon-automation-axiom.jpg","\u002Fblog\u002Famazon-automation.jpg","What is Amazon Automation? | Axiom Academy",{"title":72244,"description":72525},"blog\u002Fwhat-is-amazon-automation","ZiRul0QPf15j4F_3IvaTcnHtS2gTDsn0jcAWucry8kw",[53990],[513],[46728],{"id":72543,"title":72544,"author":71599,"body":72545,"date":72962,"description":72963,"draft":26250,"extension":506,"meta":72964,"navigation":522,"path":72972,"seo":72973,"stem":72974,"__hash__":72975,"pinned":-1,"category":72976,"type":72977,"tool":72978},"blog\u002Fblog\u002Fwhat-is-youtube-automation.md","What is YouTube automation?",{"type":8,"value":72546,"toc":72945},[72547,72550,72553,72556,72573,72576,72579,72583,72587,72590,72593,72596,72600,72603,72606,72609,72612,72616,72619,72625,72628,72631,72634,72637,72640,72643,72646,72657,72660,72666,72669,72681,72684,72687,72694,72697,72705,72708,72711,72714,72717,72720,72723,72726,72729,72737,72740,72743,72746,72749,72754,72757,72763,72766,72771,72774,72780,72790,72793,72796,72799,72805,72808,72811,72815,72818,72821,72828,72845,72848,72853,72858,72861,72864,72875,72889,72894,72904,72909,72912,72919,72922,72925,72930,72933,72937,72942],[14,72548,72549],{},"YouTube Automation is an umbrella term that actually means different things to different people. You could say the term is ambiguous, depending on context.",[18,72551],{"alt":72552},"What is youtube automation",[14,72554,72555],{},"Broadly, there’s 3 things that fall under the Umbrella:",[80,72557,72558,72563,72568],{},[83,72559,72560],{},[29,72561,72562],{},"Outsourcing the production of YouTube Videos",[83,72564,72565],{},[29,72566,72567],{},"Automating YouTube engagement",[83,72569,72570],{},[29,72571,72572],{},"Automating YouTube channel management",[14,72574,72575],{},"Automation can range from putting your channel on auto-pilot with outsourcing, legitimate use of software, to shady tactics that violate YouTube’s Terms of Service - and may even get your account banned!",[14,72577,72578],{},"Let’s break down what each of these mean in more detail, as well as go into YouTube’s terms of service to see what is and isn’t allowed.",[21,72580,72582],{"id":72581},"outsourcing-the-production-of-youtube-videos","Outsourcing the production of YouTube videos",[639,72584,72586],{"id":72585},"what-is-it","What is it?",[14,72588,72589],{},"Generally this involves paying an agency or freelancer to take over video production for you.",[14,72591,72592],{},"You are then responsible for uploading, managing the channel, and marketing it - though some agencies will help with this too. The key idea here is that you are the channel owner, but you give the hard work to someone else. You might say your channel has been \"put on auto-pilot\", but, strictly speaking, automation is a misnomer here.",[14,72594,72595],{},"A more accurate term for this would be \"YouTube outsourcing\". However, these service providers often use automated tools and paid audiences to boost engagement, which leads to the outsourcing and automation components of their service becoming conflated.",[639,72597,72599],{"id":72598},"does-youtube-allow-this","Does YouTube allow this?",[14,72601,72602],{},"Outsourcing is no problem at all, and is an established part of the YouTube ecosystem which YouTube accepts (and even encourages) if it improves production quality.",[14,72604,72605],{},"The same is not true of automating engagement  - see below.",[14,72607,72608],{},"YouTube’s terms of service doesn’t discuss outsourcing but it does discuss copyright. Please ensure you own the necessary intellectual property, not the agency, when posting your videos.",[14,72610,72611],{},"It can certainly happen that contractors in the service sector later claim some intellectual property when a project goes on to be successful. Stipulate your IP and copyright clearly in your contract.",[639,72613,72615],{"id":72614},"how-do-i-do-this","How do I do this?",[14,72617,72618],{},"If you have the money, it’s not hard to find YouTube agencies. Be warned though - agencies selling fake engagement brings risks, not guaranteed rewards, as we’ll discuss below.",[14,72620,72621],{},[322,72622,72623],{"href":72623,"rel":72624},"https:\u002F\u002Fwww.google.com\u002Fsearch?q=youtube+production+agencies",[2245],[21,72626,72567],{"id":72627},"automating-youtube-engagement",[639,72629,72586],{"id":72630},"what-is-it-1",[14,72632,72633],{},"Using bots, or fake audiences of real people, to create the false impression of a channel or video’s popularity.",[14,72635,72636],{},"Some might also include data-scraping in this category, but we would argue the intent is quite different, and it has been treated differently by the American courts (see below).",[639,72638,72599],{"id":72639},"does-youtube-allow-this-1",[14,72641,72642],{},"In a word, ‘no’.",[14,72644,72645],{},"Activities like:",[80,72647,72648,72651,72654],{},[83,72649,72650],{},"Fake engagement",[83,72652,72653],{},"Fake likes\u002Fdislikes",[83,72655,72656],{},"Generally using bots to perform activities humans are not doing",[14,72658,72659],{},"Will always violate TOS and YouTube will steps will be taken to remove them. YouTube’s algorithms can retrospectively remove engagement generated by bots, even if it seems successful at first.",[14,72661,72662],{},[322,72663,72664],{"href":72664,"rel":72665},"https:\u002F\u002Fwww.youtube.com\u002Fstatic?gl=GB&template=terms",[2245],[14,72667,72668],{},"YouTube’s current TOS stipulate use of no automated software, unless their request has been approved in writing:",[80,72670,72671],{},[83,72672,72673,72674],{},"…",[807,72675,72676,72677,72680],{},".access the Service using any automated means (such as robots, botnets or scrapers) except: (a) in the case of public search engines, in accordance with YouTube’s robots.txt file; (b) with ",[29,72678,72679],{},"YouTube’s prior written permission;"," or (c) as permitted by applicable law;",[14,72682,72683],{},"However, depending on the activity and intent, we think prohibiting any kind of automation software is both impractical and seemingly legally unenforceable - as you’ll see in the next section.",[14,72685,72686],{},"Of course, if your activity and intent is to dishonestly distort engagement, their TOS are quite clear:",[80,72688,72689],{},[83,72690,72691],{},[807,72692,72693],{},"….cause or encourage any inaccurate measurements of genuine user engagement with the Service, including by paying people or providing them with incentives to increase a video’s views, likes, or dislikes, or to increase a channel’s subscribers, or otherwise manipulate metrics;",[14,72695,72696],{},"If you’re doing something more honest - like scraping public data, or automating repetitive work, our experience is that YouTube does not block this, provided you are doing it on the scale of saving a human’s time. i.e:",[80,72698,72699,72702],{},[83,72700,72701],{},"❌ Build a ‘botnet’ of 50 bots to fake an activity humans are not doing.",[83,72703,72704],{},"✅ Use 1 bot to save 1 person from repetitive work.",[14,72706,72707],{},"YouTube’s previous TOS used to explicitly allow this, but they’ve become more conservative as of 2022 - we'll discuss this further later on.",[639,72709,72615],{"id":72710},"how-do-i-do-this-1",[14,72712,72713],{},"Although it's possible to do this with bot tools like Axiom, we do not recommend it, and if you do it at any scale we will be forced to stop it.",[14,72715,72716],{},"But If you want to automate repetitive admin work a human is already doing - read on, we're happy to help.",[14,72718,72719],{},"This brings us to our final type of YouTube automation.",[21,72721,72572],{"id":72722},"automating-youtube-channel-management",[639,72724,72586],{"id":72725},"what-is-it-2",[14,72727,72728],{},"Automating the administrative functions of a channel. This could include:",[80,72730,72731,72734],{},[83,72732,72733],{},"Scraping data",[83,72735,72736],{},"Automating admin - data reports and content uploads",[639,72738,72599],{"id":72739},"does-youtube-allow-this-2",[14,72741,72742],{},"Technically 'no', but practically 'yes'.",[14,72744,72745],{},"Their TOS stipulate you need to write for explicit permission to automate. This isn't practically possible, as Google famously have near-zero customer support.",[14,72747,72748],{},"Empirically, we've observed YouTube and other platform businesses, do not block automations that help with administrative work for content creators.",[14,72750,72751],{},[29,72752,72753],{},"Scraping Data",[14,72755,72756],{},"Some activities data-scraping have been ruled  explicitly acceptable by the US courts, even if the terms of service restrict it - a TOS can’t stipulate whatever it likes!",[14,72758,72759],{},[322,72760,72761],{"href":72761,"rel":72762},"https:\u002F\u002Fwww.forbes.com\u002Fsites\u002Fzacharysmith\u002F2022\u002F04\u002F18\u002Fscraping-data-from-linkedin-profiles-is-legal-appeals-court-rules\u002F?sh=5176263b2a9c",[2245],[14,72764,72765],{},"Essentially, if you’re scraping and operating on public data that search engines can index, scraping this is fine.  After all, a scraper is really just a search-crawler for private use!",[14,72767,72768],{},[29,72769,72770],{},"Automating admin - reports and uploads",[14,72772,72773],{},"YouTube’s prior TOS, used to permit bots that operated at the speed of humans:",[14,72775,72776],{},[322,72777,72778],{"href":72778,"rel":72779},"https:\u002F\u002Ftldrlegal.com\u002Flicense\u002Fyoutube-terms-of-service",[2245],[80,72781,72782],{},[83,72783,72784],{},[807,72785,72786,72787],{},"You agree not to use or launch any automated system, including without limitation, \"robots,\" \"spiders,\" or \"offline readers,\" that accesses the Service ",[29,72788,72789],{},"in a manner that sends more request messages to the YouTube servers in a given period of time than a human can reasonably produce",[14,72791,72792],{},"As you saw previously, the current TOS stipulates if you want to do this, you have to e-mail them your request in writing.",[14,72794,72795],{},"To stay 100% within the letter of their TOS,  you should email them before automating... Of course, Google's support are not known for being easy to contact 😏",[14,72797,72798],{},"To save time, our simple advice is; if you’re automating ‘honest work’ a human is already doing, there are no issues. We have many customers who run such automations with no problem.",[14,72800,72801,72802,72804],{},"YouTube’s problem is really with the previous case of faking engagement - ",[807,72803,57147],{}," administrative work. If anything, tech companies like tools that make it easier to produce quality content on their platform.",[639,72806,72615],{"id":72807},"how-do-i-do-this-2",[14,72809,72810],{},"Axiom is great for this!",[14,72812,72813],{},[29,72814,72753],{},[14,72816,72817],{},"Axiom works well as a general data-scraper, and performs well on YouTube and YouTube studio.",[14,72819,72820],{},"If you’re scraping the frontend of YouTube, our main tip is to scrape with the video paused. Youtube takes a little while to load and start the video, and Axiom will wait patiently until that process has finished before it starts scraping.",[14,72822,72823,72824,72827],{},"A cool tip for automatically pausing the video is to set a time beyond the video start, by appending ",[90,72825,72826],{},"&t=999999s"," at the end of the URL.",[719,72829,72833],{"className":72830,"code":72831,"language":72832,"meta":494,"style":494},"language-jsx shiki shiki-themes github-light-default github-dark-default","https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=R2-TpQBgYcg&t=999999s\n","jsx",[90,72834,72835],{"__ignoreMap":494},[727,72836,72837,72840,72842],{"class":729,"line":730},[727,72838,72839],{"class":733},"https",[727,72841,6987],{"class":768},[727,72843,72844],{"class":2920},"\u002F\u002Fwww.youtube.com\u002Fwatch?v=R2-TpQBgYcg&t=999999s\n",[14,72846,72847],{},"We have plenty of web-scraping tips to get you started here:",[14,72849,72850],{},[322,72851,72852],{"href":23846},"https:\u002F\u002Fdocs.axiom.ai\u002Fblog\u002F5-problems-webscrapers",[14,72854,72855],{},[29,72856,72857],{},"Automating admin - reports",[14,72859,72860],{},"Most reports are generated from YouTube studio data.",[14,72862,72863],{},"To scrape this data and generate a report in Google Sheets (that can be used to make slideshows), follow these steps:",[555,72865,72866,72869,72872],{},[83,72867,72868],{},"Click on \"Advanced mode\" in YouTube studio.",[83,72870,72871],{},"Setup filters so the page you are viewing has the data you need",[83,72873,72874],{},"Use axiom’s “Interact with a page’s interface” - copy the URL you are on, like this below, to the ‘go to URL’ step.",[719,72876,72878],{"className":72830,"code":72877,"language":72832,"meta":494,"style":494},"https:\u002F\u002Fstudio.youtube.com\u002Fvideo\u002Fg8dLUELGrIk\u002Fanalytics\u002Ftab-interest_viewers\u002Fperiod-default\u002Fexplore?entity_type=VIDEO&entity_id=g8dLUELGrIk&time_period=4_weeks&explore_type=TABLE_AND_CHART&metric=VIEWS&granularity=DAY&t_metrics=VIEWS&t_metrics=WATCH_TIME&t_metrics=SUBSCRIBERS_NET_CHANGE&t_metrics=TOTAL_ESTIMATED_EARNINGS&t_metrics=VIDEO_THUMBNAIL_IMPRESSIONS&t_metrics=VIDEO_THUMBNAIL_IMPRESSIONS_VTR&dimension=VIDEO&o_column=VIEWS&o_direction=ANALYTICS_ORDER_DIRECTION_DESC\n",[90,72879,72880],{"__ignoreMap":494},[727,72881,72882,72884,72886],{"class":729,"line":730},[727,72883,72839],{"class":733},[727,72885,6987],{"class":768},[727,72887,72888],{"class":2920},"\u002F\u002Fstudio.youtube.com\u002Fvideo\u002Fg8dLUELGrIk\u002Fanalytics\u002Ftab-interest_viewers\u002Fperiod-default\u002Fexplore?entity_type=VIDEO&entity_id=g8dLUELGrIk&time_period=4_weeks&explore_type=TABLE_AND_CHART&metric=VIEWS&granularity=DAY&t_metrics=VIEWS&t_metrics=WATCH_TIME&t_metrics=SUBSCRIBERS_NET_CHANGE&t_metrics=TOTAL_ESTIMATED_EARNINGS&t_metrics=VIDEO_THUMBNAIL_IMPRESSIONS&t_metrics=VIDEO_THUMBNAIL_IMPRESSIONS_VTR&dimension=VIDEO&o_column=VIEWS&o_direction=ANALYTICS_ORDER_DIRECTION_DESC\n",[555,72890,72891],{"start":1895},[83,72892,72893],{},"Scrape data from each URL using axiom’s \"get data\" step.",[14,72895,72896,72900],{},[322,72897,72899],{"href":72898},"\u002Fblog\u002Fhow-to-automate-data-google-sheets","https:\u002F\u002Fdocs.axiom.ai\u002Fblog\u002Fhow-to-automate-data-google-sheets",[592,72901],{"src":72902,"alt":72903},"\u002Fblog\u002Fyoutube-scraping.png","Start from blank - build a bot to automate Instagram posting",[555,72905,72906],{"start":1901},[83,72907,72908],{},"Add a ‘Write data to a Google Sheet’ step to consolidate your scraped data into a Google sheet.",[14,72910,72911],{},"It’s possible to generate slides and more from these reports. Check out our guides here!",[14,72913,72914,72916],{},[322,72915,72898],{"href":72898},[29,72917,72918],{},"Automating video uploads",[14,72920,72921],{},"This is also possible in axiom.",[14,72923,72924],{},"The steps are very similar to automating instagram posts, where we specify the posts we want to send in a spreadsheet:",[14,72926,72927,72929],{},[322,72928,13133],{"href":13133},"\nIn this case though, you’ll need to download our Desktop application which will let you upload files from your local machine.",[14,72931,72932],{},"For each file you want to upload, input the path in your Google sheet, and pass this to axiom. Take a look at the following resources for more info on Google sheets and using our Desktop app!",[14,72934,72935],{},[322,72936,9291],{"href":9291},[14,72938,72939],{},[322,72940,72941],{"href":72941},"\u002Fdocs\u002Ffaq\u002Fgeneral#does-axiom-come-with-a-desktop-app",[811,72943,72944],{},"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 .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":494,"searchDepth":495,"depth":495,"links":72946},[72947,72952,72957],{"id":72581,"depth":498,"text":72582,"children":72948},[72949,72950,72951],{"id":72585,"depth":495,"text":72586},{"id":72598,"depth":495,"text":72599},{"id":72614,"depth":495,"text":72615},{"id":72627,"depth":498,"text":72567,"children":72953},[72954,72955,72956],{"id":72630,"depth":495,"text":72586},{"id":72639,"depth":495,"text":72599},{"id":72710,"depth":495,"text":72615},{"id":72722,"depth":498,"text":72572,"children":72958},[72959,72960,72961],{"id":72725,"depth":495,"text":72586},{"id":72739,"depth":495,"text":72599},{"id":72807,"depth":495,"text":72615},"2022-08-05","If you're confused, you're not alone. YouTube automation means different things, depending on whom you ask",{"read":70686,"type":513,"tool":72965,"category":72966,"tags":72967,"location":46733,"featuredimg":72970,"landingimg":72971,"summary":72963},[46728],[53990],[72968,3974,72969],"youtube","channel","\u002Fblog\u002Fyoutube-automate-axiom.ai.jpg","\u002Fblog\u002Fyoutube-icon.png","\u002Fblog\u002Fwhat-is-youtube-automation",{"title":72544,"description":72963},"blog\u002Fwhat-is-youtube-automation","n-JSyxtsF9ONVGtgvXhnQMN1MYDx7bPIPL1mebjIfSU",[53990],[513],[46728],{"id":72980,"title":72981,"author":46205,"body":72982,"date":75721,"description":75722,"draft":26250,"extension":506,"meta":75723,"navigation":522,"path":23851,"seo":75729,"stem":75730,"__hash__":75731,"pinned":-1,"category":75732,"type":75733,"tool":75734},"blog\u002Fblog\u002Fcss-attribute-selectors.md","How can CSS attribute selectors be used for web scraping?",{"type":8,"value":72983,"toc":75693},[72984,72994,72996,72999,73046,73052,73055,73058,73062,73073,73076,73102,73105,73148,73151,73155,73164,73167,73247,73250,73268,73271,73274,73277,73281,73284,73288,73291,73294,73345,73348,73351,73385,73389,73392,73395,73423,73430,73439,73443,73446,73449,73475,73482,73491,73494,73500,73506,73512,73516,73519,73523,73526,73738,73741,73744,73782,73786,73789,73815,73818,73845,73852,73856,73859,73862,73870,73874,73877,73881,73884,73887,74087,74090,74110,74113,74117,74120,74123,74312,74315,74334,74337,74357,74360,74364,74367,74370,75077,75080,75112,75115,75118,75126,75130,75133,75157,75163,75167,75170,75173,75177,75180,75184,75187,75191,75197,75200,75204,75208,75211,75214,75218,75221,75224,75237,75240,75244,75248,75251,75254,75256,75259,75439,75442,75478,75481,75485,75488,75491,75495,75498,75501,75504,75615,75618,75638,75642,75645,75648,75652,75655,75658,75674,75676,75679,75682,75687,75690],[14,72985,72986,72987,72990,72991,72993],{},"Want to ",[322,72988,72989],{"href":19716},"scrape data from a web page?"," axiom.ai makes it easy with our 'Get data from the webpage' Step. Our ",[322,72992,48366],{"href":11340}," lets you easily select the content you want to scrape by pointing and clicking.",[18,72995],{},[14,72997,72998],{},"However, occasionally the selector tool can fail to return the correct results. When this happens, will display an error message such as this:",[719,73000,73002],{"className":72830,"code":73001,"language":72832,"meta":494,"style":494},"Error in step 1 - \"Get data from a webpage\": Your chosen selectors have failed to find any content on page 'https:\u002F\u002Fwww.bbc.co.uk\u002F'. If the page is loading too slowly, try adding a min wait. Use Continue on error if you want your Axiom to continue.\nLearn more about common errors\n",[90,73003,73004,73041],{"__ignoreMap":494},[727,73005,73006,73009,73012,73014,73016,73019,73022,73025,73028,73031,73033,73036,73038],{"class":729,"line":730},[727,73007,73008],{"class":768},"Error ",[727,73010,73011],{"class":1986},"in",[727,73013,59583],{"class":768},[727,73015,165],{"class":1882},[727,73017,73018],{"class":1986}," -",[727,73020,73021],{"class":737}," \"Get data from a webpage\"",[727,73023,73024],{"class":768},": Your chosen selectors have failed to find any content on page ",[727,73026,73027],{"class":737},"'https:\u002F\u002Fwww.bbc.co.uk\u002F'",[727,73029,73030],{"class":768},". If the page is loading too slowly, ",[727,73032,55159],{"class":1986},[727,73034,73035],{"class":768}," adding a min wait. Use Continue on error ",[727,73037,56759],{"class":1986},[727,73039,73040],{"class":768}," you want your Axiom to continue.\n",[727,73042,73043],{"class":729,"line":498},[727,73044,73045],{"class":768},"Learn more about common errors\n",[14,73047,73048,73049,44],{},"If you experience this issue, you can try using a different selection - but sometimes the problem still persists. In that case, you need a custom selector! One of the most useful custom selectors to know about is the ",[29,73050,73051],{},"attribute selector",[14,73053,73054],{},"In this guide, we'll show you how to find attribute selectors on a webpage. We'll provide some examples of when this may be necessary, and teach you how to use custom selectors with axiom.aii.",[14,73056,73057],{},"So if you follow this guide, you'll be well on your way to becoming a web scraping pro. If you're new at the game, we start with a primer on CSS selectors.",[21,73059,73061],{"id":73060},"what-is-a-css-selector","What is a CSS selector?",[14,73063,73064,73065,73068,73069,73072],{},"CSS selectors are one of the two parts of a CSS rule, which are for creating the visual style of HTML elements. These two parts are the ",[807,73066,73067],{},"selector",", which determines which element to apply the style to, and the ",[807,73070,73071],{},"declaration",", which is a set of instructions for specifying the appearance of the element.",[14,73074,73075],{},"Here, the CSS selector called \".xl-red-font” is applied to a html element inside a class.",[719,73077,73079],{"className":72830,"code":73078,"language":72832,"meta":494,"style":494},"\u003Ch1 class=\"xl-red-font\">Makes this text large and red\u003C\u002Fh1>\n",[90,73080,73081],{"__ignoreMap":494},[727,73082,73083,73085,73088,73090,73092,73095,73098,73100],{"class":729,"line":730},[727,73084,18130],{"class":768},[727,73086,73087],{"class":7745},"h1",[727,73089,57617],{"class":1882},[727,73091,4970],{"class":1986},[727,73093,73094],{"class":737},"\"xl-red-font\"",[727,73096,73097],{"class":768},">Makes this text large and red\u003C\u002F",[727,73099,73087],{"class":7745},[727,73101,56240],{"class":768},[14,73103,73104],{},"If we wanted this header text to be shown as a gigantic red font, the entire rule would be as follows:",[719,73106,73108],{"className":72830,"code":73107,"language":72832,"meta":494,"style":494},".xl-red-font {\n    color: red;\n    font-size: 1090px;\n}\n",[90,73109,73110,73124,73132,73144],{"__ignoreMap":494},[727,73111,73112,73115,73117,73119,73121],{"class":729,"line":730},[727,73113,73114],{"class":768},".xl",[727,73116,17337],{"class":1986},[727,73118,60247],{"class":768},[727,73120,17337],{"class":1986},[727,73122,73123],{"class":768},"font {\n",[727,73125,73126,73129],{"class":729,"line":498},[727,73127,73128],{"class":733},"    color",[727,73130,73131],{"class":768},": red;\n",[727,73133,73134,73137,73139,73141],{"class":729,"line":495},[727,73135,73136],{"class":768},"    font",[727,73138,17337],{"class":1986},[727,73140,3264],{"class":733},[727,73142,73143],{"class":768},": 1090px;\n",[727,73145,73146],{"class":729,"line":1895},[727,73147,2639],{"class":768},[14,73149,73150],{},"The CSS selector is the “.xl-red-font” part that appears in the HTML, specifying which element should be selected - hence its name. The declaration lives within the curly braces and sets the visual style. In this case, it’s big and red!",[21,73152,73154],{"id":73153},"what-is-a-css-attribute-selector","What is a CSS attribute selector?",[14,73156,73157,73158,450,73161,73163],{},"These selectors allow you to choose elements based on their HTML attributes. Much like with CSS, HTML is split into component parts. In this case we can think of HTML as consisting of ",[807,73159,73160],{},"elements",[807,73162,60142],{},". The element is the type of HTML entity to render, such as a link (”a”) or a button (”button”) or a header (”h1”, “h2” etc.). The attributes are everything else.",[14,73165,73166],{},"The following example HTML specifies an “input” element with a number of attributes - “class”, “autocapitalize”, “autocomplete” etc. are all HTML attributes.",[719,73168,73170],{"className":58663,"code":73169,"language":58665,"meta":494,"style":494},"\u003Cinput class=\"\" autocapitalize=\"none\" autocomplete=\"off\" autocorrect=\"off\" id=\"react-select-choose-a-tone-input\" spellcheck=\"false\" tabindex=\"0\" type=\"text\" aria-autocomplete=\"list\" aria-expanded=\"false\" aria-haspopup=\"true\" aria-label=\"choose-a-tone\" aria-labelledby=\"choose-a-tone\" role=\"combobox\" value=\"\" style=\"color: inherit; background: 0px center; opacity: 1; width: 100%; grid-area: 1 \u002F 2 \u002F auto \u002F auto; font: inherit; min-width: 2px; border: 0px; margin: 0px; outline: 0px; padding: 0px;\">\n",[90,73171,73172],{"__ignoreMap":494},[727,73173,73174,73176,73178,73181,73184,73187,73190,73193,73196,73199,73202,73205,73208,73211,73214,73217,73220,73222,73224,73227,73230,73233,73236,73239,73242,73245],{"class":729,"line":730},[727,73175,18130],{"class":768},[727,73177,57536],{"class":7745},[727,73179,73180],{"class":768}," class=\"\" autocapitalize=\"none\" autocomplete=\"off\" autocorrect=\"off\" id=\"",[727,73182,73183],{"class":7745},"react-select-choose-a-tone-input",[727,73185,73186],{"class":768},"\" spellcheck=\"false\" tabindex=\"0\" type=\"text\" ",[727,73188,73189],{"class":7745},"aria-autocomplete",[727,73191,73192],{"class":768},"=\"list\" ",[727,73194,73195],{"class":7745},"aria-expanded",[727,73197,73198],{"class":768},"=\"false\" ",[727,73200,73201],{"class":7745},"aria-haspopup",[727,73203,73204],{"class":768},"=\"true\" ",[727,73206,73207],{"class":7745},"aria-label",[727,73209,73210],{"class":768},"=\"",[727,73212,73213],{"class":7745},"choose-a-tone",[727,73215,73216],{"class":768},"\" ",[727,73218,73219],{"class":7745},"aria-labelledby",[727,73221,73210],{"class":768},[727,73223,73213],{"class":7745},[727,73225,73226],{"class":768},"\" role=\"combobox\" value=\"\" style=\"color: inherit; background: 0px center; opacity: 1; width: 100%; ",[727,73228,73229],{"class":7745},"grid-area",[727,73231,73232],{"class":768},": 1 \u002F 2 \u002F auto \u002F auto; ",[727,73234,73235],{"class":7745},"font",[727,73237,73238],{"class":768},": inherit; ",[727,73240,73241],{"class":7745},"min-width",[727,73243,73244],{"class":768},": 2px; border: 0px; margin: 0px; outline: 0px; padding: 0px;\"",[727,73246,56240],{"class":1986},[14,73248,73249],{},"In order to create an attribute selector, simply take the attribute as it appears in the HTML and wrap it in square brackets. That’s it!",[719,73251,73253],{"className":58663,"code":73252,"language":58665,"meta":494,"style":494},"[aria-labelledby=\"choose-a-tone\"]\n",[90,73254,73255],{"__ignoreMap":494},[727,73256,73257,73259,73261,73263,73266],{"class":729,"line":730},[727,73258,58545],{"class":768},[727,73260,73219],{"class":1882},[727,73262,4970],{"class":1986},[727,73264,73265],{"class":737},"\"choose-a-tone\"",[727,73267,17433],{"class":768},[14,73269,73270],{},"When choosing an attribute to select on, make sure you choose one that uniquely specifies the element you want - otherwise you might end up with the wrong element. In the above example, the “aria-labelledby” attribute is a unique selector that is only present on this element.",[14,73272,73273],{},"Identifying the right attribute can be a bit of an art, but when they contain human-readable text (as above) it’s a lot easier.",[14,73275,73276],{},"Because these selectors contain human readable text, they can often be very useful! For example, Google Maps contains zip codes as attribute selectors in its HTML, which lets you find locations there very conveniently.",[21,73278,73280],{"id":73279},"are-there-other-kinds-of-css-selectors","Are there other kinds of CSS selectors?",[14,73282,73283],{},"There are many other types of CSS selectors, including the ones listed below. Often when constructing a selector, you will use one or more of these selectors in combination with an Attribute selector.",[639,73285,73287],{"id":73286},"the-css-element-selector","The CSS element Selector",[14,73289,73290],{},"We’ve already met elements, and the element selector allows you to target all elements which share a tag name.",[14,73292,73293],{},"Example of HTML element selectors:",[719,73295,73297],{"className":58663,"code":73296,"language":58665,"meta":494,"style":494},"\u003Ch1>,\u003Cspan>,\u003Cdiv>,\u003Cstrong>,\u003Ca>,\u003Cinput>,\u003Cbutton>\n",[90,73298,73299],{"__ignoreMap":494},[727,73300,73301,73303,73305,73307,73310,73312,73314,73316,73318,73320,73322,73324,73326,73328,73330,73332,73334,73336,73338,73340,73343],{"class":729,"line":730},[727,73302,18130],{"class":768},[727,73304,73087],{"class":7745},[727,73306,57681],{"class":1986},[727,73308,73309],{"class":768},",\u003C",[727,73311,727],{"class":7745},[727,73313,57681],{"class":1986},[727,73315,73309],{"class":768},[727,73317,50804],{"class":7745},[727,73319,57681],{"class":1986},[727,73321,73309],{"class":768},[727,73323,29],{"class":7745},[727,73325,57681],{"class":1986},[727,73327,73309],{"class":768},[727,73329,322],{"class":7745},[727,73331,57681],{"class":1986},[727,73333,73309],{"class":768},[727,73335,57536],{"class":7745},[727,73337,57681],{"class":1986},[727,73339,73309],{"class":768},[727,73341,73342],{"class":7745},"button",[727,73344,56240],{"class":1986},[14,73346,73347],{},"In order to specify an element selector, just use the name of the element tag (without any attributes or angle brackets).",[14,73349,73350],{},"For example, the above elements can be selected like this:",[719,73352,73354],{"className":58663,"code":73353,"language":58665,"meta":494,"style":494},"h1,span,div,strong,a,input,button\n",[90,73355,73356],{"__ignoreMap":494},[727,73357,73358,73360,73362,73364,73366,73368,73370,73372,73374,73376,73378,73380,73382],{"class":729,"line":730},[727,73359,73087],{"class":7745},[727,73361,11710],{"class":768},[727,73363,727],{"class":7745},[727,73365,11710],{"class":768},[727,73367,50804],{"class":7745},[727,73369,11710],{"class":768},[727,73371,29],{"class":7745},[727,73373,11710],{"class":768},[727,73375,322],{"class":7745},[727,73377,11710],{"class":768},[727,73379,57536],{"class":7745},[727,73381,11710],{"class":768},[727,73383,73384],{"class":7745},"button\n",[639,73386,73388],{"id":73387},"the-css-id-selector","The CSS id Selector",[14,73390,73391],{},"The id attribute gives an HTML element a name that can be used to reference the element from other parts of the document, or from external documents. The name must be unique within the HTML document.",[14,73393,73394],{},"Here’s some example HTML with an id specified:",[719,73396,73398],{"className":58663,"code":73397,"language":58665,"meta":494,"style":494},"\u003Ch1 id=\"page-title\"> Browser automation is so cool\u003C\u002Fh1>\n",[90,73399,73400],{"__ignoreMap":494},[727,73401,73402,73404,73406,73409,73412,73414,73416,73419,73421],{"class":729,"line":730},[727,73403,18130],{"class":768},[727,73405,73087],{"class":7745},[727,73407,73408],{"class":768}," id=\"",[727,73410,73411],{"class":7745},"page-title",[727,73413,3513],{"class":768},[727,73415,57681],{"class":1986},[727,73417,73418],{"class":768}," Browser automation is so cool\u003C\u002F",[727,73420,73087],{"class":7745},[727,73422,56240],{"class":1986},[14,73424,73425,73426,73429],{},"The id attribute has some special convenient syntax. Instead of typing ",[727,73427,73428],{},"id=”page-title”",", you can use a # instead, like this:",[719,73431,73433],{"className":58663,"code":73432,"language":58665,"meta":494,"style":494},"#page-title\n",[90,73434,73435],{"__ignoreMap":494},[727,73436,73437],{"class":729,"line":730},[727,73438,73432],{"class":1882},[639,73440,73442],{"id":73441},"the-css-class-selector","The CSS class Selector",[14,73444,73445],{},"The class attribute tags an HTML element with a re-usable name that can be used to identify it and similar elements like it. They are usually not unique within a document, but specify a set of related elements.",[14,73447,73448],{},"Here’s some HTML with a class specified:",[719,73450,73452],{"className":58663,"code":73451,"language":58665,"meta":494,"style":494},"\u003Ch1 class=\"page-title\"> Browser automation is so cool\u003C\u002Fh1>\n",[90,73453,73454],{"__ignoreMap":494},[727,73455,73456,73458,73460,73463,73465,73467,73469,73471,73473],{"class":729,"line":730},[727,73457,18130],{"class":768},[727,73459,73087],{"class":7745},[727,73461,73462],{"class":768}," class=\"",[727,73464,73411],{"class":7745},[727,73466,3513],{"class":768},[727,73468,57681],{"class":1986},[727,73470,73418],{"class":768},[727,73472,73087],{"class":7745},[727,73474,56240],{"class":1986},[14,73476,73477,73478,73481],{},"Similarly to the id attribute, instead of using the usual ",[727,73479,73480],{},"class=”page-title”"," syntax you can use a dot:",[719,73483,73485],{"className":58663,"code":73484,"language":58665,"meta":494,"style":494},".page-title\n",[90,73486,73487],{"__ignoreMap":494},[727,73488,73489],{"class":729,"line":730},[727,73490,73484],{"class":1882},[14,73492,73493],{},"To learn more about this topic, you can check out the following resource:",[14,73495,73496],{},[322,73497,73498],{"href":73498,"rel":73499},"https:\u002F\u002Fwww.w3schools.com\u002Fcss\u002Fcss_selectors.asp",[2245],[14,73501,73502],{},[322,73503,73504],{"href":73504,"rel":73505},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FLearn\u002FCSS\u002FBuilding_blocks\u002FSelectors",[2245],[14,73507,73508],{},[322,73509,73510],{"href":73510,"rel":73511},"http:\u002F\u002Fweb.simmons.edu\u002F~grabiner\u002Fcomm244\u002Fweekfour\u002Fselectors",[2245],[21,73513,73515],{"id":73514},"attribute-selectors-can-be-combined-with-other-css-selectors","Attribute selectors can be combined with other CSS selectors",[14,73517,73518],{},"It can be very handy to combine attribute selectors in combination with other kinds of selectors. Doing this allows you to create more precise rules that target just that one element you want from a page, without pulling in any others.",[639,73520,73522],{"id":73521},"linkedin-in-pager-button","LinkedIn in pager button",[14,73524,73525],{},"Here is the HTML from a LinkedIn pager button:",[719,73527,73529],{"className":56214,"code":73528,"language":56216,"meta":494,"style":494},"\u003Cbutton aria-label=\"Next\" id=\"ember1951\" class=\"artdeco-pagination__button artdeco-pagination__button--next artdeco-button artdeco-button--muted artdeco-button--icon-right artdeco-button--1 artdeco-button--tertiary ember-view\" type=\"button\">  \u003Cli-icon aria-hidden=\"true\" type=\"chevron-right-icon\" class=\"artdeco-button__icon\" size=\"small\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 16 16\" class=\"mercado-match\" data-supported-dps=\"16x16\" fill=\"currentColor\" width=\"16\" height=\"16\" focusable=\"false\">\n  \u003Cpath d=\"M5 15l4.61-7L5 1h2.39L12 8l-4.61 7z\">\u003C\u002Fpath>\n\u003C\u002Fsvg>\u003C\u002Fli-icon>\n\n\u003Cspan class=\"artdeco-button__text\">\n    Next\n\u003C\u002Fspan>\u003C\u002Fbutton>\n",[90,73530,73531,73668,73690,73702,73706,73721,73726],{"__ignoreMap":494},[727,73532,73533,73535,73537,73539,73541,73543,73545,73547,73550,73552,73554,73557,73559,73561,73564,73567,73570,73573,73575,73578,73580,73582,73585,73587,73589,73592,73595,73597,73600,73602,73605,73608,73610,73613,73616,73618,73621,73623,73625,73628,73631,73633,73636,73639,73641,73644,73647,73649,73652,73655,73657,73659,73662,73664,73666],{"class":729,"line":730},[727,73534,18130],{"class":768},[727,73536,73342],{"class":7745},[727,73538,57885],{"class":1882},[727,73540,4970],{"class":768},[727,73542,20294],{"class":737},[727,73544,56227],{"class":1882},[727,73546,4970],{"class":768},[727,73548,73549],{"class":737},"\"ember1951\"",[727,73551,57617],{"class":1882},[727,73553,4970],{"class":768},[727,73555,73556],{"class":737},"\"artdeco-pagination__button artdeco-pagination__button--next artdeco-button artdeco-button--muted artdeco-button--icon-right artdeco-button--1 artdeco-button--tertiary ember-view\"",[727,73558,57922],{"class":1882},[727,73560,4970],{"class":768},[727,73562,73563],{"class":737},"\"button\"",[727,73565,73566],{"class":768},">  \u003C",[727,73568,73569],{"class":7745},"li-icon",[727,73571,73572],{"class":1882}," aria-hidden",[727,73574,4970],{"class":768},[727,73576,73577],{"class":737},"\"true\"",[727,73579,57922],{"class":1882},[727,73581,4970],{"class":768},[727,73583,73584],{"class":737},"\"chevron-right-icon\"",[727,73586,57617],{"class":1882},[727,73588,4970],{"class":768},[727,73590,73591],{"class":737},"\"artdeco-button__icon\"",[727,73593,73594],{"class":1882}," size",[727,73596,4970],{"class":768},[727,73598,73599],{"class":737},"\"small\"",[727,73601,57632],{"class":768},[727,73603,73604],{"class":7745},"svg",[727,73606,73607],{"class":1882}," xmlns",[727,73609,4970],{"class":768},[727,73611,73612],{"class":737},"\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\"",[727,73614,73615],{"class":1882}," viewBox",[727,73617,4970],{"class":768},[727,73619,73620],{"class":737},"\"0 0 16 16\"",[727,73622,57617],{"class":1882},[727,73624,4970],{"class":768},[727,73626,73627],{"class":737},"\"mercado-match\"",[727,73629,73630],{"class":1882}," data-supported-dps",[727,73632,4970],{"class":768},[727,73634,73635],{"class":737},"\"16x16\"",[727,73637,73638],{"class":1882}," fill",[727,73640,4970],{"class":768},[727,73642,73643],{"class":737},"\"currentColor\"",[727,73645,73646],{"class":1882}," width",[727,73648,4970],{"class":768},[727,73650,73651],{"class":737},"\"16\"",[727,73653,73654],{"class":1882}," height",[727,73656,4970],{"class":768},[727,73658,73651],{"class":737},[727,73660,73661],{"class":1882}," focusable",[727,73663,4970],{"class":768},[727,73665,57567],{"class":737},[727,73667,56240],{"class":768},[727,73669,73670,73673,73676,73679,73681,73684,73686,73688],{"class":729,"line":498},[727,73671,73672],{"class":768},"  \u003C",[727,73674,73675],{"class":7745},"path",[727,73677,73678],{"class":1882}," d",[727,73680,4970],{"class":768},[727,73682,73683],{"class":737},"\"M5 15l4.61-7L5 1h2.39L12 8l-4.61 7z\"",[727,73685,56235],{"class":768},[727,73687,73675],{"class":7745},[727,73689,56240],{"class":768},[727,73691,73692,73694,73696,73698,73700],{"class":729,"line":495},[727,73693,60223],{"class":768},[727,73695,73604],{"class":7745},[727,73697,56235],{"class":768},[727,73699,73569],{"class":7745},[727,73701,56240],{"class":768},[727,73703,73704],{"class":729,"line":1895},[727,73705,1898],{"emptyLinePlaceholder":522},[727,73707,73708,73710,73712,73714,73716,73719],{"class":729,"line":1901},[727,73709,18130],{"class":768},[727,73711,727],{"class":7745},[727,73713,57617],{"class":1882},[727,73715,4970],{"class":768},[727,73717,73718],{"class":737},"\"artdeco-button__text\"",[727,73720,56240],{"class":768},[727,73722,73723],{"class":729,"line":1973},[727,73724,73725],{"class":768},"    Next\n",[727,73727,73728,73730,73732,73734,73736],{"class":729,"line":2052},[727,73729,60223],{"class":768},[727,73731,727],{"class":7745},[727,73733,56235],{"class":768},[727,73735,73342],{"class":7745},[727,73737,56240],{"class":768},[14,73739,73740],{},"We could extract the following attribute ‘aria-label=\"Next\"’ to make this selector. The aria-label attribute seems to be human readable text, so it looks like a great choice for identifying that “Next” button.",[14,73742,73743],{},"We can then combine this with other selectors to make sure we have exactly the element we want. Here are a couple of examples of this in action:",[719,73745,73747],{"className":58663,"code":73746,"language":58665,"meta":494,"style":494},"button[aria-label=\"Next\"]\n\n.artdeco-pagination__button[aria-label=\"Next\"]\n",[90,73748,73749,73763,73767],{"__ignoreMap":494},[727,73750,73751,73753,73755,73757,73759,73761],{"class":729,"line":730},[727,73752,73342],{"class":7745},[727,73754,58545],{"class":768},[727,73756,73207],{"class":1882},[727,73758,4970],{"class":1986},[727,73760,20294],{"class":737},[727,73762,17433],{"class":768},[727,73764,73765],{"class":729,"line":498},[727,73766,1898],{"emptyLinePlaceholder":522},[727,73768,73769,73772,73774,73776,73778,73780],{"class":729,"line":495},[727,73770,73771],{"class":1882},".artdeco-pagination__button",[727,73773,58545],{"class":768},[727,73775,73207],{"class":1882},[727,73777,4970],{"class":1986},[727,73779,20294],{"class":737},[727,73781,17433],{"class":768},[639,73783,73785],{"id":73784},"facebook-group","Facebook group",[14,73787,73788],{},"Below is the outer wrapper div from an article from a Facebook Group page.",[719,73790,73792],{"className":58663,"code":73791,"language":58665,"meta":494,"style":494},"\u003Cdiv aria-describedby=\"jsc_c_jb jsc_c_jc jsc_c_jd jsc_c_jf jsc_c_je\" \naria-labelledby=\"jsc_c_ja\" class=\"lzcic4wl\" role=\"article\">\n",[90,73793,73794,73806],{"__ignoreMap":494},[727,73795,73796,73798,73800,73803],{"class":729,"line":730},[727,73797,18130],{"class":768},[727,73799,50804],{"class":7745},[727,73801,73802],{"class":7745}," aria-describedby",[727,73804,73805],{"class":768},"=\"jsc_c_jb jsc_c_jc jsc_c_jd jsc_c_jf jsc_c_je\" \n",[727,73807,73808,73810,73813],{"class":729,"line":498},[727,73809,73219],{"class":7745},[727,73811,73812],{"class":768},"=\"jsc_c_ja\" class=\"lzcic4wl\" role=\"article\"",[727,73814,56240],{"class":1986},[14,73816,73817],{},"We could use ‘role=\"article\"’ to target elements in the Article. The selector below would extract the name of the author. In this example we have combined four selectors: an element, an attribute, and then two more elements.",[719,73819,73821],{"className":58663,"code":73820,"language":58665,"meta":494,"style":494},"div[role=\"article\"] a strong\n",[90,73822,73823],{"__ignoreMap":494},[727,73824,73825,73827,73829,73832,73834,73837,73840,73842],{"class":729,"line":730},[727,73826,50804],{"class":7745},[727,73828,58545],{"class":768},[727,73830,73831],{"class":1882},"role",[727,73833,4970],{"class":1986},[727,73835,73836],{"class":737},"\"article\"",[727,73838,73839],{"class":768},"] ",[727,73841,322],{"class":7745},[727,73843,73844],{"class":7745}," strong\n",[14,73846,73847,73848,73851],{},"Here, the spaces indicate that the “a” and “strong” elements are ",[807,73849,73850],{},"children"," of the div with the attribute role=”article”. This means that the selector will look for an “a” element, inside a “strong” element, inside a “div” element with the attribute role=”article”.",[21,73853,73855],{"id":73854},"how-do-i-find-selectors-on-a-web-page","How do I find selectors on a web page?",[14,73857,73858],{},"Google Chrome has a built-in tool for inspecting the webpage that makes this easy. Web developers like to show off by making it seem like magic, but it's actually pretty simple to learn! Here's a short video that shows you how it works.",[14,73860,73861],{},"💡 To search for anything on a web page, right-click on an element and select Inspect. This will open Developer Tools. Then use Ctrl+F or Command+F to search for anything within the source code of the page.",[14,73863,73864,73865,44],{},"Learn more about Chrome Developer tools and the ",[322,73866,73869],{"href":73867,"rel":73868},"https:\u002F\u002Fwww.hostinger.co.uk\u002Ftutorials\u002Fwebsite\u002Fhow-to-inspect-and-change-style-using-google-chrome",[2245],"web inspector",[21,73871,73873],{"id":73872},"how-do-you-define-your-own-css-selectors","How do you define your own CSS selectors?",[14,73875,73876],{},"Here are three methods for generating custom selectors. Ultimately, you will want to master the art of combining these methods.",[639,73878,73880],{"id":73879},"_1-identify-a-selector-unique-to-the-element-you-want","1. Identify a selector unique to the element you want",[14,73882,73883],{},"Look for selectors that are unique to the element. If it has a unique attribute, use that.",[14,73885,73886],{},"For example, if you wanted to click the Tweet button on my Twitter feed, here's the HTML:",[719,73888,73890],{"className":58663,"code":73889,"language":58665,"meta":494,"style":494},"\u003Cdiv role=\"button\" class=\"css-18t94o4 css-1dbjc4n r-l5o3uw r-42olwf r-sdzlij r-1phboty r-rs99b7 r-19u6a5r r-2yi16 r-1qi8awa r-1ny4l3l r-ymttw5 r-o7ynqc r-6416eg r-lrvibr\" \ndata-testid=\"tweetButtonInline\" tabindex=\"0\">\u003Cdiv dir=\"auto\" class=\"css-901oao r-1awozwy r-jwli3a r-6koalj r-18u37iz r-16y2uox r-37j5jr r-a023e6 r-b88u0q r-1777fci r-rjixqe r-bcqeeo r-q4m81j r-qvutc0\">\n\u003Cspan class=\"css-901oao css-16my406 css-bfa6kz r-poiln3 r-a023e6 r-rjixqe r-bcqeeo r-qvutc0\">\u003Cspan class=\"css-901oao css-16my406 r-poiln3 r-bcqeeo r-qvutc0\">Tweet\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002Fdiv>\n",[90,73891,73892,73949,74011],{"__ignoreMap":494},[727,73893,73894,73896,73898,73901,73904,73907,73910,73913,73916,73919,73922,73925,73928,73931,73934,73937,73940,73943,73946],{"class":729,"line":730},[727,73895,18130],{"class":768},[727,73897,50804],{"class":7745},[727,73899,73900],{"class":768}," role=\"button\" class=\"",[727,73902,73903],{"class":7745},"css-18t94o4",[727,73905,73906],{"class":7745}," css-1dbjc4n",[727,73908,73909],{"class":7745}," r-l5o3uw",[727,73911,73912],{"class":7745}," r-42olwf",[727,73914,73915],{"class":7745}," r-sdzlij",[727,73917,73918],{"class":7745}," r-1phboty",[727,73920,73921],{"class":7745}," r-rs99b7",[727,73923,73924],{"class":7745}," r-19u6a5r",[727,73926,73927],{"class":7745}," r-2yi16",[727,73929,73930],{"class":7745}," r-1qi8awa",[727,73932,73933],{"class":7745}," r-1ny4l3l",[727,73935,73936],{"class":7745}," r-ymttw5",[727,73938,73939],{"class":7745}," r-o7ynqc",[727,73941,73942],{"class":7745}," r-6416eg",[727,73944,73945],{"class":7745}," r-lrvibr",[727,73947,73948],{"class":768},"\" \n",[727,73950,73951,73953,73956,73958,73960,73962,73965,73968,73971,73974,73977,73980,73983,73986,73989,73992,73995,73998,74001,74004,74007,74009],{"class":729,"line":498},[727,73952,58548],{"class":7745},[727,73954,73955],{"class":768},"=\"tweetButtonInline\" tabindex=\"0\"",[727,73957,57681],{"class":1986},[727,73959,18130],{"class":768},[727,73961,50804],{"class":7745},[727,73963,73964],{"class":768}," dir=\"auto\" class=\"",[727,73966,73967],{"class":7745},"css-901oao",[727,73969,73970],{"class":7745}," r-1awozwy",[727,73972,73973],{"class":7745}," r-jwli3a",[727,73975,73976],{"class":7745}," r-6koalj",[727,73978,73979],{"class":7745}," r-18u37iz",[727,73981,73982],{"class":7745}," r-16y2uox",[727,73984,73985],{"class":7745}," r-37j5jr",[727,73987,73988],{"class":7745}," r-a023e6",[727,73990,73991],{"class":7745}," r-b88u0q",[727,73993,73994],{"class":7745}," r-1777fci",[727,73996,73997],{"class":7745}," r-rjixqe",[727,73999,74000],{"class":7745}," r-bcqeeo",[727,74002,74003],{"class":7745}," r-q4m81j",[727,74005,74006],{"class":7745}," r-qvutc0",[727,74008,3513],{"class":768},[727,74010,56240],{"class":1986},[727,74012,74013,74015,74017,74019,74021,74024,74027,74030,74032,74034,74036,74038,74040,74042,74044,74046,74048,74050,74052,74054,74056,74058,74060,74062,74065,74067,74069,74071,74073,74075,74077,74079,74081,74083,74085],{"class":729,"line":495},[727,74014,18130],{"class":768},[727,74016,727],{"class":7745},[727,74018,73462],{"class":768},[727,74020,73967],{"class":7745},[727,74022,74023],{"class":7745}," css-16my406",[727,74025,74026],{"class":7745}," css-bfa6kz",[727,74028,74029],{"class":7745}," r-poiln3",[727,74031,73988],{"class":7745},[727,74033,73997],{"class":7745},[727,74035,74000],{"class":7745},[727,74037,74006],{"class":7745},[727,74039,3513],{"class":768},[727,74041,57681],{"class":1986},[727,74043,18130],{"class":768},[727,74045,727],{"class":7745},[727,74047,73462],{"class":768},[727,74049,73967],{"class":7745},[727,74051,74023],{"class":7745},[727,74053,74029],{"class":7745},[727,74055,74000],{"class":7745},[727,74057,74006],{"class":7745},[727,74059,3513],{"class":768},[727,74061,57681],{"class":1986},[727,74063,74064],{"class":768},"Tweet\u003C\u002F",[727,74066,727],{"class":7745},[727,74068,57681],{"class":1986},[727,74070,60223],{"class":768},[727,74072,727],{"class":7745},[727,74074,57681],{"class":1986},[727,74076,60223],{"class":768},[727,74078,50804],{"class":7745},[727,74080,57681],{"class":1986},[727,74082,60223],{"class":768},[727,74084,50804],{"class":7745},[727,74086,56240],{"class":1986},[14,74088,74089],{},"We would use the div element with an attribute selector.",[719,74091,74093],{"className":58663,"code":74092,"language":58665,"meta":494,"style":494},"div[data-testid=\"tweetButtonInline\"]\n",[90,74094,74095],{"__ignoreMap":494},[727,74096,74097,74099,74101,74103,74105,74108],{"class":729,"line":730},[727,74098,50804],{"class":7745},[727,74100,58545],{"class":768},[727,74102,58548],{"class":1882},[727,74104,4970],{"class":1986},[727,74106,74107],{"class":737},"\"tweetButtonInline\"",[727,74109,17433],{"class":768},[14,74111,74112],{},"Sometimes, websites strip out unique selectors to make them more difficult to scrape. If this is the case for your target site, you’ll need to use more devious methods….",[639,74114,74116],{"id":74115},"_2-find-a-unique-grouping-selector","2. Find a unique grouping selector",[14,74118,74119],{},"All HTML is ordered in a hierarchy. This means you can often find the element you want by finding a parent, i.e. an element which wraps around and contains your desired target.",[14,74121,74122],{},"For example, if you wanted to scrape the related trends from Google Trends search, you will see that the related trends are grouped in a block of HTML that defines a widget. First, you find a unique selector for that widget:",[719,74124,74126],{"className":58663,"code":74125,"language":58665,"meta":494,"style":494},"\u003Cwidget type=\"fe_related_queries\" version=\"1\" template=\"fe\" on-event=\"onEvent({'event': event})\" embed=\"embed\" share=\"share\" export=\"export\" explore-query=\"exploreQuery\" fields=\"[\n        {'name': 'topic', 'value': title},\n        {'name': 'color', 'value': color}\n    ]\" apis=\"[\n        {\n          'name': 'fe_relatedsearches',\n          'url': config.pathPrefix + '\u002Fapi\u002Fwidgetdata\u002Frelatedsearches',\n          'params': {'req': request, 'token': token}\n        }\n    ]\" story-title=\"storyTitle\" story-country=\"storyCountry\" story-time-range=\"storyTimeRange\" show-mode-picker=\"true\" palette=\"palette\" forced-color=\"\" help-dialog=\"helpDialog\" widget-name=\"widgetName\" ve-tracking=\"\" jslog=\"39387; track:impression\">\u003C!---->\n",[90,74127,74128,74151,74171,74189,74194,74198,74210,74223,74242,74246],{"__ignoreMap":494},[727,74129,74130,74133,74136,74139,74142,74145,74148],{"class":729,"line":730},[727,74131,74132],{"class":768},"\u003Cwidget type=\"fe_related_queries\" version=\"1\" template=\"fe\" ",[727,74134,74135],{"class":7745},"on-event",[727,74137,74138],{"class":768},"=\"onEvent({'",[727,74140,74141],{"class":1882},"event",[727,74143,74144],{"class":768},"': event})\" embed=\"embed\" share=\"share\" export=\"export\" ",[727,74146,74147],{"class":7745},"explore-query",[727,74149,74150],{"class":768},"=\"exploreQuery\" fields=\"[\n",[727,74152,74153,74156,74158,74160,74163,74165,74168],{"class":729,"line":498},[727,74154,74155],{"class":768},"        {",[727,74157,55601],{"class":737},[727,74159,1995],{"class":768},[727,74161,74162],{"class":737},"'topic'",[727,74164,2004],{"class":768},[727,74166,74167],{"class":737},"'value'",[727,74169,74170],{"class":768},": title},\n",[727,74172,74173,74175,74177,74179,74182,74184,74186],{"class":729,"line":495},[727,74174,74155],{"class":768},[727,74176,55601],{"class":737},[727,74178,1995],{"class":768},[727,74180,74181],{"class":737},"'color'",[727,74183,2004],{"class":768},[727,74185,74167],{"class":737},[727,74187,74188],{"class":768},": color}\n",[727,74190,74191],{"class":729,"line":1895},[727,74192,74193],{"class":768},"    ]\" apis=\"[\n",[727,74195,74196],{"class":729,"line":1901},[727,74197,22698],{"class":768},[727,74199,74200,74203,74205,74208],{"class":729,"line":1973},[727,74201,74202],{"class":737},"          'name'",[727,74204,1995],{"class":768},[727,74206,74207],{"class":737},"'fe_relatedsearches'",[727,74209,2427],{"class":768},[727,74211,74212,74215,74218,74221],{"class":729,"line":2052},[727,74213,74214],{"class":737},"          'url'",[727,74216,74217],{"class":768},": config.pathPrefix + ",[727,74219,74220],{"class":737},"'\u002Fapi\u002Fwidgetdata\u002Frelatedsearches'",[727,74222,2427],{"class":768},[727,74224,74225,74228,74230,74233,74236,74239],{"class":729,"line":2058},[727,74226,74227],{"class":737},"          'params'",[727,74229,54826],{"class":768},[727,74231,74232],{"class":737},"'req'",[727,74234,74235],{"class":768},": request, ",[727,74237,74238],{"class":737},"'token'",[727,74240,74241],{"class":768},": token}\n",[727,74243,74244],{"class":729,"line":2064},[727,74245,2562],{"class":768},[727,74247,74248,74251,74254,74257,74260,74263,74266,74269,74272,74275,74278,74281,74284,74287,74290,74293,74296,74299,74302,74305,74307,74310],{"class":729,"line":2087},[727,74249,74250],{"class":768},"    ]\" ",[727,74252,74253],{"class":7745},"story-title",[727,74255,74256],{"class":768},"=\"storyTitle\" ",[727,74258,74259],{"class":7745},"story-country",[727,74261,74262],{"class":768},"=\"storyCountry\" ",[727,74264,74265],{"class":7745},"story-time-range",[727,74267,74268],{"class":768},"=\"storyTimeRange\" ",[727,74270,74271],{"class":7745},"show-mode-picker",[727,74273,74274],{"class":768},"=\"true\" palette=\"palette\" ",[727,74276,74277],{"class":7745},"forced-color",[727,74279,74280],{"class":768},"=\"\" ",[727,74282,74283],{"class":7745},"help-dialog",[727,74285,74286],{"class":768},"=\"helpDialog\" ",[727,74288,74289],{"class":7745},"widget-name",[727,74291,74292],{"class":768},"=\"widgetName\" ",[727,74294,74295],{"class":7745},"ve-tracking",[727,74297,74298],{"class":768},"=\"\" jslog=\"39387; ",[727,74300,74301],{"class":7745},"track",[727,74303,74304],{"class":768},":impression\"",[727,74306,57681],{"class":1986},[727,74308,74309],{"class":768},"\u003C!----",[727,74311,56240],{"class":1986},[14,74313,74314],{},"In this case, you can use the element ‘widget’ and the following attribute selector:",[719,74316,74318],{"className":58663,"code":74317,"language":58665,"meta":494,"style":494},"widget[type=\"fe_related_queries\"]\n",[90,74319,74320],{"__ignoreMap":494},[727,74321,74322,74325,74327,74329,74332],{"class":729,"line":730},[727,74323,74324],{"class":768},"widget[",[727,74326,47218],{"class":1882},[727,74328,4970],{"class":1986},[727,74330,74331],{"class":737},"\"fe_related_queries\"",[727,74333,17433],{"class":768},[14,74335,74336],{},"Then to scrape the topics we can add an “a” element selector, separated by a space, to find the “a” element within the widget HTML.",[719,74338,74340],{"className":58663,"code":74339,"language":58665,"meta":494,"style":494},"widget[type=\"fe_related_queries\"] a\n\n",[90,74341,74342],{"__ignoreMap":494},[727,74343,74344,74346,74348,74350,74352,74354],{"class":729,"line":730},[727,74345,74324],{"class":768},[727,74347,47218],{"class":1882},[727,74349,4970],{"class":1986},[727,74351,74331],{"class":737},[727,74353,73839],{"class":768},[727,74355,74356],{"class":7745},"a\n",[14,74358,74359],{},"Still, it can be the case that it’s hard to even find a grouping element with a unique selector. So what do we do then?",[639,74361,74363],{"id":74362},"_3-look-for-the-unique-positioning-of-your-content-within-the-page","3. Look for the unique positioning of your content within the page",[14,74365,74366],{},"Webpages are made up of different elements, all of which are contained by other elements. Some elements are parents and others children; some elements can be both. Every element occupies exactly one position within this hierarchy, and this can be specified uniquely with a selector - which means if you can figure out that selector, you can pinpoint your target. Bullseye! 🎯",[14,74368,74369],{},"In this example we want to work out a custom selector to click the like button of the first Instagram post on my feed. Heres the html from that article:",[719,74371,74373],{"className":58663,"code":74372,"language":58665,"meta":494,"style":494},"\u003Carticle class=\" _ab6k _ab6l _ab6m _aatb _aatc _aate _aatf _aath _aati\" role=\"presentation\" tabindex=\"-1\">\u003Cdiv class=\"_ab8w  _ab94 _ab99 _ab9h _ab9m _ab9p _abcm\" style=\"max-height: inherit; max-width: inherit;\">\u003Cdiv class=\"_aasi _aasj\">\u003Cdiv class=\"_ab8w  _ab94 _ab97 _ab9i _ab9k _ab9p _abcm\">\u003Cheader class=\"_aaqw _aaqx\">\u003Cdiv class=\"_aap6 _aap7 _aapa\">\u003Cdiv class=\"_aarf _aarg _aaqq\" aria-disabled=\"false\" role=\"button\" tabindex=\"0\" style=\"cursor: pointer;\">\u003Ccanvas class=\"_aarh\" height=\"84\" width=\"84\" style=\"position: absolute; top: -5px; left: -5px; width: 42px; height: 42px;\">\u003C\u002Fcanvas>\u003Cspan class=\"_aa8h\" role=\"link\" tabindex=\"-1\" style=\"width: 32px; height: 32px;\">\u003Cimg alt=\"zoeandbrodsforeheadkisses's profile picture\" class=\"_aa8j\" crossorigin=\"anonymous\" draggable=\"false\">\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"_aaqy _aaq-\">\u003Cdiv class=\" _aar1\">\u003Cdiv class=\"_aaqt\">\u003Cdiv class=\"_ab8w  _ab94 _ab97 _ab9f _ab9k _ab9p _abcm\">\u003Cdiv class=\"_aacl _aaco _aacw _aacx _aad6 _aade\">\u003Cspan class=\"_aap6 _aap7 _aap8\">\u003Ca class=\"oajrlxb2 g5ia77u1 qu0x051f esr5mh6w e9989ue4 r7d6kgcz rq0escxv nhd2j8a9 nc684nl6 p7hjln8o kvgmc6g5 cxmmr5t8 oygrvhab hcukyx3x jb3vyjys rz4wbd8a qt6c0cv9 a8nywdso i1ao9s8h esuyzwwr f1sip0of lzcic4wl _acan _acao _acat _acaw _a6hd\" href=\"\u002Fzoeandbrodsforeheadkisses\" role=\"link\" tabindex=\"0\">zoeandbrodsforeheadkisses\u003C\u002Fa>\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"_aaql\">\u003Cdiv class=\"_aacl _aacn _aacu _aacx _aad6 _aade\">\u003Cdiv>\u003C\u002Fdiv>\u003Cdiv class=\"_aaqm\">\u003Cdiv class=\"_aacl _aacn _aacu _aacy _aada _aade\">\u003Ca class=\"oajrlxb2 g5ia77u1 qu0x051f esr5mh6w e9989ue4 r7d6kgcz rq0escxv nhd2j8a9 nc684nl6 p7hjln8o kvgmc6g5 cxmmr5t8 oygrvhab hcukyx3x jb3vyjys rz4wbd8a qt6c0cv9 a8nywdso i1ao9s8h esuyzwwr f1sip0of lzcic4wl _aaqk _a6hd\" href=\"\u002Fexplore\u002Flocations\u002F235395557\u002Fthredbo-resort\" role=\"link\" tabindex=\"0\">Thredbo Resort\u003C\u002Fa>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fheader>\u003Cdiv class=\"_aasm _aasn\">\u003Cbutton class=\"_abl-\" type=\"button\">\u003Cdiv class=\"_abm0\">\u003Cdiv class=\"_ab8w  _ab94 _ab97 _ab9h _ab9m _ab9p _abcm\" style=\"height: 24px; width: 24px;\">\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"_aatk\">\u003Cdiv class=\"_aamm\">\u003Cdiv class=\"_aamn\">\u003Cdiv class=\"_aami\" style=\"padding-bottom: 125%;\">\u003C\u002Fdiv>\u003Cdiv class=\"_ab8w  _ab94 _ab99 _ab9f _ab9m _ab9p _abcf _abcg _abch _abck _abcl _abcm\">\u003Cdiv class=\"_aao_\">\u003Cdiv class=\"_aap0\" role=\"presentation\">\u003Cdiv class=\"_aap1\">\u003Cul class=\"_acay\">\u003Cli style=\"transform: translateX(3289px); width: 1px;\">\u003C\u002Fli>\u003Cli class=\"_acaz\" tabindex=\"-1\" style=\"transform: translateX(0px);\">\u003Cdiv class=\"_ab8w  _ab94 _ab99 _ab9f _ab9m _ab9p _abcm\" style=\"width: 470px;\">\u003Cdiv role=\"button\" class=\"_aa06\" tabindex=\"0\">\u003Cdiv>\u003Cdiv class=\"_aagu _aamh\">\u003Cdiv class=\"_aagv\" style=\"padding-bottom: 125%;\">\u003Cimg alt=\"Photo by Zoe Sandell on July 21, 2022. May be an image of 7 people, people standing, nature and people skiing.\" class=\"_aagt\" crossorigin=\"anonymous\" decoding=\"auto\" sizes=\"470px\" \u003C\u002Fdiv>\u003Cdiv class=\"_aagw\">\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fli>\u003Cli class=\"_acaz\" tabindex=\"-1\" style=\"transform: translateX(470px);\">\u003Cdiv class=\"_ab8w  _ab94 _ab99 _ab9f _ab9m _ab9p _abcm\" style=\"width: 470px;\">\u003Cdiv role=\"button\" class=\"_aa06\" tabindex=\"0\">\u003Cdiv>\u003Cdiv class=\"_aagu _aamh\">\u003Cdiv class=\"_aagv\" style=\"padding-bottom: 125%;\">\n",[90,74374,74375],{"__ignoreMap":494},[727,74376,74377,74379,74382,74385,74387,74389,74391,74394,74397,74399,74402,74405,74407,74409,74411,74414,74416,74418,74420,74423,74425,74427,74430,74433,74435,74437,74439,74442,74444,74446,74448,74451,74454,74457,74460,74463,74465,74467,74470,74473,74475,74477,74479,74481,74483,74485,74488,74490,74492,74494,74497,74500,74503,74505,74507,74509,74511,74513,74515,74517,74519,74521,74523,74525,74527,74530,74532,74534,74536,74539,74541,74543,74545,74548,74550,74552,74554,74557,74559,74561,74563,74566,74568,74570,74572,74575,74577,74579,74581,74584,74586,74589,74591,74593,74595,74597,74599,74601,74603,74605,74607,74609,74611,74613,74615,74617,74619,74621,74623,74625,74627,74630,74632,74634,74636,74639,74641,74643,74645,74647,74649,74651,74653,74655,74657,74660,74662,74664,74666,74669,74671,74673,74675,74678,74681,74684,74686,74689,74691,74693,74695,74697,74699,74701,74703,74705,74707,74709,74711,74713,74715,74717,74719,74721,74723,74725,74727,74729,74731,74733,74736,74738,74740,74742,74745,74747,74749,74751,74754,74756,74758,74760,74763,74765,74767,74769,74771,74773,74775,74777,74779,74781,74783,74785,74787,74789,74791,74793,74795,74797,74799,74801,74803,74805,74808,74810,74812,74814,74817,74819,74821,74823,74826,74828,74830,74832,74835,74838,74841,74843,74845,74847,74849,74851,74853,74856,74858,74860,74862,74865,74867,74869,74871,74874,74876,74878,74880,74883,74885,74887,74889,74892,74894,74896,74898,74901,74903,74905,74907,74909,74911,74913,74916,74918,74920,74922,74925,74927,74929,74931,74934,74936,74938,74940,74942,74944,74946,74949,74951,74953,74955,74958,74960,74962,74964,74966,74968,74971,74974,74977,74979,74981,74983,74985,74988,74990,74992,74994,74996,74998,75000,75002,75004,75006,75008,75010,75012,75014,75016,75018,75020,75022,75024,75026,75028,75030,75033,75035,75037,75039,75041,75043,75045,75047,75049,75051,75053,75055,75057,75059,75061,75063,75065,75067,75069,75071,75073,75075],{"class":729,"line":730},[727,74378,18130],{"class":768},[727,74380,74381],{"class":7745},"article",[727,74383,74384],{"class":768}," class=\" _ab6k _ab6l _ab6m _aatb _aatc _aate _aatf _aath _aati\" role=\"presentation\" tabindex=\"-1\"",[727,74386,57681],{"class":1986},[727,74388,18130],{"class":768},[727,74390,50804],{"class":7745},[727,74392,74393],{"class":768}," class=\"_ab8w  _ab94 _ab99 _ab9h _ab9m _ab9p _abcm\" style=\"",[727,74395,74396],{"class":7745},"max-height",[727,74398,73238],{"class":768},[727,74400,74401],{"class":7745},"max-width",[727,74403,74404],{"class":768},": inherit;\"",[727,74406,57681],{"class":1986},[727,74408,18130],{"class":768},[727,74410,50804],{"class":7745},[727,74412,74413],{"class":768}," class=\"_aasi _aasj\"",[727,74415,57681],{"class":1986},[727,74417,18130],{"class":768},[727,74419,50804],{"class":7745},[727,74421,74422],{"class":768}," class=\"_ab8w  _ab94 _ab97 _ab9i _ab9k _ab9p _abcm\"",[727,74424,57681],{"class":1986},[727,74426,18130],{"class":768},[727,74428,74429],{"class":7745},"header",[727,74431,74432],{"class":768}," class=\"_aaqw _aaqx\"",[727,74434,57681],{"class":1986},[727,74436,18130],{"class":768},[727,74438,50804],{"class":7745},[727,74440,74441],{"class":768}," class=\"_aap6 _aap7 _aapa\"",[727,74443,57681],{"class":1986},[727,74445,18130],{"class":768},[727,74447,50804],{"class":7745},[727,74449,74450],{"class":768}," class=\"_aarf _aarg _aaqq\" ",[727,74452,74453],{"class":7745},"aria-disabled",[727,74455,74456],{"class":768},"=\"false\" role=\"button\" tabindex=\"0\" style=\"",[727,74458,74459],{"class":7745},"cursor",[727,74461,74462],{"class":768},": pointer;\"",[727,74464,57681],{"class":1986},[727,74466,18130],{"class":768},[727,74468,74469],{"class":7745},"canvas",[727,74471,74472],{"class":768}," class=\"_aarh\" height=\"84\" width=\"84\" style=\"position: absolute; top: -5px; left: -5px; width: 42px; height: 42px;\"",[727,74474,57681],{"class":1986},[727,74476,60223],{"class":768},[727,74478,74469],{"class":7745},[727,74480,57681],{"class":1986},[727,74482,18130],{"class":768},[727,74484,727],{"class":7745},[727,74486,74487],{"class":768}," class=\"_aa8h\" role=\"link\" tabindex=\"-1\" style=\"width: 32px; height: 32px;\"",[727,74489,57681],{"class":1986},[727,74491,18130],{"class":768},[727,74493,592],{"class":7745},[727,74495,74496],{"class":768}," alt=\"zoeandbrodsforeheadkisses'",[727,74498,74499],{"class":7745},"s",[727,74501,74502],{"class":768}," profile picture\" class=\"_aa8j\" crossorigin=\"anonymous\" draggable=\"false\"",[727,74504,57681],{"class":1986},[727,74506,60223],{"class":768},[727,74508,727],{"class":7745},[727,74510,57681],{"class":1986},[727,74512,60223],{"class":768},[727,74514,50804],{"class":7745},[727,74516,57681],{"class":1986},[727,74518,60223],{"class":768},[727,74520,50804],{"class":7745},[727,74522,57681],{"class":1986},[727,74524,18130],{"class":768},[727,74526,50804],{"class":7745},[727,74528,74529],{"class":768}," class=\"_aaqy _aaq-\"",[727,74531,57681],{"class":1986},[727,74533,18130],{"class":768},[727,74535,50804],{"class":7745},[727,74537,74538],{"class":768}," class=\" _aar1\"",[727,74540,57681],{"class":1986},[727,74542,18130],{"class":768},[727,74544,50804],{"class":7745},[727,74546,74547],{"class":768}," class=\"_aaqt\"",[727,74549,57681],{"class":1986},[727,74551,18130],{"class":768},[727,74553,50804],{"class":7745},[727,74555,74556],{"class":768}," class=\"_ab8w  _ab94 _ab97 _ab9f _ab9k _ab9p _abcm\"",[727,74558,57681],{"class":1986},[727,74560,18130],{"class":768},[727,74562,50804],{"class":7745},[727,74564,74565],{"class":768}," class=\"_aacl _aaco _aacw _aacx _aad6 _aade\"",[727,74567,57681],{"class":1986},[727,74569,18130],{"class":768},[727,74571,727],{"class":7745},[727,74573,74574],{"class":768}," class=\"_aap6 _aap7 _aap8\"",[727,74576,57681],{"class":1986},[727,74578,18130],{"class":768},[727,74580,322],{"class":7745},[727,74582,74583],{"class":768}," class=\"oajrlxb2 g5ia77u1 qu0x051f esr5mh6w e9989ue4 r7d6kgcz rq0escxv nhd2j8a9 nc684nl6 p7hjln8o kvgmc6g5 cxmmr5t8 oygrvhab hcukyx3x jb3vyjys rz4wbd8a qt6c0cv9 a8nywdso i1ao9s8h esuyzwwr f1sip0of lzcic4wl _acan _acao _acat _acaw _a6hd\" href=\"\u002Fzoeandbrodsforeheadkisses\" role=\"link\" tabindex=\"0\"",[727,74585,57681],{"class":1986},[727,74587,74588],{"class":768},"zoeandbrodsforeheadkisses\u003C\u002F",[727,74590,322],{"class":7745},[727,74592,57681],{"class":1986},[727,74594,60223],{"class":768},[727,74596,727],{"class":7745},[727,74598,57681],{"class":1986},[727,74600,60223],{"class":768},[727,74602,50804],{"class":7745},[727,74604,57681],{"class":1986},[727,74606,60223],{"class":768},[727,74608,50804],{"class":7745},[727,74610,57681],{"class":1986},[727,74612,60223],{"class":768},[727,74614,50804],{"class":7745},[727,74616,57681],{"class":1986},[727,74618,60223],{"class":768},[727,74620,50804],{"class":7745},[727,74622,57681],{"class":1986},[727,74624,18130],{"class":768},[727,74626,50804],{"class":7745},[727,74628,74629],{"class":768}," class=\"_aaql\"",[727,74631,57681],{"class":1986},[727,74633,18130],{"class":768},[727,74635,50804],{"class":7745},[727,74637,74638],{"class":768}," class=\"_aacl _aacn _aacu _aacx _aad6 _aade\"",[727,74640,57681],{"class":1986},[727,74642,18130],{"class":768},[727,74644,50804],{"class":7745},[727,74646,57681],{"class":1986},[727,74648,60223],{"class":768},[727,74650,50804],{"class":7745},[727,74652,57681],{"class":1986},[727,74654,18130],{"class":768},[727,74656,50804],{"class":7745},[727,74658,74659],{"class":768}," class=\"_aaqm\"",[727,74661,57681],{"class":1986},[727,74663,18130],{"class":768},[727,74665,50804],{"class":7745},[727,74667,74668],{"class":768}," class=\"_aacl _aacn _aacu _aacy _aada _aade\"",[727,74670,57681],{"class":1986},[727,74672,18130],{"class":768},[727,74674,322],{"class":7745},[727,74676,74677],{"class":768}," class=\"oajrlxb2 g5ia77u1 qu0x051f esr5mh6w e9989ue4 r7d6kgcz rq0escxv nhd2j8a9 nc684nl6 p7hjln8o kvgmc6g5 cxmmr5t8 oygrvhab hcukyx3x jb3vyjys rz4wbd8a qt6c0cv9 a8nywdso i1ao9s8h esuyzwwr f1sip0of lzcic4wl _aaqk _a6hd\" href=\"\u002Fexplore\u002Flocations\u002F235395557\u002F",[727,74679,74680],{"class":7745},"thredbo-resort",[727,74682,74683],{"class":768},"\" role=\"link\" tabindex=\"0\"",[727,74685,57681],{"class":1986},[727,74687,74688],{"class":768},"Thredbo Resort\u003C\u002F",[727,74690,322],{"class":7745},[727,74692,57681],{"class":1986},[727,74694,60223],{"class":768},[727,74696,50804],{"class":7745},[727,74698,57681],{"class":1986},[727,74700,60223],{"class":768},[727,74702,50804],{"class":7745},[727,74704,57681],{"class":1986},[727,74706,60223],{"class":768},[727,74708,50804],{"class":7745},[727,74710,57681],{"class":1986},[727,74712,60223],{"class":768},[727,74714,50804],{"class":7745},[727,74716,57681],{"class":1986},[727,74718,60223],{"class":768},[727,74720,50804],{"class":7745},[727,74722,57681],{"class":1986},[727,74724,60223],{"class":768},[727,74726,74429],{"class":7745},[727,74728,57681],{"class":1986},[727,74730,18130],{"class":768},[727,74732,50804],{"class":7745},[727,74734,74735],{"class":768}," class=\"_aasm _aasn\"",[727,74737,57681],{"class":1986},[727,74739,18130],{"class":768},[727,74741,73342],{"class":7745},[727,74743,74744],{"class":768}," class=\"_abl-\" type=\"button\"",[727,74746,57681],{"class":1986},[727,74748,18130],{"class":768},[727,74750,50804],{"class":7745},[727,74752,74753],{"class":768}," class=\"_abm0\"",[727,74755,57681],{"class":1986},[727,74757,18130],{"class":768},[727,74759,50804],{"class":7745},[727,74761,74762],{"class":768}," class=\"_ab8w  _ab94 _ab97 _ab9h _ab9m _ab9p _abcm\" style=\"height: 24px; width: 24px;\"",[727,74764,57681],{"class":1986},[727,74766,60223],{"class":768},[727,74768,50804],{"class":7745},[727,74770,57681],{"class":1986},[727,74772,60223],{"class":768},[727,74774,50804],{"class":7745},[727,74776,57681],{"class":1986},[727,74778,60223],{"class":768},[727,74780,73342],{"class":7745},[727,74782,57681],{"class":1986},[727,74784,60223],{"class":768},[727,74786,50804],{"class":7745},[727,74788,57681],{"class":1986},[727,74790,60223],{"class":768},[727,74792,50804],{"class":7745},[727,74794,57681],{"class":1986},[727,74796,60223],{"class":768},[727,74798,50804],{"class":7745},[727,74800,57681],{"class":1986},[727,74802,18130],{"class":768},[727,74804,50804],{"class":7745},[727,74806,74807],{"class":768}," class=\"_aatk\"",[727,74809,57681],{"class":1986},[727,74811,18130],{"class":768},[727,74813,50804],{"class":7745},[727,74815,74816],{"class":768}," class=\"_aamm\"",[727,74818,57681],{"class":1986},[727,74820,18130],{"class":768},[727,74822,50804],{"class":7745},[727,74824,74825],{"class":768}," class=\"_aamn\"",[727,74827,57681],{"class":1986},[727,74829,18130],{"class":768},[727,74831,50804],{"class":7745},[727,74833,74834],{"class":768}," class=\"_aami\" style=\"",[727,74836,74837],{"class":7745},"padding-bottom",[727,74839,74840],{"class":768},": 125%;\"",[727,74842,57681],{"class":1986},[727,74844,60223],{"class":768},[727,74846,50804],{"class":7745},[727,74848,57681],{"class":1986},[727,74850,18130],{"class":768},[727,74852,50804],{"class":7745},[727,74854,74855],{"class":768}," class=\"_ab8w  _ab94 _ab99 _ab9f _ab9m _ab9p _abcf _abcg _abch _abck _abcl _abcm\"",[727,74857,57681],{"class":1986},[727,74859,18130],{"class":768},[727,74861,50804],{"class":7745},[727,74863,74864],{"class":768}," class=\"_aao_\"",[727,74866,57681],{"class":1986},[727,74868,18130],{"class":768},[727,74870,50804],{"class":7745},[727,74872,74873],{"class":768}," class=\"_aap0\" role=\"presentation\"",[727,74875,57681],{"class":1986},[727,74877,18130],{"class":768},[727,74879,50804],{"class":7745},[727,74881,74882],{"class":768}," class=\"_aap1\"",[727,74884,57681],{"class":1986},[727,74886,18130],{"class":768},[727,74888,80],{"class":7745},[727,74890,74891],{"class":768}," class=\"_acay\"",[727,74893,57681],{"class":1986},[727,74895,18130],{"class":768},[727,74897,83],{"class":7745},[727,74899,74900],{"class":768}," style=\"transform: translateX(3289px); width: 1px;\"",[727,74902,57681],{"class":1986},[727,74904,60223],{"class":768},[727,74906,83],{"class":7745},[727,74908,57681],{"class":1986},[727,74910,18130],{"class":768},[727,74912,83],{"class":7745},[727,74914,74915],{"class":768}," class=\"_acaz\" tabindex=\"-1\" style=\"transform: translateX(0px);\"",[727,74917,57681],{"class":1986},[727,74919,18130],{"class":768},[727,74921,50804],{"class":7745},[727,74923,74924],{"class":768}," class=\"_ab8w  _ab94 _ab99 _ab9f _ab9m _ab9p _abcm\" style=\"width: 470px;\"",[727,74926,57681],{"class":1986},[727,74928,18130],{"class":768},[727,74930,50804],{"class":7745},[727,74932,74933],{"class":768}," role=\"button\" class=\"_aa06\" tabindex=\"0\"",[727,74935,57681],{"class":1986},[727,74937,18130],{"class":768},[727,74939,50804],{"class":7745},[727,74941,57681],{"class":1986},[727,74943,18130],{"class":768},[727,74945,50804],{"class":7745},[727,74947,74948],{"class":768}," class=\"_aagu _aamh\"",[727,74950,57681],{"class":1986},[727,74952,18130],{"class":768},[727,74954,50804],{"class":7745},[727,74956,74957],{"class":768}," class=\"_aagv\" style=\"",[727,74959,74837],{"class":7745},[727,74961,74840],{"class":768},[727,74963,57681],{"class":1986},[727,74965,18130],{"class":768},[727,74967,592],{"class":7745},[727,74969,74970],{"class":768}," alt=\"Photo by Zoe Sandell on July 21, 2022. May be an ",[727,74972,74973],{"class":7745},"image",[727,74975,74976],{"class":768}," of 7 people, people standing, nature and people skiing.\" class=\"_aagt\" crossorigin=\"anonymous\" decoding=\"auto\" sizes=\"470px\" \u003C\u002F",[727,74978,50804],{"class":7745},[727,74980,57681],{"class":1986},[727,74982,18130],{"class":768},[727,74984,50804],{"class":7745},[727,74986,74987],{"class":768}," class=\"_aagw\"",[727,74989,57681],{"class":1986},[727,74991,60223],{"class":768},[727,74993,50804],{"class":7745},[727,74995,57681],{"class":1986},[727,74997,60223],{"class":768},[727,74999,50804],{"class":7745},[727,75001,57681],{"class":1986},[727,75003,60223],{"class":768},[727,75005,50804],{"class":7745},[727,75007,57681],{"class":1986},[727,75009,60223],{"class":768},[727,75011,50804],{"class":7745},[727,75013,57681],{"class":1986},[727,75015,60223],{"class":768},[727,75017,50804],{"class":7745},[727,75019,57681],{"class":1986},[727,75021,60223],{"class":768},[727,75023,83],{"class":7745},[727,75025,57681],{"class":1986},[727,75027,18130],{"class":768},[727,75029,83],{"class":7745},[727,75031,75032],{"class":768}," class=\"_acaz\" tabindex=\"-1\" style=\"transform: translateX(470px);\"",[727,75034,57681],{"class":1986},[727,75036,18130],{"class":768},[727,75038,50804],{"class":7745},[727,75040,74924],{"class":768},[727,75042,57681],{"class":1986},[727,75044,18130],{"class":768},[727,75046,50804],{"class":7745},[727,75048,74933],{"class":768},[727,75050,57681],{"class":1986},[727,75052,18130],{"class":768},[727,75054,50804],{"class":7745},[727,75056,57681],{"class":1986},[727,75058,18130],{"class":768},[727,75060,50804],{"class":7745},[727,75062,74948],{"class":768},[727,75064,57681],{"class":1986},[727,75066,18130],{"class":768},[727,75068,50804],{"class":7745},[727,75070,74957],{"class":768},[727,75072,74837],{"class":7745},[727,75074,74840],{"class":768},[727,75076,56240],{"class":1986},[14,75078,75079],{},"The first article and button haven't been given any unique selectors, but the positioning of those elements must be unique. We want to click the first button in the first article.",[719,75081,75083],{"className":58663,"code":75082,"language":58665,"meta":494,"style":494},"article:nth-child(1) section span:nth-child(1) button\n",[90,75084,75085],{"__ignoreMap":494},[727,75086,75087,75089,75091,75093,75095,75097,75100,75102,75104,75106,75108,75110],{"class":729,"line":730},[727,75088,74381],{"class":7745},[727,75090,58724],{"class":1882},[727,75092,2542],{"class":768},[727,75094,165],{"class":1882},[727,75096,5031],{"class":768},[727,75098,75099],{"class":7745},"section",[727,75101,56302],{"class":7745},[727,75103,58724],{"class":1882},[727,75105,2542],{"class":768},[727,75107,165],{"class":1882},[727,75109,5031],{"class":768},[727,75111,73384],{"class":7745},[14,75113,75114],{},"Above I use the position of the ‘article’ by adding ‘nth-child(1)’, you can target any child by changing the number. So nth-child(2) will select the second article within its parent, and so on. Repeat the trick to find and click the correct button.",[14,75116,75117],{},"Downside: elements can change in their relative positions on the page when data is added or removed. For example, property websites tend to have lots of changing data on a page-by-page basis. This can cause the absolute precision of your hierarchical selectors to work against you!",[14,75119,75120,75121],{},"You can learn ",[322,75122,75125],{"href":75123,"rel":75124},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002F:nth-child",[2245],"about children here.",[21,75127,75129],{"id":75128},"what-axiomai-steps-can-custom-selectors-be-used-with","What axiom.ai steps can custom selectors be used with?",[14,75131,75132],{},"The following steps in axiom.ai feature our no-code selector tool and can be used in conjunction with custom css selectors:",[80,75134,75135,75138,75141,75144,75146,75149,75152,75154],{},[83,75136,75137],{},"Get data from a URL\u002FGet data from bot's current page",[83,75139,75140],{},"Get a list of links to pages from a URL\u002FGet a list of links to pages from bot's current page",[83,75142,75143],{},"Click Element\u002FClick Multiple Elements",[83,75145,6426],{},[83,75147,75148],{},"Select List",[83,75150,75151],{},"Download File\u002FFiles",[83,75153,23464],{},[83,75155,75156],{},"Upload a file from Google Drive\u002FDownload a file to Google Drive",[14,75158,75159,75160],{},"You can learn more about ",[322,75161,75162],{"href":7353},"axiom.ai’s Steps here.",[21,75164,75166],{"id":75165},"how-do-i-use-custom-selectors-with-axiomai","How do I use custom selectors with axiom.ai?",[14,75168,75169],{},"axiom.ai provides a no-code interface for adding custom selectors.",[14,75171,75172],{},"Click on the button ‘\u003C> set custom selector’.",[592,75174],{"src":75175,"alt":75176},"\u002Fblog\u002F1-axiom-custom-css-selector.png","Custom selector axiom.ai",[14,75178,75179],{},"Delete any code you see inside the box.",[592,75181],{"src":75182,"alt":75183},"\u002Fblog\u002F2-delete-data-css-selector.png","remove css code from axiom.ai",[14,75185,75186],{},"Add you custom selector and save.",[592,75188],{"src":75189,"alt":75190},"\u002Fblog\u002F3-add-css-selector.png","add you attribte selector into axiom.ai",[14,75192,75193,75196],{},[29,75194,75195],{},"Please note ‘Get data from a web page’"," can handle multiple selectors, to use more than one selector separate them with commas. These types of selector will also only return text results.",[14,75198,75199],{},"To use custom selectors you will need to edit the selector data model (we’ll get to that in a second).",[592,75201],{"src":75202,"alt":75203},"\u002Fblog\u002F4-css-selector.png","add multipile custom selectors",[21,75205,75207],{"id":75206},"setting-advanced-custom-selectors-using-axiomai","Setting advanced custom selectors using axiom.ai",[14,75209,75210],{},"If you're really interested in getting into the nitty-gritty with axiom.ai, you can edit the selector data model manually to tweak the selectors. However, this does require a degree of knowledge. The good news is that we are working on a no-code interface that makes it easy 😀",[14,75212,75213],{},"The selector data is specified in JSON, which is a standard format used for storing data on the web. If you’re familiar with JSON, great! If not here’s a quick cheat sheet:",[592,75215],{"src":75216,"alt":75217},"\u002Fblog\u002F5-advanced-css-selector.png","edit data object for css selectors",[14,75219,75220],{},"To change the selectors edit the code highlighted in green",[14,75222,75223],{},"To change the result type change the value in pink to one of these: “link”, “textContent” or “innerHTML”",[14,75225,75226,75227,75229,75230,75233,75234,75236],{},"Add new selectors by adding ‘{\"selector\":\"\",\"selections\":",[727,75228],{},",\"selectedElements\":",[727,75231,75232],{},"{}",",\"rejectedElements\":",[727,75235],{},",\"resultType\":\"innerHTML\"}’ and do separate with a comma.",[14,75238,75239],{},"Be warned any syntax errors can stop the selector from working! However, if you do mess it up you can always switch back to axiom.ai’s selector tool and re-select some data, which will regenerate the object so you can try again.",[21,75241,75243],{"id":75242},"when-should-you-use-attribute-selectors-with-axiomai","When should you use attribute selectors with axiom.ai?",[639,75245,75247],{"id":75246},"if-the-bot-fails-to-click-the-next-button-when-scraping-a-listing-page","If the bot fails to click the \"next\" button when scraping a listing page",[14,75249,75250],{},"Let’s say you have created a bot to scrape all the data from a web page using the ‘Get data from a webpage’ step. You have set up the select and pager rows in the step and you see green ticks next to them. The scraper should retrieve all results, but when you run the bot, it fails to move onto the next page.",[14,75252,75253],{},"This is what the step looks like when it’s correctly configured:",[592,75255],{"src":75216,"alt":75217},[14,75257,75258],{},"If you run your automation and the listing doesn't advance to the next page, try adjusting the selection of the pager button. For example, try selecting it several times or try selecting it in a slightly different way each time. If that doesn't work, it’s custom selector time! See this Linkedin example:",[719,75260,75261],{"className":56214,"code":73528,"language":56216,"meta":494,"style":494},[90,75262,75263,75375,75393,75405,75409,75423,75427],{"__ignoreMap":494},[727,75264,75265,75267,75269,75271,75273,75275,75277,75279,75281,75283,75285,75287,75289,75291,75293,75295,75297,75299,75301,75303,75305,75307,75309,75311,75313,75315,75317,75319,75321,75323,75325,75327,75329,75331,75333,75335,75337,75339,75341,75343,75345,75347,75349,75351,75353,75355,75357,75359,75361,75363,75365,75367,75369,75371,75373],{"class":729,"line":730},[727,75266,18130],{"class":768},[727,75268,73342],{"class":7745},[727,75270,57885],{"class":1882},[727,75272,4970],{"class":768},[727,75274,20294],{"class":737},[727,75276,56227],{"class":1882},[727,75278,4970],{"class":768},[727,75280,73549],{"class":737},[727,75282,57617],{"class":1882},[727,75284,4970],{"class":768},[727,75286,73556],{"class":737},[727,75288,57922],{"class":1882},[727,75290,4970],{"class":768},[727,75292,73563],{"class":737},[727,75294,73566],{"class":768},[727,75296,73569],{"class":7745},[727,75298,73572],{"class":1882},[727,75300,4970],{"class":768},[727,75302,73577],{"class":737},[727,75304,57922],{"class":1882},[727,75306,4970],{"class":768},[727,75308,73584],{"class":737},[727,75310,57617],{"class":1882},[727,75312,4970],{"class":768},[727,75314,73591],{"class":737},[727,75316,73594],{"class":1882},[727,75318,4970],{"class":768},[727,75320,73599],{"class":737},[727,75322,57632],{"class":768},[727,75324,73604],{"class":7745},[727,75326,73607],{"class":1882},[727,75328,4970],{"class":768},[727,75330,73612],{"class":737},[727,75332,73615],{"class":1882},[727,75334,4970],{"class":768},[727,75336,73620],{"class":737},[727,75338,57617],{"class":1882},[727,75340,4970],{"class":768},[727,75342,73627],{"class":737},[727,75344,73630],{"class":1882},[727,75346,4970],{"class":768},[727,75348,73635],{"class":737},[727,75350,73638],{"class":1882},[727,75352,4970],{"class":768},[727,75354,73643],{"class":737},[727,75356,73646],{"class":1882},[727,75358,4970],{"class":768},[727,75360,73651],{"class":737},[727,75362,73654],{"class":1882},[727,75364,4970],{"class":768},[727,75366,73651],{"class":737},[727,75368,73661],{"class":1882},[727,75370,4970],{"class":768},[727,75372,57567],{"class":737},[727,75374,56240],{"class":768},[727,75376,75377,75379,75381,75383,75385,75387,75389,75391],{"class":729,"line":498},[727,75378,73672],{"class":768},[727,75380,73675],{"class":7745},[727,75382,73678],{"class":1882},[727,75384,4970],{"class":768},[727,75386,73683],{"class":737},[727,75388,56235],{"class":768},[727,75390,73675],{"class":7745},[727,75392,56240],{"class":768},[727,75394,75395,75397,75399,75401,75403],{"class":729,"line":495},[727,75396,60223],{"class":768},[727,75398,73604],{"class":7745},[727,75400,56235],{"class":768},[727,75402,73569],{"class":7745},[727,75404,56240],{"class":768},[727,75406,75407],{"class":729,"line":1895},[727,75408,1898],{"emptyLinePlaceholder":522},[727,75410,75411,75413,75415,75417,75419,75421],{"class":729,"line":1901},[727,75412,18130],{"class":768},[727,75414,727],{"class":7745},[727,75416,57617],{"class":1882},[727,75418,4970],{"class":768},[727,75420,73718],{"class":737},[727,75422,56240],{"class":768},[727,75424,75425],{"class":729,"line":1973},[727,75426,73725],{"class":768},[727,75428,75429,75431,75433,75435,75437],{"class":729,"line":2052},[727,75430,60223],{"class":768},[727,75432,727],{"class":7745},[727,75434,56235],{"class":768},[727,75436,73342],{"class":7745},[727,75438,56240],{"class":768},[14,75440,75441],{},"We would extract the following attribute ‘aria-label=\"Next\"’ to make this selector. Combining both element and attribute selectors, we can come up with one of the following:",[719,75443,75444],{"className":58663,"code":73746,"language":58665,"meta":494,"style":494},[90,75445,75446,75460,75464],{"__ignoreMap":494},[727,75447,75448,75450,75452,75454,75456,75458],{"class":729,"line":730},[727,75449,73342],{"class":7745},[727,75451,58545],{"class":768},[727,75453,73207],{"class":1882},[727,75455,4970],{"class":1986},[727,75457,20294],{"class":737},[727,75459,17433],{"class":768},[727,75461,75462],{"class":729,"line":498},[727,75463,1898],{"emptyLinePlaceholder":522},[727,75465,75466,75468,75470,75472,75474,75476],{"class":729,"line":495},[727,75467,73771],{"class":1882},[727,75469,58545],{"class":768},[727,75471,73207],{"class":1882},[727,75473,4970],{"class":1986},[727,75475,20294],{"class":737},[727,75477,17433],{"class":768},[14,75479,75480],{},"Either one of these should work to find the button on every page.",[639,75482,75484],{"id":75483},"if-the-bot-does-nothing-when-entering-text-into-an-input-form","If the bot does nothing when entering text into an input form",[14,75486,75487],{},"You've created a bot that enters data into a webform. The bot opens the correct page and selects the correct form input, but no text is input.",[14,75489,75490],{},"Let’s see how the enter text step is configured. You should see a green tick in the File field, and some example text in the Text field. This looks like it should work:",[592,75492],{"src":75493,"alt":75494},"\u002Fblog\u002F7-not-text-entered.png","Entering text into inputs browser automation",[14,75496,75497],{},"However, when you run the automation nothing happens - no text is entered.",[14,75499,75500],{},"As always, the simple solution is to try re-selecting the input field. But if that doesn't work, you can try using a custom selector.",[14,75502,75503],{},"For example, if the HTML of your text field looks like this:",[719,75505,75507],{"className":58663,"code":75506,"language":58665,"meta":494,"style":494},"\u003Ctextarea data-testid=\"project-desc\" placeholder=\"Your sentence goes here\" class=\"flex flex-1 py-2.5 px-3.5 border-purple-100 rounded shadow-sm resize-none w-full placeholder-purple-200 focus:outline-none focus:ring-0 focus:border-turquoise-700 text-gray-800\" type=\"text\" autocomplete=\"off\" id=\"what-sentence-would-you-like-to-rewrite\" style=\"min-height: 128px; max-height: unset; height: 126px;\">For example if you wanted to scrape Zillow listings and not the sponsored content you could use this selector:\u003C\u002Ftextarea>\n\n",[90,75508,75509],{"__ignoreMap":494},[727,75510,75511,75513,75515,75517,75519,75522,75525,75528,75531,75534,75537,75539,75542,75545,75548,75551,75554,75557,75560,75563,75565,75568,75570,75573,75576,75579,75582,75585,75588,75591,75593,75596,75598,75601,75603,75606,75608,75611,75613],{"class":729,"line":730},[727,75512,18130],{"class":768},[727,75514,58190],{"class":7745},[727,75516,58274],{"class":7745},[727,75518,73210],{"class":768},[727,75520,75521],{"class":7745},"project-desc",[727,75523,75524],{"class":768},"\" placeholder=\"Your sentence goes here\" class=\"flex ",[727,75526,75527],{"class":7745},"flex-1",[727,75529,75530],{"class":7745}," py-2",[727,75532,75533],{"class":1882},".5",[727,75535,75536],{"class":7745}," px-3",[727,75538,75533],{"class":1882},[727,75540,75541],{"class":7745}," border-purple-100",[727,75543,75544],{"class":768}," rounded ",[727,75546,75547],{"class":7745},"shadow-sm",[727,75549,75550],{"class":7745}," resize-none",[727,75552,75553],{"class":7745}," w-full",[727,75555,75556],{"class":7745}," placeholder-purple-200",[727,75558,75559],{"class":768}," focus:",[727,75561,75562],{"class":7745},"outline-none",[727,75564,75559],{"class":768},[727,75566,75567],{"class":7745},"ring-0",[727,75569,75559],{"class":768},[727,75571,75572],{"class":7745},"border-turquoise-700",[727,75574,75575],{"class":7745}," text-gray-800",[727,75577,75578],{"class":768},"\" type=\"text\" autocomplete=\"off\" id=\"",[727,75580,75581],{"class":7745},"what-sentence-would-you-like-to-rewrite",[727,75583,75584],{"class":768},"\" style=\"",[727,75586,75587],{"class":7745},"min-height",[727,75589,75590],{"class":768},": 128px; ",[727,75592,74396],{"class":7745},[727,75594,75595],{"class":768},": unset; height: 126px;\"",[727,75597,57681],{"class":1986},[727,75599,75600],{"class":768},"For example if you wanted to scrape Zillow listings and not the sponsored ",[727,75602,7791],{"class":7745},[727,75604,75605],{"class":768}," you could ",[727,75607,52467],{"class":7745},[727,75609,75610],{"class":768}," this selector:\u003C\u002F",[727,75612,58190],{"class":7745},[727,75614,56240],{"class":1986},[14,75616,75617],{},"Then the following attribute selector looks like a good solution:",[719,75619,75621],{"className":58663,"code":75620,"language":58665,"meta":494,"style":494},"textarea[data-testid=\"project-desc\"]\n",[90,75622,75623],{"__ignoreMap":494},[727,75624,75625,75627,75629,75631,75633,75636],{"class":729,"line":730},[727,75626,58190],{"class":7745},[727,75628,58545],{"class":768},[727,75630,58548],{"class":1882},[727,75632,4970],{"class":1986},[727,75634,75635],{"class":737},"\"project-desc\"",[727,75637,17433],{"class":768},[639,75639,75641],{"id":75640},"if-your-scrape-works-inconsistently-or-does-not-get-all-the-results-you-want","If your scrape works inconsistently, or does not get all the results you want",[14,75643,75644],{},"You've made a bot to scrape multiple real estate pages on a website such as Zillow. It seems simple enough: select the content and write it to a Google Sheet. For 90% of use cases, it is in fact that simple!",[14,75646,75647],{},"However, property websites have varying content and layouts. Not all content is present on every page. This type of problem can break any and all web scrapers scrambling the results returned.",[592,75649],{"src":75650,"alt":75651},"\u002Fblog\u002F8-scrape-does-not-work.png","selecting data to scrape",[14,75653,75654],{},"To solve this problem, call on custom selectors to give you a helping hand!",[14,75656,75657],{},"For example, to scrape Zillow listings and not any sponsored content you could use this selector:",[719,75659,75661],{"className":58663,"code":75660,"language":58665,"meta":494,"style":494},".result-list-container .list-card-info a\n",[90,75662,75663],{"__ignoreMap":494},[727,75664,75665,75668,75671],{"class":729,"line":730},[727,75666,75667],{"class":1882},".result-list-container",[727,75669,75670],{"class":1882}," .list-card-info",[727,75672,75673],{"class":7745}," a\n",[21,75675,46678],{"id":46677},[14,75677,75678],{},"With the right methods, web scraping is a simple way to collect important data. If you're comfortable using custom selectors, there will be no web page that you can't extract content from. You'll become an expert in no time. Attribute selectors in particular are often unique and can be useful if you want to create custom selectors quickly.",[14,75680,75681],{},"Good luck!",[14,75683,75684],{},[29,75685,75686],{},"UPDATE!!!",[14,75688,75689],{},"In the next couple of release we will be introducing a no-code tool that provide hints and helps you set custom selectors. Watch this space!",[811,75691,75692],{},"html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}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 .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}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}",{"title":494,"searchDepth":495,"depth":495,"links":75694},[75695,75696,75697,75702,75706,75707,75712,75713,75714,75715,75720],{"id":73060,"depth":498,"text":73061},{"id":73153,"depth":498,"text":73154},{"id":73279,"depth":498,"text":73280,"children":75698},[75699,75700,75701],{"id":73286,"depth":495,"text":73287},{"id":73387,"depth":495,"text":73388},{"id":73441,"depth":495,"text":73442},{"id":73514,"depth":498,"text":73515,"children":75703},[75704,75705],{"id":73521,"depth":495,"text":73522},{"id":73784,"depth":495,"text":73785},{"id":73854,"depth":498,"text":73855},{"id":73872,"depth":498,"text":73873,"children":75708},[75709,75710,75711],{"id":73879,"depth":495,"text":73880},{"id":74115,"depth":495,"text":74116},{"id":74362,"depth":495,"text":74363},{"id":75128,"depth":498,"text":75129},{"id":75165,"depth":498,"text":75166},{"id":75206,"depth":498,"text":75207},{"id":75242,"depth":498,"text":75243,"children":75716},[75717,75718,75719],{"id":75246,"depth":495,"text":75247},{"id":75483,"depth":495,"text":75484},{"id":75640,"depth":495,"text":75641},{"id":46677,"depth":498,"text":46678},"2022-07-29","A practical guide to using CSS selectors, including the attribute selector, for browser automation.",{"read":68139,"type":513,"tool":75724,"category":75725,"tags":75726,"location":46733,"featuredimg":75727,"landingimg":75727,"summary":75722,"video":75728,"metaTitle":72981},[46728],[48207],[60142,48365,58665],"\u002Fblog\u002Fcss-attribute-selector.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FbZ48quIx6jg?rel=0",{"title":72981,"description":75722},"blog\u002Fcss-attribute-selectors","t1F3rhSXP2AQLmjOv4hmkDeMtb1m3ImodF4cTAmv_9A",[48207],[513],[46728],{"id":75736,"title":75737,"author":46205,"body":75738,"date":76089,"description":75742,"draft":26250,"extension":506,"meta":76090,"navigation":522,"path":13133,"seo":76097,"stem":76098,"__hash__":76099,"pinned":-1,"category":76100,"type":76101,"tool":76102},"blog\u002Fblog\u002Fautomate-instagram-post.md","Automate posts to Instagram",{"type":8,"value":75739,"toc":76065},[75740,75743,75745],[14,75741,75742],{},"Do you spend much of your working day on Instagram, posting across multiple accounts? If so, this guide is perfect for you. In a few simple steps, we’ll teach you how to build a bot that will post to Instagram for you - without a single line of code. What's more, you will pick up a skill that empowers you to automate just about anything on the web. How awesome is that? ✋",[18,75744],{},[11197,75746,75747,75751,75754,75757,75759,75762,75768,75772,75775,75778,75782,75785,75789,75792,75801,75805,75815,75819,75825,75828,75830,75833,75836,75839,75843,75847,75850,75852,75855,75858,75864,75867,75869,75871,75874,75877,75882,75886,75891,75894,75898,75906,75908,75910,75914,75917,75920,75922,75926,75929,75932,75935,75938,75940,75943,75946,75948,75951,75956,75959,75962,75965,75969,75972,75974,75977,75979,75987,75990,75992,75994,75996,76001,76005,76007,76009,76011,76013,76015,76032,76034,76038,76041,76043,76047,76049,76052,76061],{},[21,75748,75750],{"id":75749},"why-build-a-bot-for-automatic-posting-on-instagram","Why build a bot for automatic posting on Instagram?",[14,75752,75753],{},"Have you ever seen a bot do your work? You can sit back and watch it working its magic on your screen. Before you know it, you’ll find your Instagram posts up and attracting likes - all without touching the keyboard.",[14,75755,75756],{},"There’s a learning curve to building bots to automate the browser. If you’ve used Zapier, then Axiom will be easy for you to pick up. If you’re a newbie, this guide takes you through the steps to program a bot without a single line of code. Once you’ve mastered that, you can start automating a whole range of tedious tasks!",[21,75758,71042],{"id":71041},[14,75760,75761],{},"A bot is the software cousin of the robot. Like a robot, its job is to do the tedious work for us. Just like a physical robot, it needs instructions, so it knows how to do the job. In this case, you’ll give the bot a set of instructions that tells it how to automate posting to Instagram.",[14,75763,75764,75765,46258],{},"Check out our blog on bots ",[322,75766,75767],{"href":46256},"click here",[21,75769,75771],{"id":75770},"how-are-bots-made","How are bots made?",[14,75773,75774],{},"You make bots by combining steps to replicate your actions using Axiom’s no-code bot builder. You can build as many bots as you want for any web-based application, not just Instagram.",[14,75776,75777],{},"If you are completely new to this, keep following the guide and by the end you’ll have made a working bot.",[21,75779,75781],{"id":75780},"how-do-bots-automate-posting-on-instagram","How do bots automate posting on Instagram?",[14,75783,75784],{},"The bot you’re about to make will automate the same web actions you perform to create an Instagram post. Bots work just like you: they open the browser window, click on the new post button, upload an image and insert the text before finally clicking the post button to complete the task.",[21,75786,75788],{"id":75787},"will-my-instagram-account-get-blocked","Will my Instagram account get blocked?",[14,75790,75791],{},"The short answer is no, Instagram does not currently limit posting. However, if you created an army of bots automating Instagram 24\u002F7, then yes, you would be blocked. And to be honest, you would deserve it.",[14,75793,75794,75795,75800],{},"We believe bots should be used responsibly and shouldn’t be used to spam websites and degrade other users' experiences. To avoid getting blocked, read about ",[322,75796,75799],{"href":75797,"rel":75798},"https:\u002F\u002Fthepreviewapp.com\u002Finstagram-limits",[2245],"Instagram’s rate limits"," and don’t exceed them. Don’t use Axiom to abuse the system.",[21,75802,75804],{"id":75803},"lets-dive-in-and-make-a-bot-to-automate-instagram-posting","Let’s dive in and make a bot to automate Instagram posting",[14,75806,75807,75808,75811,75812,44],{},"Before we you start, please note you need to use Axiom’s desktop app as this automation requires files to be uploaded, ",[322,75809,75810],{"href":71934},"Click here to install.","\nCurrently, bots can only work with files on the desktop. If you would like to see this feature on the cloud or elsewhere, ",[322,75813,75814],{"href":71943},"please vote here",[639,75816,75818],{"id":75817},"_1-install-axiom-in-your-chrome-browser","1. Install Axiom in your chrome browser",[14,75820,75821,75822,44],{},"If you haven’t yet installed Axiom, and created an account please goto the chrome store and ",[322,75823,46307],{"href":13910,"rel":75824},[2245],[14,75826,75827],{},"By the way, we give all new users 2 hours of runtime. This means you can build and run this bot a few times on us 🙂",[639,75829,71964],{"id":71963},[14,75831,75832],{},"Create a new Google Sheet. You can do this in your Chrome browser by entering shortcut 'sheet.new'.",[14,75834,75835],{},"First name your sheet 'Automate posting on Instagram’, then add two new tabs to the sheet titled 'Post' and 'Posted.’",[14,75837,75838],{},"Set up your sheet on the first ‘Post’ tab as seen below. Add some dummy posts for testing the bot and add the image path and name.",[592,75840],{"src":75841,"alt":75842},"\u002Fblog\u002Finstgram-sheet.jpg","Set up a google sheet to read data and write data to from Instagram",[639,75844,75846],{"id":75845},"_3-launch-instagram-and-open-axiom","3. Launch Instagram and open Axiom",[14,75848,75849],{},"First, log in to Instagram in your chrome browser. Then open up Axiom and click the '+ New Automation' button. You’re now going to start combining steps to build your automation.",[639,75851,71984],{"id":71983},[14,75853,75854],{},"To build your bot from scratch, click on 'Start blank.' You can make as many bots as you want.",[592,75856],{"src":75857,"alt":72903},"\u002Fblog\u002Fstart-from-blank.jpg",[639,75859,75860,75861],{"id":71992},"5. Add your first step, ‘",[29,75862,75863],{},"Read data from a Google Sheet’",[14,75865,75866],{},"Using the Step Finder click ‘Read data from a Google Sheet’. The step will be added to Axiom for you to configure.",[14,75868,71130],{},[14,75870,72001],{},[14,75872,75873],{},"On the first cell, toggle the switch and enter 'A2'. This setting tells the bot where to start reading data. In the example below, you would start with 'My first automated post' as the column titles fill row one.",[14,75875,75876],{},"On the last cell, click the toggle switch and enter 'AC2'. You have limited the bot to read a single row. If you wanted to post two posts concurrently, you could change the setting to AC3.",[14,75878,72014,75879],{},[322,75880,75881],{"href":67897},"watch these videos.",[592,75883],{"src":75884,"alt":75885},"\u002Fblog\u002Fread-sheet-instagram-posts.jpg","Set up axiom.ai to read data from a Google Sheet",[639,75887,75888,75889],{"id":72022},"6. ",[29,75890,114],{},[14,75892,75893],{},"Click ‘Add a step’ below the ‘read’ step. Using the Step Finder click on 'Loop through data' to add the step.",[592,75895],{"src":75896,"alt":75897},"\u002Fblog\u002Finteract-step.jpg","Add an interact step for automating web actions",[14,75899,75900,75901,69184],{},"In the ‘Go to Url’ field enter ‘",[322,75902,75905],{"href":75903,"rel":75904},"https:\u002F\u002Fwww.instagram.com",[2245],"https:\u002F\u002Fwww.instagram.com\u002F",[14,75907,72036],{},[14,75909,72039],{},[592,75911],{"src":75912,"alt":75913},"\u002Fblog\u002Fclick-element.jpg","automate clicks with axiom.ai",[14,75915,75916],{},"Then, click on 'Select' and use our selector tool to highlight the ‘Create a new post’ button on Instagram and click confirm.",[14,75918,75919],{},"Well done, you have automated a web action.",[639,75921,72052],{"id":72051},[592,75923],{"src":75924,"alt":75925},"\u002Fblog\u002Ffile-path-set-up.jpg","Automate image uploads to instagram posts using axiom.ai's file upload step",[14,75927,75928],{},"Add an 'Upload file’ sub step and select the button 'Select from computer' in the Instagram pop-up window.",[14,75930,75931],{},"In 'File path' click on the yellow stadium 'Insert data' and select Google-Sheet-Data. A data preview will open. Select column C with the image path and save and close the preview.",[14,75933,75934],{},"Add a second 'Click element' sub step. Select the ‘next’ button.",[14,75936,75937],{},"Use a third 'Click element' sub step. Select the ‘filter’ button.",[14,75939,72065],{},[14,75941,75942],{},"Now pass your caption from the sheet into the ‘Enter text’ step. Next, click on the yellow stadium 'Insert data' and select Google-Sheet-Data. A data preview will open. Select column A and save and close the preview.",[592,75944],{"src":75945,"alt":75925},"\u002Fblog\u002Fenter-text-substep.jpg",[14,75947,75928],{},[14,75949,75950],{},"Add one more ‘Click element’ to click Instagram’s ‘Post’ button.",[14,75952,75953],{},[29,75954,75955],{},"Important",[14,75957,75958],{},"When you see the text ‘Do you want to click this element now?’ click cancel so that the post does not send.",[14,75960,75961],{},"You can disable this step by clicking on the menu to the left and selecting \"Disable step\" from the drop down. This stops you from accidentally sending messages before you're ready!",[14,75963,75964],{},"You’re almost ready to test the bot.",[639,75966,75968],{"id":75967},"_8-add-a-new-step-write-data-to-a-google-sheet","8. Add a new step ‘Write data to a Google Sheet’",[14,75970,75971],{},"Add a new step (not a sub step) below the ‘Interact’ step by choosing ‘Write data to a Google Sheet’.",[14,75973,72105],{},[14,75975,75976],{},"For ‘Sheet Name’, select the tab called 'Posted'. This tab will keep a record of the posts sent.",[14,75978,72111],{},[639,75980,75982,75983],{"id":75981},"_9-delete-rows-from-a-google-sheet","9. ",[29,75984,75985],{},[29,75986,281],{},[14,75988,75989],{},"Add the step ‘Delete rows from a Google Sheet' to delete the row of data that has been used to create the post. This is to prevent it from being repeated.",[14,75991,72125],{},[14,75993,72128],{},[14,75995,72131],{},[14,75997,75998,75999],{},"Well done! The bot is complete and ready to test ",[29,76000,46635],{},[592,76002],{"src":76003,"alt":76004},"\u002Fblog\u002Fdelete-data.jpg","Delete rows of data from Google Sheet",[21,76006,16228],{"id":16227},[14,76008,72141],{},[14,76010,46645],{},[14,76012,46648],{},[14,76014,71335],{},[555,76016,76017,76022,76027],{},[83,76018,76019],{},[29,76020,76021],{},"Does the image upload into the post?",[83,76023,76024],{},[29,76025,76026],{},"Is the Instgram filter clicked?",[83,76028,76029],{},[29,76030,76031],{},"Is the caption entered into the post?",[14,76033,46654],{},[21,76035,76037],{"id":76036},"debugging-your-bot","Debugging your bot",[14,76039,76040],{},"If you experience any issue with the bot not clicking buttons, try re-selecting the button or text input. To change the selection, move the cursor slowly over the object and re-select.",[14,76042,71358],{},[14,76044,72175,76045],{},[322,76046,487],{"href":486},[21,76048,46678],{"id":46677},[14,76050,76051],{},"Now you can run your bot on the desktop app as often as you like. You have a working bot to automate a repetitive task on Instagram that you built yourself. That's pretty awesome! What’s your next bot going to be?",[14,76053,76054,76055,76060],{},"If you would like to schedule this bot, vote for ‘",[322,76056,76059],{"href":76057,"rel":76058},"https:\u002F\u002Fbrowserbots.nolt.io\u002Fwidget\u002F10",[2245],"File management for the Cloud","’ on our product roadmap.",[46683,76062,46686,76063],{"id":46685},[322,76064,46690],{"href":46689},{"title":494,"searchDepth":495,"depth":495,"links":76066},[76067,76068,76069,76070,76071,76072,76084,76085,76086],{"id":75749,"depth":498,"text":75750},{"id":71041,"depth":498,"text":71042},{"id":75770,"depth":498,"text":75771},{"id":75780,"depth":498,"text":75781},{"id":75787,"depth":498,"text":75788},{"id":75803,"depth":498,"text":75804,"children":76073},[76074,76075,76076,76077,76078,76079,76080,76081,76082],{"id":75817,"depth":495,"text":75818},{"id":71963,"depth":495,"text":71964},{"id":75845,"depth":495,"text":75846},{"id":71983,"depth":495,"text":71984},{"id":71992,"depth":495,"text":71993},{"id":72022,"depth":495,"text":72023},{"id":72051,"depth":495,"text":72052},{"id":75967,"depth":495,"text":75968},{"id":75981,"depth":495,"text":76083},"9. Delete rows from a Google Sheet",{"id":16227,"depth":498,"text":16228},{"id":76036,"depth":498,"text":76037},{"id":46677,"depth":498,"text":46678,"children":76087},[76088],{"id":46685,"depth":1895,"text":46722},"2022-07-05",{"read":70686,"type":513,"tool":76091,"category":76092,"tags":76093,"location":46733,"featuredimg":523,"landingimg":76094,"summary":76095,"video":76096},[46728],[53990],[13413,12880,11532],"\u002Fblog\u002Finstagram-post-icon.jpg","Learn how to automate posts on Instagram using axiom.ai's no-code bot building tool","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F4rThSF7BjDw?rel=0",{"title":75737,"description":75742},"blog\u002Fautomate-instagram-post","P5NYnCpl0jdEb9zhW546tqmfyLVqQN8AXh3VmU2ub4I",[53990],[513],[46728],{"id":76104,"title":76105,"author":70410,"body":76106,"date":76089,"description":76400,"draft":26250,"extension":506,"meta":76401,"navigation":522,"path":19662,"seo":76410,"stem":76411,"__hash__":76412,"pinned":-1,"category":76413,"type":76414,"tool":76415},"blog\u002Fblog\u002Fscrape-amazon-asins.md","How to simply scrape ASIN data from Amazon",{"type":8,"value":76107,"toc":76377},[76108,76114,76116,76119,76123,76126,76129,76140,76143,76147,76150,76153,76156,76162,76165,76169,76176,76179,76182,76185,76189,76193,76196,76200,76204,76207,76211,76214,76217,76221,76224,76228,76233,76236,76240,76243,76247,76250,76254,76258,76261,76264,76267,76271,76274,76277,76280,76284,76288,76291,76295,76298,76302,76306,76309,76313,76316,76320,76324,76327,76331,76335,76338,76341,76344,76348,76352,76355,76359,76361,76364,76367,76369],[14,76109,76110,76111,76113],{},"Welcome! In this guide we are going to cover how to ",[322,76112,19663],{"href":19692}," from a list of products, where each product has a number of variants that all need scraping.",[18,76115],{},[14,76117,76118],{},"This can be a daunting task, but never fear - by using some clever techniques you can hugely simplify the problem and get the data you need for your business.",[21,76120,76122],{"id":76121},"why-its-hard","Why it's hard",[14,76124,76125],{},"The first idea that comes to mind is to vist the listing pages, scrape the link to each page, and then use those links to visit the product pages to scrape each variant's ASIN.",[14,76127,76128],{},"Unfortunately, it quickly becomes apparent that this is not going to work. There are two major problems that present themselves:",[80,76130,76131,76134],{},[83,76132,76133],{},"Each product can have its own unique collection of variants. How can we tell the bot to select them without hardcoding hundreds of clicks?",[83,76135,76136,76137,76139],{},"Clicking each variant can often alter the layout of the page. This means a single ",[322,76138,62727],{"href":19675},"  won't work - we'd need to figure out a way to dynamically switch the scraper setup.",[14,76141,76142],{},"Multiply this by the number of products we have to deal with and the automation becomes unmanageable. You'd spend more time trying to build this than you save by running it. So is there a better way?",[21,76144,76146],{"id":76145},"how-to-use-amazons-coding-to-our-advantage","How to use Amazon's coding to our advantage",[14,76148,76149],{},"When using Axiom, you can get a lot of mileage out of observing how a site is built and using this to your advantage.",[14,76151,76152],{},"In this case, when performing an Amazon search we can see that each of the product variants has its own listing in the search.",[14,76154,76155],{},"This is useful, because now it looks like we can avoid the problem of figuring out how to cycle through each variant; Amazon's dev team have already written this code for us. All we have to do is type the product name into the search bar, and all the variants will appear in the search listing.",[14,76157,76158,76159,76161],{},"However, we're still left with our second problem above, about how to select which ",[322,76160,62727],{"href":19692}," we need for a particular page. Can we bypass this as well?",[14,76163,76164],{},"It turns out that the answer is yes, we can! Let's take a look at the anatomy of an Amazon page URL:",[592,76166],{"src":76167,"alt":76168},"\u002Fblog\u002Famazon-asin-url-1.jpg","axiom.ai can scrape Amazons ASINs from the URL string",[14,76170,76171],{},[322,76172,76175],{"href":76173,"rel":76174},"https:\u002F\u002Fwww.amazon.co.uk\u002FDreamscene-Geometric-Pillowcase-Reversible-Charcoal\u002Fdp\u002FB082DL7SMX\u002Fref=sr_1_16?crid=1J0ET0KDRVBTI&keywords=dreamscene%2Bduvet%2Bcover&qid=1656601779&sprefix=dreamscene%2Bduvet%2Bcover%2Caps%2C130&sr=8-16&th=1",[2245],"See the page",[14,76177,76178],{},"What's that number highlighted in green? It's the ASIN we're looking for! So if we can make a bot that grabs the URLS and extracts the ASIN, we're home and dry.",[14,76180,76181],{},"There's one final fly in the ointment: sponsored content. Amazon adds this related content to the top of all search pages, but that poses a problem if you're after specific products. Luckily, Axiom provides tools to deal with this case; we can make a selection that exludes these promoted products.",[14,76183,76184],{},"Now we have all the pieces we need, let's build a bot!",[21,76186,76188],{"id":76187},"how-to-build-a-bot-to-scrape-amazon-asin-data","How to build a bot to scrape Amazon ASIN data",[639,76190,76192],{"id":76191},"_1-create-a-google-sheet","1. Create a Google Sheet",[14,76194,76195],{},"Create a Google Sheet containing two tabs. We'll call them \"Search\" and \"Results\". Add all the product names you want to scrape ASINs for in column A of the tab called \"Search\".",[592,76197],{"src":76198,"alt":76199},"\u002Fblog\u002Fgooglesheet-for-amazon.jpg","Create a Google Sheet",[639,76201,76203],{"id":76202},"_2-create-a-new-axiom","2. Create a new Axiom",[14,76205,76206],{},"Click on the \"+ New Automation\" button to make a new automation! Exciting.",[639,76208,76210],{"id":76209},"_3-start-from-blank","3. Start from blank",[14,76212,76213],{},"We're building this one from from scratch by adding our own steps.",[592,76215],{"src":75857,"alt":76216},"Start from blank - build a bot to automate amazon with axiom.ai",[639,76218,76220],{"id":76219},"_4-read-data-from-a-google-sheet","4. Read data from a Google Sheet",[14,76222,76223],{},"Add a \"Read data from a Google Sheet\" step and select the tab called \"Search\".",[639,76225,76227],{"id":76226},"_5-interact-with-amazons-web-page","5. Interact with Amazon's web page",[14,76229,15528,76230,76232],{},[90,76231,114],{}," step. This step contains all the sub step we need to interact with Amazon's webpage.",[592,76234],{"src":75896,"alt":76235},"Add an interact step Axioma.i",[639,76237,76239],{"id":76238},"_6-go-to-url","6. Go to URL",[14,76241,76242],{},"Set the Amazon search page in the \"Go to URL\" sub step",[639,76244,76246],{"id":76245},"_7-enter-text-into-amazons-search-field","7. Enter text into Amazon's search field",[14,76248,76249],{},"Add an \"Enter Text\" substep. Click \"Select\" and select the search bar's input field. Then click \"Insert Data\" to add google-sheet-data, and from the popup select the column that contains your product names.",[592,76251],{"src":76252,"alt":76253},"\u002Fblog\u002Fenter-text.jpg","Enter data into Amazon's search bar with axiom.ai",[639,76255,76257],{"id":76256},"_9-trigger-the-search-on-amazon","9. Trigger the search on Amazon",[14,76259,76260],{},"Add a \"Click Element\" sub step. This step clicks the search button and updates the search results.",[592,76262],{"src":76263,"alt":76235},"\u002Fblog\u002Fsubstep-amazon-asin.jpg",[14,76265,76266],{},"That's the first part of the bot done - only a few more steps to add. Feel free to do a test run!",[639,76268,76270],{"id":76269},"_10-add-a-step-to-scrape-the-data-from-amazon","10. Add a step to scrape the data from Amazon",[14,76272,76273],{},"Add a \"Get data from a webpage\" step. First, let's scrape the product titles.",[14,76275,76276],{},"Select a title (ignoring any sponsored content), then select a second title to create a repeating selection. Add a new column, and click the dropdown to select the \"Link\" data type. Then select the titles again to grab the links to the product pages.",[14,76278,76279],{},"Set the Max Results setting to 10 for the first few runs when you are testing the bot - we can turn this off later when we're happy everything is working.",[592,76281],{"src":76282,"alt":76283},"\u002Fblog\u002Fselecting-data-amazon.gif","Selecting data to scrape on Amazon with axiom.ai's no-code selector tool",[639,76285,76287],{"id":76286},"_11-write-the-data-to-the-google-sheet","11. Write the data to the Google Sheet",[14,76289,76290],{},"Add a \"Write data to a Google Sheet\" step and set \"Sheet name\" to \"Results\". The \"Data\" dropdown should already be set correctly to use the interact-data variable from our 'Interact' step, but double check it's looking OK.",[639,76292,76294],{"id":76293},"_12-read-the-scraped-data-from-the-google-sheet","12. Read the scraped data from the Google Sheet",[14,76296,76297],{},"Now add another \"Read data from a Google Sheet\". This time select the sheet name called \"Results\".",[592,76299],{"src":76300,"alt":76301},"\u002Fblog\u002Fread-data-amazon-asin.jpg","Reading Amazon product data from a Google Sheet in Axom.ai",[639,76303,76305],{"id":76304},"_14-extract-the-asin-from-the-url-part-1","14. Extract the ASIN from the url part 1",[14,76307,76308],{},"Add a new step called \"Split by character\". In the \"Data\" field select the \"google-sheet-data__1\" step - that's our second \"Read data from a Google Sheet\" step - and choose column B, the one with the url.",[592,76310],{"src":76311,"alt":76312},"\u002Fblog\u002Fdata-selection-asin-split.jpg","Select data to split",[14,76314,76315],{},"In the field called \"Character\" add \"dp\" (without the quotation marks!)",[592,76317],{"src":76318,"alt":76319},"\u002Fblog\u002Famazon-asin-split-by-character.jpg","axiom.ai extracting ASINs from Amazon",[639,76321,76323],{"id":76322},"_15-extract-the-asin-from-the-url-part-2","15.  Extract the ASIN from the url part 2",[14,76325,76326],{},"Add one more \"Split by character\" set the \"Character\" to \"\" (again, no quotation marks). In \"Data\" select \"split-by-character\" - what we want here is to pass the result of the first split into the second split, this chaining them together. When the preview appears, select column A.",[592,76328],{"src":76329,"alt":76330},"\u002Fblog\u002Famazon-asin-split-by-character-two.jpg","Split character step extracting ASIN from Amazo using axiom.ai's no-code bot builder",[639,76332,76334],{"id":76333},"_16-write-the-data-to-the-google-sheet","16. Write the data to the Google Sheet",[14,76336,76337],{},"We're almost done! Let's add a final \"Write data to a Google Sheet\" step.",[14,76339,76340],{},"In the \"Spreadsheet url\" field, find the sheet you previously created. Set \"Sheet name\" to \"Results\", make sure \"Data\" is set to \"split-by-character__1\", the data variable for our last \"Split by character\" step.",[14,76342,76343],{},"Toggle \"Clear data before writing | Add to existing data\" to display \"Add to existing data\" and set the starting cell option to \"C1\".",[592,76345],{"src":76346,"alt":76347},"\u002Fblog\u002Fwrite-data-google-sheet-asin.jpg","Writing data to a Google Sheet in axiom.ai",[639,76349,76351],{"id":76350},"_17-the-bot-is-complete-and-ready-to-scrape-amazon","17. The bot is complete and ready to scrape Amazon",[14,76353,76354],{},"Woo, we're done! You have just built a bot for scraping ASIN's from Amazon's website all without a single line of code. Go ahead and run the bot.",[592,76356],{"src":76357,"alt":76358},"\u002Fblog\u002Fgoogle-sheet-asins.jpg","web scraping a list of ASINs from Amazon into Google Sheets",[21,76360,46678],{"id":46677},[14,76362,76363],{},"Some websites don't make it easy to scrape data, but by analysing a site's structure and observing its behaviour we can often work out how to scrape the data we want.",[14,76365,76366],{},"Always remember that the more you can try and simplify the approach, the easier it will be to build things. It's worth taking a little time to think through the best way to solve your problem before diving in. A small saving in complexity can reap much bigger rewards than you might think!",[21,76368,67351],{"id":67350},[14,76370,67354,76371,2004,76373,67361,76375,21423],{},[322,76372,67357],{"href":19666},[322,76374,67360],{"href":19692},[322,76376,72201],{"href":19675},{"title":494,"searchDepth":495,"depth":495,"links":76378},[76379,76380,76381,76398,76399],{"id":76121,"depth":498,"text":76122},{"id":76145,"depth":498,"text":76146},{"id":76187,"depth":498,"text":76188,"children":76382},[76383,76384,76385,76386,76387,76388,76389,76390,76391,76392,76393,76394,76395,76396,76397],{"id":76191,"depth":495,"text":76192},{"id":76202,"depth":495,"text":76203},{"id":76209,"depth":495,"text":76210},{"id":76219,"depth":495,"text":76220},{"id":76226,"depth":495,"text":76227},{"id":76238,"depth":495,"text":76239},{"id":76245,"depth":495,"text":76246},{"id":76256,"depth":495,"text":76257},{"id":76269,"depth":495,"text":76270},{"id":76286,"depth":495,"text":76287},{"id":76293,"depth":495,"text":76294},{"id":76304,"depth":495,"text":76305},{"id":76322,"depth":495,"text":76323},{"id":76333,"depth":495,"text":76334},{"id":76350,"depth":495,"text":76351},{"id":46677,"depth":498,"text":46678},{"id":67350,"depth":498,"text":67351},"Learn in minutes to scrape ASIN data from Amazon using Axiom, a no-code browser automation tool.",{"read":61760,"type":513,"tool":76402,"category":76403,"tags":76404,"location":46733,"featuredimg":46734,"landingimg":76406,"summary":76407,"video":76408,"metaTitle":76409},[46728],[48207],[67389,67391,76405],"product data","\u002Fblog\u002Famazon-scaper.jpg","A practical guide on scraping that hard to reach data on Amazon.","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fr_C2cb5nbuY?rel=0","How to scrape ASIN data from Amazon | Axiom Academy",{"title":76105,"description":76400},"blog\u002Fscrape-amazon-asins","wSSQYXTUYIynYDY3ExhgNG9Ykaqs5f3FNEZeDBLQY58",[48207],[513],[46728],{"id":76417,"title":76418,"author":76419,"body":76420,"date":76659,"description":76424,"draft":26250,"extension":506,"meta":76660,"navigation":522,"path":76666,"seo":76667,"stem":76668,"__hash__":76669,"pinned":-1,"category":76670,"type":76671,"tool":76672},"blog\u002Fblog\u002Faxiom-zapier.md","Use Zapier and Axiom together to automate anything!","Yaseer Sheriff",{"type":8,"value":76421,"toc":76650},[76422,76425,76428,76431,76434,76437,76440,76457,76460,76464,76473,76476,76479,76482,76485,76489,76492,76495,76498,76501,76505,76508,76511,76514,76517,76521,76524,76527,76530,76533,76536,76539,76542,76546,76549,76552,76559,76561,76610,76614,76617,76626,76629],[14,76423,76424],{},"If you work with no-code tools, you've probably worked with Zapier - the web's original glue to connect web-apps.",[14,76426,76427],{},"If there's an API for it, chances are, there's a Zap to automate it.",[14,76429,76430],{},"But what if there's no Zapier Integration, or the API is incomplete?",[14,76432,76433],{},"This is where tools like Axiom come in - using the two together means you can automate anything",[18,76435],{"alt":76436},"Combine browser and api automation with axiom.ai and Zapier",[14,76438,76439],{},"Here's a few examples:",[80,76441,76442,76445,76448,76451,76454],{},[83,76443,76444],{},"Scraping prices on a schedule, then triggering a Zap when the price changes",[83,76446,76447],{},"Fulfilling an order on a supplier's site, when someone buys on Shopify or Amazon",[83,76449,76450],{},"Managing 100s of customer accounts, on Amazon, YouTube and Social Media",[83,76452,76453],{},"Monitoring a booking form for availability, booking and triggering a Zap when availability opens",[83,76455,76456],{},"Automating government websites and banks without APIs, then triggering Zaps on top, to build new fintech companies",[14,76458,76459],{},"Plus many more! Uzing Zapier and Axiom together let's you achieve much more than either tool alone.",[21,76461,76463],{"id":76462},"zapier-how-does-it-work","Zapier - How does it work?",[14,76465,76466,76467,450,76470,44],{},"Zapier automates using Zapier apps, each of which provides API integration with a particular piece of software. There are thousands upon thousands of apps in Zapier's comprehensive store, and each one provides API integrations by supplying ",[807,76468,76469],{},"triggers",[807,76471,76472],{},"actions",[14,76474,76475],{},"A trigger is an event that an app fires whenever a particular thing happens. For example, the Gmail app has a trigger that fires when an email hits your inbox.",[14,76477,76478],{},"An action is something an app can do in response to a trigger. For example, in the JIRA app, you might have an action which creates a new ticket.",[14,76480,76481],{},"Within Zapier, you can then use these triggers and actions to link systems together and create larger workflows. By combining the above trigger and action, you can now create a ticket in JIRA whenever an email lands in your inbox. Pretty cool!",[592,76483],{"src":76484},"\u002Fblog\u002Fzapier-jira.png",[21,76486,76488],{"id":76487},"axiom-how-does-it-work","Axiom - How does it work?",[14,76490,76491],{},"Axiom automates your work by using browser actions input into a website's user interface (UI).",[14,76493,76494],{},"This means that you can automate anything that you manually do yourself. Clicking on buttons, selecting items from lists, entering text into forms and copying and pasting data from one place to another are some of the most common browser actions, and ones you likely do many hundreds - even thousands - of times each day.",[14,76496,76497],{},"What's great about this is that for axiom to work, you don't need API access; just some kind of browser-based user interface, which all web software has. You can then do anything the interface allows you to do, without having to rely on the site's developers having implemented an API trigger or action.",[592,76499],{"src":76500},"\u002Fblog\u002Faxiom-example.png",[21,76502,76504],{"id":76503},"zapier-when-do-i-use-it","Zapier - When do I use it?",[14,76506,76507],{},"If there's a Zapier integration and it contains the triggers and actions you need, we recommend using it!",[14,76509,76510],{},"APIs are very well defined, and don't often change. If they do, the changes are usually tightly controlled behind different versions of the app - a feature Zapier supports well. This makes the connection very reliable.",[14,76512,76513],{},"Zapier's trigger system is also powerful because it lets you respond to events in real time. This cuts out complexity compared to more passive systems, which have to read lists of data and then determine what to do for each item. Zapier skips all of that by listening to the app directly, and immediately acting when it receives a signal.",[14,76515,76516],{},"However, there are scenarios when a system has a limited (or nonexistent) API, or where integrating using the provided API is abstract or unintuitive. Data can be formatted in ways that are hard to understand, and it can be tricky to figure out what you need to do.",[21,76518,76520],{"id":76519},"axiom-when-do-i-use-it","Axiom - When do I use it?",[14,76522,76523],{},"This is where axiom excels. Because it uses the UI, and because every website has a UI, it doesn't matter whether a particular API trigger or action has been implemented - if you can do it, so can axiom.",[14,76525,76526],{},"This can be very useful in data extraction (web scraping), where many platforms don't give API access to their data. Social media platforms like LinkedIn or Instagram are unlikely to ever have Zaps.",[14,76528,76529],{},"UI automation can also be used for data entry by typing the required data directly into web forms. This is often useful with government forms, legacy systems, and niche e-commerce applications.",[14,76531,76532],{},"Smaller tools that are earlier in their development cycle have also often not yet had the resources to build an API, so this can be a great option for integrating with their functionality early.",[14,76534,76535],{},"Even if an API is provided, UI automation may be the more intuitive choice for non-coders.",[14,76537,76538],{},"For example, if you’re copy-pasting data from a complex analytics system into a spreadsheet, it's often easier to visually select data as it appears on-screen rather than trying to understand the data output of an API. In these systems, the UI's job is to make complex information digestible, and you can take advantage of this in your automation.",[14,76540,76541],{},"Finally, building an automation in a way that mirrors your normal work will often be easier to create, understand and maintain. This is because you don't have to map your existing well-understood process into a different one in order to automate it.",[21,76543,76545],{"id":76544},"no-code-tools-are-most-powerful-when-used-together","No-code tools are most powerful when used together",[14,76547,76548],{},"The magic really starts to happen when you combine Zapier and Axiom together, giving you the best of both worlds.",[14,76550,76551],{},"By using these tools together, you can automate literally anything - and that’s not an exaggeration!",[14,76553,76554,76555,44],{},"Learn more about why: ",[322,76556,76558],{"href":76557},"\u002Fblog\u002Fconnect-no-code-together-to-build-product-ideas","connecting no-code tools together is the best way to build something new",[21,76560,6725],{"id":6724},[80,76562,76563,76579,76594],{},[83,76564,76565,76568],{},[29,76566,76567],{},"Fulfilling an order on a supplier's site, when someone buys on Shopify",[80,76569,76570,76573,76576],{},[83,76571,76572],{},"In this case, the shop was a niche e-commerce storefront which did not have an API",[83,76574,76575],{},"Previously, they had to manually enter orders received in Shopify into the second store - very tedious!",[83,76577,76578],{},"By combining a Shopify \"new order\" trigger in Zapier with a UI automation to copy the data into the shopping cart of the other storefront, they were able to automate the whole process",[83,76580,76581,76583],{},[29,76582,76444],{},[80,76584,76585,76588,76591],{},[83,76586,76587],{},"Price monitoring is common across lots of industries: e-commerce, crypto, real-estate to name but a few",[83,76589,76590],{},"Most prices are not available via API - you need a scraper",[83,76592,76593],{},"By detecting the price change with Axiom and then sending this information to Zapier, you can hook into a huge number of other apps",[83,76595,76596,76599],{},[29,76597,76598],{},"Managing multiple customer accounts, on Amazon, YouTube and Social Media",[80,76600,76601,76604,76607],{},[83,76602,76603],{},"Agencies are prolific Zap users that automate to stay time-efficient. Unfortunately, Zaps can't automate every aspect of customer account management.",[83,76605,76606],{},"We see agencies logging in and out of customer accounts on Amazon or YouTube, then repeating the same steps, such as generating a report, downloading or uploading files, and managing stock or assets",[83,76608,76609],{},"Axiom is a great way to automate the repetitive steps on each account, whilst tying into their existing Zaps",[21,76611,76613],{"id":76612},"how-do-i-use-zapier-and-axiom-together","How do I use Zapier and Axiom together?",[14,76615,76616],{},"Axiom has a Zapier app available on the pro tier, so you can trigger axiom from any Zapier integration:",[80,76618,76619],{},[83,76620,76621,76625],{},[322,76622,76624],{"href":76623},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fzapier#trigger-axiom-from-zapier","Trigger Axiom from Zapier","\nIt's possible to trigger Zapier from Axiom using either webhooks, or Google Sheets, which is available on our free tier.",[14,76627,76628],{},"Use webhooks when the data sent to Zapier will be relatively small:",[80,76630,76631,76638],{},[83,76632,76633,76637],{},[322,76634,76636],{"href":76635},"\u002Fdocs\u002Fno-code-tool\u002Fintegrations\u002Fzapier#trigger-zapier-from-axiom","Trigger Zapier by Webhook","\nIf large volumes of data are being sent, both Zapier and Axiom have deep sheets integration, which makes data-driven automations much easier to handle:",[83,76639,76640,76643,76644,76647,76648,44],{},[322,76641,76642],{"href":72898},"Trigger Zapier with Google Sheets","\nIf we can be of help, please don't hesitate to contact us for ",[322,76645,76646],{"href":486},"one-on-one help"," or take a look at our ",[322,76649,62806],{"href":61952},{"title":494,"searchDepth":495,"depth":495,"links":76651},[76652,76653,76654,76655,76656,76657,76658],{"id":76462,"depth":498,"text":76463},{"id":76487,"depth":498,"text":76488},{"id":76503,"depth":498,"text":76504},{"id":76519,"depth":498,"text":76520},{"id":76544,"depth":498,"text":76545},{"id":6724,"depth":498,"text":6725},{"id":76612,"depth":498,"text":76613},"2022-06-06",{"read":61760,"type":513,"tool":76661,"category":76662,"tags":76663,"location":46733,"featuredimg":46734,"landingimg":76664,"summary":76665},[46728],[53990],[829,48147],"\u002Fblog\u002Fzapier-and-axiom.png","Plug gaps in your Zaps and automate all your work.","\u002Fblog\u002Faxiom-zapier",{"title":76418,"description":76424},"blog\u002Faxiom-zapier","oKgsgXda6cB1CuAftZ9kP4OL6jUR8IFEMnos7ftVHtU",[53990],[513],[46728],{"id":76674,"title":76675,"author":71599,"body":76676,"date":77279,"description":76680,"draft":26250,"extension":506,"meta":77280,"navigation":522,"path":72898,"seo":77287,"stem":77288,"__hash__":77289,"pinned":-1,"category":77290,"type":77291,"tool":77292},"blog\u002Fblog\u002Fhow-to-automate-data-google-sheets.md","How to automate data work in Google Sheets",{"type":8,"value":76677,"toc":77259},[76678,76681,76684,76686,76689,76692,76698,76701,76704,76708,76711,76714,76717,76791,76794,76798,76801,76804,76807,76818,76821,76826,76829,76832,76839,76846,76850,76854,76857,76860,76864,76867,76870,76873,76876,76879,76882,76920,76923,76926,76930,76933,76938,76942,76945,76948,77060,77064,77067,77070,77081,77084,77090,77093,77096,77104,77107,77141,77144,77154,77157,77161,77164,77171,77179,77186,77191,77194,77198,77201,77204,77207,77218,77221,77225,77228,77231,77242,77246,77249,77252],[14,76679,76680],{},"Every job has those mind-numbing repetitive tasks.",[14,76682,76683],{},"Chances are, if your work involves a computer, a whole bunch of those tasks involve the venerable spreadsheet.",[18,76685],{"alt":7318},[14,76687,76688],{},"Spreadsheets are an essential tool for anyone that works with data, and have remained so for decades despite many more new-fangled apps coming in to try and supplant them.",[14,76690,76691],{},"A great deal of repetitive spreadsheet work can be automated, but spreadsheets have so many features people don't know where to start - this guide shows you where to begin",[21,76693,76695],{"id":76694},"how-to-extract-and-import-data",[29,76696,76697],{},"How to Extract and Import Data",[14,76699,76700],{},"Ah, copy-pasting data from the internet - a tedious task that everyone with a computer has had to do at some point.",[14,76702,76703],{},"This is a task very amenable to automation, and as such there are a few different approaches.",[639,76705,76707],{"id":76706},"data-import-google-sheet-functions","Data Import Google Sheet Functions",[14,76709,76710],{},"If your data is well structured, there are a range of native sheet functions that may get the job done.",[14,76712,76713],{},"In particular, to extract data from websites this way, you’ll need to have a structured HTML table or list.",[14,76715,76716],{},"These functions are particularly useful if you’re importing data from feeds and files, available on a URL.",[7092,76718,76719,76732],{},[7095,76720,76721],{},[7098,76722,76723,76726,76729],{},[7101,76724,76725],{},"Formula",[7101,76727,76728],{},"When to use",[7101,76730,76731],{},"Documentation Link",[7108,76733,76734,76749,76763,76777],{},[7098,76735,76736,76739,76742],{},[7113,76737,76738],{},"IMPORTHTML()",[7113,76740,76741],{},"Public HTML Tables or Lists",[7113,76743,76744],{},[322,76745,76748],{"href":76746,"rel":76747},"https:\u002F\u002Fsupport.google.com\u002Fdocs\u002Fanswer\u002F3093339",[2245],"Docs",[7098,76750,76751,76754,76757],{},[7113,76752,76753],{},"IMPORTFEED()",[7113,76755,76756],{},"RSS Feeds",[7113,76758,76759],{},[322,76760,76748],{"href":76761,"rel":76762},"https:\u002F\u002Fsupport.google.com\u002Fdocs\u002Fanswer\u002F3093337",[2245],[7098,76764,76765,76768,76771],{},[7113,76766,76767],{},"IMPORTDATA()",[7113,76769,76770],{},"Public .csv or .tsv files from a URL",[7113,76772,76773],{},[322,76774,76748],{"href":76775,"rel":76776},"https:\u002F\u002Fsupport.google.com\u002Fdocs\u002Fanswer\u002F3093335",[2245],[7098,76778,76779,76782,76785],{},[7113,76780,76781],{},"IMPORTXML()",[7113,76783,76784],{},"Public XML Feeds",[7113,76786,76787],{},[322,76788,76748],{"href":76789,"rel":76790},"https:\u002F\u002Fsupport.google.com\u002Fdocs\u002Fanswer\u002F3093342",[2245],[14,76792,76793],{},"If the data is not publicly available (e.g. behind a login), and in particular if the data is not structured in a simple table, you’re going to need a dedicated tool, as Google sheets alone won’t be sufficient.",[639,76795,76797],{"id":76796},"use-no-code-scraping-tools","Use No-code Scraping tools",[14,76799,76800],{},"If the website was complex, a few years ago, you’d need to write code to extract (or scrape) data from it. No longer!",[14,76802,76803],{},"With modern no-code tools, you can now visually select the data you need to scrape.",[14,76805,76806],{},"This has many advantages:",[555,76808,76809,76812,76815],{},[83,76810,76811],{},"Get data behind a login",[83,76813,76814],{},"Get data with more complex structure (i.e. not just a HTML table)",[83,76816,76817],{},"Group data as you need",[14,76819,76820],{},"You can see how to get started with Axiom’s no-code scraper here:",[14,76822,76823],{},[322,76824,76825],{"href":19716},"\u002Fdocs\u002Fextracting-content-from-web-page",[14,76827,76828],{},"Axiom does a lot more than scraping, and you may want a simpler, scraping-only solution.",[14,76830,76831],{},"If axiom doesn’t work well for you, try the following dedicated scraping tools:",[14,76833,76834],{},[322,76835,76838],{"href":76836,"rel":76837},"https:\u002F\u002Fwww.minirpa.net",[2245],"https:\u002F\u002Fwww.minirpa.net\u002F",[14,76840,76841],{},[322,76842,76845],{"href":76843,"rel":76844},"https:\u002F\u002Fsimplescraper.io",[2245],"https:\u002F\u002Fsimplescraper.io\u002F",[21,76847,76849],{"id":76848},"automate-repetitive-actions-use-macros","Automate repetitive actions - use Macros",[639,76851,76853],{"id":76852},"in-sheets","In Sheets",[14,76855,76856],{},"Macros are one of the most powerful features of Sheets and Excel. A macro is a way to record your user interface actions, and replay them to automate repetitive tasks.",[14,76858,76859],{},"You can use Macros to automate any UI steps that you perform repeatedly.",[639,76861,76863],{"id":76862},"example-formatting-styles","Example - Formatting Styles",[14,76865,76866],{},"If all your tables looks like this:",[592,76868],{"src":76869},"\u002Fblog\u002Fsheets-0.png",[14,76871,76872],{},"But you want them all to look like this:",[592,76874],{"src":76875},"\u002Fblog\u002Fsheets-1.png",[14,76877,76878],{},"You can create a Macro and assign it to a keyboard shortcut. Press the keyboard shortcut every time you see a table and it’ll format it. Make as many as you need. Convenient, right?",[14,76880,76881],{},"Here’s how you do it:",[80,76883,76884,76893,76907,76913],{},[83,76885,76886,76887,76890],{},"Click: ",[29,76888,76889],{},"Extensions → Macros→ Record Macro",[592,76891],{"src":76892},"\u002Fblog\u002Fsheets-2.png",[83,76894,76895,76896],{},"Now perform the UI actions you want to automate. This could be anything from using the keyboard to copy and paste, or pointing and clicking on something with the mouse. In this case:\n",[555,76897,76898,76901],{},[83,76899,76900],{},"Select all cells, Ctrl-A",[83,76902,76903,76904],{},"Applying alternating colors to the cells . (Click the menu item which does this)\n",[592,76905],{"src":76906},"\u002Fblog\u002Fsheets-3.png",[83,76908,76909,76910],{},"Click ‘Save’ and give your Macro a name and number.\n",[592,76911],{"src":76912},"\u002Fblog\u002Fsheets-4.png",[83,76914,76915,76916,76919],{},"Press: ",[29,76917,76918],{},"Ctrl + Alt + Shift + 1"," (or another number) to format tables any time!",[14,76921,76922],{},"Macros can get very complicated.",[14,76924,76925],{},"If you can, our recommendation is to make a series of small macros, rather than one huge super-macro. This is both more flexible and easier to implement.",[639,76927,76929],{"id":76928},"automate-actions-on-any-website","Automate Actions on any website",[14,76931,76932],{},"Macros are powerful, and using them may give you a few ideas… sadly, they only work within the context of Google Sheets. If you would like to automate the UI of any other website in a similar way, you can do that with axiom:",[14,76934,76935],{},[322,76936,76937],{"href":7289},"\u002Fdocs\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002F",[21,76939,76941],{"id":76940},"how-to-format-data-with-google-sheet-formulas-a-cheat-sheet","How to format data with Google Sheet formulas - A cheat sheet",[14,76943,76944],{},"You can spend a lot of time in sheets formatting data to be presentable, particularly when you’re presenting that data to clients.",[14,76946,76947],{},"These functions in particular can be extremely useful in automating data formatting and organisation:",[7092,76949,76950,76960],{},[7095,76951,76952],{},[7098,76953,76954,76956,76958],{},[7101,76955,76725],{},[7101,76957,76728],{},[7101,76959,76731],{},[7108,76961,76962,76976,76990,77004,77018,77032,77046],{},[7098,76963,76964,76967,76970],{},[7113,76965,76966],{},"REPLACE(text, position, length, new_text)",[7113,76968,76969],{},"String replace all parts of text (a string), with another string. Probably the handiest function out there for cleaning data.",[7113,76971,76972],{},[322,76973,76748],{"href":76974,"rel":76975},"https:\u002F\u002Fsupport.google.com\u002Fdocs\u002Fanswer\u002F3098247",[2245],[7098,76977,76978,76981,76984],{},[7113,76979,76980],{},"CLEAN(text)",[7113,76982,76983],{},"Removes all non-printable characters.",[7113,76985,76986],{},[322,76987,76748],{"href":76988,"rel":76989},"https:\u002F\u002Fsupport.google.com\u002Fdocs\u002Fanswer\u002F309414",[2245],[7098,76991,76992,76995,76998],{},[7113,76993,76994],{},"CONCATENATE('Welcome', ' ', 'to', ' ', 'Sheets')",[7113,76996,76997],{},"Join text in separate columns together",[7113,76999,77000],{},[322,77001,76748],{"href":77002,"rel":77003},"https:\u002F\u002Fsupport.google.com\u002Fdocs\u002Fanswer\u002F3094123?hl=en-GB",[2245],[7098,77005,77006,77009,77012],{},[7113,77007,77008],{},"SPLIT(\"Alas, poor Yorick\",\"\")",[7113,77010,77011],{},"Break text into parts, with a delimitter (e.g. a space, or comma)",[7113,77013,77014],{},[322,77015,76748],{"href":77016,"rel":77017},"https:\u002F\u002Fsupport.google.com\u002Fdocs\u002Fanswer\u002F3094136?hl=en-GB",[2245],[7098,77019,77020,77023,77026],{},[7113,77021,77022],{},"PROPER(text_to_capitalize)",[7113,77024,77025],{},"Use proper capitalization. Great for presentations!",[7113,77027,77028],{},[322,77029,76748],{"href":77030,"rel":77031},"https:\u002F\u002Fsupport.google.com\u002Fdocs\u002Fanswer\u002F3094133",[2245],[7098,77033,77034,77037,77040],{},[7113,77035,77036],{},"TRIM(\" lorem ipsum\")",[7113,77038,77039],{},"Trims unnecessary spaces in text.",[7113,77041,77042],{},[322,77043,76748],{"href":77044,"rel":77045},"https:\u002F\u002Fsupport.google.com\u002Fdocs\u002Fanswer\u002F3094140",[2245],[7098,77047,77048,77051,77054],{},[7113,77049,77050],{},"VLOOKUP(search_key, range, index)",[7113,77052,77053],{},"Searches a range in a column for a value, returns that value if found. If you have your data ordered in one way, and you need to reorganise it into another order using one column for the ordering.",[7113,77055,77056],{},[322,77057,76748],{"href":77058,"rel":77059},"https:\u002F\u002Fsupport.google.com\u002Fdocs\u002Fanswer\u002F3093318?hl=en-GB",[2245],[21,77061,77063],{"id":77062},"how-to-template-google-slide-reports-from-sheets-data","How to Template Google Slide Reports from Sheets Data",[14,77065,77066],{},"There’s a good chance that, if you are collecting data in Sheets, you will want to create a report from the collected data. A great option is to make a report in Google Slides.",[14,77068,77069],{},"We’ve seen customers:",[80,77071,77072,77075,77078],{},[83,77073,77074],{},"Presenting analytics data, like monthly results",[83,77076,77077],{},"Presenting candidate packs in recruitment",[83,77079,77080],{},"Presenting and consolidating data in graphs",[14,77082,77083],{},"Our customers tell us they copy-paste the data back and forth from sheets to slides, doing repetitive work to generate a new report each time. They ask if Axiom can help.",[14,77085,77086,77087],{},"It can and does help with the data collection. After that we advise to ",[29,77088,77089],{},"create a reusable template that links data to sheets.",[592,77091],{"src":77092},"\u002Fblog\u002Fsheets-5.png",[14,77094,77095],{},"Everything in this example can be linked to a data entry in a Google Sheet. This means that every month, all you need to do is:",[80,77097,77098,77101],{},[83,77099,77100],{},"Update the sheet data",[83,77102,77103],{},"Click two buttons, then a new presentation will be generated automatically!",[14,77105,77106],{},"Here’s how to do it:",[80,77108,77109,77118,77121],{},[83,77110,77111,77112,77115],{},"In your slideshow click ",[29,77113,77114],{},"Insert —> Chart —> From Sheets",[592,77116],{"src":77117},"\u002Fblog\u002Fsheets-6.png",[83,77119,77120],{},"Style your charts Into the format you need.",[83,77122,77123,77124],{},"By default, the presentations don’t update by themselves - this is a good thing actually! It allows you to:\n",[555,77125,77126,77129,77135,77138],{},[83,77127,77128],{},"Update your data in sheets",[83,77130,77131,77134],{},[29,77132,77133],{},"Update your data in slides - only when required"," (See below)",[83,77136,77137],{},"Make a slides copy, or download a file. The data in your copy\u002Ffile is now a ‘snapshot’ of sheet data, at the point when you chose to save the copy.",[83,77139,77140],{},"Repeat 1 -> 3 to generate as many copies as you need to generate a series from the template. e.g:\n- (January, February, March)\n- (Candidate Set 1, Candidate Set 2, Candidate Set 3)",[639,77142,77133],{"id":77143},"update-your-data-in-slides-only-when-required",[80,77145,77146],{},[83,77147,77148,77151],{},[29,77149,77150],{},"Tools —> Linked objects —> Update All",[592,77152],{"src":77153},"\u002Fblog\u002Fsheets-7.png",[592,77155],{"src":77156},"\u002Fblog\u002Fsheets-8.png",[21,77158,77160],{"id":77159},"automate-data-entry-actions-with-google-sheets-data","Automate Data Entry Actions with Google Sheets Data",[14,77162,77163],{},"Most spreadsheets do not live in isolation - they form part of business processes.",[14,77165,77166,77167,77170],{},"Every row added to a sheet may correspond to a new ",[807,77168,77169],{},"action"," you need to perform, like:",[80,77172,77173,77176],{},[83,77174,77175],{},"Receiving an order → then sending it to your fulfilment partner",[83,77177,77178],{},"Signing up a new customer → then adding them to a CRM",[14,77180,77181,77182,77185],{},"Or maybe the sheet is the ",[807,77183,77184],{},"output"," of the action, like:",[80,77187,77188],{},[83,77189,77190],{},"Receiving requests via email → then adding the data to sheets",[14,77192,77193],{},"Any action you need to do with your sheets data can be broken down into either API actions, or user interface actions. Zapier covers APIs, and Axiom covers UI actions; all bases covered with just two tools!",[639,77195,77197],{"id":77196},"zapier-api-actions","Zapier - API Actions",[14,77199,77200],{},"Zapier is ideal for cases when your data has an API and Zapier Connector.",[592,77202],{"src":77203},"\u002Fblog\u002Fsheets-9.png",[14,77205,77206],{},"When a new row is added to sheets, you can trigger a range of actions, like:",[555,77208,77209,77212,77215],{},[83,77210,77211],{},"Sending a templated email",[83,77213,77214],{},"Creating a new calendar event",[83,77216,77217],{},"Adding a CRM entry in hubspot",[14,77219,77220],{},"You can link your sheet to any action that Zapier supports, in fact. There’s a huge library of integrations to explore within Zapier.",[639,77222,77224],{"id":77223},"axiom-enter-data-into-forms","Axiom - Enter data into forms",[14,77226,77227],{},"If you need to populate web forms with your Google Sheets data, this is what axiom was designed for.",[14,77229,77230],{},"We have a detailed set of guides to cover just this topic!",[14,77232,77233,77236,77239],{},[322,77234,77235],{"href":77235},"\u002Fdocs\u002Fusing-google-sheets",[322,77237,77238],{"href":77238},"\u002Fdocs\u002Fautomating-the-ui",[592,77240],{"src":77241},"\u002Fblog\u002Fsheets-10.png",[639,77243,77245],{"id":77244},"concluding","Concluding",[14,77247,77248],{},"We’ve only just scratched the surface of Sheets. As of 2022, Spreadsheets have been around for 53 years, and we bet they’ll still be around 50 years from now, too.",[14,77250,77251],{},"We’ll be revisiting this topic again in the (near) future.",[14,77253,77254,77255,77258],{},"Vist ",[322,77256,77257],{"href":486},"axiom.ai\u002Fcustomer-support"," if you need some help integrating axiom automations with Google Sheets!",{"title":494,"searchDepth":495,"depth":495,"links":77260},[77261,77265,77270,77271,77274],{"id":76694,"depth":498,"text":76697,"children":77262},[77263,77264],{"id":76706,"depth":495,"text":76707},{"id":76796,"depth":495,"text":76797},{"id":76848,"depth":498,"text":76849,"children":77266},[77267,77268,77269],{"id":76852,"depth":495,"text":76853},{"id":76862,"depth":495,"text":76863},{"id":76928,"depth":495,"text":76929},{"id":76940,"depth":498,"text":76941},{"id":77062,"depth":498,"text":77063,"children":77272},[77273],{"id":77143,"depth":495,"text":77133},{"id":77159,"depth":498,"text":77160,"children":77275},[77276,77277,77278],{"id":77196,"depth":495,"text":77197},{"id":77223,"depth":495,"text":77224},{"id":77244,"depth":495,"text":77245},"2022-05-20",{"read":70686,"type":513,"tool":77281,"category":77282,"tags":77283,"location":46733,"featuredimg":77284,"landingimg":77285,"summary":77286},[46728],[53990],[67072],"\u002Fblog\u002Fsheets-data-scraper.jpg","\u002Fblog\u002Fgooglesheetrobot.jpg","Learn how to automate Google Sheets, Slides and more.",{"title":76675,"description":76680},"blog\u002Fhow-to-automate-data-google-sheets","MWN9HRUsNCjo9OemG6u4Pm2VNi6UR1NDmrGwTY-bSE4",[53990],[513],[46728],{"id":77294,"title":77295,"author":71599,"body":77296,"date":77824,"description":77300,"draft":26250,"extension":506,"meta":77825,"navigation":522,"path":76557,"seo":77833,"stem":77834,"__hash__":77835,"pinned":-1,"category":77836,"type":77837,"tool":77838},"blog\u002Fblog\u002Fconnect-no-code-together-to-build-product-ideas.md","Connect no-code tools together to build product ideas, quickly",{"type":8,"value":77297,"toc":77807},[77298,77301,77304,77307,77310,77313,77316,77319,77323,77326,77329,77332,77376,77380,77383,77389,77513,77517,77525,77531,77534,77542,77545,77548,77551,77554,77558,77564,77567,77578,77582,77586,77589,77592,77595,77598,77605,77609,77618,77621,77625,77628,77631,77634,77637,77640,77646,77650,77653,77662,77665,77672,77771,77774,77778,77781,77784,77795,77798,77801,77804],[14,77299,77300],{},"We felt uneasy.",[14,77302,77303],{},"It was 2012. ‘Steve’ (name redacted) wanted to pour his life savings into an untested internet idea -  and he wanted our company to code it.",[592,77305],{"src":77306},"\u002Fblog\u002Finnovator-dancing.gif",[14,77308,77309],{},"The hard truth is that software development is expensive, timelines are notoriously unpredictable, and your life savings don’t go far when outsourcing. Inevitably, as you develop the idea, you discover you need to iterate and make changes or improvements.",[14,77311,77312],{},"But what happens when the money runs out - and you still have a huge list of tasks left to do?",[14,77314,77315],{},"This is a recipe for disaster. Unfortunately this scenario has played out too many times to count, and leads to conflict, strained relationships and failed projects.",[14,77317,77318],{},"Nobody should test their idea like this. In 2022, there’s a much better way - no expensive coders required!",[21,77320,77322],{"id":77321},"no-code-mvps-are-becoming-the-new-normal","No-code MVPs are becoming the new normal",[14,77324,77325],{},"These days, nearly all MVP ideas can be built with no-code tools.",[14,77327,77328],{},"Most ideas from non-coders aren’t about creating new technology - they’re about solving a real-world problem, and the tech is just a tool to get the job done.",[14,77330,77331],{},"In 2022, we can see a record of success-stories where no-code MVPs have been used to bootstrap businesses to millions of $ of revenue - even all the way to acquisition.",[80,77333,77334,77351],{},[83,77335,77336,77341,77342],{},[322,77337,77340],{"href":77338,"rel":77339},"https:\u002F\u002Fwww.producthunt.com",[2245],"Product Hunt"," itself is a great example - the basic idea was made in 20 minutes!\n",[80,77343,77344],{},[83,77345,77346],{},[322,77347,77350],{"href":77348,"rel":77349},"https:\u002F\u002Finc42.com\u002Fresources\u002Fwisdom-20-minute-startup",[2245],"https:\u002F\u002Finc42.com\u002Fresources\u002Fwisdom-20-minute-startup\u002F",[83,77352,77353,77358,77359,77362],{},[322,77354,77357],{"href":77355,"rel":77356},"http:\u002F\u002FMakerpad.com",[2245],"Makerpad.com"," is another great example - and interestingly, one of the best resources to learn about no-code! You can see a great collection of stories, ranging from successful early stage funding, to significant profitable businesses - as well as those headline-grabbing exits ",[29,77360,77361],{},"🤑",[80,77363,77364,77370],{},[83,77365,77366],{},[322,77367,77368],{"href":77368,"rel":77369},"https:\u002F\u002Fwww.makerpad.co\u002Fposts\u002Fhow-flexiple-made-3-million-with-a-no-code-tech-stack-of-100-month",[2245],[83,77371,77372],{},[322,77373,77374],{"href":77374,"rel":77375},"https:\u002F\u002Fwww.makerpad.co\u002Fposts\u002Fbuilding-biyo-with-bubble-and-raising-125k-in-funding",[2245],[21,77377,77379],{"id":77378},"there-are-no-code-tools-for-nearly-everything-now","There are no-code tools for (nearly) everything now",[14,77381,77382],{},"If “there’s an app for that” was the new mindset entering the 2010s, “there’s a no-code tool for that” should be the mindset of the 2020s.",[14,77384,77385,77386],{},"The following is just an overview of the major, established tools - alongside a newer browser automation tool we heard good things about ",[29,77387,77388],{},"😉",[7092,77390,77391,77404],{},[7095,77392,77393],{},[7098,77394,77395,77398,77401],{},[7101,77396,77397],{},"Tool",[7101,77399,77400],{},"Use",[7101,77402,77403],{},"Best For",[7108,77405,77406,77416,77427,77438,77449,77459,77470,77481,77492,77503],{},[7098,77407,77408,77410,77413],{},[7113,77409,3288],{},[7113,77411,77412],{},"Automate anything with APIs",[7113,77414,77415],{},"Quick integrations between a huge variety of systems",[7098,77417,77418,77421,77424],{},[7113,77419,77420],{},"Integromat",[7113,77422,77423],{},"Create complex workflows by plugging APIs together",[7113,77425,77426],{},"Like Zapier, but cheaper at volume and designed for more complex automations",[7098,77428,77429,77432,77435],{},[7113,77430,77431],{},"Webflow",[7113,77433,77434],{},"Dynamic websites & CMS",[7113,77436,77437],{},"Ideal for static marketing websites",[7098,77439,77440,77443,77446],{},[7113,77441,77442],{},"Bubble",[7113,77444,77445],{},"Build applications with modern UI, data connections etc.",[7113,77447,77448],{},"Building the UI of your new app or website",[7098,77450,77451,77453,77456],{},[7113,77452,18287],{},[7113,77454,77455],{},"Super-powered Spreadsheets",[7113,77457,77458],{},"Building databases",[7098,77460,77461,77464,77467],{},[7113,77462,77463],{},"Stacker",[7113,77465,77466],{},"Turn spreadsheets into apps",[7113,77468,77469],{},"Connecting UIs to data",[7098,77471,77472,77475,77478],{},[7113,77473,77474],{},"Shopify",[7113,77476,77477],{},"E-commerce",[7113,77479,77480],{},"Building an online shop quickly",[7098,77482,77483,77486,77489],{},[7113,77484,77485],{},"Typeform",[7113,77487,77488],{},"Collect information from users with web forms",[7113,77490,77491],{},"Making beautiful forms quickly",[7098,77493,77494,77497,77500],{},[7113,77495,77496],{},"Stripe",[7113,77498,77499],{},"Take payments",[7113,77501,77502],{},"Not a no-code tool, but the default integration with most no-code apps",[7098,77504,77505,77507,77510],{},[7113,77506,3435],{},[7113,77508,77509],{},"Automate manual tasks in the user interface of web apps",[7113,77511,77512],{},"Automating apps where APIs aren’t available or fast to integrate",[639,77514,77516],{"id":77515},"check-product-hunt-regularly","Check Product Hunt. Regularly.",[14,77518,77519,77520,77524],{},"The above list only scratches the surface. ",[322,77521,77523],{"href":77338,"rel":77522},[2245],"https:\u002F\u002Fwww.producthunt.com\u002F","  is a great way to shop around.",[14,77526,77527,77528],{},"New no-code tools are being launched all the time - we seem to proliferate like rabbits ",[29,77529,77530],{},"🐰🐰",[14,77532,77533],{},"So, If you can’t find the tool you’re looking for now, be sure to check back another time.",[21,77535,77537,77538,77541],{"id":77536},"no-code-tools-connected-together-are-much-more-powerful-than-alone","No-code tools connected together are ",[807,77539,77540],{},"much"," more powerful than alone",[14,77543,77544],{},"No-code tools really shine when they’re used to join the dots.",[14,77546,77547],{},"For example, you’ll find it hard to build a customer support system with just Typeform in isolation.",[14,77549,77550],{},"But what if you attach a Zapier trigger for incoming emails, and then populate your data into Airtable? Suddenly, you have a powerful customer support system that has 80% of the features of a custom SaaS product... and you built it in a fraction of the time!",[14,77552,77553],{},"This is precisely where no-code shines: quickly building an initial product (or process) by connecting things together, and using the complimentary features of each tool to your advantage.",[639,77555,77557],{"id":77556},"api-rpa-automation-are-a-great-pair","API + RPA Automation are a great pair",[14,77559,77560,77561],{},"We frequently see this happening with Zapier and Axiom. API + RPA automation are not competing - they’re actually a great match ",[322,77562,77563],{"href":77563},"\u002Fblog\u002Frpa-api-automation",[14,77565,77566],{},"Using these two flavours of automation together means you can literally automate anything. That’s not an exaggeration. We’ve seen customers automate tasks as varied as:",[80,77568,77569,77572,77575],{},[83,77570,77571],{},"Generating reports in YouTube Studio when new data is generated",[83,77573,77574],{},"Fulfilling an order by inputting data into a form, when an email is received",[83,77576,77577],{},"Scrape NFT data on a schedule or custom event",[21,77579,77581],{"id":77580},"how-to-connect-no-code-tools-to-build-ideas-quickly","How to connect no-code tools to build ideas quickly",[639,77583,77585],{"id":77584},"be-lazy-use-the-fastest-simplest-solution-that-works","Be lazy. Use the fastest, simplest solution that works!",[14,77587,77588],{},"If you can, buy - don’t build. Time is money, and it will be ultimately cheaper to release early and learn faster than to spend ages building the wrong thing.",[14,77590,77591],{},"We’re a team of coders. But even we choose SaaS & no-code solutions before code, whenever we can.",[14,77593,77594],{},"For every problem, we first check if a SaaS tool exists that solves it.",[14,77596,77597],{},"If not, we then see if we can assemble a solution with our current no-code tools.",[14,77599,77600,77601,77604],{},"Only if we ",[807,77602,77603],{},"can’t"," do all this, will we consider coding a new tool or process. Sometimes coding new things is necessary, but it’s always a last-resort.",[639,77606,77608],{"id":77607},"use-makerpad","Use Makerpad",[14,77610,77611,77612,77617],{},"We mentioned ",[322,77613,77616],{"href":77614,"rel":77615},"https:\u002F\u002Fwww.makerpad.co",[2245],"https:\u002F\u002Fwww.makerpad.co\u002F"," before as a place to read about no-code MVPs.",[14,77619,77620],{},"But makerpad is much more than this - it’s a community of creators that teach you how to use no-code to build virtually anything. Check out their tutorials for tons of in-depth no-code guides.",[639,77622,77624],{"id":77623},"focus-on-tools-that-interoperate","Focus on Tools that interoperate",[14,77626,77627],{},"Some tools and businesses are walled gardens.",[14,77629,77630],{},"They want you to stay inside, and they don’t play nice and connect with others outside their ecosystem.",[592,77632],{"src":77633},"\u002Fblog\u002Fsteve-2.gif",[14,77635,77636],{},"Avoid building within walled gardens - they will limit your app’s ability to grow!",[14,77638,77639],{},"When choosing a new tool, check for connections such as webhooks, app integrations, or APIs - this is a good indication that you’ll have a lot of room to branch out. You can also check whether the tool you’re considering has a Zapier app, as this almost always opens up a huge space to play in.",[14,77641,77642,77643,77645],{},"Of course, if you ",[807,77644,6800],{}," find that you need to connect together systems without APIs, then axiom is a good bet - but we’d rather you not have these problems in the first place. We’re nice like that. 🙂",[639,77647,77649],{"id":77648},"common-no-code-tool-pairings","Common no-code tool pairings",[14,77651,77652],{},"Some pairs were just meant to be together.",[14,77654,77655,77656,77661],{},"Sonny and Cher. Laurel and Hardy. ",[322,77657,77660],{"href":77658,"rel":77659},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAnt_%26_Dec",[2245],"Ant and Dec"," .",[14,77663,77664],{},"(...one for the Brits out there 🇬🇧)",[14,77666,77667,77668,77671],{},"Now, you can throw Axiom and Zapier into the mix ",[29,77669,77670],{},"💑  .T","hough we’ve been known to flirt with Integromat on occasion, Zapier holds a special place in our heart as our first... Integration.",[7092,77673,77674,77687],{},[7095,77675,77676],{},[7098,77677,77678,77681,77684],{},[7101,77679,77680],{},"Tool 1",[7101,77682,77683],{},"Tool 2",[7101,77685,77686],{},"Can be used for",[7108,77688,77689,77698,77707,77716,77725,77734,77743,77752,77762],{},[7098,77690,77691,77693,77695],{},[7113,77692,77485],{},[7113,77694,77496],{},[7113,77696,77697],{},"Build a payment system",[7098,77699,77700,77702,77704],{},[7113,77701,77485],{},[7113,77703,3288],{},[7113,77705,77706],{},"Trigger events when someone fills a form",[7098,77708,77709,77711,77713],{},[7113,77710,77485],{},[7113,77712,18287],{},[7113,77714,77715],{},"Build forms to create a database",[7098,77717,77718,77720,77722],{},[7113,77719,77442],{},[7113,77721,3288],{},[7113,77723,77724],{},"Trigger events when users perform certain actions",[7098,77726,77727,77729,77731],{},[7113,77728,77463],{},[7113,77730,18287],{},[7113,77732,77733],{},"Build data-driven apps with UIs",[7098,77735,77736,77738,77740],{},[7113,77737,77474],{},[7113,77739,77496],{},[7113,77741,77742],{},"Take payments on your online shop",[7098,77744,77745,77747,77749],{},[7113,77746,77474],{},[7113,77748,3288],{},[7113,77750,77751],{},"Automate e-commerce events - e.g. Add new customers to your CRM",[7098,77753,77754,77756,77759],{},[7113,77755,77474],{},[7113,77757,77758],{},"Axiom",[7113,77760,77761],{},"Automate events without APIs - e.g. Send orders to fulfilment forms",[7098,77763,77764,77766,77768],{},[7113,77765,77758],{},[7113,77767,3288],{},[7113,77769,77770],{},"Connecting systems without APIs, to systems that do.",[14,77772,77773],{},"There are too many combinations and permutations to list them all - hopefully this will give you a flavour of the kind of things you can do if you're creative!",[639,77775,77777],{"id":77776},"creative-combinations-unlock-new-possibilities","Creative combinations unlock new possibilities!",[14,77779,77780],{},"Often, you can build something new - something that you didn’t think was possible - by creatively combining building blocks like these.",[14,77782,77783],{},"We’ve seen some great ideas emerge whilst running axiom. Here’s a small sample:",[80,77785,77786,77789,77792],{},[83,77787,77788],{},"Customers scraping menus with axiom to build their own local or niche delivery startups",[83,77790,77791],{},"Customers automating tax admin processes and creating new SaaS subscriptions from them",[83,77793,77794],{},"Customers automating legacy systems and creating new APIs where none exist",[14,77796,77797],{},"This is just scratching the surface of what’s possible given the tools now available.",[14,77799,77800],{},"In 2012, we saw customers like Steve spend their life-savings trying to get ideas off the ground.",[14,77802,77803],{},"In 2022, anyone can make their ideas a reality. Your first limitation is not money, but how fast you can release, learn and iterate; something no-code tools speed up by an order of magnitude.",[14,77805,77806],{},"If you’ve got a cool idea you want to build, remember this before spending your life savings on developers!",{"title":494,"searchDepth":495,"depth":495,"links":77808},[77809,77810,77813,77817],{"id":77321,"depth":498,"text":77322},{"id":77378,"depth":498,"text":77379,"children":77811},[77812],{"id":77515,"depth":495,"text":77516},{"id":77536,"depth":498,"text":77814,"children":77815},"No-code tools connected together are much more powerful than alone",[77816],{"id":77556,"depth":495,"text":77557},{"id":77580,"depth":498,"text":77581,"children":77818},[77819,77820,77821,77822,77823],{"id":77584,"depth":495,"text":77585},{"id":77607,"depth":495,"text":77608},{"id":77623,"depth":495,"text":77624},{"id":77648,"depth":495,"text":77649},{"id":77776,"depth":495,"text":77777},"2022-05-13",{"read":61760,"type":513,"tool":77826,"category":77827,"tags":77828,"location":46733,"featuredimg":77830,"landingimg":77831,"summary":77832},[46728],[50552],[3974,77829,65126],"mvp","\u002Fblog\u002Fnocode-connect.jpg","\u002Fblog\u002Fpenknife.jpg","No-code tools are significantly more powerful when connected together.",{"title":77295,"description":77300},"blog\u002Fconnect-no-code-together-to-build-product-ideas","i0aPN0zk-VrZ8Keao327LkEAVcsxIbDr7yPKi2gM_LA",[50552],[513],[46728],{"id":77840,"title":77841,"author":71599,"body":77842,"date":78155,"description":77850,"draft":26250,"extension":506,"meta":78156,"navigation":522,"path":78166,"seo":78167,"stem":78168,"__hash__":78169,"pinned":-1,"category":78170,"type":78171,"tool":78172},"blog\u002Fblog\u002Fhow-to-scrape-nft-prices-opensea.md","How to scrape NFT prices on OpenSea",{"type":8,"value":77843,"toc":78140},[77844,77851,77854,77857,77860,77863,77866,77871,77875,77884,77888,77891,77894,77901,77904,77908,77911,77917,77930,77934,77941,77944,77952,77955,77959,77965,77968,77971,77974,77977,77980,77984,77987,77992,77995,77998,78002,78005,78008,78011,78013,78024,78027,78032,78034,78038,78041,78044,78048,78051,78055,78058,78061,78064,78075,78078,78081,78087,78091,78095,78108,78124,78128],[14,77845,77846],{},[322,77847,77850],{"href":77848,"rel":77849},"https:\u002F\u002Ftwitter.com\u002Frarecandyio\u002Fstatus\u002F1521548615579226114?s=24&t=HmnoZdLJDHiCstgzSvn6pQ",[2245],"https:\u002F\u002Ftwitter.com\u002Frarecandyio\u002Fstatus\u002F1521548615579226114",[14,77852,77853],{},"In the beginning, back when the internet was still young, it may shock you to know there were no Astro Apes or Slurp Juices in sight.",[18,77855],{"alt":77856},"How to scrpae opensea with bots",[14,77858,77859],{},"Life in this early internet was a simpler, more innocent time. Websites were plain, wholesome creations, unsullied by ‘Slurp Juice’. Writing a web-scraper was simple; a site’s data loaded instantly within its HTML.",[14,77861,77862],{},"Fast-forward to 2022 and the web is filled with $ billion ApeCoins, and complex JavaScript apps which stream in data progressively after page load.",[14,77864,77865],{},"At axiom, we don’t know how to use multiple slurp juices on a single ape... but we do know about web-scraping for price tracking.",[14,77867,77868],{},[29,77869,77870],{},"If you need access to NFT data, but don’t have an API, you’ve come to the right place.",[21,77872,77874],{"id":77873},"scraping-opensea","Scraping OpenSea",[14,77876,77877,77878,77883],{},"We’re going to illustrate this by looking at OpenSea.io - the most popular NFT marketplace - but you can take all the advice here and apply this to other sites. Many of our customers scrape ",[322,77879,77882],{"href":77880,"rel":77881},"http:\u002F\u002FPoocoin.app",[2245],"Poocoin.app"," or analytics dashboards using the same techniques.",[21,77885,77887],{"id":77886},"dont-scrape-from-cloud-ips","Don’t Scrape from Cloud IPs",[592,77889],{"src":77890},"\u002Fblog\u002Fblocking.png",[14,77892,77893],{},"OpenSea - and other websites protected by Cloudflare - prevent cloud IPs on AWS, Google and others from accessing their website. This is primarily for DDoS protection, but scrapers can get caught up in their net too.",[14,77895,77896,77897,77900],{},"As a result,",[29,77898,77899],{},"you can’t use axiom's cloud product,"," which is hosted on AWS.",[14,77902,77903],{},"Luckily, our desktop application comes to the rescue!",[21,77905,77907],{"id":77906},"scrape-locally-over-vpn","Scrape Locally, over VPN",[14,77909,77910],{},"We recommend scraping locally, and using a VPN to avoid your IP being blocked.",[14,77912,77913,77914],{},"To do this, you can download our ",[322,77915,77916],{"href":71934},"desktop application.",[14,77918,77919,77920,450,77925],{},"If you’re looking for VPN providers, we recommend: ",[322,77921,77924],{"href":77922,"rel":77923},"https:\u002F\u002Ftailscale.com",[2245],"https:\u002F\u002Ftailscale.com\u002F",[322,77926,77929],{"href":77927,"rel":77928},"https:\u002F\u002Fwww.expressvpn.com",[2245],"https:\u002F\u002Fwww.expressvpn.com\u002F",[21,77931,77933],{"id":77932},"scrape-in-2-stages-links-then-pages","Scrape In 2 Stages  - Links, then Pages",[14,77935,77936,77937],{},"Most customers try to just scrape everything from a single page, for example on a collection page such as: ",[322,77938,77939],{"href":77939,"rel":77940},"https:\u002F\u002Fopensea.io\u002Fcollection\u002Fdava-humanoids",[2245],[14,77942,77943],{},"We’ve noticed the selectors for price on these pages are inconsistent - this means your scraper is quite likely to break, or have missing data.",[14,77945,77946,77947,77951],{},"In contrast, item pages like: ",[322,77948,77949],{"href":77949,"rel":77950},"https:\u002F\u002Fopensea.io\u002Fassets\u002Fmatic\u002F0xf81cb9bfea10d94801f3e445d3d818e72e8d1da4\u002F18921",[2245]," have more static selectors, and more data to hand.",[14,77953,77954],{},"For this reason, we recommend breaking the scrape into two passes: scrape links and meta data from the collection page, and use those links to scrape the remaining data on each item page. This may take slightly longer, but the solution is more robust and flexible.",[639,77956,77958],{"id":77957},"_1-collection-page-scrape-floor-price-item-links","1. Collection Page: Scrape Floor Price & Item Links",[14,77960,77961,77962],{},"e.g:\n",[322,77963,77939],{"href":77939,"rel":77964},[2245],[14,77966,77967],{},"The most likely data you’ll want to scrape from the collection page is the the floor price  -  you can grab this data alongside item numbers and volume.",[592,77969],{"src":77970},"\u002Fblog\u002Fscrape-floor.png",[14,77972,77973],{},"Alongside this, you will need to scrape the Item Links, which you’ll pass as input to Step 2.",[592,77975],{"src":77976},"\u002Fblog\u002Fscrape-links.png",[14,77978,77979],{},"When done, you can write this data to a Google Sheet.",[639,77981,77983],{"id":77982},"_2-item-links-scrape-item-data","2. Item Links: Scrape Item Data",[14,77985,77986],{},"e.g:",[14,77988,77989],{},[322,77990,77949],{"href":77949,"rel":77991},[2245],[592,77993],{"src":77994},"\u002Fblog\u002Fscrape-items.png",[14,77996,77997],{},"In step 2, you take the link data from the Google Sheet populated in Step 1, visit each link, and grab data from the visited page.",[21,77999,78001],{"id":78000},"run-batch-scraping-on-google-sheets","Run Batch Scraping on Google Sheets",[14,78003,78004],{},"We see many a young scraper try to scrape 1000s of entries in one long pass, then try to write everything to a single CSV. This is a recipe for tears and disaster, like keeping no backups of your work, or putting all your eggs in one basket.",[14,78006,78007],{},"At axiom, we take utmost care of our eggs, baskets, and customers!",[14,78009,78010],{},"As a result, we strongly recommend batching your scraping process by writing to Google Sheets as you go.",[14,78012,76806],{},[555,78014,78015,78018,78021],{},[83,78016,78017],{},"You can recover from failure. If your scrape is interrupted, you can pick up where you left off.",[83,78019,78020],{},"Data is available progressively, not just at the end",[83,78022,78023],{},"You can use all the powerful features of Google sheets - post-process and filter your data, then pass this back to other automations.",[14,78025,78026],{},"Here’s some articles that show you how:",[14,78028,78029],{},[322,78030,78031],{"href":78031},"\u002Fdocs\u002Ftutorials\u002Flong-bot-runs",[18,78033],{},[21,78035,78037],{"id":78036},"page-changes-missing-data","Page-Changes & Missing Data",[14,78039,78040],{},"Only a few things in life are certain. Death, Taxes, the 2nd Law of thermodynamics, and web-scrapers breaking.",[14,78042,78043],{},"Luckily, our docs have some guidelines to mitigate scraper issues:",[14,78045,78046],{},[322,78047,23846],{"href":23846},[14,78049,78050],{},"Sadly don’t have guidelines to mitigate the effects of taxes (or death).",[21,78052,78054],{"id":78053},"schedule-or-trigger-events-with-zapier-webhooks","Schedule or Trigger Events with Zapier & Webhooks",[14,78056,78057],{},"Once your scraper is up and running, you may want to run it on a schedule.",[14,78059,78060],{},"But you can turn your scraper into an even more powerful tool by integrating it with Zapier’s APIs.",[14,78062,78063],{},"Using API + RPA Automation together opens up a world of possibilities:",[555,78065,78066,78069,78072],{},[83,78067,78068],{},"Trigger an automation when a price changes",[83,78070,78071],{},"Get notified when new items appear from a creator",[83,78073,78074],{},"Input your data into any system with an API",[14,78076,78077],{},"Using UI Automation + API Automation together means you can literally automate anything - that’s not an exaggeration.",[14,78079,78080],{},"Our users have surprised us by building new systems, and even whole new businesses, by automating something new!",[14,78082,78083],{},[322,78084,78086],{"href":78085},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fwebhooks","https:\u002F\u002Faxiom.a\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fwebhooks\u002F",[14,78088,78089],{},[322,78090,77563],{"href":77563},[21,78092,78094],{"id":78093},"rinse-repeat-for-nbatopshotcom-poocoinapp-and-others","Rinse & Repeat for Nbatopshot.com, Poocoin.app and others",[14,78096,78097,78098,78103,78104,78107],{},"We’ve focused on ",[322,78099,78102],{"href":78100,"rel":78101},"http:\u002F\u002FOpenSea.io",[2245],"OpenSea.io"," here, but ",[29,78105,78106],{},"the principles generalise to other sites with listing pages",", such as:",[80,78109,78110,78117],{},[83,78111,78112],{},[322,78113,78116],{"href":78114,"rel":78115},"https:\u002F\u002Fnbatopshot.com",[2245],"NBA Topshot",[83,78118,78119],{},[322,78120,78123],{"href":78121,"rel":78122},"http:\u002F\u002FPooCoin.app",[2245],"PooCoin.app",[639,78125,78127],{"id":78126},"reach-out-if-you-get-stuck","Reach out if you get stuck",[14,78129,78130,78131,78135,78136],{},"If you ever get stuck while building web scrapers, please don't hesitate to contact us for ",[29,78132,78133],{},[322,78134,76646],{"href":486}," or take a look at our ",[29,78137,78138],{},[322,78139,62806],{"href":61952},{"title":494,"searchDepth":495,"depth":495,"links":78141},[78142,78143,78144,78145,78149,78150,78151,78152],{"id":77873,"depth":498,"text":77874},{"id":77886,"depth":498,"text":77887},{"id":77906,"depth":498,"text":77907},{"id":77932,"depth":498,"text":77933,"children":78146},[78147,78148],{"id":77957,"depth":495,"text":77958},{"id":77982,"depth":495,"text":77983},{"id":78000,"depth":498,"text":78001},{"id":78036,"depth":498,"text":78037},{"id":78053,"depth":498,"text":78054},{"id":78093,"depth":498,"text":78094,"children":78153},[78154],{"id":78126,"depth":495,"text":78127},"2022-05-05",{"read":61760,"type":513,"tool":78157,"category":78158,"tags":78159,"location":46733,"featuredimg":78162,"landingimg":78163,"video":78164,"summary":78165},[46728],[48207],[78160,78161],"NFTs","OpenSea","\u002Fblog\u002Fape.png","\u002Fblog\u002Fopensea-icon.jpg","https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FycnbFEKCwNg?rel=0","Our top tips for scraping NFT data.","\u002Fblog\u002Fhow-to-scrape-nft-prices-opensea",{"title":77841,"description":77850},"blog\u002Fhow-to-scrape-nft-prices-opensea","ACsRn8odNCGABBCu9MEtNAFn4n13HRRoZFvRHKDZov0",[48207],[513],[46728],{"id":78174,"title":71042,"author":71437,"body":78175,"date":78464,"description":78179,"draft":26250,"extension":506,"meta":78465,"navigation":522,"path":46256,"seo":78472,"stem":78473,"__hash__":78474,"pinned":-1,"category":78475,"type":78476,"tool":78477},"blog\u002Fblog\u002Fwhat-is-a-bot.md",{"type":8,"value":78176,"toc":78450},[78177,78180,78183,78185,78193,78196,78200,78207,78220,78223,78228,78240,78243,78246,78250,78253,78256,78260,78263,78266,78271,78278,78281,78284,78288,78291,78294,78297,78300,78303,78307,78310,78313,78316,78319,78323,78326,78329,78332,78335,78338,78342,78345,78360,78363,78372,78375,78389,78392,78397,78401,78404,78407,78410,78413,78417,78420,78423,78426,78430,78433,78436,78439],[14,78178,78179],{},"Who doesn’t love robots - that evergreen staple of science fiction?",[14,78181,78182],{},"The concept has long fascinated futurists, and the robot has enjoyed a central place in visions of high technology for decades:",[18,78184],{"alt":71042},[14,78186,78187,78188],{},"In this article, we’re going to talk about the subtler, quieter and more digital cousin of the robot: the ",[29,78189,78190],{},[322,78191,78192],{"href":69646},"software bot.",[14,78194,78195],{},"Although we haven’t yet reached a future where everyone has a robot butler, software bots are playing a more and more important role as virtual assistants.",[21,78197,78199],{"id":78198},"software-bots-vs-robots","Software bots vs robots",[14,78201,78202,78203,78206],{},"A ",[29,78204,78205],{},"robot"," is :",[8898,78208,78209],{},[14,78210,78211,78212,78215,78216,78219],{},"a ",[807,78213,78214],{},"machine","  —especially one ",[807,78217,78218],{},"programmable"," by a computer, capable of carrying out a complex series of actions automatically",[14,78221,78222],{},"The robots of science fiction resemble human beings, and interact with the physical world like a human.",[14,78224,47617,78225,78206],{},[29,78226,78227],{},"software bot",[8898,78229,78230],{},[14,78231,78232,78235,78236,78239],{},[807,78233,78234],{},"software"," that interacts with ",[807,78237,78238],{},"other software",", like a human does",[14,78241,78242],{},"Sometimes bots even pretend to be human! 👻",[14,78244,78245],{},"Just like robots that work in a factory, software bots are useful because they can do a lot of work very quickly. This can save a lot of hard labour; in a factory it’s physical labour, but in software it’s usually highly tedious or repetitive tasks. Software bots never get bored and can go forever!",[21,78247,78249],{"id":78248},"are-bots-bad","Are bots bad?",[14,78251,78252],{},"Of course, bots are not inherently bad; most are very useful!",[14,78254,78255],{},"But some bots have do a bad rep. In particular, the bots that pretend to be human to deceive you...",[639,78257,78259],{"id":78258},"the-dark-side-spambots-and-twitterbots","The dark side: Spambots and Twitterbots",[14,78261,78262],{},"You may have heard of spambots or twitter bots. These are bots sending messages or tweets en-masse.",[14,78264,78265],{},"Most social media systems restrict access to ‘APIs’ (software interfaces for writing code). In order to automate a Facebook or instagram post, you’d need to post using the User Interface (UI).",[14,78267,78268],{},[807,78269,78270],{},"Any software that interacts with the User Interface, like a human does, is a bot",[14,78272,78273,78274,78277],{},"Doing this is not inherently bad, but if you’re ",[807,78275,78276],{},"pretending t","o be human, it’s possible you don’t have good intentions.",[14,78279,78280],{},"But many bots aren’t pretending - they’re interacting like humans because they have no choice.",[14,78282,78283],{},"And they’re trying to be useful, even if they don’t always succeed!",[639,78285,78287],{"id":78286},"the-friendly-side-web-crawlers-and-chatbots","The friendly side: Web-crawlers and Chatbots",[14,78289,78290],{},"You may have dealt with chatbots in customer support. Early chatbots were very annoying and would leave you frustrated and wishing you were talking to a human.",[14,78292,78293],{},"Modern chatbots are good enough that you may not realise you’re speaking to a bot. That’s because they aren’t designed to work independently, more like ‘assistants’ to a human. One customer support person can speak to more customers, using their bot assistants, and you’d never know!",[14,78295,78296],{},"Another variety of chatbot you might have seen are bots for Discord. Discord is a little unusual in that they actively encourage bots, and they are used to perform many administrative functions, taking user input and performing some kind of useful response. Hopefully this attitude towards bots becomes more common!",[14,78298,78299],{},"If you’ve ever run a search query on Google or elsewhere, its search results have been collated by its Googlebot web-crawler. The Googlebot will do its best to navigate a website like a human, rendering HTML and JavaScript like axiom.ai’s browser bots do. Slack bots and Telegram bots work in a similar way.",[14,78301,78302],{},"Without these bots that read and try to understand websites, modern search couldn’t function.",[21,78304,78306],{"id":78305},"why-do-sites-block-bots","Why do sites block bots?",[14,78308,78309],{},"There are two main reasons why websites might block bots: to prevent abuse, and to protect what the site considers its intellectual property.",[14,78311,78312],{},"For example, in the case of things like Instagram automation bots, fake interaction directly damages the value of their service as it can skew their recommendation algorithms and lead to users having a poor experience.",[14,78314,78315],{},"Instagram is primarily concerned with this spammy behaviour and therefore take steps to rate limit accounts. LinkedIn follows a similar approach. If a bot is behaving in a polite manner, and working at a rate consistent with normal use, it should be OK.",[14,78317,78318],{},"The other commonly seen reason is to protect what a site considers its property. This is the case with sites that are essentially databases of information - for example, Linkedin or Crunchbase. Here, the information is their product, and the site owners would prefer to sell this information via paid accounts or a strictly limited API. They don’t want bots taking and re-distributing this premium content en masse!",[21,78320,78322],{"id":78321},"the-rise-of-workplace-bots","The rise of workplace bots",[14,78324,78325],{},"Lately, bots have become more powerful, and are being used more widely -  especially in large companies.",[592,78327],{"src":78328},"\u002Fblog\u002Fbot2.png",[14,78330,78331],{},"Don’t worry, these are admin bots - more likely to pay invoices and file taxes, rather than be put in charge of America’s nuclear arsenal.",[14,78333,78334],{},"This industry has become known by the term “Robotic Process Automation”, and has gained a lot of popularity in the last decade. The tools have grown out of automation consultancies and become quite powerful and sophisticated, generally used at scale in large enterprises.",[14,78336,78337],{},"This approach is much less common with smaller businesses or startups, largely due to the cost and implementation complexity, but we are starting to see some tools make inroads into this space.",[21,78339,78341],{"id":78340},"can-i-build-a-bot","Can I build a bot?",[14,78343,78344],{},"Yes! The traditional way to do so is by writing code. Selenium is the old standard for bots that need to interact with a browser, with Google’s Puppeteer being a great alternative (though it can only control chromium-based browsers).",[80,78346,78347,78354],{},[83,78348,78349],{},[322,78350,78353],{"href":78351,"rel":78352},"https:\u002F\u002Fwww.selenium.dev\u002Fselenium-ide",[2245],"https:\u002F\u002Fwww.selenium.dev\u002Fselenium-ide\u002F",[83,78355,78356],{},[322,78357,78358],{"href":78358,"rel":78359},"https:\u002F\u002Fdevelopers.google.com\u002Fweb\u002Ftools\u002Fpuppeteer",[2245],[14,78361,78362],{},"The programming language Python is also a popular option, particularly for headless bots that can interact directly with the underlying code of a website.",[80,78364,78365],{},[83,78366,78367],{},[322,78368,78371],{"href":78369,"rel":78370},"https:\u002F\u002Fwww.fullstackpython.com\u002Fbots",[2245],"Python Bots",[14,78373,78374],{},"For very large RPA projects, traditional RPA software leads the way. These work on desktop software as well, which can be very useful. UiPath and Automation Anywhere are popular examples of these tools, but beware - they are highly complex and not for the faint of heart! Generally, these bots are built and maintained by specialist developers who have trained in the software.",[80,78376,78377,78382],{},[83,78378,78379],{},[322,78380,63823],{"href":63823,"rel":78381},[2245],[83,78383,78384],{},[322,78385,78388],{"href":78386,"rel":78387},"https:\u002F\u002Fautomationanywhere.com",[2245],"https:\u002F\u002Fautomationanywhere",[14,78390,78391],{},"There are a growing list of lighter no-code options, which let you build a bot by directly interacting with the UI and assembling the steps with a simple builder interface. axiom.ai is one of these tools. These can be less suitable for very large projects, but are great for getting your bots up and running quickly.",[14,78393,78394,78395],{},"Learn how to build a bot with axiom.ai.ai ",[322,78396,68465],{"href":69646},[21,78398,78400],{"id":78399},"what-can-you-automate-with-bots","What can you automate with bots?",[14,78402,78403],{},"With desktop software like UiPath, people build bots to automate tasks like invoice processing by reading data from PDFs. They also automate some of the repetitive work we do in Excel, like copy-pasting. An Excel Macro is a type of bot!",[14,78405,78406],{},"With Browser Automation software like axiom.ai, people build bots to scrape websites, transform the data and perhaps perform data entry with it. One example of this is automating manual form entry to fulfil an order for an online shop.",[14,78408,78409],{},"While running axiom.ai, we’ve seen a huge variety of different use cases being implemented, from entering CRM records, to report generation, price monitoring and content production.",[14,78411,78412],{},"What’s exciting about bots is that, in theory, any interaction with software can be automated by creating a bot to replicate your steps!",[21,78414,78416],{"id":78415},"use-bots-responsibly","Use bots responsibly",[14,78418,78419],{},"In general, it’s always a good idea to respect the wishes of the site owner and follow their terms of service.",[14,78421,78422],{},"If you have to pay to access information, redistributing it for free would be bad form.",[14,78424,78425],{},"If your bots are going to be interacting with real people, make sure they’re not doing anything that could be seen as harassing, manipulative or annoying.",[639,78427,78429],{"id":78428},"what-if-my-bot-turns-on-me","What if my bot turns on me?!",[592,78431],{"src":78432},"\u002Fblog\u002Fscarybots.png",[14,78434,78435],{},"Thankfully, this isn’t very likely outside of science fiction. Likely the worst that can happen is the bot accidentally duplicating something or sending one too many messages.",[14,78437,78438],{},"But bugs can happen, so make sure you’ve tested carefully before deploying!",[14,78440,78441,78442,76647,78444,78446,78447],{},"If your axiom.ai bot is becoming unruly, please don’t hesitate to contact us for ",[322,78443,76646],{"href":486},[322,78445,62806],{"href":61952},". Additionally, learn how to ",[322,78448,78449],{"href":69646},"create a bot from scratch here.",{"title":494,"searchDepth":495,"depth":495,"links":78451},[78452,78453,78457,78458,78459,78460,78461],{"id":78198,"depth":498,"text":78199},{"id":78248,"depth":498,"text":78249,"children":78454},[78455,78456],{"id":78258,"depth":495,"text":78259},{"id":78286,"depth":495,"text":78287},{"id":78305,"depth":498,"text":78306},{"id":78321,"depth":498,"text":78322},{"id":78340,"depth":498,"text":78341},{"id":78399,"depth":498,"text":78400},{"id":78415,"depth":498,"text":78416,"children":78462},[78463],{"id":78428,"depth":495,"text":78429},"2022-04-29",{"read":46726,"type":513,"tool":78466,"category":78467,"tags":78468,"location":46733,"featuredimg":78469,"landingimg":78470,"summary":78471},[46728],[50552],[68862,12111,3974],"\u002Fblog\u002Frobots-hero.jpg","\u002Fblog\u002Frobot-front-page.jpg","You may have heard of bots... but what are they exactly?",{"title":71042,"description":78179},"blog\u002Fwhat-is-a-bot","N__RqNVIwZmOejPI3-MymacaQlBo_tFC29nlMDVtBMU",[50552],[513],[46728],{"id":78479,"title":78480,"author":46205,"body":78481,"date":78856,"description":78485,"draft":26250,"extension":506,"meta":78857,"navigation":522,"path":23846,"seo":78867,"stem":78868,"__hash__":78869,"pinned":78863,"category":78870,"type":78871,"tool":78872},"blog\u002Fblog\u002F5-problems-webscrapers.md","5 killer problems with web scrapers, and how to solve them",{"type":8,"value":78482,"toc":78834},[78483,78486,78489,78492,78495,78499,78502,78505,78508,78512,78515,78519,78522,78525,78529,78532,78536,78539,78542,78546,78549,78552,78555,78563,78566,78575,78589,78595,78598,78601,78605,78608,78611,78614,78618,78621,78624,78627,78636,78639,78645,78648,78651,78654,78658,78661,78664,78667,78670,78673,78683,78689,78693,78696,78699,78702,78705,78708,78711,78714,78719,78725,78728,78732,78735,78738,78741,78744,78756,78759,78762,78766,78769,78772,78775,78778,78813,78816,78819,78822,78825,78832],[14,78484,78485],{},"Web scraping is great when you have it all working, and can save you a ton of mind-numbing copy and pasting. Unfortunately, getting to that sweet spot can be filled with frustration. At first, things look easy - but as you start scraping more data, the problems begin to mount.",[18,78487],{"alt":78488},"how to solve problems when scraping the web",[14,78490,78491],{},"Solving these is part science, part art.",[14,78493,78494],{},"At axiom, we’re scraping experts that have seen 1000s of cases. These are the most common problems you’ll encounter and our recommended fixes.",[21,78496,78498],{"id":78497},"problem-missing-or-inconsistent-data","Problem: Missing or inconsistent data",[14,78500,78501],{},"Computers are brilliant in some ways, but quite dumb in others, and they don’t understand pages as well as a human does. Rather than parsing the data as meaningful chunks, they see the page as a generic data structure called the “Document Object Model” or DOM.",[14,78503,78504],{},"Just because content looks the same on a page, doesn’t mean it has the same underlying DOM structure, and this can cause the web scraper to behave inconsistently.",[14,78506,78507],{},"For example, take a look at these two google results, and examine the titles html and classes:",[639,78509,78511],{"id":78510},"example-one","Example One",[592,78513],{"src":78514},"\u002Fblog\u002Fwebscrape-one.jpg",[639,78516,78518],{"id":78517},"example-two","Example Two",[592,78520],{"src":78521},"\u002Fblog\u002Fweb-scraper-two.png",[14,78523,78524],{},"It looks like both have a similar style, particularly in regards to the title of the page. But if we take a look under the hood, we see that the HTML code looks like this:",[639,78526,78528],{"id":78527},"example-one-title-in-html","Example one title in html",[592,78530],{"src":78531},"\u002Fblog\u002Fhtml-scrape-classes-one.jpg",[639,78533,78535],{"id":78534},"example-two-title-in-html","Example two title in html",[592,78537],{"src":78538},"\u002Fblog\u002Fhtml-scrape-classes-two.jpg",[14,78540,78541],{},"These are structures with almost nothing in common, despite their visual similarities!",[639,78543,78545],{"id":78544},"solution","Solution:",[14,78547,78548],{},"The choice of selectors is key here and, sadly, there’s no silver bullet. In rare circumstances, a unique id or class may exist for the elements you’re trying to scrape. Here, for example, we can see that “.a-price” looks like it will nicely grab that price info from Amazon:",[592,78550],{"src":78551},"\u002Fblog\u002Famazon-code-example.png",[14,78553,78554],{},"Unfortunately, many websites can make this difficult. Particularly common traps include:",[80,78556,78557,78560],{},[83,78558,78559],{},"Using automatically generated code without clear or consistent human-readable names",[83,78561,78562],{},"Not following visual styling or coding rules exactly (for example, having duplicate ids on a single page)",[14,78564,78565],{},"In most real scraping scenarios, you’ll need to choose selectors based on the structural layout of the page. For example, you may choose to scrape the price from a table by its position:",[719,78567,78569],{"className":756,"code":78568,"language":758,"meta":494,"style":494},".product_table > tbody > tr:first-child > td\n",[90,78570,78571],{"__ignoreMap":494},[727,78572,78573],{"class":729,"line":730},[727,78574,78568],{},[14,78576,78577,78578,78581,78582,78584,78585,78588],{},"A neat trick for more annoying issues is to make use of the CSS pseudo-classes ",[78579,78580],"is",{},"(), ",[49189,78583],{},"() and ",[78586,78587],"matches",{},"():",[14,78590,78591],{},[322,78592,78593],{"href":78593,"rel":78594},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002F:is",[2245],[14,78596,78597],{},"These allow you to use a single selector to grab several different types of elements in one, which can be handy!",[14,78599,78600],{},"axiom.ai’s No-code tool makes heavy use of these when trying to find the most general selector it can, but it’s a tricky problem to completely automate.",[21,78602,78604],{"id":78603},"problem-web-pages-change","Problem: Web Pages Change",[14,78606,78607],{},"Picture this: your scraper is working fine and has been running for weeks - or even months - without a problem.",[14,78609,78610],{},"Then one day it suddenly breaks, spitting out 0 results. What gives?",[14,78612,78613],{},"Your code hasn’t changed. It’s quite likely the page you are scraping has changed, and the content has moved to another place on the page’s HTML.",[639,78615,78617],{"id":78616},"solution-1","Solution",[14,78619,78620],{},"Unfortunately this problem isn’t completely solved; you will need to keep an eye on your scrapers, so they can be fixed when this happens. This can be reduced by choosing the most general selector for an element, as discussed above.",[14,78622,78623],{},"If you can construct an XPath query, you can create regular expressions that will find content with some added flexibility over CSS selectors.",[14,78625,78626],{},"This is particularly useful if you’re trying to scrape structured content like email addresses or phone numbers.  Here’s an XPATH query to scrape email addresses using ‘mailto’ links for example.",[719,78628,78630],{"className":756,"code":78629,"language":758,"meta":494,"style":494},"\u002F\u002Fa[starts-with(@href, 'mailto')]\u002Ftext()\n",[90,78631,78632],{"__ignoreMap":494},[727,78633,78634],{"class":729,"line":730},[727,78635,78629],{},[14,78637,78638],{},"Read more about XPath here:",[14,78640,78641],{},[322,78642,78643],{"href":78643,"rel":78644},"https:\u002F\u002Fwww.w3schools.com\u002Fxml\u002Fxpath_intro.asp",[2245],[14,78646,78647],{},"However, this only goes so far. For example, if the developers of a particular website decide to do a complete redesign, there’s likely to be little alternative except to reconfigure the scraper.",[14,78649,78650],{},"If you hire a developer to build your scraper, you should definitely factor in that you will need a maintenance agreement - this is commonly overlooked.",[14,78652,78653],{},"Another approach is to ensure that maintenance is something anyone can do. The usual way is to use a no-code tool that lets you select elements with a visual interface. We’ve gone for this angle with axiom.ai, so that anyone can easily re-select data if it moves around on the page.",[21,78655,78657],{"id":78656},"problem-anti-bot-measures","Problem: Anti-bot measures",[14,78659,78660],{},"Many websites don’t like bots or scrapers 😢",[14,78662,78663],{},"They sometimes detect and block them outright, throw CAPTCHAs, or rate-limit them and add DDOS protection.",[639,78665,78617],{"id":78666},"solution-2",[14,78668,78669],{},"Often bot blocking is implemented as a simple rate limit. If this is the case and your bot’s speed sets off DDOS detectors, or rate-limiters, you can slow your bot down with by adding ‘wait’ steps, preferably for random time intervals. This can work well on social media sites.",[14,78671,78672],{},"Your bot may also be detected and blocked based on metadata in request headers, or similar. This is a game of cat and mouse, but projects like ‘puppeteer stealth’ are good examples of how to be a sneaky mouse 🐭",[14,78674,78675,78676,78679,78680,44],{},"If you are facing CAPTCHA, tools like ",[322,78677,6548],{"href":51767,"rel":78678},[2245],"  will let you send the captcha to be solved by a human on demand - very useful! Learn more about out ",[322,78681,78682],{"href":6547},"2Captcha integration",[14,78684,78685,78686,12252],{},"Enabling the \"Bypass bot detection\" option in your automation settings can give you an advantage over the bot blocking tools! This can be used locally and will give you the ability to slip by automatically. Learn more in our ",[322,78687,78688],{"href":51820},"Bot Blocking",[21,78690,78692],{"id":78691},"problem-large-scale-scraping-is-slow","Problem: Large-scale scraping is slow",[14,78694,78695],{},"If you want to get simple HTML data, using simple HTTP request tools will do the job quickly.",[14,78697,78698],{},"However, most modern websites use JavaScript, and they often stream in data after the page has been loaded from the web server. Unless you have the time to reverse-engineer each site’s data endpoints, you’ll have to use a web-browser to render pages.",[14,78700,78701],{},"Browsers can be slow, particularly if you’re scrolling and looping through 1000s of pages.",[14,78703,78704],{},"What happens if your long scrape is interrupted? And how can you speed it up?",[639,78706,78617],{"id":78707},"solution-3",[14,78709,78710],{},"We recommend running jobs in batches that write data as you go. If you structure the batching properly, you can pick up from any interruptions easily.",[14,78712,78713],{},"We recommend writing to your output as you progress. In axiom.ai, this is done using Google Sheets.",[14,78715,78716,78718],{},[322,78717,9291],{"href":9291},"\nIt’s possible to speed up bots on UI interactions by using keyboard input, and explicitly limiting how much data they should retrieve, or wait for, on each page.",[14,78720,78721,78724],{},[322,78722,78723],{"href":78723},"\u002Fdocs\u002Ftutorials\u002Fspeed-up-run","\nIf you’re scraping a long list, it may also be possible to divide up this list and run multiple bots in parallel to speed up execution (For an alphabetic list example, send A-G to bot 1, H-P to bot 2, R-Z to bot 3)",[14,78726,78727],{},"We do this with axiom.ai on our premium tiers, so you can scrape 3X faster with 3 bots for example.",[21,78729,78731],{"id":78730},"problem-ui-interactions-before-scraping","Problem: UI Interactions before scraping",[14,78733,78734],{},"Websites often hide their content behind clickable elements, or load it in after the initial page load - Facebook’s newsfeed is a good example of this. You will need to initite 'Scroll' events to load content.",[14,78736,78737],{},"Simple HTTP requests are not sufficient here. It will be necessary to use a browser, and perhaps browser automation framework, that can run ‘Click’, ‘Type’ and ‘Scroll’ events.",[639,78739,78617],{"id":78740},"solution-4",[14,78742,78743],{},"If you want to do this in pure code, Selenium and Puppeteer are solid industry standard tools:",[80,78745,78746,78751],{},[83,78747,78748],{},[322,78749,78353],{"href":78351,"rel":78750},[2245],[83,78752,78753],{},[322,78754,78358],{"href":78358,"rel":78755},[2245],[14,78757,78758],{},"You can automate clicking and waiting for content to load to your heart’s content, but be warned - writing an algorithm to handle waiting for UI actions and loading can be quite hard. With each click, you may need to guess how long the content takes to load.",[14,78760,78761],{},"If you don’t want to write your own algorithms, and would like a no-code approach, axiom.ai is a no-code interface to Google’s Puppeteer framework.",[21,78763,78765],{"id":78764},"bonus-grouping-results","Bonus: Grouping results",[14,78767,78768],{},"This is one people don’t realise until they’re deep into scraping.",[14,78770,78771],{},"The human eye is great at grouping data into structures visually. When you see a layout with a title, phone number and email inside a card, you immediately know it’s all part of the same structure. Computers, however, only see the results of your selectors as lists of text.",[14,78773,78774],{},"Say you’re scraping a list of contacts, and some of the contacts still have landlines (for some reason) while most do not. You want to scrape this landline data, but not every individual has it. When your selectors fire and scrape the data, it ends up like this:",[14,78776,78777],{},"Looks good, right?…",[7092,78779,78780,78789],{},[7095,78781,78782],{},[7098,78783,78784,78786],{},[7101,78785,2662],{},[7101,78787,78788],{},"Number",[7108,78790,78791,78799,78806],{},[7098,78792,78793,78796],{},[7113,78794,78795],{},"Hal",[7113,78797,78798],{},"07400596",[7098,78800,78801,78804],{},[7113,78802,78803],{},"Arnie",[7113,78805,78798],{},[7098,78807,78808,78811],{},[7113,78809,78810],{},"Brigitte",[7113,78812],{},[14,78814,78815],{},"Wrong! The problem is that the phone numbers here do not necessarily belong to Hal or Arnie. If Arnie or Hal was missing a landline number, instead of Brigitte, you would still end up with this exact data output.",[14,78817,78818],{},"Building web scrapers to work around this issue can involve careful study of the HTML structure of the page, custom coding, clever xpath and regular expressions, and a lot of patience.",[14,78820,78821],{},"Some tools (axiom.ai included), try to help you with this by finding a parent grouping element and automatically pruning off any elements that fall outside of it, which can help make scraping in these cases much less tedious. Others, like SimpleScraper, prefer to leave it to the user to figure out.",[14,78823,78824],{},"Sometimes the structure of the HTML page can be very different from how the page appears visually. In this case, it can be quite difficult to find valid selectors at all. One day, perhaps visual recognition AI will come along that can solve this problem - but it’s not quite there yet!",[14,78826,78827,78828,76647,78830,44],{},"If you ever get stuck while building web scrapers, please don't hesitate to contact us for ",[322,78829,76646],{"href":486},[322,78831,62806],{"href":61952},[811,78833,4898],{},{"title":494,"searchDepth":495,"depth":495,"links":78835},[78836,78843,78846,78849,78852,78855],{"id":78497,"depth":498,"text":78498,"children":78837},[78838,78839,78840,78841,78842],{"id":78510,"depth":495,"text":78511},{"id":78517,"depth":495,"text":78518},{"id":78527,"depth":495,"text":78528},{"id":78534,"depth":495,"text":78535},{"id":78544,"depth":495,"text":78545},{"id":78603,"depth":498,"text":78604,"children":78844},[78845],{"id":78616,"depth":495,"text":78617},{"id":78656,"depth":498,"text":78657,"children":78847},[78848],{"id":78666,"depth":495,"text":78617},{"id":78691,"depth":498,"text":78692,"children":78850},[78851],{"id":78707,"depth":495,"text":78617},{"id":78730,"depth":498,"text":78731,"children":78853},[78854],{"id":78740,"depth":495,"text":78617},{"id":78764,"depth":498,"text":78765},"2022-04-20",{"read":70686,"type":513,"tool":78858,"category":78859,"tags":78860,"pinned":78863,"location":46733,"featuredimg":78864,"landingimg":78865,"summary":78866},[46728],[48207],[48365,78861,62728,78862],"extract data","xpath","top","\u002Fblog\u002Flarge-scraper.png","\u002Fblog\u002Fscraper.png","Read about the most common problems you find in web scrapers, and get our expert tips on how to fix them!",{"title":78480,"description":78485},"blog\u002F5-problems-webscrapers","lfcUymYwpzsNPuBEvEPXNTobjZXX_wxGy1l4CKl0Pc0",[48207],[513],[46728],{"id":78874,"title":78875,"author":76419,"body":78876,"date":1043,"description":78880,"draft":26250,"extension":506,"meta":79033,"navigation":522,"path":77563,"seo":79039,"stem":79040,"__hash__":79041,"pinned":-1,"category":79042,"type":79043,"tool":79044},"blog\u002Fblog\u002Frpa-api-automation.md","RPA vs API automation, what should I use?",{"type":8,"value":78877,"toc":79025},[78878,78881,78884,78887,78891,78894,78897,78900,78903,78906,78909,78913,78916,78919,78922,78925,78929,78932,78935,78938,78941,78944,78947,78950,78953,78956,78960,78963,78966,78969,78972,78975,78978,78981,78985,78988,78991,78994,78997,79001,79004,79007,79015,79018],[14,78879,78880],{},"The automation landscape contains a lot of confusing jargon. APIs? RPA? …Intelligent Automation?",[14,78882,78883],{},"Let’s cut through some  noise and start with the basics - most automations these days are built with APIs by developers.",[18,78885],{"alt":78886},"RPA or API automation?",[21,78888,78890],{"id":78889},"whats-api-automation","What’s API Automation?",[14,78892,78893],{},"An ‘API’ is an ‘Application Programming Interface’. It allows a programming language to provide instructions to a web-application, or other piece of software.",[14,78895,78896],{},"Stripe is quite a well known API for payments. You can hire a developer to build a payment system in pretty much any programming language you’d like.",[14,78898,78899],{},"There’s plenty of no-code tools to take payments without hiring a developer too.",[14,78901,78902],{},"Some of the most well-known no-code tools for API automation are Zapier, Integromat and Tray.io.",[14,78904,78905],{},"Want to Connect Google Sheets to Typeform?",[14,78907,78908],{},"There are APIs into both, so there’s a Zap for that.",[21,78910,78912],{"id":78911},"no-api-use-the-user-interface-rpa-is-ui-automation","No API? Use the User Interface. RPA is UI Automation",[14,78914,78915],{},"The only way to Automate software without an API is to use whatever interface a human does - usually the User Interface (UI).",[14,78917,78918],{},"This is often known as ‘Robotic Process Automation’ (RPA).",[14,78920,78921],{},"RPA has become really popular in the last 5 years or so, thanks to companies like UiPath that provide RPA Developer tools for Enterprises.",[14,78923,78924],{},"As RPA became more popular, marketing around AI and ‘Intelligent Automation’ may have blurred its original meaning. RPA really just means ‘User Interface Automation’. RPA vs Intelligent automation is a whole other topic we could talk about, but it's a subject for another article.",[21,78926,78928],{"id":78927},"what-advantages-does-ui-automation-have-over-api-automation","What advantages does UI Automation have over API Automation?",[14,78930,78931],{},"Often, a system just doesn’t have an API, so UI automation is the only choice.",[14,78933,78934],{},"But this isn’t the only reason.",[14,78936,78937],{},"UI Automation is common for data scraping, but it’s also common to use it for data-entry into forms, where creating APIs are not part of the technology focus. We see this often with government forms, legacy systems, and niche e-commerce applications.",[14,78939,78940],{},"Even with APIs, UI Automation is often more intuitive for non-coders in particular.",[14,78942,78943],{},"If you’re copy-pasting data from an analytics system into a spreadsheet, building a UI bot to do this may be faster than accessing analytics and spreadsheet APIs.",[14,78945,78946],{},"We see this often with YouTube and other analytics reporting. Visually selecting data as it appears in-context during your normal working day is much more intuitive than going into API documentation and parsing a data-feed into the correct format.",[14,78948,78949],{},"There are also cases where automation needs human and machine input to work together. Perhaps an automation can’t run end-to-end, but needs to hand back to the human to decide.",[14,78951,78952],{},"Browser automation excels at these cases, sometimes called ‘Attended Automation’. Zapier can’t really handle these.",[14,78954,78955],{},"Finally, we see cases when UI automation - which closely mimics a person’s real work - is just faster than API automation. You already know the specification and implementation details because you’re doing the work already. This is particularly important for the long-tail of small automations that are too small to hire a developer.",[21,78957,78959],{"id":78958},"what-are-the-disadvantages-of-ui-automation","What are the disadvantages of UI Automation?",[14,78961,78962],{},"UI Automation can be hard to get right!",[14,78964,78965],{},"Your application may change, breaking the UI Automation. APIs don’t change often, and if they do, they’re often versioned for backward compatibility. Not so with UIs.",[14,78967,78968],{},"The automation may need to detect and fix the change. More often though, a human being may need to make an amendment.",[14,78970,78971],{},"Many applications block automations if data is key to their business model - LinkedIn is perhaps the most well-known example.",[14,78973,78974],{},"LinkedIn does not make it easy to select data - changing page structure regularly + rate-limiting profile views. It’s not possible to extract large data-sets from places like LinkedIn, or Crunchbase, without getting into an arms race for bot detection.",[14,78976,78977],{},"This means creating multiple accounts, rotating these, and perhaps rotating your IP address via a VPN alongside. This can create a lot of admin overhead.",[14,78979,78980],{},"It’s for this reason, we don’t recommend UI automation for extracting large data-sets, particularly from companies like LinkedIn or Crunchbase where data is a protected part of their business.",[21,78982,78984],{"id":78983},"which-automation-tool-is-the-right-one-for-the-job","Which automation tool is the right one for the job?",[14,78986,78987],{},"You should use APIs, if one exists, and it is intuitive enough to use for your use-case. There may be a template on Zapier or Integromat - check those places first.",[14,78989,78990],{},"If no API exists, or the UI is the most intuitive way to access your data - perhaps UI Automation tools like Axiom or UiPath are a good fit.",[14,78992,78993],{},"If you have a development team, and your automation is large, and for a large enterprise, enterprise RPA tools like UiPath are your best bet.",[14,78995,78996],{},"If you have a smaller automation, your API access is limited, or you just want to get an automation up quickly to mimic your existing workflow - Tools like axiom are a good fit.",[21,78998,79000],{"id":78999},"ui-api-together-plug-gaps-in-your-zaps","UI + API together. Plug gaps in your Zaps",[14,79002,79003],{},"We’ve observed that customers get the most value when they use API automation and UI Automation together.",[14,79005,79006],{},"In axiom’s case, we have a Zapier app & webhook integration, which has proven to be quite popular.  We’ve seen customers automate tasks as varied as:",[80,79008,79009,79011,79013],{},[83,79010,77571],{},[83,79012,77574],{},[83,79014,77577],{},[14,79016,79017],{},"Using UI Automation + API Automation together means you can literally automate anything - that’s not an exaggeration. Our customers often surprise us by automating things we would never have guessed!",[14,79019,79020,79021,76647,79023,44],{},"If we can be of help, please don't hesitate to contact us for ",[322,79022,76646],{"href":486},[322,79024,62806],{"href":61952},{"title":494,"searchDepth":495,"depth":495,"links":79026},[79027,79028,79029,79030,79031,79032],{"id":78889,"depth":498,"text":78890},{"id":78911,"depth":498,"text":78912},{"id":78927,"depth":498,"text":78928},{"id":78958,"depth":498,"text":78959},{"id":78983,"depth":498,"text":78984},{"id":78999,"depth":498,"text":79000},{"read":46726,"type":513,"tool":79034,"category":79035,"tags":79036,"location":46733,"featuredimg":46734,"landingimg":79037,"summary":79038},[46728],[50552],[3974,829,65126],"\u002Fblog\u002Fboxing.jpg","Confused by RPA and APIs? We explain both approaches without jargon.",{"title":78875,"description":78880},"blog\u002Frpa-api-automation","-oGyFo_yY5DbFEpLHyd0BXXGMb_moIkOFj2jULhagxE",[50552],[513],[46728],{"id":79046,"title":79047,"author":79048,"body":79049,"date":79420,"description":79053,"draft":26250,"extension":506,"meta":79421,"navigation":522,"path":79429,"seo":79430,"stem":79431,"__hash__":79432,"pinned":-1,"category":79433,"type":79434,"tool":79435},"blog\u002Fblog\u002Fautomate-your-meal-planning.md","Let browser bots handle your meal planning","Sam Sycamore",{"type":8,"value":79050,"toc":79406},[79051,79054,79057,79064,79067,79076,79079,79083,79086,79089,79091,79097,79103,79106,79110,79117,79120,79123,79130,79134,79140,79143,79146,79149,79152,79155,79158,79162,79165,79171,79174,79178,79186,79189,79193,79203,79206,79209,79213,79227,79230,79240,79246,79253,79256,79263,79270,79273,79276,79293,79296,79302,79308,79313,79316,79319,79322,79326,79329,79344,79358,79361,79364,79367,79371,79378,79381,79384,79387,79393,79396,79399],[14,79052,79053],{},"In Part I of this tutorial series we became acquainted with axiom.ai's user interface, and got to see one of the simplest forms that browser automation can take: namely, opening new tabs.",[18,79055],{"alt":79056},"Automate meal planning with axiom.ai",[14,79058,79059,79060,79063],{},"Here in Part II, we'll go over how to take your browser bots to the next level by instructing them to ",[807,79061,79062],{},"interact"," with individual web pages, and to navigate through multiple pages according to the ground rules that we define upfront.",[14,79065,79066],{},"In the process, we'll see how Axiom is able to pick up on the underlying patterns behind the data, and use those patterns to potentially save you hours upon hours of tedious clicking, copying, and pasting.",[14,79068,79069,79070,79075],{},"For our sample data, we'll scope out some dinner recipes from ",[322,79071,79074],{"href":79072,"rel":79073},"http:\u002F\u002Fallrecipes.com",[2245],"Allrecipes.com"," and let Axiom do the heavy lifting of scraping all the information we need (recipe name, prep time, ingredients, directions) to \"automate\" our weekly meal prep. This info can be automatically fed into a Google Sheet for safe keeping, but for our purposes here we will just have our browser bot display the scraped data in a popup window.",[14,79077,79078],{},"Once you get the hang of this kind of scraping functionality, you'll wonder how and why you ever performed tasks like this by hand in the first place!",[21,79080,79082],{"id":79081},"_1-get-ready-to-build","1. Get ready to build",[14,79084,79085],{},"This tutorial assumes that you already completed Part I, and as such, you've already done the prerequisite work of installing Axiom and familiarizing yourself with how to get started.",[14,79087,79088],{},"If needed, you can review these introductory steps in the first half of Part I.",[21,79090,76203],{"id":76202},[14,79092,13969,79093,79096],{},[29,79094,79095],{},"Create New Axiom"," on the main menu.",[14,79098,79099,79100],{},"Then select ",[29,79101,79102],{},"Start blank",[592,79104],{"src":79105},"\u002Fblog\u002Fstart-blank.jpg",[21,79107,79109],{"id":79108},"_3-create-a-list-of-links-to-pages","3. Create a list of links to pages",[14,79111,79112,79113,79116],{},"On the screen that follows, select ",[29,79114,79115],{},"Get a list of links to pages"," as the first step in your automated process.",[592,79118],{"src":79119},"\u002Fblog\u002Flinks.jpg",[14,79121,79122],{},"Enter the following URL in the corresponding field:",[14,79124,79125],{},[322,79126,79129],{"href":79127,"rel":79128},"https:\u002F\u002Fwww.allrecipes.com\u002Fguides\u002F201\u002Fmeat-and-poultry\u002Fchicken",[2245],"https:\u002F\u002Fwww.allrecipes.com\u002Fguides\u002F201\u002Fmeat-and-poultry\u002Fchicken\u002F",[639,79131,79133],{"id":79132},"i-select-links","I. Select links",[14,79135,79136,79137,5381],{},"Below the URL field, click on the ",[29,79138,79139],{},"Select links",[592,79141],{"src":79142},"\u002Fblog\u002Freciepeselect.jpg",[14,79144,79145],{},"This will redirect you to the tab you have open, but now you've got an extra superpower: the magic orange selector box.",[14,79147,79148],{},"With this power, you can click on any element on the page that contains a link, and it will be added to your list of data to be scraped.",[14,79150,79151],{},"That's not all, though: this selector box also picks up on repeated patterns if you feed it a few items. So after you click on the first three recipes at this top of this list, Axiom will automatically select all of the links that follow below.",[14,79153,79154],{},"How's that for artificial intelligence? 😁",[14,79156,79157],{},"Once Axiom has caught on to your pattern, click the Confirm button in the lower right corner.",[639,79159,79161],{"id":79160},"ii-set-a-maximum-number-of-results","II. Set a maximum number of results",[14,79163,79164],{},"We really don't need to scrape every single link from this list. For our purposes, 10 links should be plenty here.",[14,79166,79167,79168],{},"To limit the maximum number of results, simply enter that number under ",[29,79169,79170],{},"Max results:",[592,79172],{"src":79173},"\u002Fblog\u002Fmax-results.jpg",[21,79175,79177],{"id":79176},"_4-loop-through-data","4. Loop through data",[14,79179,9766,79180,79182,79183],{},[29,79181,8486],{}," sign at the bottom of the menu to add another step. Select ",[29,79184,79185],{},"Loop through data.",[592,79187],{"src":79188},"\u002Fblog\u002Finteract.jpg",[639,79190,79192],{"id":79191},"i-go-to-page","I. Go to page",[14,79194,79195,79196,79199,79200,79202],{},"This will automatically add the first \"step within the step,\" if you will, named ",[29,79197,79198],{},"Go to page.","\nWhen you click on the ",[29,79201,131],{}," field, a sidebar will open up on the right to give you access to the data you scraped in the previous step.",[14,79204,79205],{},"Click on the yellow button in the sidebar to insert that data into the URL field.",[592,79207],{"src":79208},"\u002Fblog\u002Furl-interact.jpg",[639,79210,79212],{"id":79211},"ii-get-data-from-a-url","II. Get data from a URL",[14,79214,79215,79216,79219,79220,79223,79224,79226],{},"Within ",[807,79217,79218],{},"Step 2 - Loop through data",", click on  ",[29,79221,79222],{},"Sub step"," immediately below the ",[29,79225,124],{}," section:",[592,79228],{"src":79229},"\u002Fblog\u002Fsubstep.jpg",[14,79231,79232,79233,79236,79237,44],{},"This will add another step within ",[807,79234,79235],{},"Step 2",", rather than creating a ",[807,79238,79239],{},"Step 3",[14,79241,79242,79243],{},"For this step, select ",[29,79244,79245],{},"Get data from a URL.",[14,79247,79248,79249,79252],{},"The process here is similar to what we did to select the links in ",[807,79250,79251],{},"Step 1,"," but now we will tell Axiom which specific bits of data we are interested in on each of the pages.",[14,79254,79255],{},"To do this, we'll start by navigating to this URL:",[14,79257,79258],{},[322,79259,79262],{"href":79260,"rel":79261},"https:\u002F\u002Fwww.allrecipes.com\u002Frecipe\u002F279987\u002Fsheet-pan-sweet-and-sour-chicken",[2245],"https:\u002F\u002Fwww.allrecipes.com\u002Frecipe\u002F279987\u002Fsheet-pan-sweet-and-sour-chicken\u002F",[14,79264,79265,79266,79269],{},"Back on the Axiom menu, click the ",[29,79267,79268],{},"Select data"," button to regain your orange selector-box superpower.",[592,79271],{"src":79272},"\u002Fblog\u002Fallreciepenode.jpg",[14,79274,79275],{},"But instead of scraping just one kind of data, this time we'll collect information for four separate fields:",[80,79277,79278,79281,79284,79287,79290],{},[83,79279,79280],{},"Recipe name",[83,79282,79283],{},"Recipe summary",[83,79285,79286],{},"Image",[83,79288,79289],{},"Cook time",[83,79291,79292],{},"Prep time",[14,79294,79295],{},"Start by selecting the name at the top of the page. This will be our first field.",[14,79297,9766,79298,79301],{},[29,79299,79300],{},"Add column"," sign on the selection menu to add another field.",[14,79303,79304,79305],{},"Set the selector to html and click on the ",[29,79306,79307],{},"Recipe image",[14,79309,13969,79310,79312],{},[29,79311,79300],{}," again and repeat this process for the Ingredients section, followed by the Directions section.",[14,79314,79315],{},"You may have to play around with your orange selector boxes to get them just right. Don't get discouraged if you make a mistake—it's easy enough to undo and try again.",[14,79317,79318],{},"When all four fields are selected, your selection menu will look like this:",[14,79320,79321],{},"Click Confirm in the bottom-right corner when you're done.",[21,79323,79325],{"id":79324},"_5-display-the-scraped-data","5. Display the scraped data.",[14,79327,79328],{},"For our third and final step in the automation, we will tell Axiom to display the data we've gathered in a popup window. This is a simpler (though temporary) alternative to storing the data in a Google Sheet, which is also possible.",[14,79330,79331,79332,79334,79335,79337,79338,15746,79341],{},"Back in the Axiom UI, click the green ",[29,79333,610],{}," sign below ",[807,79336,79235],{}," in order to add ",[807,79339,79340],{},"Step 3.",[29,79342,79343],{},"Display a message.",[14,79345,79346,79347,69818,79350,79353,79354,79357],{},"Click the yellow stadium in the ",[29,79348,79349],{},"Display message",[29,79351,79352],{},"Interact data",". Clicking on it will open a popup to show us what the data actually looks like. Click ",[29,79355,79356],{},"Close and Save"," to confirm.",[592,79359],{"src":79360},"\u002Fblog\u002Fdsm.jpg",[14,79362,79363],{},"When the bot is fully assembled, your workflow should look like this:",[592,79365],{"src":79366},"\u002Fblog\u002Fdesign-pattern.jpg",[21,79368,79370],{"id":79369},"_6-click-the-play-button","6. Click the 'Play' button.",[14,79372,79373,79374,79377],{},"With all three steps in place, you're ready to run your new browser bot. Click the ",[29,79375,79376],{},"Play"," button at the bottom of the screen to fire it up.",[14,79379,79380],{},"When the automation is complete (this may take a few minutes), you'll be presented with a popup that looks like this:",[14,79382,79383],{},"...And that's all there is to it!",[14,79385,79386],{},"Congratulations, now you've got a list of some of the best chicken recipes you can find on the internet, without all of the tedious navigating, copying, and pasting you'd have to do otherwise.",[14,79388,79389,79390],{},"In the process of automating our meal prep research, we encountered a core concept in computer programming: ",[29,79391,79392],{},"the loop.",[14,79394,79395],{},"This is where we begin to see axiom.ai's true power shining through—it enables us to take advantage of the tools that software engineers use to make our lives easier, without having to write a single line of code ourselves.",[14,79397,79398],{},"Indeed, you would need some pretty sophisticated coding skills to pull off a comparable feat. With Axiom, you can harness the power of an engineering team with just a few mouse clicks.",[14,79400,79020,79401,79403,79404,44],{},[322,79402,76646],{"href":486}," or take a look at are ",[322,79405,62806],{"href":61952},{"title":494,"searchDepth":495,"depth":495,"links":79407},[79408,79409,79410,79414,79418,79419],{"id":79081,"depth":498,"text":79082},{"id":76202,"depth":498,"text":76203},{"id":79108,"depth":498,"text":79109,"children":79411},[79412,79413],{"id":79132,"depth":495,"text":79133},{"id":79160,"depth":495,"text":79161},{"id":79176,"depth":498,"text":79177,"children":79415},[79416,79417],{"id":79191,"depth":495,"text":79192},{"id":79211,"depth":495,"text":79212},{"id":79324,"depth":498,"text":79325},{"id":79369,"depth":498,"text":79370},"2020-05-14",{"read":59051,"type":513,"tool":79422,"category":79423,"tags":79424,"location":46733,"featuredimg":79426,"landingimg":79427,"summary":79428},[46728],[53990],[79425,69641],"meal planer","\u002Fblog\u002Fmeal-planner.jpg","\u002Fblog\u002Ffood.jpg","Learn how to scrape data from a website without code.","\u002Fblog\u002Fautomate-your-meal-planning",{"title":79047,"description":79053},"blog\u002Fautomate-your-meal-planning","AIq94myANAGpiJ9czi0y4YTYVOKJWoomREJrGao6fhY",[53990],[513],[46728],{"id":79437,"title":79438,"author":79048,"body":79439,"date":79601,"description":79443,"draft":26250,"extension":506,"meta":79602,"navigation":522,"path":79609,"seo":79610,"stem":79611,"__hash__":79612,"pinned":-1,"category":79613,"type":79614,"tool":79615},"blog\u002Fblog\u002Fautomate-your-morning-routine.md","How to automate your morning routine",{"type":8,"value":79440,"toc":79589},[79441,79444,79447,79450,79453,79456,79459,79462,79465,79469,79472,79478,79482,79489,79493,79499,79503,79506,79509,79513,79516,79520,79522,79525,79528,79532,79535,79538,79541,79545,79548,79551,79555,79558,79561,79565,79568,79571,79574,79577,79580,79583,79586],[14,79442,79443],{},"First of all, congratulations for jumping into the world of automation! You're officially on the cutting edge of technology.",[18,79445],{"alt":79446},"Automate your morning routine with axiom.ai",[14,79448,79449],{},"That term \"automation\" can sound awfully intimidating, but it doesn't have to be that way. Axiom makes browser automation a breeze, as you will see.",[14,79451,79452],{},"When all is said and done, your new browser bot will be able to launch a predefined list of as many websites as you want in their own tabs, all with a single click.",[14,79454,79455],{},"This is super handy if you're the kind of person who relies on multiple web-based apps and services as part of your daily workflow: email, calendar, social media, Google docs, Notion workspaces... whatever you need. No more pecking and hunting through bookmarks and browser history!",[14,79457,79458],{},"Maybe that doesn't sound huge, but those extra seconds of wasted time add up! Opening 5 browser tabs is one thing, but what happens when you need to perform a similar kind of repetitive task 100 times, or 1000 times?",[14,79460,79461],{},"Let's be real: our resulting bot won't necessarily be the most exciting example of what browser automation can do.",[14,79463,79464],{},"Rather, the primary goal here is to get you acquainted with axiom.ai's user interface so you'll be prepared to tackle more complex bot behavior as we progress through this tutorial series.",[21,79466,79468],{"id":79467},"before-we-begin","Before We Begin",[14,79470,79471],{},"Install the Axiom browser extension and desktop app if you haven't already.",[14,79473,79474,79475,44],{},"You can find detailed instructions in the ",[322,79476,79477],{"href":61952},"Axiom Documentation",[21,79479,79481],{"id":79480},"_1-launch-google-chrome","1. Launch Google Chrome",[14,79483,79484,79485,5983],{},"To begin using the app, navigate away from the Google Chrome Startup Page. Axiom can only run from a website with an http:\u002F\u002F or https:\u002F\u002F URL (e.g. ",[322,79486,79487],{"href":79487,"rel":79488},"https:\u002F\u002Fwww.google.com",[2245],[21,79490,79492],{"id":79491},"_2-luanch-the-axiom-desktop-app","2. Luanch the Axiom desktop app",[14,79494,79495,79496,79498],{},"If you don't have the app installed ",[322,79497,75767],{"href":71934}," then follow the prompt.",[21,79500,79502],{"id":79501},"_3-click-on-the-axiom-browser-automation-extension-icon-to-open-the-app","3. Click on the Axiom Browser Automation extension icon, to open the app",[14,79504,79505],{},"Everything is ready to go.",[592,79507],{"src":79508},"\u002Fblog\u002Fclicktoopen.jpg",[21,79510,79512],{"id":79511},"_4-click-new-automation","4. Click 'New automation'",[14,79514,79515],{},"This button is where the magic begins whenever you want to build a new bot, go ahead click twice.",[21,79517,79519],{"id":79518},"_5-then-click-start-blank","5. Then click 'Start blank'",[592,79521],{"src":79105},[14,79523,79524],{},"Note that this section also includes some house templates for common tasks that you might find useful as you get more comfortable.",[14,79526,79527],{},"That said, if you want to get to know the user interface better, you'd do well to continue building from scratch in this first outing.",[21,79529,79531],{"id":79530},"_6-click-all-and-search-for-open-a-new-tab","6. Click all and search for 'Open a new tab.'",[14,79533,79534],{},"Clicking \"Start blank\" takes you to a list of all possible actions that your browser bots can perform.",[14,79536,79537],{},"For this particular bot, the only action we are interested in is \"Open in a new tab.\" Click to add.",[592,79539],{"src":79540},"\u002Fblog\u002Ftab.jpg",[21,79542,79544],{"id":79543},"_7-enter-the-url-of-the-first-site-you-wish-to-open","7. Enter the URL of the first site you wish to open.'",[14,79546,79547],{},"Note that you can also test the link by clicking \"Open URL in new tab.\"",[14,79549,79550],{},"And if you are already on the page that you wish to open, you can click \"Get current URL\" and Axiom will fill in the blank for you.",[21,79552,79554],{"id":79553},"click-the-sign-to-add-another-step-repeating-as-many-times-as-needed","Click the '+' sign to add another step, repeating as many times as needed.",[592,79556],{"src":79557},"\u002Fblog\u002Fnewtabs.jpg",[14,79559,79560],{},"Each time you click the '+' sign, you will return to the list in Step 6. Select \"Open a new tab,\" then lather, rinse, and repeat to your heart's content.",[21,79562,79564],{"id":79563},"click-the-play-button-to-test-your-new-bot","Click the 'Play' button to test your new bot.",[14,79566,79567],{},"When you're ready to take your new bot for a test drive, click the Play button at the bottom of the menu. If all goes according to plan, you should see multiple tabs open all at once, with a single click.",[14,79569,79570],{},"Guess what?",[14,79572,79573],{},"That's all there is to it!",[14,79575,79576],{},"Well, that's all for this installment anyway.",[14,79578,79579],{},"Now you have become acquainted with many of the puzzle pieces that you will encounter most frequently going forward.",[14,79581,79582],{},"Not so scary, right?",[14,79584,79585],{},"What you will find as we move on to the next tutorial is that although the browser bot behavior will start to look a little more complex, the process for you as the bot builder won't get much more complicated than what we've seen here.",[14,79587,79588],{},"If you made it this far, then you are more than ready to utilize Axiom to its fullest potential!",{"title":494,"searchDepth":495,"depth":495,"links":79590},[79591,79592,79593,79594,79595,79596,79597,79598,79599,79600],{"id":79467,"depth":498,"text":79468},{"id":79480,"depth":498,"text":79481},{"id":79491,"depth":498,"text":79492},{"id":79501,"depth":498,"text":79502},{"id":79511,"depth":498,"text":79512},{"id":79518,"depth":498,"text":79519},{"id":79530,"depth":498,"text":79531},{"id":79543,"depth":498,"text":79544},{"id":79553,"depth":498,"text":79554},{"id":79563,"depth":498,"text":79564},"2020-05-12",{"read":61760,"type":513,"tool":79603,"category":79604,"tags":79605,"location":46733,"featuredimg":79606,"landingimg":79607,"summary":79608},[46728],[53990],[69641],"\u002Fblog\u002Fmorning-routine-large.jpg","\u002Fblog\u002Falarm-2.jpg","Learn how to build a simple browser automation.","\u002Fblog\u002Fautomate-your-morning-routine",{"title":79438,"description":79443},"blog\u002Fautomate-your-morning-routine","VfYcXMe9VPRUi_2bs8dioYhn_FsHuRBH4_YhZnrBOuE",[53990],[513],[46728],{"id":79617,"title":79618,"author":79048,"body":79619,"date":79987,"description":79623,"draft":26250,"extension":506,"meta":79988,"navigation":522,"path":79996,"seo":79997,"stem":79998,"__hash__":79999,"pinned":-1,"category":80000,"type":80001,"tool":80002},"blog\u002Fblog\u002Fclean-up-your-cluttered-inbox.md","Clean up your cluttered inbox with browser automation",{"type":8,"value":79620,"toc":79972},[79621,79624,79627,79630,79637,79640,79643,79646,79648,79652,79657,79666,79669,79672,79678,79682,79685,79688,79691,79697,79704,79711,79714,79717,79724,79728,79735,79737,79741,79743,79748,79751,79753,79757,79766,79771,79774,79777,79781,79787,79790,79793,79797,79803,79818,79827,79830,79834,79840,79843,79854,79857,79860,79864,79870,79875,79878,79881,79884,79888,79891,79894,79899,79902,79905,79909,79912,79915,79918,79929,79932,79946,79949,79952,79957],[14,79622,79623],{},"You should be commended for your bravery in making it all the way to Part III of this tutorial series! Bravo! 👏",[18,79625],{"alt":79626},"Use a bot to clean up your inbox and delete emails",[14,79628,79629],{},"Parts I and II were all about getting comfortable with axiom.ai's interface and capabilities. Now that you've arrived at Part III, it's time to solidify all of these core concepts and get a feel for what a browser bot can look like as its behavior becomes more complex.",[14,79631,79632,79633,79636],{},"In fact, this bot is deceptively simple on the surface: it searches for keywords in your ",[322,79634,79635],{"href":1515},"Gmail inbox"," and deletes emails that match those terms. This is handy if you have certain newsletters or spam subscriptions that have taken over your inbox and need to be eradicated.",[14,79638,79639],{},"But the possibilities that it opens up are profound! You'll be pulling in data from external sources (Google Sheets in this case); sequentially clicking on elements on the page; and even recording keystrokes for the bot to perform.",[21,79641,79642],{"id":79081},"1. Get ready to build.",[14,79644,79645],{},"his tutorial assumes that you already completed Parts I & II, and as such, you've already done the prerequisite work of installing Axiom and familiarizing yourself with how to get started.",[14,79647,79088],{},[21,79649,79651],{"id":79650},"_2-create-a-new-google-sheet","2. Create a new Google Sheet.",[14,79653,79654,79655,44],{},"Before you begin building your bot, you'll need to create a new spreadsheet in Google Docs. This Sheet will contain the keywords you want the bot to search for in ",[322,79656,1534],{"href":1515},[14,79658,79659,79660,79665],{},"Navigate to ",[322,79661,79664],{"href":79662,"rel":79663},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets",[2245],"Google sheets"," and sign in if needed.",[14,79667,79668],{},"Start a new Blank spreadsheet.",[14,79670,79671],{},"Add each keyword to a new row in column A of the spreadsheet.",[14,79673,79674,79675],{},"Give the Sheet a memorable name—how about ",[807,79676,79677],{},"Cluttered Inbox Keywords?",[21,79679,79681],{"id":79680},"_3-connect-axiom-to-google-sheets","3. Connect Axiom to Google Sheets.",[14,79683,79684],{},"Now we're ready to fire up Axiom.",[14,79686,79687],{},"If you haven't connected Axiom to your Google Docs account before, you'll need to do this next. (You can skip ahead to Step 4 if you've already done this.)",[592,79689],{"src":79690},"\u002Fblog\u002Fgrant-google.jpg",[14,79692,79693,79694],{},"In the dahsboard left hand side menu, click on the button labeled ",[29,79695,79696],{},"Google Sheets and API Key",[14,79698,79699,79700,79703],{},"This will open a new page, next click on ",[29,79701,79702],{},"Connect Google Sheets"," a browser window will open and ask you to sign in with Google.",[14,79705,79706,79707,79710],{},"After signing in, click ",[29,79708,79709],{},"Allow"," on the form that follows to give Axiom permission to interact with your Google Docs.",[592,79712],{"src":79713},"\u002Fblog\u002Faxiom-permissions.png",[14,79715,79716],{},"Once confirmed, a new tab will pop up to let you know the authentication was successful. You can close this tab.",[14,79718,79719,79720,79723],{},"Note that Google will likely send you a ",[29,79721,79722],{},"Security alert"," email as further confirmation that you have granted access to Axiom. You can safely disregard this email.",[21,79725,79727],{"id":79726},"_4-create-a-new-axiom","4. Create a new Axiom.",[14,79729,13969,79730,79732,79733,44],{},[29,79731,79095],{}," on the dashboard, then once again. Select ",[29,79734,79102],{},[592,79736],{"src":79105},[21,79738,79740],{"id":79739},"_5-add-the-interact-step","5. Add the Interact step",[592,79742],{"src":79188},[14,79744,701,79745,79747],{},[29,79746,114],{}," as the first step in this automation process.",[14,79749,79750],{},"In the url field insert the link to your Gmail inbox—which.",[592,79752],{"src":79208},[21,79754,79756],{"id":79755},"_6-get-search-terms-from-google-sheet","6. Get search terms from Google Sheet.",[14,79758,9773,79759,79761,79762,79765],{},[29,79760,8486],{}," sign above ",[29,79763,79764],{},"Step 1 - Interact"," to add Step 2.",[14,79767,79768,79769,44],{},"Scroll down the list and select ",[29,79770,92],{},[14,79772,79773],{},"Then simply search for the sheet you made and select it.",[592,79775],{"src":79776},"\u002Fblog\u002Fsheet-search.jpg",[21,79778,79780],{"id":79779},"_7-define-how-axiom-will-interact-with-gmail","7. Define how Axiom will interact with Gmail.",[14,79782,79783,79784],{},"Click back into the ",[29,79785,79786],{},"Interact step",[14,79788,79789],{},"Though this is technically the final step, it contains several sub-steps that will define exactly how the browser bot will interact with your Gmail inbox.",[14,79791,79792],{},"Each of the following sub-steps I - V will be nested within Step 2",[639,79794,79796],{"id":79795},"i-enter-text-plug-in-keywords-from-google-sheet","I. Enter Text: Plug in keywords from Google Sheet",[14,79798,79799,79800],{},"Add another step and select ",[29,79801,79802],{},"Enter Text.",[14,79804,79805,79806,79809,79810,79813,79814,79817],{},"Click the button labelled ",[29,79807,79808],{},"Select text field."," In your Gmail inbox, select the ",[29,79811,79812],{},"Search bar"," at the top of the screen. Click ",[29,79815,79816],{},"Confirm"," in the bottom-right corner.",[14,79819,79820,79821,79826],{},"Plug the ",[29,79822,79823],{},[727,79824,79825],{},"google-sheet-data1"," data into the URL field.",[592,79828],{"src":79829},"\u002Fblog\u002Fentertext.jpg",[639,79831,79833],{"id":79832},"ii-press-keys-press-return-to-search","II. Press Key(s): Press return to search",[14,79835,79836,79837],{},"For the third step, select ",[29,79838,79839],{},"Press Key(s).",[14,79841,79842],{},"This gives you the option to record a keystroke on your keyboard that the bot will perform when the time comes.",[14,79844,9766,79845,79847,79848,79850,79851,44],{},[29,79846,5357],{}," button; press ",[29,79849,10445],{}," on your keyboard; then click ",[29,79852,79853],{},"Stop Recording",[592,79855],{"src":79856},"\u002Fblog\u002Fkeypress.jpg",[14,79858,79859],{},"During the automation process, this keystroke will initiate searching your inbox for the keywords pulled in from the previous step.",[639,79861,79863],{"id":79862},"iii-click-element-click-to-open-dropdown","III. Click Element: Click to open dropdown",[14,79865,79866,79867],{},"Add another sub-step within Step 3: ",[29,79868,79869],{},"Click Element.",[14,79871,9766,79872,79874],{},[29,79873,155],{}," button in the Axiom interface to be taken back to your Gmail inbox.",[14,79876,79877],{},"In Gmail, click on the Select box, which is located directly below the Search bar in your inbox.",[14,79879,79880],{},"Click Confirm in the bottom-right corner of the screen.",[592,79882],{"src":79883},"\u002Fblog\u002Fselector-1.png",[639,79885,79887],{"id":79886},"iv-click-element-click-on-delete-icon","IV. Click Element: Click on Delete icon",[592,79889],{"src":79890},"\u002Fblog\u002Fselector2.png",[14,79892,79893],{},"Add another Click Element sub-step as before. This time, with the Select button checked, click on the Delete icon to select it as the click for this step.",[14,79895,13969,79896,79898],{},[29,79897,79816],{}," one last time, and your bot is now ready to run!",[14,79900,79901],{},"When your automation sequence is complete, it should look like this:",[14,79903,79904],{},"Click the Play button to run your new bot! 🎉",[21,79906,79908],{"id":79907},"epilogue-where-to-go-from-here","Epilogue: Where to go from here",[14,79910,79911],{},"You've learned a lot through these three introductory tutorials—in fact, you're now equipped with all the requisite knowledge to pull off some pretty sophisticated automated tasks with Axiom.",[14,79913,79914],{},"The bots we've built together are typical examples of how an individual might apply automation to their daily routine. But how might you apply what you've learned to your core business processes?",[14,79916,79917],{},"In Part II, you saw how to scrape data from a collection of cooking recipes. Consider other kinds of data you might need to gather:",[80,79919,79920,79923,79926],{},[83,79921,79922],{},"customer details",[83,79924,79925],{},"shipping addresses",[83,79927,79928],{},"pricing information",[14,79930,79931],{},"In Part III, you learned how to click on elements on a page, how to pull in data from a spreadsheet, and how to record keystrokes for a bot to perform. How else could you put this functionality into action?",[80,79933,79934,79937,79940,79943],{},[83,79935,79936],{},"logging into multiple platforms (e-commerce provider, CRM, CMS)",[83,79938,79939],{},"gathering data from multiple sources",[83,79941,79942],{},"entering data into selected fields",[83,79944,79945],{},"updating inventory lists",[14,79947,79948],{},"This is really just the tip of iceberg in terms of what's possible with a tool like Axiom.",[14,79950,79951],{},"For more inspiration to get the gears turning in your mind, visit our Recipes page here:",[14,79953,79954],{},[322,79955,79956],{"href":324},"View templates",[14,79958,79959,79960,79403,79962,79964,79965,79968,79969],{},"And if you ever get stuck while building the browser bot of your dreams, please don't hesitate to contact us for ",[322,79961,76646],{"href":486},[322,79963,62806],{"href":61952},". If you want to learn how to send a ",[322,79966,79967],{"href":1515},"Gmail blast"," with bot read our ",[322,79970,79971],{"href":19671},"blog.",{"title":494,"searchDepth":495,"depth":495,"links":79973},[79974,79975,79976,79977,79978,79979,79980,79986],{"id":79081,"depth":498,"text":79642},{"id":79650,"depth":498,"text":79651},{"id":79680,"depth":498,"text":79681},{"id":79726,"depth":498,"text":79727},{"id":79739,"depth":498,"text":79740},{"id":79755,"depth":498,"text":79756},{"id":79779,"depth":498,"text":79780,"children":79981},[79982,79983,79984,79985],{"id":79795,"depth":495,"text":79796},{"id":79832,"depth":495,"text":79833},{"id":79862,"depth":495,"text":79863},{"id":79886,"depth":495,"text":79887},{"id":79907,"depth":498,"text":79908},"2020-02-16",{"read":70686,"type":513,"tool":79989,"category":79990,"tags":79991,"location":46733,"featuredimg":79993,"landingimg":79994,"summary":79995},[46728],[53990],[67770,1532,79992],"clean inbox","\u002Fblog\u002Fcluttered-email.jpg","\u002Fblog\u002Fgmail.jpg","Learn how to build a bot that reads from a Google Sheet and interacts with the browser.","\u002Fblog\u002Fclean-up-your-cluttered-inbox",{"title":79618,"description":79623},"blog\u002Fclean-up-your-cluttered-inbox","DUlqlETbsVEQSdHMm7M_V6J7ZvD9SrZS0JzuCKzza5c",[53990],[513],[46728],{"id":26222,"title":26223,"author":523,"body":80004,"date":523,"description":494,"draft":26250,"extension":506,"meta":80024,"navigation":522,"path":19671,"seo":80025,"stem":26253,"__hash__":26254,"pinned":-1,"category":80026,"type":80027,"tool":80028},{"type":8,"value":80005,"toc":80022},[80006,80008,80010,80012,80015,80019],[12701,80007],{"description":26228,"headline":26229},[12706,80009],{},[26233,80011],{},[12744,80013],{"author":26237,"className":80014,"quote":26239},[12741],[26241,80016,80017],{"bg-class":12752},[12749,80018],{},[12755,80020],{"className":80021},[12752],{"title":494,"searchDepth":495,"depth":495,"links":80023},[],{},{"title":26223,"description":494},[],[],[],{"id":80030,"title":80031,"bio":80032,"body":80033,"date":523,"description":44,"extension":506,"image":80039,"linkedin":80040,"meta":80041,"name":46205,"navigation":522,"order":523,"path":80042,"seo":80043,"stem":80044,"__hash__":80045},"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":80034,"toc":80037},[80035],[14,80036,44],{},{"title":494,"searchDepth":495,"depth":495,"links":80038},[],"\u002Fauthors\u002Falex-barlow.jpeg","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falex-barlow-9b489330\u002F",{},"\u002Fauthors\u002Falex-barlow",{"title":80031,"description":44},"authors\u002Falex-barlow","mthwrlpXbshOSgAygqgpyg38ZdiM_P6DKRLDBGrqcOo",1781274724401]