[{"data":1,"prerenderedAt":32382},["ShallowReactive",2],{"search-dialog-corpus":3,"search-dialog-default-links":25152,"pinned-blogs":26220,"content-doc-\u002Fautomate-fetch":26221,"atoz-automate":26255},[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,"extension":506,"meta":26250,"navigation":522,"order":523,"path":26251,"seo":26252,"stem":26253,"__hash__":26254},"automate\u002Fautomate\u002Findex.md","Automate Jobs lever without code",{"type":8,"value":26225,"toc":26248},[26226,26230,26235,26240,26245],[12701,26227],{"description":26228,"headline":26229},"Explore how automation can simplify everyday browser tasks — from social media and data entry to reporting and scraping. Save time, reduce repetition, and streamline your workflow across the web.","Discover the range of usecases for browser automation",[26231,26232],"ato-z-index",{":perPage":26233,"folder":26234},"18","automate",[12744,26236],{"author":26237,"className":26238,"quote":26239},"N B",[12752],"Axiom exceeds expectations.",[26241,26242,26243],"background-wrapper",{"bg-class":12752},[12749,26244],{},[12755,26246],{"className":26247},[12752],{"title":494,"searchDepth":495,"depth":495,"links":26249},[],{},"\u002Fautomate",{"title":26223,"description":494},"automate\u002Findex","l9tTYhLHYoo8lZamGCJHHP3uRVjk0y8YPjpwyYfgpqg",[26256,26467,26629,26795,26972,27198,27363,27527,27689,27868,28025,28187,28352,28520,28704,28884,29053,29229,29428,29595,29765,29786,29948,30129,30293,30467,30632,30789,30946,31103,31257,31429,31587,31742,31902,32064,32224],{"id":26257,"title":26258,"author":26259,"body":26260,"date":523,"description":26461,"extension":506,"meta":26462,"navigation":522,"order":523,"path":26463,"seo":26464,"stem":26465,"__hash__":26466},"automate\u002Fautomate\u002Famazon-seller-central.md","Automate Amazon Seller Central without code | axiom","Alex Barlow",{"type":8,"value":26261,"toc":26446},[26262,26271,26275,26277,26280,26284,26286,26289,26292,26296,26298,26301,26305,26307,26310,26317,26323,26325,26342,26354,26360,26362,26372,26381,26392,26396,26398,26401,26405,26409,26411,26414,26418,26421,26425,26428,26432,26435,26439],[26263,26264],"left-hero-automate",{"description":26265,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":26270},"Running an Amazon store means living in Seller Central, and the work is scattered everywhere. Orders on one screen, inventory on another, pricing, reports, cases, all separate. A bot can pull it together, updating listings from a sheet and gathering your numbers into one. There are three ways to start, with no code, with code, or with a Claude skill.","Get started no-code","#no-code","Get started code","#code","Automate Amazon Seller Central",[21,26272,26274],{"id":26273},"what-i-mean-by-automating-seller-central","What I mean by automating Seller Central",[11,26276],{},[14,26278,26279],{},"Automating Amazon Seller Central means a bot handles the repetitive seller work in the console. Updating prices and stock from a sheet, pulling orders and settlement reports, checking your listings, downloading the reports buried a few clicks deep. It is the back-office upkeep of a store you run, gathered into one place, so you are not clicking across a dozen screens to see how the business is doing.",[21,26281,26283],{"id":26282},"the-work-is-scattered-across-seller-central","The work is scattered across Seller Central",[11,26285],{},[14,26287,26288],{},"Seller Central is enormous, and that is the problem. Your orders are on one screen, your inventory on another, pricing somewhere else, your reports behind a download, your account health on its own page. Seeing the whole picture means clicking through all of it, every day.",[14,26290,26291],{},"Amazon has the Selling Partner API for the heavy, structured pulls, and if you are big enough it is worth the setup. For everyone else, the day-to-day is still the console. A bot is good at exactly that, opening each screen, reading what is there, and writing it into one sheet, so the scattered pieces of your store finally sit together. API when you outgrow it, the browser until then.",[21,26293,26295],{"id":26294},"who-this-is-for","Who this is for",[11,26297],{},[14,26299,26300],{},"This is for the Amazon seller without a back office of staff. The solo seller or small team updating prices, watching stock, and pulling reports by hand across Seller Central's screens. You manage the account, you just want the busywork gathered up. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,26302,26304],{"id":26303},"how-id-approach-it","How I'd approach it",[11,26306],{},[14,26308,26309],{},"Start with the screen you check most, usually orders or inventory. Point the bot at it, read what is there, and write it to a sheet. For updates, put the new prices or stock in a sheet and let the bot apply them listing by listing. Run it on your own account with your own logged-in session, and be careful with anything that changes a price.",[14,26311,26312,26313,44],{},"One screen, your account, then schedule it. I would lay out the first draft with ",[322,26314,26316],{"href":26315},"\u002Fbuild-with-no-code\u002Fdescription","Build with description",[21,26318,26320,26321],{"id":26319},"automate-seller-central-from-a-description","Automate Seller Central from a description ",[727,26322],{"id":513},[11,26324],{},[14,26326,26327,26328,26333,26334,26337,26338,26341],{},"Describe the task in plain words in the ",[322,26329,26332],{"href":26330,"rel":26331},"https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Faxiom-browser-automation\u002Fcpgamigjcbffkaiciiepndmonbfdimbb",[2245],"Chrome extension"," and it builds the steps for you. Give it a few short lines, check what it made, and run it. ",[322,26335,26336],{"href":26315},"Explore no-code",". Note: ",[29,26339,26340],{},"Build from description"," is coming very soon. In the meantime you can still use the no-code builder.",[26343,26344,26351],"build-with-description",{":instructions":26345,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open Seller Central and sign in\",\"Go to the orders page\",\"Read each order's details\",\"Write the orders to a Google Sheet\",\"Run it every morning\"]","500","[]","Instructions","Describe your automation","Ready",[14,26352,26353],{},"To the right is an example. Describe the screen and the fields you want, and the AI lays out the steps.",[21,26355,26357,26358],{"id":26356},"automate-seller-central-in-code","Automate Seller Central in code ",[727,26359],{"id":90},[11,26361],{},[14,26363,26364,26367,26368],{},[29,26365,26366],{},"Build with code."," If you would rather script it yourself, this is the path. ",[322,26369,26371],{"href":26370},"\u002Fbuild-with-code","Explore code",[26373,26374,26378],"build-with-code",{":secondaryLinks":26347,"code":26375,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Your own Seller Central, using your logged-in session\n  await page.goto(\"https:\u002F\u002Fsellercentral.amazon.com\u002Forders-v3\");\n  await page.waitForSelector(\".order-row\");\n\n  \u002F\u002F Read each order off the table\n  const orders = await page.$$eval(\".order-row\", els =>\n    els.map(el => ({\n      id:     el.querySelector(\".order-id\")?.textContent.trim(),\n      item:   el.querySelector(\".item\")?.textContent.trim(),\n      status: el.querySelector(\".status\")?.textContent.trim(),\n    }))\n  );\n\n  console.log(orders); \u002F\u002F write these to your sheet\n} finally {\n  await browser.close();\n}\n","Code tool","https:\u002F\u002Fcode.axiom.ai",[14,26379,26380],{},"Connect Playwright (or Puppeteer) to our cloud Chromium and write the same scripts you'd run locally, without managing the browser.",[26382,26383],"ask-claude-automate",{"description":26384,"eyebrow":26385,"image":26386,"imageAlt":26387,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the Seller Central task you need. It builds the bot for you, no-code or code, gathering your screens into a sheet or updating listings.","Build with a Claude skill","\u002Flanding\u002Fai-assistant-merge.webp","Claude building an Amazon Seller Central automation from a description","Install the skill","\u002Fbuild-in-claude#install","\u002Fbuild-in-claude","Build no-code or code bots with a skill.",[21,26393,26395],{"id":26394},"what-can-you-automate","What can you automate?",[11,26397],{},[14,26399,26400],{},"The scattered Seller Central screens, for the store you run. A couple of cases worth knowing first.",[26402,26403],"tone-cards",{":cards":26404},"[{\"title\":\"Works well\",\"items\":[\"Pulling orders into a sheet\",\"Updating prices and stock from a sheet\",\"Downloading and gathering reports\",\"Checking listings and account health\",\"Running it on a schedule\"]},{\"title\":\"Harder\",\"items\":[\"Frequent layout changes in the console\",\"2FA on the seller account\",\"Very large catalogues in one run\"]},{\"title\":\"Don't try\",\"items\":[\"Pricing tricks that break Amazon's policies\",\"Scraping buyers' personal details\",\"Anything against Amazon's terms\"]}]",[21,26406,26408],{"id":26407},"what-id-watch-out-for","What I'd watch out for",[11,26410],{},[14,26412,26413],{},"Seller Central is a sprawling app behind a login, so a few things trip up a store bot. Here is what I would watch for.",[639,26415,26417],{"id":26416},"be-careful-changing-prices","Be careful changing prices",[14,26419,26420],{},"A bad price update across a catalogue is an expensive mistake, and on Amazon it can trigger a race to the bottom. Run one listing first, double-check the number, and cap how much the bot changes in a run.",[639,26422,26424],{"id":26423},"api-for-the-heavy-pulls","API for the heavy pulls",[14,26426,26427],{},"For large, structured exports, the Selling Partner API is sturdier than scraping the screen. Use the browser for the day-to-day and the gaps, and reach for the API when volume is the point.",[639,26429,26431],{"id":26430},"use-your-own-session","Use your own session",[14,26433,26434],{},"Sign in as yourself on the account you own, and store the cookies so the bot keeps the session rather than logging in fresh each run.",[639,26436,26438],{"id":26437},"when-the-layout-shifts","When the layout shifts",[14,26440,26441,26442,26445],{},"Amazon updates the console often, and buttons move. Repick anything that stops being found with the ",[322,26443,26444],{"href":11340},"selector tool",", and recheck after a big update.",{"title":494,"searchDepth":495,"depth":495,"links":26447},[26448,26449,26450,26451,26452,26453,26454,26455],{"id":26273,"depth":498,"text":26274},{"id":26282,"depth":498,"text":26283},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":26319,"depth":498,"text":26320},{"id":26356,"depth":498,"text":26357},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":26456},[26457,26458,26459,26460],{"id":26416,"depth":495,"text":26417},{"id":26423,"depth":495,"text":26424},{"id":26430,"depth":495,"text":26431},{"id":26437,"depth":495,"text":26438},"Automate Amazon Seller Central without code. Update prices and stock from a sheet, pull orders and reports, and gather your scattered store screens into one. From axiom.",{},"\u002Fautomate\u002Famazon-seller-central",{"title":26258,"description":26461},"automate\u002Famazon-seller-central","BsVk18aoojpZD2gTSYRk9U1CoYyqpCHtdaD4gRadA9k",{"id":26468,"title":26469,"author":26259,"body":26470,"date":523,"description":26623,"extension":506,"meta":26624,"navigation":522,"order":523,"path":26625,"seo":26626,"stem":26627,"__hash__":26628},"automate\u002Fautomate\u002Fblogger.md","Automate Blogger without code | axiom",{"type":8,"value":26471,"toc":26608},[26472,26476,26480,26482,26485,26489,26491,26494,26497,26499,26501,26504,26506,26508,26511,26516,26522,26524,26533,26539,26545,26547,26553,26558,26562,26564,26566,26569,26572,26574,26576,26579,26583,26586,26590,26593,26595,26598,26602],[26263,26473],{"description":26474,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":26475},"A blog is a pipeline. Drafts go in, formatted posts come out, on a schedule. A bot can run that pipeline for you, publishing from a Google Sheet, scheduling a backlog, and updating old posts in bulk, so writing is the only part you do by hand. There are three ways to start, with no code, with code, or with a Claude skill.","Automate Blogger",[21,26477,26479],{"id":26478},"what-i-mean-by-automating-blogger","What I mean by automating Blogger",[11,26481],{},[14,26483,26484],{},"Automating Blogger means a bot handles the publishing work, not the writing. Taking drafts from a sheet and posting them with the right title, labels, and formatting, scheduling a backlog so posts go out over time, updating a detail across many old posts at once, and pulling comments or stats into a sheet. The words are yours. The mechanical part of getting them onto the blog is what a bot takes on.",[21,26486,26488],{"id":26487},"publishing-is-a-pipeline","Publishing is a pipeline",[11,26490],{},[14,26492,26493],{},"Think of a blog less as a page and more as a pipeline. A draft comes in, it gets a title and labels, it is formatted, it is published or scheduled. Done once, that is a few minutes. Done for a backlog of fifty posts, or every week forever, it is a chore that crowds out the writing.",[14,26495,26496],{},"Blogger has an API if you want to script against it directly, but most people just want their drafts to become posts without the clicking. That is the pipeline a bot runs. Keep your posts in a sheet, one row each, and let the bot publish them down the list, on the schedule you set. The writing stays human, the publishing runs itself.",[21,26498,26295],{"id":26294},[11,26500],{},[14,26502,26503],{},"This is for the blogger or small content team publishing on Blogger without a developer. You write in a doc or a sheet, and you would rather not paste, format, and publish each post by hand. Migrating a backlog, scheduling ahead, or fixing the same thing across old posts. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,26505,26304],{"id":26303},[11,26507],{},[14,26509,26510],{},"Put your posts in a sheet. One row per post, columns for the title, the body, and the labels. Point the bot at Blogger, and let it create each post, paste the body, set the labels, and publish or schedule it. Start with one post to check the formatting comes through, then run the list. Run it on your own blog with your own logged-in session.",[14,26512,26513,26514,44],{},"Sheet to blog, one post first, then the backlog. I would lay out the first draft with ",[322,26515,26316],{"href":26315},[21,26517,26519,26520],{"id":26518},"automate-blogger-from-a-description","Automate Blogger from a description ",[727,26521],{"id":513},[11,26523],{},[14,26525,26327,26526,26333,26529,26337,26531,26341],{},[322,26527,26332],{"href":26330,"rel":26528},[2245],[322,26530,26336],{"href":26315},[29,26532,26340],{},[26343,26534,26536],{":instructions":26535,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open Blogger and sign in\",\"Read the next post from a Google Sheet\",\"Click to create a new post\",\"Paste the title, body, and labels\",\"Publish it, then move to the next row\"]",[14,26537,26538],{},"To the right is an example. Describe how you publish, and the AI lays out the steps.",[21,26540,26542,26543],{"id":26541},"automate-blogger-in-code","Automate Blogger in code ",[727,26544],{"id":90},[11,26546],{},[14,26548,26549,26367,26551],{},[29,26550,26366],{},[322,26552,26371],{"href":26370},[26373,26554,26556],{":secondaryLinks":26347,"code":26555,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Your posts, from your sheet\n  const posts = [\n    { title: \"On slow mornings\", body: \"\u003Cp>The first post body.\u003C\u002Fp>\", labels: \"essays\" },\n  ];\n\n  for (const post of posts) {\n    \u002F\u002F New post on your own blog, using your logged-in session\n    await page.goto(\"https:\u002F\u002Fwww.blogger.com\u002Fblog\u002Fpost\u002Fedit\u002Fnew\");\n    await page.getByLabel(\"Title\").fill(post.title);\n    await page.frameLocator(\".editor iframe\").locator(\"body\").fill(post.body);\n    await page.getByLabel(\"Labels\").fill(post.labels);\n    await page.getByRole(\"button\", { name: \"Publish\" }).click();\n    await page.waitForSelector(\"text=Published\");\n  }\n} finally {\n  await browser.close();\n}\n",[14,26557,26380],{},[26382,26559],{"description":26560,"eyebrow":26385,"image":26386,"imageAlt":26561,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe how you publish. It builds the bot for you, no-code or code, turning a sheet of drafts into posts on your blog.","Claude building a Blogger automation from a description",[21,26563,26395],{"id":26394},[11,26565],{},[14,26567,26568],{},"The publishing pipeline, for the blog you run. A couple of cases worth knowing first.",[26402,26570],{":cards":26571},"[{\"title\":\"Works well\",\"items\":[\"Publishing posts from a sheet\",\"Scheduling a backlog over time\",\"Adding labels and formatting\",\"Updating a detail across old posts\",\"Scraping comments and stats into a sheet\"]},{\"title\":\"Harder\",\"items\":[\"Complex formatting and embedded media\",\"The rich-text editor inside an iframe\",\"2FA on the account\"]},{\"title\":\"Don't try\",\"items\":[\"Auto-generating low-quality spam posts\",\"Publishing content that is not yours\",\"Anything against Blogger's terms\"]}]",[21,26573,26408],{"id":26407},[11,26575],{},[14,26577,26578],{},"Blogger is simple, but the editor has a couple of quirks. Here is what I would watch for.",[639,26580,26582],{"id":26581},"the-editor-is-in-an-iframe","The editor is in an iframe",[14,26584,26585],{},"Blogger's post body lives inside a rich-text frame, so a bot has to target the frame, not the page, to type into it. If text will not go in, that is usually why.",[639,26587,26589],{"id":26588},"check-the-formatting-on-one-post","Check the formatting on one post",[14,26591,26592],{},"Pasting a body can carry stray formatting. Run one post first, look at how it published, and fix the source in your sheet before you push the whole backlog.",[639,26594,26431],{"id":26430},[14,26596,26597],{},"Sign in as yourself on the blog you own, and store the cookies so the bot keeps the session rather than logging in fresh each run.",[639,26599,26601],{"id":26600},"when-the-editor-changes","When the editor changes",[14,26603,26604,26605,26607],{},"If a field stops being found after a Blogger update, repick it with the ",[322,26606,26444],{"href":11340},", and confirm the iframe is still where the body goes.",{"title":494,"searchDepth":495,"depth":495,"links":26609},[26610,26611,26612,26613,26614,26615,26616,26617],{"id":26478,"depth":498,"text":26479},{"id":26487,"depth":498,"text":26488},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":26518,"depth":498,"text":26519},{"id":26541,"depth":498,"text":26542},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":26618},[26619,26620,26621,26622],{"id":26581,"depth":495,"text":26582},{"id":26588,"depth":495,"text":26589},{"id":26430,"depth":495,"text":26431},{"id":26600,"depth":495,"text":26601},"Automate Blogger without code. Publish posts from a Google Sheet, schedule a backlog, update old posts in bulk, and scrape your comments and stats. From axiom.",{},"\u002Fautomate\u002Fblogger",{"title":26469,"description":26623},"automate\u002Fblogger","xczw6D6m2PrA7mKX7yZEStGgB6gXnXaoDyVmSuOEi3I",{"id":26630,"title":26631,"author":26259,"body":26632,"date":523,"description":26789,"extension":506,"meta":26790,"navigation":522,"order":523,"path":26791,"seo":26792,"stem":26793,"__hash__":26794},"automate\u002Fautomate\u002Fbots.md","Build browser bots without code | axiom",{"type":8,"value":26633,"toc":26774},[26634,26638,26642,26644,26647,26651,26653,26656,26659,26661,26663,26666,26668,26670,26673,26678,26684,26686,26695,26701,26707,26709,26715,26720,26724,26728,26730,26733,26736,26738,26740,26743,26747,26750,26754,26760,26764,26767,26771],[26263,26635],{"description":26636,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":26637},"A bot is just a script that does the browser work you would otherwise do by hand. It clicks, types, scrapes, and downloads, on a schedule, while you do something better. The word sounds dramatic, but most useful bots are wonderfully boring. There are three ways to start, with no code, with code, or with a Claude skill.","Build browser bots",[21,26639,26641],{"id":26640},"what-i-mean-by-a-bot","What I mean by a bot",[11,26643],{},[14,26645,26646],{},"A bot is a set of browser steps that runs on its own. It opens a page, clicks what you would click, types what you would type, reads what you would read, and saves the result. One bot might fill a form, another might pull a daily report, another might move data from one tool to the next. A testing bot might run through a sign-up flow on a schedule to check it still works. Whatever the task, a bot is just you, automated, doing the same thing without getting bored or making typos.",[21,26648,26650],{"id":26649},"most-bots-are-boring-and-that-is-the-point","Most bots are boring, and that is the point",[11,26652],{},[14,26654,26655],{},"The word bot does a lot of heavy lifting. People hear it and think of spam, scrapers, and click farms. The bots most people actually need are nothing like that. They fill a timesheet, download an invoice, check a price, update a record. Dull, repetitive, and exactly the work a person should not be doing by hand.",[14,26657,26658],{},"There is a line, and it matters. A good bot works at a reasonable pace, on sites and data you are allowed to use, and within a site's terms. A bad bot hammers a server, fakes signups, or scrapes behind a login it has no right to. axiom is built for the boring, useful kind, and the same care that keeps a bot reliable also keeps it a good web citizen.",[21,26660,26295],{"id":26294},[11,26662],{},[14,26664,26665],{},"This is for anyone with a browser task they do too often. Pulling the same report, filling the same form, copying data between the same two tools every week. You do not want to learn a programming language to win an hour back, you just want the boring part handled. No-coders and coders both, since you can build a bot without code and drop into code when you want.",[21,26667,26304],{"id":26303},[11,26669],{},[14,26671,26672],{},"Pick one task and one bot. Do not try to automate your whole week on day one. Take the thing you do most often, write down the steps you take by hand, and build those. Run it on real data once and watch it work. When it is solid, set it on a schedule. Then build the next one.",[14,26674,26675,26676,44],{},"One bot, one task, proven before you trust it. That is the order that actually sticks. I would lay out the first draft with ",[322,26677,26316],{"href":26315},[21,26679,26681,26682],{"id":26680},"build-a-bot-from-a-description","Build a bot from a description ",[727,26683],{"id":513},[11,26685],{},[14,26687,26327,26688,26333,26691,26337,26693,26341],{},[322,26689,26332],{"href":26330,"rel":26690},[2245],[322,26692,26336],{"href":26315},[29,26694,26340],{},[26343,26696,26698],{":instructions":26697,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Go to the dashboard and log in\",\"Read the open tasks on the page\",\"Update each one from a Google Sheet\",\"Save the change\",\"Move to the next task\"]",[14,26699,26700],{},"To the right is an example. Describe the task and let the AI lay out the steps of your bot.",[21,26702,26704,26705],{"id":26703},"build-a-bot-in-code","Build a bot in code ",[727,26706],{"id":90},[11,26708],{},[14,26710,26711,26367,26713],{},[29,26712,26366],{},[322,26714,26371],{"href":26370},[26373,26716,26718],{":secondaryLinks":26347,"code":26717,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Log in once\n  await page.goto(\"https:\u002F\u002Fexample.com\u002Flogin\");\n  await page.fill(\"#email\", process.env.SITE_EMAIL);\n  await page.fill(\"#password\", process.env.SITE_PASSWORD);\n  await page.click(\"button[type=submit]\");\n\n  \u002F\u002F A bot is just these steps, repeated for every item in a queue\n  await page.goto(\"https:\u002F\u002Fexample.com\u002Fqueue\");\n  const tasks = await page.$$(\".task\");\n\n  for (let i = 0; i \u003C tasks.length; i++) {\n    await page.goto(\"https:\u002F\u002Fexample.com\u002Fqueue\");\n    await page.$$(\".task\").then(items => items[i].click());\n\n    await page.waitForSelector(\".task-detail\");\n    await page.click(\".mark-done\");\n    await page.waitForSelector(\".done\");\n  }\n} finally {\n  await browser.close();\n}\n",[14,26719,26380],{},[26382,26721],{"description":26722,"eyebrow":26385,"image":26386,"imageAlt":26723,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the task. It builds the bot for you, no-code or code, the boring repetitive kind that just gets the work done.","Claude building a browser bot from a description",[21,26725,26727],{"id":26726},"what-can-a-bot-do","What can a bot do?",[11,26729],{},[14,26731,26732],{},"Most browser work. A couple of cases worth knowing first.",[26402,26734],{":cards":26735},"[{\"title\":\"Works well\",\"items\":[\"Filling and submitting forms\",\"Pulling reports and exports\",\"Moving data between web apps\",\"Updating records on a schedule\",\"Checking prices or status\",\"Testing a web flow end to end\"]},{\"title\":\"Harder\",\"items\":[\"Sites with strong bot detection\",\"2FA and captcha-gated logins\",\"Tasks that need real human judgment\"]},{\"title\":\"Don't try\",\"items\":[\"Spam, fake signups, or click farms\",\"Scraping behind a login you have no right to\",\"Anything against a site's terms\"]}]",[21,26737,26408],{"id":26407},[11,26739],{},[14,26741,26742],{},"A bot is only as reliable as the page it runs on. Here is what I would watch for.",[639,26744,26746],{"id":26745},"build-one-bot-at-a-time","Build one bot at a time",[14,26748,26749],{},"The fastest way to give up is to automate everything at once. Build one bot that does one task, run it for a week, then build the next. Small and proven beats big and broken.",[639,26751,26753],{"id":26752},"sites-change-bots-break","Sites change, bots break",[14,26755,26756,26757,26759],{},"A bot depends on the page staying roughly the same. When a site updates its layout, repick the element with the ",[322,26758,26444],{"href":11340},", or describe the change to Claude and have it patch the bot. Plan for it, it is the nature of the web.",[639,26761,26763],{"id":26762},"be-a-good-bot","Be a good bot",[14,26765,26766],{},"Run at a human pace, on sites and data you are allowed to use, and within a site's terms. A bot that hammers a server or fakes activity gets blocked, and rightly so.",[639,26768,26770],{"id":26769},"login-and-sessions","Login and sessions",[14,26772,26773],{},"If a bot needs to be signed in, store the cookies so the session carries over, or sign in as a step. Decide which before you schedule it.",{"title":494,"searchDepth":495,"depth":495,"links":26775},[26776,26777,26778,26779,26780,26781,26782,26783],{"id":26640,"depth":498,"text":26641},{"id":26649,"depth":498,"text":26650},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":26680,"depth":498,"text":26681},{"id":26703,"depth":498,"text":26704},{"id":26726,"depth":498,"text":26727},{"id":26407,"depth":498,"text":26408,"children":26784},[26785,26786,26787,26788],{"id":26745,"depth":495,"text":26746},{"id":26752,"depth":495,"text":26753},{"id":26762,"depth":495,"text":26763},{"id":26769,"depth":495,"text":26770},"Build browser bots without code, from data entry to testing bots. A bot clicks, types, scrapes, and downloads the boring browser work for you, on a schedule. Build no-code or in code with axiom.",{},"\u002Fautomate\u002Fbots",{"title":26631,"description":26789},"automate\u002Fbots","ABNjofKhkfJDKSUw-T43S7WCwcSeHTkNeyoKnmGk55I",{"id":26796,"title":26797,"author":26259,"body":26798,"date":523,"description":26966,"extension":506,"meta":26967,"navigation":522,"order":523,"path":26968,"seo":26969,"stem":26970,"__hash__":26971},"automate\u002Fautomate\u002Fchrome.md","Automate Chrome | No-code browser automation | axiom",{"type":8,"value":26799,"toc":26950},[26800,26804,26808,26810,26813,26817,26819,26822,26825,26827,26829,26832,26834,26836,26839,26845,26851,26853,26862,26868,26874,26876,26883,26889,26893,26897,26899,26902,26905,26907,26909,26912,26916,26919,26923,26926,26930,26933,26937,26943,26947],[26263,26801],{"description":26802,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":26803},"Chrome is where the work happens, and browser automation splits two ways. Developers reach for Selenium, Puppeteer, or Playwright. Everyone else gets stuck, because the browser fights back with cookies, bot detection, and settings you wire up by hand. axiom gives you both a no-code extension and a code tool, and it handles the browser parts for you. There are three ways to start, with no code, with code, or with a Claude skill.","Automate Chrome",[21,26805,26807],{"id":26806},"what-i-mean-by-automating-chrome","What I mean by automating Chrome",[11,26809],{},[14,26811,26812],{},"Automating Chrome means handing the clicking, typing, and navigating you do in your browser to a bot that runs in that same browser. axiom is a Chrome extension, so it works on any site you can open in a tab, using the Chrome session you are already signed into. No separate app, no copy of your logins kept somewhere else. You can run it right there in your Chrome, or send the same job to the cloud on Chromium when you want it on a schedule.",[21,26814,26816],{"id":26815},"the-hard-part-is-the-browser-not-the-clicks","The hard part is the browser, not the clicks",[11,26818],{},[14,26820,26821],{},"Clicking through a task once is easy. The hard part of automating Chrome is the browser itself. With code you would drive it using Selenium, Puppeteer, or Playwright, and they are good tools, but you still have to solve the rest by hand. Sites set cookies you need to keep or clear. Pages pull in heavy resources you may want to block so a run is fast and cheap. Sites run bot detection you have to get past. Long jobs need their own profile so sessions do not collide.",[14,26823,26824],{},"axiom hands you those as controls instead of code. Keep or carry cookies, block images and other resources, get past common bot blocking, and run each job in its own profile, set in the no-code tool or called from the code tool. Same browser engine underneath, far less plumbing. So this works whether you are a no-coder who never wants to see a config, or a coder who would rather not rebuild the same browser setup on every project.",[21,26826,26295],{"id":26294},[11,26828],{},[14,26830,26831],{},"This is for anyone who lives in Chrome and repeats the same work in it, checking a dashboard, copying numbers between tabs, filling the same web app. And it is for the developer who has wired up Selenium, Puppeteer, or Playwright before and is tired of rebuilding cookie handling, proxies, and anti-bot tricks on every project. No-coders get the controls without the code. Coders get the same controls without the boilerplate. Both automate the same Chrome.",[21,26833,26304],{"id":26303},[11,26835],{},[14,26837,26838],{},"There are two honest paths. If you want it done fast and visible, build it no-code in the extension, run it in your Chrome, and reach for the browser controls when a site pushes back. If you live in code, connect Puppeteer or Playwright to our cloud Chromium and let the same controls handle cookies, resource blocking, profiles, and bot detection, so you are not writing that part again.",[14,26840,26841,26842,26844],{},"Most people should try no-code first, because the hard browser parts are already solved for you. Move into code when you need it, not by default. Either way I would lay out the first draft with ",[322,26843,26316],{"href":26315},", then tidy the steps.",[21,26846,26848,26849],{"id":26847},"automate-chrome-from-a-description","Automate Chrome from a description ",[727,26850],{"id":513},[11,26852],{},[14,26854,26327,26855,26333,26858,26337,26860,26341],{},[322,26856,26332],{"href":26330,"rel":26857},[2245],[322,26859,26336],{"href":26315},[29,26861,26340],{},[26343,26863,26865],{":instructions":26864,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open the dashboard in Chrome and log in\",\"Read the open tickets on the page\",\"Copy each ticket number into a Google Sheet\",\"Mark the ticket as seen\",\"Move to the next one\"]",[14,26866,26867],{},"To the right is an example. Describe the task and the AI lays out the steps, right inside Chrome.",[21,26869,26871,26872],{"id":26870},"automate-chrome-in-code","Automate Chrome in code ",[727,26873],{"id":90},[11,26875],{},[14,26877,26878,26880,26881],{},[29,26879,26366],{}," Bring Selenium, Puppeteer, or Playwright, connect to our cloud Chromium, and let axiom handle cookies, resource blocking, profiles, and bot detection. ",[322,26882,26371],{"href":26370},[26373,26884,26886],{":secondaryLinks":26347,"code":26885,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Block heavy resources so the run is fast and cheap\n  await page.route(\"**\u002F*\", route => {\n    const type = route.request().resourceType();\n    return [\"image\", \"media\", \"font\"].includes(type)\n      ? route.abort()\n      : route.continue();\n  });\n\n  \u002F\u002F The pages you would open by hand each morning\n  const dashboards = [\n    \"https:\u002F\u002Fexample.com\u002Fsite-a\u002Fstatus\",\n    \"https:\u002F\u002Fexample.com\u002Fsite-b\u002Fstatus\",\n  ];\n\n  for (const url of dashboards) {\n    await page.goto(url);\n    await page.waitForSelector(\".health\");\n\n    \u002F\u002F Read a value off the page\n    const status = await page.$eval(\".health\", el => el.textContent.trim());\n    console.log(url, status);\n\n    \u002F\u002F Act on it, the way you would in the browser\n    if (status !== \"OK\") {\n      await page.click(\"#acknowledge\");\n      await page.waitForSelector(\".acknowledged\");\n    }\n  }\n} finally {\n  await browser.close();\n}\n",[14,26887,26888],{},"Connect Selenium, Puppeteer, or Playwright to our cloud Chromium and write the same scripts you'd run locally, without managing the browser.",[26382,26890],{"description":26891,"eyebrow":26385,"image":26386,"imageAlt":26892,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe what you want Chrome to do. It builds the bot for you, no-code or code, and sets the browser controls, cookies, resource blocking, profiles, and bot detection, so you do not have to.","Claude building a Chrome automation from a description",[21,26894,26896],{"id":26895},"what-can-you-automate-in-chrome","What can you automate in Chrome?",[11,26898],{},[14,26900,26901],{},"Most of what you do in a tab. A couple of cases worth knowing first.",[26402,26903],{":cards":26904},"[{\"title\":\"Works well\",\"items\":[\"Repeating a task across many tabs or sites\",\"Moving data between a web app and a sheet\",\"Filling and submitting web forms\",\"Downloading reports on a schedule\",\"Checking a dashboard and acting on it\"]},{\"title\":\"Harder\",\"items\":[\"Sites with heavy bot detection\",\"2FA logins\",\"Sites with strict rate limiting\"]},{\"title\":\"Don't try\",\"items\":[\"Anything against a site's terms\",\"Solving captchas to abuse a service\",\"Mass account creation\"]}]",[21,26906,26408],{"id":26407},[11,26908],{},[14,26910,26911],{},"Chrome is a moving target. Sites change, and so does the browser. Here is what I would watch for.",[639,26913,26915],{"id":26914},"use-your-session-or-carry-the-cookies","Use your session, or carry the cookies",[14,26917,26918],{},"On the desktop a bot can use the Chrome session you are already signed into. In the cloud there is no you logged in, so store the cookies or sign in as a step. Decide which before you schedule it.",[639,26920,26922],{"id":26921},"bot-detection","Bot detection",[14,26924,26925],{},"Some sites watch for automation and block it. axiom can run with stealth settings and proxies to get past common checks, but keep it legitimate. Evasion is for reaching a site you are allowed to use, not for hammering it or breaking its terms.",[639,26927,26929],{"id":26928},"resources-and-profiles","Resources and profiles",[14,26931,26932],{},"Block images and other heavy resources to keep runs fast, and give each job its own profile so logins and cookies do not collide. Both are settings in the no-code tool, or calls in code.",[639,26934,26936],{"id":26935},"selectors-over-positions","Selectors over positions",[14,26938,26939,26940,26942],{},"A step tied to a spot on the page breaks when Chrome reflows the layout. Pick the element with the ",[322,26941,26444],{"href":11340}," so it holds up.",[639,26944,26946],{"id":26945},"local-versus-cloud","Local versus cloud",[14,26948,26949],{},"Running in your own Chrome is good for watching and debugging. Running in the cloud frees your machine, but it needs its own login and any proxies set up. Build local, then move to cloud.",{"title":494,"searchDepth":495,"depth":495,"links":26951},[26952,26953,26954,26955,26956,26957,26958,26959],{"id":26806,"depth":498,"text":26807},{"id":26815,"depth":498,"text":26816},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":26847,"depth":498,"text":26848},{"id":26870,"depth":498,"text":26871},{"id":26895,"depth":498,"text":26896},{"id":26407,"depth":498,"text":26408,"children":26960},[26961,26962,26963,26964,26965],{"id":26914,"depth":495,"text":26915},{"id":26921,"depth":495,"text":26922},{"id":26928,"depth":495,"text":26929},{"id":26935,"depth":495,"text":26936},{"id":26945,"depth":495,"text":26946},"Automate Chrome no-code or in code. Browser automation that handles the hard parts, cookies, resource blocking, bot detection, and profiles, so you skip the Selenium, Puppeteer, and Playwright plumbing.",{},"\u002Fautomate\u002Fchrome",{"title":26797,"description":26966},"automate\u002Fchrome","NR25aDfIlIRxDfLyZFIOjD6hymQD-REQM_TYBaIg75U",{"id":26973,"title":26974,"author":26259,"body":26975,"date":523,"description":27192,"extension":506,"meta":27193,"navigation":522,"order":523,"path":27194,"seo":27195,"stem":27196,"__hash__":27197},"automate\u002Fautomate\u002Fclicks.md","Automate browser clicks and typing without code | axiom",{"type":8,"value":26976,"toc":27175},[26977,26981,26985,26987,26990,26994,26996,26999,27006,27031,27034,27036,27038,27041,27043,27045,27051,27056,27062,27064,27074,27080,27086,27088,27094,27099,27103,27105,27107,27110,27113,27115,27117,27120,27124,27130,27134,27137,27141,27147,27151,27158,27162,27165,27169,27172],[26263,26978],{"description":26979,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":26980},"Every browser task comes down to clicks and typing. Clicking a button in the browser, choosing from a menu, typing into a field, pressing Enter. A bot can do all of it for you, the same browser actions you would make by hand, on every row of your data. There are three ways to start, with no code, with code, or with a Claude skill.","Automate browser clicks and typing",[21,26982,26984],{"id":26983},"what-i-mean-by-automating-clicks","What I mean by automating clicks",[11,26986],{},[14,26988,26989],{},"A click is the smallest thing you do in a browser, and typing is right next to it. Clicking and typing are the building blocks of every browser task. Automating browser clicks and typing means a bot makes those moves for you. A left click on a website button, a double click, a right click for a menu, a key press like Enter or Tab, and text typed into a field. String a few together and you have a task. axiom does each one as a step in the browser, with the value coming from you or from a sheet.",[21,26991,26993],{"id":26992},"the-hard-part-of-a-click-is-making-it-land","The hard part of a click is making it land",[11,26995],{},[14,26997,26998],{},"Firing a browser click is easy. Making it land on the right element every time is the part that takes care, and it comes down to how you point at the button in the browser.",[14,27000,27001,27002,27005],{},"Often a button has unique text on it, like Submit or Download. The ",[322,27003,27004],{"href":10402},"single selector tool"," can select an element by that text, which is the quickest way to tie a click to the right button. When the text is not unique, use a custom selector that matches an attribute on the button. Most buttons carry something stable you can target, for example:",[719,27007,27011],{"className":27008,"code":27009,"language":27010,"meta":494,"style":494},"language-css shiki shiki-themes github-light-default github-dark-default","button[type=\"submit\"]\n","css",[90,27012,27013],{"__ignoreMap":494},[727,27014,27015,27018,27021,27024,27026,27029],{"class":729,"line":730},[727,27016,27017],{"class":7745},"button",[727,27019,27020],{"class":768},"[",[727,27022,27023],{"class":1882},"type",[727,27025,4970],{"class":1986},[727,27027,27028],{"class":737},"\"submit\"",[727,27030,17433],{"class":768},[14,27032,27033],{},"Two more things decide whether a click works. Timing, the element has to be on the page before you click it, so the bot waits rather than firing into a page that has not loaded. And the kind of click, a plain click, a double click, a right click, a hover, or a key press, each is its own action. Get the target, the wait, and the type right, and a click just works.",[21,27035,26295],{"id":26294},[11,27037],{},[14,27039,27040],{},"This is for anyone repeating the same clicks and keystrokes all day. Clicking through a queue, typing the same values into a form, pressing the same buttons in the same order. And for anyone with a sheet of data that needs typing into a web app one field at a time. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,27042,26304],{"id":26303},[11,27044],{},[14,27046,27047,27048,27050],{},"Do the task once and write down each click and keystroke in order. Click here, type that, press Enter, click next. Then build those as steps. For each click, pick the element with the ",[322,27049,26444],{"href":11340}," so it targets the thing and not a spot on the screen. Add a wait where a page loads between actions. If the values change each time, read them from a sheet and loop.",[14,27052,27053,27054,44],{},"Map the clicks, target the elements, then loop. That order keeps it simple. I would lay out the first draft with ",[322,27055,26316],{"href":26315},[21,27057,27059,27060],{"id":27058},"automate-clicks-from-a-description","Automate clicks from a description ",[727,27061],{"id":513},[11,27063],{},[14,27065,27066,27067,26333,27070,26337,27072,26341],{},"Describe the clicks and typing in plain words in the ",[322,27068,26332],{"href":26330,"rel":27069},[2245],[322,27071,26336],{"href":26315},[29,27073,26340],{},[26343,27075,27077],{":instructions":27076,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Go to the page\",\"Click into the search field\",\"Type the query from a Google Sheet\",\"Press Enter\",\"Click the first result\"]",[14,27078,27079],{},"To the right is an example. Describe the clicks and typing and let the AI lay out the steps.",[21,27081,27083,27084],{"id":27082},"automate-clicks-in-code","Automate clicks in code ",[727,27085],{"id":90},[11,27087],{},[14,27089,27090,26367,27092],{},[29,27091,26366],{},[322,27093,26371],{"href":26370},[26373,27095,27097],{":secondaryLinks":26347,"code":27096,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Each value would come from your Google Sheet\n  const queries = [\"widgets\", \"gadgets\", \"gizmos\"];\n\n  for (const q of queries) {\n    await page.goto(\"https:\u002F\u002Fexample.com\");\n\n    \u002F\u002F Click into the field, type, and press a key\n    await page.click(\"#search\");\n    await page.fill(\"#search\", q);\n    await page.keyboard.press(\"Enter\");\n\n    \u002F\u002F Wait for the element, then click it. Targets the element, not a pixel.\n    await page.waitForSelector(\".result\");\n    await page.click(\".result:first-child\");\n  }\n} finally {\n  await browser.close();\n}\n",[14,27098,26380],{},[26382,27100],{"description":27101,"eyebrow":26385,"image":26386,"imageAlt":27102,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the clicks and typing you want. It builds the bot for you, no-code or code, targeting each element so the clicks land even when the page changes.","Claude building a click and type automation from a description",[21,27104,26395],{"id":26394},[11,27106],{},[14,27108,27109],{},"Most clicks and keystrokes. A couple of cases worth knowing first.",[26402,27111],{":cards":27112},"[{\"title\":\"Works well\",\"items\":[\"Clicking buttons, links, and menus\",\"Typing into fields from a sheet\",\"Key presses like Enter and Tab\",\"Selecting from dropdowns\",\"Hovers, double clicks, and right clicks\"]},{\"title\":\"Harder\",\"items\":[\"Clicking a list of buttons with steps in between\",\"Drag and drop\",\"Canvas and custom widgets with no real element\",\"Clicks gated behind bot detection\"]},{\"title\":\"Don't try\",\"items\":[\"Click fraud or fake ad clicks\",\"Anything against a site's terms\",\"Hammering a button faster than a human could\"]}]",[21,27114,26408],{"id":26407},[11,27116],{},[14,27118,27119],{},"A click looks trivial until it lands in the wrong place. Here is what I would watch for.",[639,27121,27123],{"id":27122},"clicking-a-whole-list-of-buttons","Clicking a whole list of buttons",[14,27125,27126,27127,44],{},"When a page has a list of buttons, like a download on every invoice row, click them in turn by reading their selectors from a sheet and looping. Give each button a custom selector, either nth-child by position or a unique class, then a Click element step that sets its selector from the loop. There is a full walkthrough in ",[322,27128,27129],{"href":13868},"interacting with a button list",[639,27131,27133],{"id":27132},"wait-before-you-click","Wait before you click",[14,27135,27136],{},"If the click fires before the element is on the page, it misses. The no-code tool has auto-wait algorithms built in that hold each step until the element is ready, so most of the time you do not have to think about it. When you do, add an explicit wait for the element.",[639,27138,27140],{"id":27139},"an-element-that-will-not-click","An element that will not click",[14,27142,27143,27144,27146],{},"If a click does nothing, the selector is probably matching the wrong element, or none at all. Switch to selecting the button by its text in the ",[322,27145,27004],{"href":10402},", which is often the most reliable way to pin it down.",[639,27148,27150],{"id":27149},"elements-inside-an-iframe","Elements inside an iframe",[14,27152,27153,27154,27157],{},"If a button or field sits inside an iframe, turn on iframe mode in the no-code ",[322,27155,27156],{"href":10402},"single selector"," before you pick it. You will know you are on an iframe element because the selector highlight turns blue. With iframe mode off, the click cannot reach inside the frame.",[639,27159,27161],{"id":27160},"the-right-kind-of-click","The right kind of click",[14,27163,27164],{},"A menu that needs a right click or a hover will not open on a plain click. Match the action to what the page expects, a double click, a right click, or a hover.",[639,27166,27168],{"id":27167},"typing-that-does-not-register","Typing that does not register",[14,27170,27171],{},"Some fields ignore text that is set instead of typed. If a value does not take, type it key by key, or click the field first to focus it.",[811,27173,27174],{},"html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}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 .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}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":27176},[27177,27178,27179,27180,27181,27182,27183,27184],{"id":26983,"depth":498,"text":26984},{"id":26992,"depth":498,"text":26993},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":27058,"depth":498,"text":27059},{"id":27082,"depth":498,"text":27083},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":27185},[27186,27187,27188,27189,27190,27191],{"id":27122,"depth":495,"text":27123},{"id":27132,"depth":495,"text":27133},{"id":27139,"depth":495,"text":27140},{"id":27149,"depth":495,"text":27150},{"id":27160,"depth":495,"text":27161},{"id":27167,"depth":495,"text":27168},"Automate browser clicks and typing without code. Fire mouse clicks, key presses, and type text from a sheet on the right element of any web page, every time. From axiom.",{},"\u002Fautomate\u002Fclicks",{"title":26974,"description":27192},"automate\u002Fclicks","dQ8zF0XZ-Jty_rgz06TL4kG9Z-y-6suGMKBwp5jWba0",{"id":27199,"title":27200,"author":26259,"body":27201,"date":523,"description":27357,"extension":506,"meta":27358,"navigation":522,"order":523,"path":27359,"seo":27360,"stem":27361,"__hash__":27362},"automate\u002Fautomate\u002Fcomment-on-facebook.md","Automate your Facebook group without code | axiom",{"type":8,"value":27202,"toc":27342},[27203,27207,27211,27213,27216,27220,27222,27225,27228,27230,27232,27235,27237,27239,27242,27247,27253,27255,27265,27271,27277,27279,27285,27290,27294,27296,27298,27301,27304,27306,27308,27311,27315,27318,27322,27325,27329,27332,27336],[26263,27204],{"description":27205,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":27206},"Running a Facebook group means keeping up with comments faster than one person can. A bot can read the new comments, draft a reply with AI, and help you respond, so your community does not wait. This is for engaging your own followers, not spamming strangers. There are three ways to start, with no code, with code, or with a Claude skill.","Automate your Facebook group",[21,27208,27210],{"id":27209},"what-i-mean-by-automating-a-facebook-group","What I mean by automating a Facebook group",[11,27212],{},[14,27214,27215],{},"Automating a Facebook group means a bot helps with the repetitive parts of running a community. It reads the latest comments, pulls out what people are asking, drafts a reply with AI, and posts it once you are happy. It is the same engaging you would do by hand, sped up, so a growing group does not outpace you. It is not about reaching people who never asked to hear from you.",[21,27217,27219],{"id":27218},"the-honest-version-of-facebook-automation","The honest version of Facebook automation",[11,27221],{},[14,27223,27224],{},"Most of what gets called Facebook automation is spam. Fake likes, mass friend requests, bots posting into groups they have no business in. That gets accounts banned, and it should. Facebook also restricts automated interaction in its terms, so any tool you use here has to be used with care.",[14,27226,27227],{},"The version that holds up is narrow. You run your own group or page. You engage the people who already followed you. A bot helps you keep pace with comments, drafting replies you review, at a speed a person could manage. That is the line axiom is built to stay on, and it is the only version of this worth doing.",[21,27229,26295],{"id":26294},[11,27231],{},[14,27233,27234],{},"This is for the person running a Facebook group or page who cannot keep up with the comments. A community manager, a creator, a small team answering the same questions over and over. You want to reply to your own followers faster, not blast strangers. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,27236,26304],{"id":26303},[11,27238],{},[14,27240,27241],{},"Keep a person in the loop. Have the bot read new comments and draft replies, then look them over before they go out, at least until you trust the drafts. Start with one kind of comment, like a common question, and let the bot handle just that. Run it at a human pace, not hundreds of replies a minute.",[14,27243,27244,27245,44],{},"Engage your own people, review the drafts, go slow. That is what keeps the account safe and the replies real. I would lay out the first draft with ",[322,27246,26316],{"href":26315},[21,27248,27250,27251],{"id":27249},"reply-to-your-group-from-a-description","Reply to your group from a description ",[727,27252],{"id":513},[11,27254],{},[14,27256,27257,27258,26333,27261,26337,27263,26341],{},"Describe how you reply in plain words in the ",[322,27259,26332],{"href":26330,"rel":27260},[2245],[322,27262,26336],{"href":26315},[29,27264,26340],{},[26343,27266,27268],{":instructions":27267,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Go to the group page\",\"Scrape the latest comment\",\"Draft a reply with AI from the comment\",\"Click the comment to reply\",\"Enter the reply in the text field\",\"Press the key to post it\"]",[14,27269,27270],{},"To the right is an example. Describe how you reply and the AI lays out the steps. Review the drafts before you trust it to post.",[21,27272,27274,27275],{"id":27273},"reply-to-your-group-in-code","Reply to your group in code ",[727,27276],{"id":90},[11,27278],{},[14,27280,27281,26367,27283],{},[29,27282,26366],{},[322,27284,26371],{"href":26370},[26373,27286,27288],{":secondaryLinks":26347,"code":27287,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\nimport { draftReply } from \".\u002Fai\"; \u002F\u002F your own AI call\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  await page.goto(\"https:\u002F\u002Fwww.facebook.com\u002Fgroups\u002Fyour-group\");\n\n  \u002F\u002F Read the latest comment\n  const comment = await page.locator(\".comment\").first().innerText();\n\n  \u002F\u002F Draft a reply with your own AI, then review before it posts\n  const reply = await draftReply(comment);\n\n  \u002F\u002F Open the reply box, type, and post\n  await page.getByRole(\"button\", { name: \"Reply\" }).first().click();\n  await page.getByRole(\"textbox\", { name: \"Write a reply\" }).fill(reply);\n  await page.keyboard.press(\"Enter\");\n} finally {\n  await browser.close();\n}\n",[14,27289,26380],{},[26382,27291],{"description":27292,"eyebrow":26385,"image":26386,"imageAlt":27293,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe how you engage your group. It builds the bot for you, no-code or code, reading comments and drafting replies for you to review.","Claude drafting a reply to a Facebook group comment",[21,27295,26395],{"id":26394},[11,27297],{},[14,27299,27300],{},"Helping you keep up with your own community. A couple of lines to stay on the right side of.",[26402,27302],{":cards":27303},"[{\"title\":\"Works well\",\"items\":[\"Reading new comments in your group\",\"Drafting replies with AI\",\"Answering the same common questions\",\"Flagging comments that need you\",\"Pulling comments into a sheet to review\"]},{\"title\":\"Harder\",\"items\":[\"Telling apart questions, spam, and noise\",\"Keeping replies in your own voice\",\"Facebook's checks on automated activity\"]},{\"title\":\"Don't try\",\"items\":[\"Posting into groups you do not run\",\"Mass friend requests or fake likes\",\"Auto-replying to strangers at scale\"]}]",[21,27305,26408],{"id":26407},[11,27307],{},[14,27309,27310],{},"Facebook is strict about automation, so this is the page to read carefully. Here is what I would watch for.",[639,27312,27314],{"id":27313},"facebook-restricts-automation","Facebook restricts automation",[14,27316,27317],{},"Facebook's terms limit automated interaction. Engaging your own community carefully is one thing, blasting activity is another, and the second gets accounts restricted. Stay on your own group or page, and keep the volume human.",[639,27319,27321],{"id":27320},"keep-a-person-in-the-loop","Keep a person in the loop",[14,27323,27324],{},"Let the bot draft, not decide. Review replies before they post, at least until the drafts are reliably right. Auto-posting AI text to real people goes wrong fast without a check.",[639,27326,27328],{"id":27327},"go-at-a-human-pace","Go at a human pace",[14,27330,27331],{},"A person does not post fifty replies a minute. Add waits, cap how many a run sends, and spread it out, so the activity looks like what it is, a person keeping up.",[639,27333,27335],{"id":27334},"layouts-and-logins","Layouts and logins",[14,27337,27338,27339,27341],{},"Facebook changes its layout often and watches for unusual logins. Repick elements with the ",[322,27340,26444],{"href":11340}," when they shift, and use your own logged-in session rather than a fresh login every run.",{"title":494,"searchDepth":495,"depth":495,"links":27343},[27344,27345,27346,27347,27348,27349,27350,27351],{"id":27209,"depth":498,"text":27210},{"id":27218,"depth":498,"text":27219},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":27249,"depth":498,"text":27250},{"id":27273,"depth":498,"text":27274},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":27352},[27353,27354,27355,27356],{"id":27313,"depth":495,"text":27314},{"id":27320,"depth":495,"text":27321},{"id":27327,"depth":495,"text":27328},{"id":27334,"depth":495,"text":27335},"Automate your Facebook group without code, the non-spammy way. Read new comments, draft replies with AI, and engage your own followers, with a person in the loop. From axiom.",{},"\u002Fautomate\u002Fcomment-on-facebook",{"title":27200,"description":27357},"automate\u002Fcomment-on-facebook","fZwRSnVrdziAg9ortBh5ZGCJkKb3ati61ZVG3d_iEVY",{"id":27364,"title":27365,"author":26259,"body":27366,"date":523,"description":27521,"extension":506,"meta":27522,"navigation":522,"order":523,"path":27523,"seo":27524,"stem":27525,"__hash__":27526},"automate\u002Fautomate\u002Fcoursera-org.md","Automate Coursera admin without code | axiom",{"type":8,"value":27367,"toc":27506},[27368,27372,27376,27378,27381,27385,27387,27390,27393,27395,27397,27400,27402,27404,27407,27412,27418,27420,27430,27436,27442,27444,27450,27455,27459,27461,27463,27466,27469,27471,27473,27476,27480,27483,27487,27490,27494,27499,27503],[26263,27369],{"description":27370,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":27371},"Running a Coursera org is a pile of back-office clicking. Enrolling learners, pulling progress reports, uploading content, keeping attendee lists up to date. A bot can take the repetitive admin off your plate, so you spend your time on the program and not the console. There are three ways to start, with no code, with code, or with a Claude skill.","Automate Coursera admin",[21,27373,27375],{"id":27374},"what-i-mean-by-automating-coursera","What I mean by automating Coursera",[11,27377],{},[14,27379,27380],{},"Automating Coursera means a bot handles the admin work of running your organization's account. Enrolling a list of learners from a sheet, pulling this week's progress report, uploading a new resource, updating who is in which program. It is the routine back-office upkeep an admin does by hand every week, done for you. It is not about the courses themselves.",[21,27382,27384],{"id":27383},"the-back-office-not-the-courses","The back office, not the courses",[11,27386],{},[14,27388,27389],{},"There are two very different things people mean by automating Coursera. One is faking your way through a course, auto-clicking lessons and quizzes to earn a certificate you did not. That is cheating, it gets accounts banned, and it is not what this is for.",[14,27391,27392],{},"The other is running the organization. If you administer Coursera for a team, a campus, or a company, the work is enrolling people, chasing completion, and reporting on it, the same clicks over and over in the admin console. That is the part a bot helps with. axiom is for the back office, the attendee lists and the progress reports, not for pretending to learn.",[21,27394,26295],{"id":26294},[11,27396],{},[14,27398,27399],{},"This is for the person who administers Coursera for an organization. The learning lead enrolling new hires, the campus admin pulling completion reports, the ops person keeping the learner list in sync with the HR system. You manage the account, you just do not want to click through the console by hand every week. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,27401,26304],{"id":26303},[11,27403],{},[14,27405,27406],{},"Pick the task you repeat most. Usually it is enrolling a batch of people or pulling the weekly report. Put the learner list in a Google Sheet, point the bot at the admin console, and let it work the list row by row, or read the report and drop the numbers in a sheet. Run it on your own org account with your own logged-in session, and schedule it for the day the report is due.",[14,27408,27409,27410,44],{},"One admin task, your account, on a schedule. I would lay out the first draft with ",[322,27411,26316],{"href":26315},[21,27413,27415,27416],{"id":27414},"automate-coursera-admin-from-a-description","Automate Coursera admin from a description ",[727,27417],{"id":513},[11,27419],{},[14,27421,27422,27423,26333,27426,26337,27428,26341],{},"Describe the admin task in plain words in the ",[322,27424,26332],{"href":26330,"rel":27425},[2245],[322,27427,26336],{"href":26315},[29,27429,26340],{},[26343,27431,27433],{":instructions":27432,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open the Coursera admin console and sign in\",\"Read the new learners from a Google Sheet\",\"Add each one to the program\",\"Send the invite\",\"Move to the next row\"]",[14,27434,27435],{},"To the right is an example. Describe the admin task for your org, and the AI lays out the steps.",[21,27437,27439,27440],{"id":27438},"automate-coursera-admin-in-code","Automate Coursera admin in code ",[727,27441],{"id":90},[11,27443],{},[14,27445,27446,26367,27448],{},[29,27447,26366],{},[322,27449,26371],{"href":26370},[26373,27451,27453],{":secondaryLinks":26347,"code":27452,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Your org's learners. These would come from your Google Sheet.\n  const learners = [\n    { email: \"ada@example.com\",  program: \"Data Foundations\" },\n    { email: \"alan@example.com\", program: \"Data Foundations\" },\n  ];\n\n  \u002F\u002F Use your own admin session\n  await page.goto(\"https:\u002F\u002Fwww.coursera.org\u002Fadmin\u002Flearners\");\n\n  for (const learner of learners) {\n    await page.getByRole(\"button\", { name: \"Add learner\" }).click();\n    await page.getByLabel(\"Email\").fill(learner.email);\n    await page.getByLabel(\"Program\").selectOption(learner.program);\n    await page.getByRole(\"button\", { name: \"Send invite\" }).click();\n    await page.waitForSelector(\".invite-sent\");\n  }\n} finally {\n  await browser.close();\n}\n",[14,27454,26380],{},[26382,27456],{"description":27457,"eyebrow":26385,"image":26386,"imageAlt":27458,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the admin task for your org. It builds the bot for you, no-code or code, enrolling learners, pulling reports, or keeping your lists in sync.","Claude building a Coursera admin automation from a description",[21,27460,26395],{"id":26394},[11,27462],{},[14,27464,27465],{},"Most of the Coursera admin console. A couple of cases worth knowing first.",[26402,27467],{":cards":27468},"[{\"title\":\"Works well\",\"items\":[\"Enrolling learners from a sheet\",\"Pulling completion and progress reports\",\"Uploading resources and content\",\"Keeping attendee lists in sync\",\"Running reports on a schedule\"]},{\"title\":\"Harder\",\"items\":[\"Bulk actions the console does slowly\",\"2FA on the admin account\",\"Layout changes after a Coursera update\"]},{\"title\":\"Don't try\",\"items\":[\"Auto-completing courses or quizzes\",\"Faking certificates\",\"Anything against Coursera's terms\"]}]",[21,27470,26408],{"id":26407},[11,27472],{},[14,27474,27475],{},"The Coursera console is a big app behind a login, so a few things trip up an admin bot. Here is what I would watch for.",[639,27477,27479],{"id":27478},"admin-only-no-faking-progress","Admin only, no faking progress",[14,27481,27482],{},"This is for the admin side, enrolling and reporting. Do not point it at lessons and quizzes to fake completion. That is cheating, and a fast way to lose the account.",[639,27484,27486],{"id":27485},"use-your-own-admin-session","Use your own admin session",[14,27488,27489],{},"Sign in as the admin you are, and store the cookies so the bot keeps the session rather than logging in fresh each run.",[639,27491,27493],{"id":27492},"the-console-changes","The console changes",[14,27495,27496,27497,26445],{},"Coursera updates the admin pages, and buttons move. Target what you need with the ",[322,27498,26444],{"href":11340},[639,27500,27502],{"id":27501},"match-the-sheet-to-the-console","Match the sheet to the console",[14,27504,27505],{},"Enrolling from a sheet only works if the columns line up with the fields, the email, the program, the role. Get the mapping right and run one row first, before you loop a hundred.",{"title":494,"searchDepth":495,"depth":495,"links":27507},[27508,27509,27510,27511,27512,27513,27514,27515],{"id":27374,"depth":498,"text":27375},{"id":27383,"depth":498,"text":27384},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":27414,"depth":498,"text":27415},{"id":27438,"depth":498,"text":27439},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":27516},[27517,27518,27519,27520],{"id":27478,"depth":495,"text":27479},{"id":27485,"depth":495,"text":27486},{"id":27492,"depth":495,"text":27493},{"id":27501,"depth":495,"text":27502},"Automate the Coursera admin back office without code. Enroll learners, pull progress reports, upload content, and keep attendee lists in sync. Your org account. From axiom.",{},"\u002Fautomate\u002Fcoursera-org",{"title":27365,"description":27521},"automate\u002Fcoursera-org","cZN9K54d04VIdSEhUxV5biqjdpsbfIuuEONPzG1rHig",{"id":27528,"title":27529,"author":26259,"body":27530,"date":523,"description":27683,"extension":506,"meta":27684,"navigation":522,"order":523,"path":27685,"seo":27686,"stem":27687,"__hash__":27688},"automate\u002Fautomate\u002Fdepop.md","Automate your Depop shop without code | axiom",{"type":8,"value":27531,"toc":27668},[27532,27536,27540,27542,27545,27549,27551,27554,27557,27559,27561,27564,27566,27568,27571,27576,27582,27584,27593,27599,27605,27607,27613,27618,27622,27624,27626,27629,27632,27634,27636,27639,27643,27646,27650,27653,27655,27658,27662],[26263,27533],{"description":27534,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":27535},"On Depop, staying visible is a part-time job. Refreshing items so they climb back up, relisting, updating prices, keeping stock straight. A bot can take that grind off your hands for the shop you actually run. This is for your own shop, not for follow-spam. There are three ways to start, with no code, with code, or with a Claude skill.","Automate your Depop shop",[21,27537,27539],{"id":27538},"what-i-mean-by-automating-your-depop-shop","What I mean by automating your Depop shop",[11,27541],{},[14,27543,27544],{},"Automating your Depop shop means a bot handles the repetitive selling work. Refreshing items so they show up higher, relisting things that went stale, updating prices from a sheet, and pulling your sales into a spreadsheet. It is the upkeep of a shop you run, done for you, so you can spend your time sourcing and shipping rather than tapping the same buttons all day.",[21,27546,27548],{"id":27547},"staying-visible-is-a-part-time-job","Staying visible is a part-time job",[11,27550],{},[14,27552,27553],{},"Depop rewards activity. Items that get refreshed climb back to the top of search, fresh listings get seen, and a shop that goes quiet sinks. So sellers end up refreshing and relisting constantly, by hand, just to stay where buyers can find them. That upkeep is real work, and it is exactly the kind a bot is good at.",[14,27555,27556],{},"There are two honest limits to know. Depop is mobile-first, so a browser bot reaches what the web shop exposes, which is less than the app. And the activity that helps is your own shop's upkeep, not mass following and liking to chase attention, which reads as spam and gets accounts limited. Keep it to your own listings, at a human pace, and the bot earns its keep.",[21,27558,26295],{"id":26294},[11,27560],{},[14,27562,27563],{},"This is for the Depop seller running a shop without a team. You source, you list, you ship, and the refreshing and price tweaks eat the time in between. One shop, your stock. If you are looking to mass-follow or spam for reach, this is not the tool. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,27565,26304],{"id":26303},[11,27567],{},[14,27569,27570],{},"Start with the chore you repeat most, usually refreshing or relisting. Let the bot work through your listings at a steady, human pace, refreshing the ones that have gone stale. For price changes, put the new prices in a sheet and let the bot apply them item by item. Check the web shop can do the task first, since some of Depop lives only in the app. Run it on your own shop with your own logged-in session.",[14,27572,27573,27574,44],{},"Your own listings, human pace, web only. I would lay out the first draft with ",[322,27575,26316],{"href":26315},[21,27577,27579,27580],{"id":27578},"automate-your-depop-shop-from-a-description","Automate your Depop shop from a description ",[727,27581],{"id":513},[11,27583],{},[14,27585,26327,27586,26333,27589,26337,27591,26341],{},[322,27587,26332],{"href":26330,"rel":27588},[2245],[322,27590,26336],{"href":26315},[29,27592,26340],{},[26343,27594,27596],{":instructions":27595,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open my Depop shop on the web and sign in\",\"Go through each listing in turn\",\"Refresh the listing\",\"Wait a moment before the next one\",\"Stop after the last item\"]",[14,27597,27598],{},"To the right is an example. Describe the task for your shop, and the AI lays out the steps.",[21,27600,27602,27603],{"id":27601},"automate-your-depop-shop-in-code","Automate your Depop shop in code ",[727,27604],{"id":90},[11,27606],{},[14,27608,27609,26367,27611],{},[29,27610,26366],{},[322,27612,26371],{"href":26370},[26373,27614,27616],{":secondaryLinks":26347,"code":27615,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Your own shop, using your logged-in session\n  await page.goto(\"https:\u002F\u002Fwww.depop.com\u002Fyourshop\u002F\");\n  await page.waitForSelector(\".listing\");\n\n  \u002F\u002F Collect your listing links\n  const items = await page.$$eval(\".listing a\", els =>\n    els.map(a => a.href)\n  );\n\n  \u002F\u002F Refresh each one at a steady, human pace\n  for (const url of items) {\n    await page.goto(`${url}\u002Fedit`);\n    await page.getByRole(\"button\", { name: \"Refresh\" }).click();\n    await page.waitForTimeout(4000); \u002F\u002F do not race\n  }\n} finally {\n  await browser.close();\n}\n",[14,27617,26380],{},[26382,27619],{"description":27620,"eyebrow":26385,"image":26386,"imageAlt":27621,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the Depop task for your shop. It builds the bot for you, no-code or code, refreshing listings or updating prices from a sheet.","Claude building a Depop shop automation from a description",[21,27623,26395],{"id":26394},[11,27625],{},[14,27627,27628],{},"The shop upkeep, for the shop you run. A couple of lines to stay on the right side of.",[26402,27630],{":cards":27631},"[{\"title\":\"Works well\",\"items\":[\"Refreshing listings to stay visible\",\"Relisting stale items\",\"Updating prices from a sheet\",\"Pulling your sales into a sheet\",\"Running it at a steady pace\"]},{\"title\":\"Harder\",\"items\":[\"Anything the app does but the web does not\",\"Uploading photos for new listings\",\"Depop's checks on automated activity\"]},{\"title\":\"Don't try\",\"items\":[\"Mass following or liking for reach\",\"Spamming buyers with messages\",\"Anything against Depop's terms\"]}]",[21,27633,26408],{"id":26407},[11,27635],{},[14,27637,27638],{},"Depop is mobile-first and watches for spammy activity, so a few things matter here. Here is what I would watch for.",[639,27640,27642],{"id":27641},"the-web-does-less-than-the-app","The web does less than the app",[14,27644,27645],{},"Depop is built for the phone, so a browser bot reaches what the web shop exposes, which is not everything. Check the web can do the task before you build it.",[639,27647,27649],{"id":27648},"refresh-at-a-human-pace","Refresh at a human pace",[14,27651,27652],{},"Refreshing every listing in a burst looks like a bot. Space it out with waits and a steady rhythm, so the activity reads like a seller keeping their shop tidy.",[639,27654,26431],{"id":26430},[14,27656,27657],{},"Sign in as yourself on the shop you own, and store the cookies so the bot keeps the session rather than logging in fresh each run.",[639,27659,27661],{"id":27660},"keep-it-to-your-own-shop","Keep it to your own shop",[14,27663,27664,27665,27667],{},"The upkeep that helps is on your own listings. Mass following and liking to chase reach is the spammy side, and it gets accounts limited. Pick what you act on with the ",[322,27666,26444],{"href":11340},", and keep it to your shop.",{"title":494,"searchDepth":495,"depth":495,"links":27669},[27670,27671,27672,27673,27674,27675,27676,27677],{"id":27538,"depth":498,"text":27539},{"id":27547,"depth":498,"text":27548},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":27578,"depth":498,"text":27579},{"id":27601,"depth":498,"text":27602},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":27678},[27679,27680,27681,27682],{"id":27641,"depth":495,"text":27642},{"id":27648,"depth":495,"text":27649},{"id":26430,"depth":495,"text":26431},{"id":27660,"depth":495,"text":27661},"Automate your Depop shop without code. Refresh and relist items, update prices from a sheet, and pull your sales into one, for the shop you run. From axiom.",{},"\u002Fautomate\u002Fdepop",{"title":27529,"description":27683},"automate\u002Fdepop","_GZlMPhnZdXTxK0RkNB94Rz3X6yA15Ahl-WrMbKz3DU",{"id":27690,"title":27691,"author":26259,"body":27692,"date":523,"description":27862,"extension":506,"meta":27863,"navigation":522,"order":523,"path":27864,"seo":27865,"stem":27866,"__hash__":27867},"automate\u002Fautomate\u002Fdownload-files-to-your-computer.md","Download files from a website without code | axiom",{"type":8,"value":27693,"toc":27847},[27694,27698,27702,27704,27707,27711,27713,27716,27724,27727,27730,27732,27734,27737,27739,27741,27744,27753,27759,27761,27771,27777,27783,27785,27791,27796,27800,27804,27806,27809,27812,27814,27816,27819,27823,27826,27830,27833,27837,27840,27844],[26263,27695],{"description":27696,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":27697},"Reports, invoices, exports, images, the files you click to download one at a time. A bot can grab them for you, from a button on the page or straight from a URL, and loop a whole list of downloads from a sheet. The one thing to decide up front is where they land, your own machine or your Google Drive. There are three ways to start, with no code, with code, or with a Claude skill.","Download files from a website",[21,27699,27701],{"id":27700},"what-i-mean-by-downloading-files-from-a-website","What I mean by downloading files from a website",[11,27703],{},[14,27705,27706],{},"Downloading files from a website means a bot does the clicking and saving you would do by hand. It opens the page, finds the file, whether that is a download button or a direct link, and saves it where you tell it. Give it one page or a list of URLs in a sheet, and it works through every one, naming each download as it goes.",[21,27708,27710],{"id":27709},"where-your-downloads-land","Where your downloads land",[11,27712],{},[14,27714,27715],{},"The first thing to settle is not how to download, it is where the file goes. That choice decides how you run it.",[14,27717,27718,27719,27723],{},"If you want files on your own machine, run it in the desktop app. The ",[322,27720,27722],{"href":27721},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fdownload-local","local download steps",", Download file, Download files, and Download file from URL, all save straight to a folder on your computer, and they only work in the desktop app.",[14,27725,27726],{},"If you want files in the cloud, save to Google Drive. The Download a file to Google Drive step puts each file in a Drive folder, which is the way to go when the bot runs in the cloud with no machine of yours involved. That same Drive step can also write to a local folder when you run it on the desktop, so one step covers both.",[14,27728,27729],{},"Decide the destination first, and the rest of the build follows.",[21,27731,26295],{"id":26294},[11,27733],{},[14,27735,27736],{},"This is for anyone who downloads the same files on a schedule. Pulling a daily report off a dashboard, saving invoices from a portal, collecting exports one click at a time. And for anyone sitting on a spreadsheet of links who needs every file behind them. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,27738,26304],{"id":26303},[11,27740],{},[14,27742,27743],{},"Start with where the downloads go, local or Drive, because that picks your runner. Then look at the source. If you have direct file URLs, use the from-URL step, it is the simplest. If the file sits behind a button or a link on a page, go to the page first, then point the download step at that element. For a list, read the URLs from a Google Sheet and loop through them, saving each with its own name.",[14,27745,27746,27747,27750,27751,44],{},"Destination, then source, then loop. That order keeps it simple. There is a full walkthrough in ",[322,27748,27749],{"href":10670},"how to automate file downloads",", and I would lay out the first draft with ",[322,27752,26316],{"href":26315},[21,27754,27756,27757],{"id":27755},"download-files-from-a-description","Download files from a description ",[727,27758],{"id":513},[11,27760],{},[14,27762,27763,27764,26333,27767,26337,27769,26341],{},"Describe what to download and where in the ",[322,27765,26332],{"href":26330,"rel":27766},[2245],[322,27768,26336],{"href":26315},[29,27770,26340],{},[26343,27772,27774],{":instructions":27773,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Read a list of page URLs from a Google Sheet\",\"Open each page in turn\",\"Download the file on the page\",\"Name it from the sheet\",\"Save it to my folder\"]",[14,27775,27776],{},"To the right is an example. Describe what to download and where it should land, and the AI lays out the steps.",[21,27778,27780,27781],{"id":27779},"download-files-in-code","Download files in code ",[727,27782],{"id":90},[11,27784],{},[14,27786,27787,26367,27789],{},[29,27788,26366],{},[322,27790,26371],{"href":26370},[26373,27792,27794],{":secondaryLinks":26347,"code":27793,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\nimport path from \"path\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Pages that each hold a file. These would come from your Google Sheet.\n  const pages = [\n    \"https:\u002F\u002Fexample.com\u002Freports\u002Fjan\",\n    \"https:\u002F\u002Fexample.com\u002Freports\u002Ffeb\",\n  ];\n\n  for (const url of pages) {\n    await page.goto(url);\n\n    \u002F\u002F Wait for the download the click starts, then save it where you want\n    const [download] = await Promise.all([\n      page.waitForEvent(\"download\"),\n      page.getByRole(\"button\", { name: \"Download\" }).click(),\n    ]);\n\n    const name = download.suggestedFilename();\n    await download.saveAs(path.join(\"\u002Fdownloads\", name));\n  }\n} finally {\n  await browser.close();\n}\n",[14,27795,26380],{},[26382,27797],{"description":27798,"eyebrow":26385,"image":26386,"imageAlt":27799,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe what to download and where. It builds the bot for you, no-code or code, from a button or a URL, saving to your machine or to Google Drive.","Claude building a file download automation from a description",[21,27801,27803],{"id":27802},"what-can-you-download","What can you download?",[11,27805],{},[14,27807,27808],{},"Most files behind a click. A couple of cases worth knowing first.",[26402,27810],{":cards":27811},"[{\"title\":\"Works well\",\"items\":[\"Reports and exports from a dashboard\",\"Invoices and statements from a portal\",\"Files behind a download button\",\"Direct file URLs from a list\",\"Images and PDFs in bulk\"]},{\"title\":\"Harder\",\"items\":[\"Files behind a login or 2FA\",\"Files that open in the browser instead of saving\",\"Very large files on a slow connection\"]},{\"title\":\"Don't try\",\"items\":[\"Downloading material you have no right to\",\"Anything against a site's terms\",\"Pulling files faster than a site allows\"]}]",[21,27813,26408],{"id":26407},[11,27815],{},[14,27817,27818],{},"Downloading is simple until a file opens in a tab instead of saving. Here is what I would watch for.",[639,27820,27822],{"id":27821},"local-downloads-need-the-desktop-app","Local downloads need the desktop app",[14,27824,27825],{},"The local download steps only save to your computer when the bot runs in the desktop app. In the cloud, save to Google Drive instead, or use the Drive step that can do both.",[639,27827,27829],{"id":27828},"files-that-open-instead-of-downloading","Files that open instead of downloading",[14,27831,27832],{},"Some files open in the browser rather than downloading. Turn on Force download so the bot saves them instead. If it still opens, the file is being served inline and needs a different approach.",[639,27834,27836],{"id":27835},"folder-permissions","Folder permissions",[14,27838,27839],{},"If a file will not save, check the path is right and that the folder has write permission for your user. A wrong path is the usual culprit.",[639,27841,27843],{"id":27842},"reused-file-names","Reused file names",[14,27845,27846],{},"When two files would share a name, axiom adds a number so nothing is overwritten. Turn on Overwrite if you would rather replace the old file instead.",{"title":494,"searchDepth":495,"depth":495,"links":27848},[27849,27850,27851,27852,27853,27854,27855,27856],{"id":27700,"depth":498,"text":27701},{"id":27709,"depth":498,"text":27710},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":27755,"depth":498,"text":27756},{"id":27779,"depth":498,"text":27780},{"id":27802,"depth":498,"text":27803},{"id":26407,"depth":498,"text":26408,"children":27857},[27858,27859,27860,27861],{"id":27821,"depth":495,"text":27822},{"id":27828,"depth":495,"text":27829},{"id":27835,"depth":495,"text":27836},{"id":27842,"depth":495,"text":27843},"Download files from a website without code, and automate your downloads end to end. Grab them from a button or a direct URL, loop a list from a sheet, and save to your own machine or to Google Drive. From axiom.",{},"\u002Fautomate\u002Fdownload-files-to-your-computer",{"title":27691,"description":27862},"automate\u002Fdownload-files-to-your-computer","fHOFBqJAKqMx3J3nftbbxInrpdPm1fuR-CdeUVOE3oY",{"id":27869,"title":27870,"author":26259,"body":27871,"date":523,"description":28019,"extension":506,"meta":28020,"navigation":522,"order":523,"path":28021,"seo":28022,"stem":28023,"__hash__":28024},"automate\u002Fautomate\u002Febay-store.md","Automate your eBay store without code | axiom",{"type":8,"value":27872,"toc":28004},[27873,27877,27881,27883,27886,27890,27892,27895,27898,27900,27902,27905,27907,27909,27912,27917,27923,27925,27934,27940,27946,27948,27954,27959,27963,27965,27967,27970,27973,27975,27977,27980,27982,27985,27989,27992,27994,27997,27999],[26263,27874],{"description":27875,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":27876},"Selling on eBay is a thousand small edits. Revising prices, relisting ended items, updating quantities, sending offers. A bot can batch that grind from a sheet for the store you run, and pull your orders into one place. There are three ways to start, with no code, with code, or with a Claude skill.","Automate your eBay store",[21,27878,27880],{"id":27879},"what-i-mean-by-automating-your-ebay-store","What I mean by automating your eBay store",[11,27882],{},[14,27884,27885],{},"Automating your eBay store means a bot handles the steady stream of small selling tasks. Revising prices and quantities across listings from a sheet, relisting items that ended, pulling your orders and sales into a spreadsheet, and gathering competitor prices to set against. It is the back-office upkeep of a store you run, batched, so the constant little edits stop eating your day.",[21,27887,27889],{"id":27888},"selling-on-ebay-is-a-thousand-small-edits","Selling on eBay is a thousand small edits",[11,27891],{},[14,27893,27894],{},"eBay is not one big task, it is a thousand small ones. Nudge this price, bump that quantity, relist the three that ended overnight, send an offer to the watchers, fix a title. None of them takes long on its own, which is exactly why they pile up, and why a busy store spends more time on edits than on selling.",[14,27896,27897],{},"eBay has APIs for sellers who can build against them, and for volume that is the route. For everyone else, the edits stay manual. A bot is good at the small-and-repetitive, working a sheet of changes across your listings, one after another. Put the edits in a sheet, and the stream of little tasks runs itself.",[21,27899,26295],{"id":26294},[11,27901],{},[14,27903,27904],{},"This is for the solo or small eBay seller without a team. You list, you revise, you relist, you ship, and the little edits in between never stop. One store, your stock. You manage the account, you just want the busywork batched. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,27906,26304],{"id":26303},[11,27908],{},[14,27910,27911],{},"Put your edits in a sheet. One row per listing, columns for the new price and quantity. Point the bot at Seller Hub, and let it open each listing and revise it to match the row. For ended items, have the bot find them and relist. Start with one listing to check the revision saves, then run the list. Run it on your own store with your own logged-in session, and double-check any price change.",[14,27913,27914,27915,44],{},"Sheet to store, one listing first, then the rest. I would lay out the first draft with ",[322,27916,26316],{"href":26315},[21,27918,27920,27921],{"id":27919},"automate-your-ebay-store-from-a-description","Automate your eBay store from a description ",[727,27922],{"id":513},[11,27924],{},[14,27926,26327,27927,26333,27930,26337,27932,26341],{},[322,27928,26332],{"href":26330,"rel":27929},[2245],[322,27931,26336],{"href":26315},[29,27933,26340],{},[26343,27935,27937],{":instructions":27936,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open Seller Hub and sign in\",\"Read the next listing and its new price from a Google Sheet\",\"Open that listing to revise it\",\"Update the price and the quantity\",\"Save, then move to the next row\"]",[14,27938,27939],{},"To the right is an example. Describe the edit for your store, and the AI lays out the steps.",[21,27941,27943,27944],{"id":27942},"automate-your-ebay-store-in-code","Automate your eBay store in code ",[727,27945],{"id":90},[11,27947],{},[14,27949,27950,26367,27952],{},[29,27951,26366],{},[322,27953,26371],{"href":26370},[26373,27955,27957],{":secondaryLinks":26347,"code":27956,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Your listings and their new values, from your sheet\n  const listings = [\n    { url: \"https:\u002F\u002Fwww.ebay.com\u002Fitm\u002F111\", price: \"29.99\", qty: \"5\" },\n    { url: \"https:\u002F\u002Fwww.ebay.com\u002Fitm\u002F222\", price: \"14.50\", qty: \"2\" },\n  ];\n\n  for (const item of listings) {\n    \u002F\u002F Open the revise page on your own logged-in session\n    await page.goto(`${item.url}?revise=true`);\n    await page.getByLabel(\"Price\").fill(item.price);\n    await page.getByLabel(\"Quantity\").fill(item.qty);\n    await page.getByRole(\"button\", { name: \"Revise listing\" }).click();\n    await page.waitForSelector(\".revision-saved\");\n  }\n} finally {\n  await browser.close();\n}\n",[14,27958,26380],{},[26382,27960],{"description":27961,"eyebrow":26385,"image":26386,"imageAlt":27962,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the eBay task you need. It builds the bot for you, no-code or code, revising listings from a sheet or pulling your orders out.","Claude building an eBay store automation from a description",[21,27964,26395],{"id":26394},[11,27966],{},[14,27968,27969],{},"The stream of small edits, for the store you run. A couple of cases worth knowing first.",[26402,27971],{":cards":27972},"[{\"title\":\"Works well\",\"items\":[\"Revising prices and quantities from a sheet\",\"Relisting ended items\",\"Pulling orders into a sheet\",\"Gathering competitor prices\",\"Running it on a schedule\"]},{\"title\":\"Harder\",\"items\":[\"Variation listings with many options\",\"2FA on the account\",\"Frequent layout changes\"]},{\"title\":\"Don't try\",\"items\":[\"Scraping buyers' personal details\",\"Shill bidding or price manipulation\",\"Anything against eBay's terms\"]}]",[21,27974,26408],{"id":26407},[11,27976],{},[14,27978,27979],{},"Seller Hub is a big app behind a login, so a few things trip up a store bot. Here is what I would watch for.",[639,27981,26417],{"id":26416},[14,27983,27984],{},"A bad price across a catalogue is an expensive mistake. Run one listing first, confirm the number, and cap how many a run revises.",[639,27986,27988],{"id":27987},"relisting-can-cost-fees","Relisting can cost fees",[14,27990,27991],{},"Past your free listings, an insertion fee can apply each time. A bot that relists on a loop can run up charges, so check the fee and cap the relists before you set it going.",[639,27993,26431],{"id":26430},[14,27995,27996],{},"Sign in as yourself on the store you own, and store the cookies so the bot keeps the session rather than logging in fresh each run.",[639,27998,26438],{"id":26437},[14,28000,28001,28002,26445],{},"eBay updates Seller Hub often, and fields move. Repick anything that stops being found with the ",[322,28003,26444],{"href":11340},{"title":494,"searchDepth":495,"depth":495,"links":28005},[28006,28007,28008,28009,28010,28011,28012,28013],{"id":27879,"depth":498,"text":27880},{"id":27888,"depth":498,"text":27889},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":27919,"depth":498,"text":27920},{"id":27942,"depth":498,"text":27943},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":28014},[28015,28016,28017,28018],{"id":26416,"depth":495,"text":26417},{"id":27987,"depth":495,"text":27988},{"id":26430,"depth":495,"text":26431},{"id":26437,"depth":495,"text":26438},"Automate your eBay store without code. Revise prices and quantities from a sheet, relist ended items, and pull your orders into one, for the store you run. From axiom.",{},"\u002Fautomate\u002Febay-store",{"title":27870,"description":28019},"automate\u002Febay-store","6BMPKVQruriW1CUkBwrNwlNzzeeSAGGWG_pRTSz-S-k",{"id":28026,"title":28027,"author":26259,"body":28028,"date":523,"description":28181,"extension":506,"meta":28182,"navigation":522,"order":523,"path":28183,"seo":28184,"stem":28185,"__hash__":28186},"automate\u002Fautomate\u002Fetsy-store.md","Automate your Etsy store without code | axiom",{"type":8,"value":28029,"toc":28166},[28030,28034,28038,28040,28043,28047,28049,28052,28055,28057,28059,28062,28064,28066,28069,28074,28080,28082,28092,28098,28104,28106,28112,28117,28121,28123,28125,28128,28131,28133,28135,28138,28142,28145,28149,28155,28157,28159,28163],[26263,28031],{"description":28032,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":28033},"You make things, but every product means a listing, photos, a keyword-stuffed title, tags, prices, and then renewals and stock updates forever. A bot can take that listing grind off your hands, updating your Etsy shop from a sheet and pulling your orders and sales into one. There are three ways to start, with no code, with code, or with a Claude skill.","Automate your Etsy store",[21,28035,28037],{"id":28036},"what-i-mean-by-automating-your-etsy-store","What I mean by automating your Etsy store",[11,28039],{},[14,28041,28042],{},"Automating your Etsy store means a bot handles the repetitive seller work in Shop Manager. Updating prices and stock across listings from a sheet, refreshing titles and tags, renewing listings, pulling your orders and sales into a spreadsheet, and gathering market data to price against. It is the back-office upkeep of a shop you run, done for you, so the admin stops eating the hours you would rather spend making.",[21,28044,28046],{"id":28045},"the-listing-grind-is-the-tax-on-making","The listing grind is the tax on making",[11,28048],{},[14,28050,28051],{},"On Etsy you are a maker first, but the platform is built around listings. Every product needs one, with photos, a title packed with keywords, thirteen tags, variations, and a price, and then it needs renewing and restocking and editing as things change. Multiply that by a catalogue and the listing grind becomes the tax you pay to sell what you made.",[14,28053,28054],{},"Etsy's Shop Manager has a few bulk tools, and there is an API if you get approved, but most of the day-to-day is still one listing at a time. That is the part a bot is good at. Feed it your listings from a sheet, let it update the fields across the shop, and the grind that ate your evenings runs on its own. You get back to making.",[21,28056,26295],{"id":26294},[11,28058],{},[14,28060,28061],{},"This is for the solo maker or small Etsy shop without a team. You would rather spend your time on the product than on Shop Manager, but the listings, the renewals, and the stock updates do not do themselves. You are a maker, not a developer, which is the point of doing this without code. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,28063,26304],{"id":26303},[11,28065],{},[14,28067,28068],{},"Put your shop in a sheet. One row per listing, columns for the title, price, stock, and tags. Point the bot at Shop Manager, and let it open each listing and update the fields to match the row. Start with the change you make most, usually a price or stock update, and get one listing right before you run the whole catalogue. Run it on your own shop with your own logged-in session.",[14,28070,28071,28072,44],{},"Sheet to shop, one listing first, then the catalogue. I would lay out the first draft with ",[322,28073,26316],{"href":26315},[21,28075,28077,28078],{"id":28076},"automate-your-etsy-store-from-a-description","Automate your Etsy store from a description ",[727,28079],{"id":513},[11,28081],{},[14,28083,28084,28085,26333,28088,26337,28090,26341],{},"Describe the update in plain words in the ",[322,28086,26332],{"href":26330,"rel":28087},[2245],[322,28089,26336],{"href":26315},[29,28091,26340],{},[26343,28093,28095],{":instructions":28094,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open Shop Manager and sign in\",\"Read the next listing and its new price from a Google Sheet\",\"Open that listing\",\"Update the price and the stock\",\"Save, then move to the next row\"]",[14,28096,28097],{},"To the right is an example. Describe the update for your shop, and the AI lays out the steps.",[21,28099,28101,28102],{"id":28100},"automate-your-etsy-store-in-code","Automate your Etsy store in code ",[727,28103],{"id":90},[11,28105],{},[14,28107,28108,26367,28110],{},[29,28109,26366],{},[322,28111,26371],{"href":26370},[26373,28113,28115],{":secondaryLinks":26347,"code":28114,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Your listings and their new values, from your sheet\n  const listings = [\n    { url: \"https:\u002F\u002Fwww.etsy.com\u002Fyour-shop\u002Flisting\u002F111\", price: \"24.00\", stock: \"8\" },\n    { url: \"https:\u002F\u002Fwww.etsy.com\u002Fyour-shop\u002Flisting\u002F222\", price: \"18.50\", stock: \"3\" },\n  ];\n\n  for (const item of listings) {\n    \u002F\u002F Open the listing's edit page on your own logged-in session\n    await page.goto(`${item.url}\u002Fedit`);\n    await page.getByLabel(\"Price\").fill(item.price);\n    await page.getByLabel(\"Quantity\").fill(item.stock);\n    await page.getByRole(\"button\", { name: \"Save\" }).click();\n    await page.waitForSelector(\".saved\");\n  }\n} finally {\n  await browser.close();\n}\n",[14,28116,26380],{},[26382,28118],{"description":28119,"eyebrow":26385,"image":26386,"imageAlt":28120,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the shop update you need. It builds the bot for you, no-code or code, updating listings from a sheet or pulling your orders out.","Claude building an Etsy store automation from a description",[21,28122,26395],{"id":26394},[11,28124],{},[14,28126,28127],{},"The Shop Manager grind, for the shop you run. A couple of cases worth knowing first.",[26402,28129],{":cards":28130},"[{\"title\":\"Works well\",\"items\":[\"Updating prices and stock from a sheet\",\"Refreshing titles and tags across listings\",\"Renewing listings\",\"Pulling orders and sales into a sheet\",\"Gathering market data to price against\"]},{\"title\":\"Harder\",\"items\":[\"Uploading photos for new listings\",\"Variations with many options\",\"2FA on the account\"]},{\"title\":\"Don't try\",\"items\":[\"Scraping buyers' personal details\",\"Copying another shop's listings or photos\",\"Anything against Etsy's terms\"]}]",[21,28132,26408],{"id":26407},[11,28134],{},[14,28136,28137],{},"Shop Manager is a big app behind a login, so a few things trip up a shop bot. Here is what I would watch for.",[639,28139,28141],{"id":28140},"listing-fees-still-apply","Listing fees still apply",[14,28143,28144],{},"Renewing and creating listings can cost a fee each time. A bot that renews on a loop can run up charges fast, so cap what it does and check the fee before you automate a renewal.",[639,28146,28148],{"id":28147},"match-the-sheet-to-the-fields","Match the sheet to the fields",[14,28150,28151,28152,28154],{},"Updating from a sheet works when the columns line up with the listing fields, the price, the stock, the title. Pick each field with the ",[322,28153,26444],{"href":11340},", and run one listing before the whole shop.",[639,28156,26431],{"id":26430},[14,28158,27657],{},[639,28160,28162],{"id":28161},"save-and-confirm","Save and confirm",[14,28164,28165],{},"Etsy saves a listing when you tell it to, and a bot that moves on too fast can skip the save. Wait for the confirmation before the next listing, so an update is not lost.",{"title":494,"searchDepth":495,"depth":495,"links":28167},[28168,28169,28170,28171,28172,28173,28174,28175],{"id":28036,"depth":498,"text":28037},{"id":28045,"depth":498,"text":28046},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":28076,"depth":498,"text":28077},{"id":28100,"depth":498,"text":28101},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":28176},[28177,28178,28179,28180],{"id":28140,"depth":495,"text":28141},{"id":28147,"depth":495,"text":28148},{"id":26430,"depth":495,"text":26431},{"id":28161,"depth":495,"text":28162},"Automate your Etsy store without code. Update listings, prices, and stock from a sheet, renew listings, and pull your orders and sales into one. From axiom.",{},"\u002Fautomate\u002Fetsy-store",{"title":28027,"description":28181},"automate\u002Fetsy-store","kxJA_D9CB6L13bUlhPxa-9CtjGB7ndKXl8fQOt-0csI",{"id":28188,"title":28189,"author":26259,"body":28190,"date":523,"description":28346,"extension":506,"meta":28347,"navigation":522,"order":523,"path":28348,"seo":28349,"stem":28350,"__hash__":28351},"automate\u002Fautomate\u002Ffacebook-ad-reporting.md","Automate Facebook ad reporting without code | axiom",{"type":8,"value":28191,"toc":28331},[28192,28196,28200,28202,28205,28209,28211,28214,28217,28219,28221,28224,28226,28228,28231,28236,28242,28244,28254,28260,28266,28268,28274,28279,28283,28287,28289,28292,28295,28297,28299,28302,28304,28307,28311,28317,28321,28324,28328],[26263,28193],{"description":28194,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":28195},"Pulling the same numbers out of Ads Manager every week is a chore. A bot can do your Facebook ad reporting for you, downloading the export or reading the figures straight off the table, then dropping them in a sheet on a schedule. Your own ad account, your own data. There are three ways to start, with no code, with code, or with a Claude skill.","Automate Facebook ad reporting",[21,28197,28199],{"id":28198},"what-i-mean-by-automating-facebook-ad-reporting","What I mean by automating Facebook ad reporting",[11,28201],{},[14,28203,28204],{},"Automating Facebook ad reporting means a bot gets your ad numbers out of Ads Manager so you do not have to. It opens your reporting view, either downloads the report Facebook exports or reads the figures off the table, and writes them where you want, a sheet, a folder, a dashboard feed. Run it every morning and the latest numbers are waiting, with no clicking through Ads Manager by hand.",[21,28206,28208],{"id":28207},"the-api-exists-but-it-is-heavy","The API exists, but it is heavy",[11,28210],{},[14,28212,28213],{},"Before you automate anything, know the official routes. Ads Manager can export a report, and Meta has a Marketing API for ad data. If you have a developer and the time, the API is the robust way to do this.",[14,28215,28216],{},"But the API is heavy. App review, access tokens, rate limits, and code to maintain, all before you see a single number. For a marketer or a small team that just needs last week's spend and results in a sheet, that is a lot. The browser route pulls exactly what you already see in Ads Manager, on a schedule, with no app review and no token to manage. It is the quick, no-developer way to the same data.",[21,28218,26295],{"id":26294},[11,28220],{},[14,28222,28223],{},"This is for the marketer or agency pulling the same Facebook ad numbers every week. Building the Monday report, updating a client dashboard, tracking spend against budget. You manage the ad account, you just do not want to export and copy by hand every time. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,28225,26304],{"id":26303},[11,28227],{},[14,28229,28230],{},"Decide how you want the data, the file or the figures. If you need the full report with every breakdown, download the export Ads Manager produces and save it to a sheet or folder. If you only need a few headline numbers, read them straight off the reporting table, which skips the file entirely. Either way, run it on your own ad account with your own logged-in session, and schedule it for the morning the report is due.",[14,28232,28233,28234,44],{},"File or figures, your account, on a schedule. I would lay out the first draft with ",[322,28235,26316],{"href":26315},[21,28237,28239,28240],{"id":28238},"pull-your-ad-report-from-a-description","Pull your ad report from a description ",[727,28241],{"id":513},[11,28243],{},[14,28245,28246,28247,26333,28250,26337,28252,26341],{},"Describe the report in plain words in the ",[322,28248,26332],{"href":26330,"rel":28249},[2245],[322,28251,26336],{"href":26315},[29,28253,26340],{},[26343,28255,28257],{":instructions":28256,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open Ads Manager and go to the reporting view\",\"Set the date range to last week\",\"Read the spend, results, and cost per result from the table\",\"Write the numbers into a Google Sheet\",\"Run it every Monday morning\"]",[14,28258,28259],{},"To the right is an example. Describe the report you pull, and the AI lays out the steps.",[21,28261,28263,28264],{"id":28262},"pull-your-ad-report-in-code","Pull your ad report in code ",[727,28265],{"id":90},[11,28267],{},[14,28269,28270,26367,28272],{},[29,28271,26366],{},[322,28273,26371],{"href":26370},[26373,28275,28277],{":secondaryLinks":26347,"code":28276,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Your own Ads Manager reporting view, using your logged-in session\n  await page.goto(\"https:\u002F\u002Fbusiness.facebook.com\u002Fadsmanager\u002Freporting\");\n  await page.waitForSelector(\".report-row\");\n\n  \u002F\u002F Read each campaign row off the table\n  const rows = await page.$$eval(\".report-row\", els =>\n    els.map(el => ({\n      campaign: el.querySelector(\".name\")?.textContent.trim(),\n      spend:    el.querySelector(\".spend\")?.textContent.trim(),\n      results:  el.querySelector(\".results\")?.textContent.trim(),\n    }))\n  );\n\n  console.log(rows); \u002F\u002F write these to your sheet\n} finally {\n  await browser.close();\n}\n",[14,28278,26380],{},[26382,28280],{"description":28281,"eyebrow":26385,"image":26386,"imageAlt":28282,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the report you need. It builds the bot for you, no-code or code, downloading the export or reading the figures and dropping them in a sheet.","Claude building a Facebook ad reporting automation from a description",[21,28284,28286],{"id":28285},"what-can-you-pull","What can you pull?",[11,28288],{},[14,28290,28291],{},"Most of what Ads Manager shows you. A couple of cases worth knowing first.",[26402,28293],{":cards":28294},"[{\"title\":\"Works well\",\"items\":[\"Spend, results, and cost per result\",\"Campaign, ad set, and ad breakdowns\",\"The export file Ads Manager produces\",\"A fixed date range on a schedule\",\"Numbers into a sheet or dashboard feed\"]},{\"title\":\"Harder\",\"items\":[\"Custom columns that move around\",\"Very large date ranges that page slowly\",\"Two-factor logins on the account\"]},{\"title\":\"Don't try\",\"items\":[\"Pulling data from accounts you do not manage\",\"Anything against Facebook's terms\",\"Scraping faster than a person would\"]}]",[21,28296,26408],{"id":26407},[11,28298],{},[14,28300,28301],{},"Ads Manager is a heavy, changing app, so a few things trip up a report bot. Here is what I would watch for.",[639,28303,26431],{"id":26430},[14,28305,28306],{},"Run on the account you manage, signed in as yourself. Store the cookies so the bot keeps the session rather than logging in fresh each run, which Facebook treats as suspicious.",[639,28308,28310],{"id":28309},"the-layout-shifts","The layout shifts",[14,28312,28313,28314,28316],{},"Ads Manager changes often, and columns move. Target cells by the column you want with the ",[322,28315,26444],{"href":11340},", and recheck after a big Facebook update.",[639,28318,28320],{"id":28319},"wait-for-the-numbers-to-load","Wait for the numbers to load",[14,28322,28323],{},"The table fills in after the page loads, and a wrong date range shows the wrong figures. Set the range explicitly and wait for the row to appear before you read it.",[639,28325,28327],{"id":28326},"download-or-extract-not-both","Download or extract, not both",[14,28329,28330],{},"If you only need a few numbers, read them off the table and skip the file. If you need everything, download the export. Pick one so the bot stays simple, and remember the local download needs the desktop app.",{"title":494,"searchDepth":495,"depth":495,"links":28332},[28333,28334,28335,28336,28337,28338,28339,28340],{"id":28198,"depth":498,"text":28199},{"id":28207,"depth":498,"text":28208},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":28238,"depth":498,"text":28239},{"id":28262,"depth":498,"text":28263},{"id":28285,"depth":498,"text":28286},{"id":26407,"depth":498,"text":26408,"children":28341},[28342,28343,28344,28345],{"id":26430,"depth":495,"text":26431},{"id":28309,"depth":495,"text":28310},{"id":28319,"depth":495,"text":28320},{"id":28326,"depth":495,"text":28327},"Automate Facebook ad reporting without code. Download the export or extract the figures from Ads Manager, then drop them in a sheet on a schedule. Your account, your data. From axiom.",{},"\u002Fautomate\u002Ffacebook-ad-reporting",{"title":28189,"description":28346},"automate\u002Ffacebook-ad-reporting","5YBUnOMcXq8rYbZbK4BTNj8FDTKrl32BQIhwgAJTj1M",{"id":28353,"title":28354,"author":26259,"body":28355,"date":523,"description":28514,"extension":506,"meta":28515,"navigation":522,"order":523,"path":28516,"seo":28517,"stem":28518,"__hash__":28519},"automate\u002Fautomate\u002Ffb-bots.md","Build Facebook bots without code | axiom",{"type":8,"value":28356,"toc":28499},[28357,28361,28365,28367,28370,28374,28376,28379,28382,28384,28386,28389,28391,28393,28404,28409,28415,28417,28426,28432,28438,28440,28446,28451,28455,28459,28461,28464,28467,28469,28471,28474,28478,28481,28483,28486,28488,28491,28493],[26263,28358],{"description":28359,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":28360},"A Facebook bot can take the repetitive work off your hands across the handful of accounts, pages, and groups you run. Posting to your groups, replying to comments, scraping your own data into a sheet. This is for the few you manage, not a farm of accounts. There are three ways to start, with no code, with code, or with a Claude skill.","Build Facebook bots",[21,28362,28364],{"id":28363},"what-i-mean-by-a-facebook-bot","What I mean by a Facebook bot",[11,28366],{},[14,28368,28369],{},"A Facebook bot is just a bot that does your repetitive Facebook tasks for you. Posting an update to your group, replying to the same kinds of comments, scraping your page's data into a sheet, checking what came in overnight. Across the handful of accounts and pages you actually run, it handles the upkeep you would otherwise do click by click. It is not a wall of fake accounts.",[21,28371,28373],{"id":28372},"a-bot-is-not-a-bot-farm","A bot is not a bot farm",[11,28375],{},[14,28377,28378],{},"Say Facebook bot and most people picture a farm, hundreds of fake accounts liking, following, and posting spam into groups they have no business in. That version breaks Facebook's terms, and it gets accounts banned in waves. It is also not what a bot has to be.",[14,28380,28381],{},"A bot can simply be the thing that does your own Facebook upkeep, across the few accounts or pages you run, at the pace a person would. One creator with a couple of pages, a small team with a group to manage. Facebook does restrict automated interaction in its terms, so even the honest version means staying on your own turf and keeping the volume human. A handful you own, not masses you do not, is the whole difference.",[21,28383,26295],{"id":26294},[11,28385],{},[14,28387,28388],{},"This is for the person juggling a few Facebook accounts, pages, or groups without a team. A creator with two pages, a community manager with a group, a small brand keeping its presence ticking over. You want the routine handled across the few you run, not to spin up a hundred accounts. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,28390,26304],{"id":26303},[11,28392],{},[14,28394,28395,28396,28400,28401,44],{},"Start with one task on one account. Take the thing you repeat most, posting to the group, clearing the same comments, pulling your weekly numbers, and build just that. Use your own logged-in session so the bot acts as you, and run it at a human pace. If the task is replying to comments, the ",[322,28397,28399],{"href":28398},"\u002Fautomate\u002Ffacebook-groups","Facebook group page"," goes deeper, and for ad numbers there is ",[322,28402,28403],{"href":28348},"Facebook ad reporting",[14,28405,28406,28407,44],{},"One task, one account, your pace. I would lay out the first draft with ",[322,28408,26316],{"href":26315},[21,28410,28412,28413],{"id":28411},"build-a-facebook-bot-from-a-description","Build a Facebook bot from a description ",[727,28414],{"id":513},[11,28416],{},[14,28418,26327,28419,26333,28422,26337,28424,26341],{},[322,28420,26332],{"href":26330,"rel":28421},[2245],[322,28423,26336],{"href":26315},[29,28425,26340],{},[26343,28427,28429],{":instructions":28428,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open your group on the web\",\"Click to start a new post\",\"Add the post text from a Google Sheet\",\"Attach the image if there is one\",\"Publish the post\"]",[14,28430,28431],{},"To the right is an example. Describe the task for your account, and the AI lays out the steps.",[21,28433,28435,28436],{"id":28434},"build-a-facebook-bot-in-code","Build a Facebook bot in code ",[727,28437],{"id":90},[11,28439],{},[14,28441,28442,26367,28444],{},[29,28443,26366],{},[322,28445,26371],{"href":26370},[26373,28447,28449],{":secondaryLinks":26347,"code":28448,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Your own group, using your logged-in session\n  await page.goto(\"https:\u002F\u002Fwww.facebook.com\u002Fgroups\u002Fyour-group\");\n\n  \u002F\u002F Open the composer and write the post\n  await page.getByRole(\"button\", { name: \"Write something\" }).click();\n  await page.getByRole(\"textbox\").fill(\"This week's update for the group.\");\n\n  \u002F\u002F Review before it goes live, then publish\n  await page.getByRole(\"button\", { name: \"Post\" }).click();\n  await page.waitForSelector(\".post-confirmation\");\n} finally {\n  await browser.close();\n}\n",[14,28450,26380],{},[26382,28452],{"description":28453,"eyebrow":26385,"image":26386,"imageAlt":28454,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the Facebook task for your account. It builds the bot for you, no-code or code, for the handful you run, not a farm.","Claude building a Facebook bot from a description",[21,28456,28458],{"id":28457},"what-can-a-facebook-bot-do","What can a Facebook bot do?",[11,28460],{},[14,28462,28463],{},"Across the few accounts you run. A couple of lines to stay on the right side of.",[26402,28465],{":cards":28466},"[{\"title\":\"Works well\",\"items\":[\"Posting to your own group or page\",\"Replying to common comments\",\"Scraping your own page data into a sheet\",\"Checking what came in overnight\",\"Pulling your numbers on a schedule\"]},{\"title\":\"Harder\",\"items\":[\"Facebook's checks on automated activity\",\"Layout changes after a Facebook update\",\"Keeping replies in your own voice\"]},{\"title\":\"Don't try\",\"items\":[\"Running masses of accounts at once\",\"Posting into groups you do not run\",\"Fake likes, follows, or comment spam\"]}]",[21,28468,26408],{"id":26407},[11,28470],{},[14,28472,28473],{},"Facebook is strict about automation, so read this one carefully. Here is what I would watch for.",[639,28475,28477],{"id":28476},"a-handful-not-a-farm","A handful, not a farm",[14,28479,28480],{},"This works for the few accounts and pages you run. Spin it up across dozens to post and follow at scale and it is spam, and Facebook bans it. Stay on your own, and keep the volume human.",[639,28482,27314],{"id":27313},[14,28484,28485],{},"Facebook's terms limit automated interaction. Careful upkeep on your own turf is one thing, mass activity is another, and the second gets accounts restricted. Read the rules before you build.",[639,28487,26431],{"id":26430},[14,28489,28490],{},"Sign in as yourself and store the cookies so the bot keeps the session. Fresh logins and bursts of activity are exactly what Facebook flags.",[639,28492,26438],{"id":26437},[14,28494,28495,28496,28498],{},"Facebook redesigns often and buttons move. Repick elements with the ",[322,28497,26444],{"href":11340}," when a step stops finding them, and keep a person glancing at anything that posts publicly.",{"title":494,"searchDepth":495,"depth":495,"links":28500},[28501,28502,28503,28504,28505,28506,28507,28508],{"id":28363,"depth":498,"text":28364},{"id":28372,"depth":498,"text":28373},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":28411,"depth":498,"text":28412},{"id":28434,"depth":498,"text":28435},{"id":28457,"depth":498,"text":28458},{"id":26407,"depth":498,"text":26408,"children":28509},[28510,28511,28512,28513],{"id":28476,"depth":495,"text":28477},{"id":27313,"depth":495,"text":27314},{"id":26430,"depth":495,"text":26431},{"id":26437,"depth":495,"text":26438},"Build Facebook bots without code for the handful of accounts you run. Post to your groups, reply to comments, and scrape your own data into a sheet, at a human pace. From axiom.",{},"\u002Fautomate\u002Ffb-bots",{"title":28354,"description":28514},"automate\u002Ffb-bots","oGOJuTZ5lOrbWcK4gler881BEP_Zgcuk7lhVbaRk7cU",{"id":28521,"title":28522,"author":26259,"body":28523,"date":523,"description":28698,"extension":506,"meta":28699,"navigation":522,"order":523,"path":28700,"seo":28701,"stem":28702,"__hash__":28703},"automate\u002Fautomate\u002Ffile-upload-to-website.md","File upload to a website without code | axiom",{"type":8,"value":28524,"toc":28683},[28525,28529,28533,28535,28538,28542,28544,28547,28555,28563,28566,28568,28570,28573,28575,28577,28580,28589,28595,28597,28607,28613,28619,28621,28627,28632,28636,28640,28642,28645,28648,28650,28652,28655,28659,28662,28666,28669,28673,28676,28680],[26263,28526],{"description":28527,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":28528},"Attaching the same files to web forms, product pages, and portals is slow, repetitive work. A bot can do the file upload for you, picking the field, choosing the file, and looping a whole list from a sheet. The one thing to decide up front is where the files come from, your own machine or your Google Drive. There are three ways to start, with no code, with code, or with a Claude skill.","Automate file upload to a website",[21,28530,28532],{"id":28531},"what-i-mean-by-file-upload-to-a-website","What I mean by file upload to a website",[11,28534],{},[14,28536,28537],{},"A file upload to a website is the moment you click an upload field, pick a file, and the page takes it. Automating it means a bot does that for you. It finds the upload field, points it at a file, and submits, one file or a whole list of them from a sheet. Give it the paths and the pages, and it attaches every file without you opening a single dialog.",[21,28539,28541],{"id":28540},"where-the-files-come-from","Where the files come from",[11,28543],{},[14,28545,28546],{},"The first thing to settle is not how to upload, it is where the files live. That choice decides how you run it.",[14,28548,28549,28550,28554],{},"If the files are on your own machine, run it in the desktop app. The ",[322,28551,28553],{"href":28552},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fupload-local","Upload a file step"," takes a path on your computer and attaches it, and it only works in the desktop app.",[14,28556,28557,28558,28562],{},"If the files are in the cloud, upload from Google Drive. The ",[322,28559,28561],{"href":28560},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fbrowser-actions\u002Fupload-cloud","Upload a file from Google Drive step"," takes a Drive URL, which is the way to go when the bot runs in the cloud with no machine of yours involved. That same Drive step can also pull from a local folder when you run it on the desktop, so one step covers both.",[14,28564,28565],{},"Decide where the files come from first, and the rest of the build follows.",[21,28567,26295],{"id":26294},[11,28569],{},[14,28571,28572],{},"This is for anyone who attaches the same kinds of files to the web all day. Adding images to product pages in a CMS, uploading documents to a portal, attaching receipts to a form. And for anyone sitting on a folder of files and a sheet of pages that need them. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,28574,26304],{"id":26303},[11,28576],{},[14,28578,28579],{},"Start with where the files come from, local or Drive, because that picks your runner. Then list what goes where. For one field with many files, put the paths in a Google Sheet and loop. For files spread across pages, like product pages in a CMS, put one row per page with the page URL and the file in it, then loop both.",[14,28581,28582,28583,28586,28587,44],{},"Source first, then map files to pages, then loop. There is a ",[322,28584,28585],{"href":23565},"template that uploads from a Google Sheet"," to start from, and I would lay out the first draft with ",[322,28588,26316],{"href":26315},[21,28590,28592,28593],{"id":28591},"upload-files-from-a-description","Upload files from a description ",[727,28594],{"id":513},[11,28596],{},[14,28598,28599,28600,26333,28603,26337,28605,26341],{},"Describe what to upload and where the files come from in the ",[322,28601,26332],{"href":26330,"rel":28602},[2245],[322,28604,26336],{"href":26315},[29,28606,26340],{},[26343,28608,28610],{":instructions":28609,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Read a list of file paths from a Google Sheet\",\"Go to the upload page\",\"Click the upload field\",\"Choose the file for this row\",\"Wait for the upload, then take the next row\"]",[14,28611,28612],{},"To the right is an example. Describe what to upload and where the files come from, and the AI lays out the steps.",[21,28614,28616,28617],{"id":28615},"upload-files-in-code","Upload files in code ",[727,28618],{"id":90},[11,28620],{},[14,28622,28623,26367,28625],{},[29,28624,26366],{},[322,28626,26371],{"href":26370},[26373,28628,28630],{":secondaryLinks":26347,"code":28629,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F One row per page. These would come from your Google Sheet.\n  const rows = [\n    { url: \"https:\u002F\u002Fexample.com\u002Fproducts\u002F1\u002Fedit\", file: \"images\u002Fwidget.jpg\" },\n    { url: \"https:\u002F\u002Fexample.com\u002Fproducts\u002F2\u002Fedit\", file: \"images\u002Fgadget.jpg\" },\n  ];\n\n  for (const row of rows) {\n    await page.goto(row.url);\n\n    \u002F\u002F Point the upload field at a file on disk\n    await page.setInputFiles('input[type=\"file\"]', row.file);\n\n    \u002F\u002F Submit, then wait for the upload to finish before the next row\n    await page.click(\"button[type=submit]\");\n    await page.waitForSelector(\".upload-done\");\n  }\n} finally {\n  await browser.close();\n}\n",[14,28631,26380],{},[26382,28633],{"description":28634,"eyebrow":26385,"image":26386,"imageAlt":28635,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe what to upload and where the files come from. It builds the bot for you, no-code or code, from your machine or from Google Drive.","Claude building a file upload automation from a description",[21,28637,28639],{"id":28638},"what-can-you-upload","What can you upload?",[11,28641],{},[14,28643,28644],{},"Most upload fields. A couple of cases worth knowing first.",[26402,28646],{":cards":28647},"[{\"title\":\"Works well\",\"items\":[\"Images to product pages in a CMS\",\"Documents and PDFs to a portal\",\"Receipts and attachments to a form\",\"Many files to one field from a sheet\",\"Files spread across many pages\"]},{\"title\":\"Harder\",\"items\":[\"Drag-and-drop only upload zones\",\"Uploads behind a login or 2FA\",\"Very large files on a slow connection\"]},{\"title\":\"Don't try\",\"items\":[\"Uploading content you have no right to\",\"Anything against a site's terms\",\"Flooding a site with junk uploads\"]}]",[21,28649,26408],{"id":26407},[11,28651],{},[14,28653,28654],{},"Uploads are simple until the file is not where the bot expects. Here is what I would watch for.",[639,28656,28658],{"id":28657},"local-uploads-need-the-desktop-app","Local uploads need the desktop app",[14,28660,28661],{},"The Upload a file step only reads files off your computer when the bot runs in the desktop app. In the cloud, upload from Google Drive instead, or use the Drive step that can do both.",[639,28663,28665],{"id":28664},"check-the-path-and-permissions","Check the path and permissions",[14,28667,28668],{},"If a file will not upload, check the filename and path are right, the file is actually there, and your user has read access to the folder. A wrong path is the usual culprit.",[639,28670,28672],{"id":28671},"wait-for-the-upload-to-finish","Wait for the upload to finish",[14,28674,28675],{},"A big file takes time to go up. If the bot moves on too soon, the form submits without the file. Add a wait sized to the file, or wait for the page to confirm the upload.",[639,28677,28679],{"id":28678},"drag-and-drop-zones","Drag-and-drop zones",[14,28681,28682],{},"Some upload areas only accept a drag, not a click. If selecting the field does nothing, the page is often hiding a real file input behind the drop zone, so point the step at that input instead.",{"title":494,"searchDepth":495,"depth":495,"links":28684},[28685,28686,28687,28688,28689,28690,28691,28692],{"id":28531,"depth":498,"text":28532},{"id":28540,"depth":498,"text":28541},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":28591,"depth":498,"text":28592},{"id":28615,"depth":498,"text":28616},{"id":28638,"depth":498,"text":28639},{"id":26407,"depth":498,"text":26408,"children":28693},[28694,28695,28696,28697],{"id":28657,"depth":495,"text":28658},{"id":28664,"depth":495,"text":28665},{"id":28671,"depth":495,"text":28672},{"id":28678,"depth":495,"text":28679},"Automate file upload to a website without code. Run bulk file uploads, attach files to forms and pages, loop a list from a sheet, and upload from your machine or Google Drive. From axiom.",{},"\u002Fautomate\u002Ffile-upload-to-website",{"title":28522,"description":28698},"automate\u002Ffile-upload-to-website","eHJOjFo-XjJkPgHWOSLUWvw0aidp4ueb_aS0gc8DGTc",{"id":28705,"title":28706,"author":26259,"body":28707,"date":523,"description":28878,"extension":506,"meta":28879,"navigation":522,"order":523,"path":28880,"seo":28881,"stem":28882,"__hash__":28883},"automate\u002Fautomate\u002Fform-filling.md","Automate data entry and form filling | axiom",{"type":8,"value":28708,"toc":28864},[28709,28713,28717,28719,28726,28728,28730,28733,28736,28739,28741,28743,28746,28754,28761,28764,28770,28772,28783,28789,28795,28797,28804,28809,28813,28815,28817,28820,28823,28825,28827,28830,28834,28840,28844,28847,28851,28854,28858],[26263,28710],{"description":28711,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":28712},"Data entry into web forms is repetitive work. Some forms are tiny, an email and a password. Others run for pages, with dropdowns, date pickers, and dozens of inputs. A bot can do the data entry for you, filling and submitting each form, pulling every value from a sheet, handling every row. There are three ways to start, with no code, with code, or with a Claude skill.","Automate data entry and form filling",[21,28714,28716],{"id":28715},"what-i-mean-by-data-entry","What I mean by data entry",[11,28718],{},[14,28720,28721,28722,28725],{},"By data entry I mean putting data into a web form, the work some people call form filling. That data can come from a Google Sheet, Excel, or a webhook. It is the work of taking values from columns and rows and dropping each one into the right field. That field might be a text box, a date picker, or a file upload. All of it can be automated with a bot, and you can run it in the cloud. You can do it three ways, with no code, with code, or with a ",[322,28723,28724],{"href":26390},"Claude skill",". Let me show how I would go about it.",[21,28727,26295],{"id":26294},[11,28729],{},[14,28731,28732],{},"This is for anyone who does data entry into a web form all day. Entering orders into a portal, adding candidates to an ATS, keying invoices into a finance system, moving rows from a spreadsheet into a CRM one record at a time. The data sits in a Google Sheet, and the form has no API to reach it.",[14,28734,28735],{},"It is also for the coder who already writes Playwright or Puppeteer to fill forms, where the hybrid approach can cut the boilerplate. And for the people who just like automating things. I am one of them.",[14,28737,28738],{},"If you do the same data entry again and again with different values, a bot can take the sheet and do the typing, one row or ten thousand. If the data lives in a Sheet, in Excel, or arrives by webhook, and the form lives in Chrome, it can be automated, whether you code or not.",[21,28740,26304],{"id":26303},[11,28742],{},[14,28744,28745],{},"I'm a no-coder, so my approach leans no-code. Which is better for data entry? I would say no-code, and here is why.",[14,28747,28748,28749,28753],{},"The data can come from a lot of places. For most people it is a Google Sheet, and axiom integrates with that directly, along with Excel and ",[322,28750,28752],{"href":28751},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Fwebhooks","webhooks",". So the values are easy to feed in.",[14,28755,28756,28757,28760],{},"Plenty of forms are buried in iframes, and the ",[322,28758,28759],{"href":11340},"no-code tool"," supports those too. And not to be totally biased, but sometimes you want a trick up your sleeve. A no-code step like key press lets me Tab between fields and come back to click a button. Forms are structured, so that works well here.",[14,28762,28763],{},"Code works too. I have done it and it is not that hard. The thing I ran into was dynamic forms that load in pieces, so I had to add a lot of waits by hand. The no-code tool has algorithms that handle that waiting for you. So yes, for data entry, my approach is no-code.",[21,28765,28767,28768],{"id":28766},"automate-data-entry-from-a-description","Automate data entry from a description ",[727,28769],{"id":513},[11,28771],{},[14,28773,28774,28775,28778,28779,26337,28781,26341],{},"Describe the form in plain words in the ",[322,28776,26332],{"href":26330,"rel":28777},[2245]," and it builds the steps for you. Give it the fields and where each value comes from, then run it. ",[322,28780,26336],{"href":26315},[29,28782,26340],{},[26343,28784,28786],{":instructions":28785,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Log into the site\",\"Open the new record form\",\"Fill name, email, and company from a Google Sheet\",\"Pick the plan from the dropdown\",\"Upload the contract file\",\"Click submit, then load the next row\"]",[14,28787,28788],{},"To the right is an example. Break the form down field by field and let the AI generate the steps of your bot.",[21,28790,28792,28793],{"id":28791},"automate-form-filling-in-code","Automate form filling in code ",[727,28794],{"id":90},[11,28796],{},[14,28798,28799,28801,28802],{},[29,28800,26366],{}," If you are more interested in the infrastructure and running your own code, this is the right choice for you. ",[322,28803,26371],{"href":26370},[26373,28805,28807],{":secondaryLinks":26347,"code":28806,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F 1. Log into the site once\n  await page.goto(\"https:\u002F\u002Fexample.com\u002Flogin\");\n  await page.fill(\"#email\", process.env.SITE_EMAIL);\n  await page.fill(\"#password\", process.env.SITE_PASSWORD);\n  await page.click(\"button[type=submit]\");\n\n  \u002F\u002F 2. Each row would come from your Google Sheet\n  const rows = [\n    { name: \"Ada Lovelace\", email: \"ada@example.com\", plan: \"Pro\",  file: \"contracts\u002Fada.pdf\" },\n    { name: \"Alan Turing\",  email: \"alan@example.com\", plan: \"Team\", file: \"contracts\u002Falan.pdf\" },\n  ];\n\n  for (const row of rows) {\n    \u002F\u002F 3. Open a fresh form for each record\n    await page.goto(\"https:\u002F\u002Fexample.com\u002Frecords\u002Fnew\");\n    await page.waitForSelector(\"#name\");\n\n    \u002F\u002F 4. Fill the text fields\n    await page.fill(\"#name\", row.name);\n    await page.fill(\"#email\", row.email);\n\n    \u002F\u002F 5. Choose from a dropdown\n    await page.selectOption(\"#plan\", row.plan);\n\n    \u002F\u002F 6. Upload a file\n    await page.setInputFiles(\"#contract\", row.file);\n\n    \u002F\u002F 7. Submit, then wait for the confirmation before the next row\n    await page.click(\"button[type=submit]\");\n    await page.waitForSelector(\".confirmation\");\n  }\n} finally {\n  await browser.close();\n}\n",[14,28808,26380],{},[26382,28810],{"description":28811,"eyebrow":26385,"image":26386,"imageAlt":28812,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the form. It builds the bot for you, no-code or code, and handles the tricky parts like dynamic fields, dropdowns, and waits.","Claude building a form automation from a description",[21,28814,26395],{"id":26394},[11,28816],{},[14,28818,28819],{},"Most forms can be filled by a bot. A couple of cases worth knowing first.",[26402,28821],{":cards":28822},"[{\"title\":\"Works well\",\"items\":[\"Data entry from webhooks\",\"Passing data from Google Sheets into online forms\",\"Automating login forms\",\"Inputting customer data\",\"Automating messaging\"]},{\"title\":\"Harder\",\"items\":[\"Long multi-page forms\",\"Complex forms with conditional questions\",\"Sites with throttling or rate limiting\"]},{\"title\":\"Don't try\",\"items\":[\"Placing bets\",\"Vote rigging\",\"Spamming web forms\"]}]",[21,28824,26408],{"id":26407},[11,28826],{},[14,28828,28829],{},"The range of forms out there is broad, so the use cases are broad too. I won't pretend it is all easy. Forms hide surprises, and a learning curve is real. Here is what I would watch for.",[639,28831,28833],{"id":28832},"data-in-the-wrong-field","Data in the wrong field",[14,28835,28836,28837,28839],{},"If you see a value land in the wrong place, a color in the price field for example, the selector is wrong or it picked the wrong element. You can fix it in the no-code tool with the ",[322,28838,26444],{"href":11340},", or directly in your code.",[639,28841,28843],{"id":28842},"long-forms-with-many-steps","Long forms with many steps",[14,28845,28846],{},"Break a long form into several axioms, one per page, then load them into a single controller axiom that runs each one in order with the run another axiom step.",[639,28848,28850],{"id":28849},"cookies","Cookies",[14,28852,28853],{},"If you log into a site, you either have the run sign in each time, or you store the cookies so the session carries over. Storing the cookies is the method we recommend.",[639,28855,28857],{"id":28856},"iframes","Iframes",[14,28859,28860,28861,28863],{},"Forms in legacy systems are often embedded in iframes. We have a mode to handle that, turn it on in the ",[322,28862,26444],{"href":11340},". If that does not work, inspect the page and check whether the iframe has a URL you can open to reach the form directly.",{"title":494,"searchDepth":495,"depth":495,"links":28865},[28866,28867,28868,28869,28870,28871,28872],{"id":28715,"depth":498,"text":28716},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":28766,"depth":498,"text":28767},{"id":28791,"depth":498,"text":28792},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":28873},[28874,28875,28876,28877],{"id":28832,"depth":495,"text":28833},{"id":28842,"depth":495,"text":28843},{"id":28849,"depth":495,"text":28850},{"id":28856,"depth":495,"text":28857},"Automate the data entry you do by hand. Pull values from a Google Sheet, Excel, or a webhook into every form field, no-code in the browser or in code with axiom.",{},"\u002Fautomate\u002Fform-filling",{"title":28706,"description":28878},"automate\u002Fform-filling","XZykCFEXvti9M-Oua274YfMP0b5oHIWAEavi0cWAarg",{"id":28885,"title":28886,"author":523,"body":28887,"date":523,"description":494,"extension":506,"meta":29048,"navigation":522,"order":523,"path":29049,"seo":29050,"stem":29051,"__hash__":29052},"automate\u002Fautomate\u002Fforms-office.md","Forms Office",{"type":8,"value":28888,"toc":29032},[28889,28891,28895,28899,28903,28905,28908,28912,28914,28917,28920,28922,28924,28927,28929,28931,28934,28939,28945,28947,28957,28963,28969,28971,28977,28982,28986,28988,28990,28993,28996,28998,29000,29003,29007,29010,29012,29018,29022,29025,29029],[11,28890],{},[21,28892,28894],{"id":28893},"title-automate-microsoft-forms-without-code-axiomdescription-automate-microsoft-forms-without-code-fill-and-submit-forms-from-a-google-sheet-run-test-responses-and-feed-office-forms-from-your-data-from-axiomauthor-alex-barlow","title: \"Automate Microsoft Forms without code | axiom\"\ndescription: \"Automate Microsoft Forms without code. Fill and submit forms from a Google Sheet, run test responses, and feed Office forms from your data. From axiom.\"\nauthor: Alex Barlow",[26263,28896],{"description":28897,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":28898},"Microsoft Forms is great at collecting answers, less so at receiving them from somewhere else. A bot can fill a form for you, entering data from a sheet, submitting a test response, or sending the same answers in on a schedule. Inside Microsoft 365 the responses are already handled, so this is about putting data in. There are three ways to start, with no code, with code, or with a Claude skill.","Automate Microsoft Forms",[21,28900,28902],{"id":28901},"what-i-mean-by-automating-microsoft-forms","What I mean by automating Microsoft Forms",[11,28904],{},[14,28906,28907],{},"Automating Microsoft Forms means a bot fills the form the way a person would. It opens the form link, enters the answers from a sheet or a script, picks the choices, and submits. Run it once for a test, or down a list of rows to send many responses in. The responses you collect already flow to Excel on their own, so the part a bot adds is getting data into the form in the first place.",[21,28909,28911],{"id":28910},"power-automate-handles-the-inside","Power Automate handles the inside",[11,28913],{},[14,28915,28916],{},"If you live in Microsoft 365, know what is already there. Form responses land in an Excel workbook on their own, and Power Automate can react to each new response, sending a mail, updating a list, kicking off a flow. For reacting to responses inside the Microsoft world, that is the tool, and it is a good one.",[14,28918,28919],{},"What Power Automate does not do is submit a form. It waits for responses, it does not create them. So the browser route covers the other direction, filling Microsoft Forms in, entering data from a sheet, running a test response, or bridging from a system that lives outside your tenant. Power Automate for what happens after a response, a browser bot for putting the response there.",[21,28921,26295],{"id":26294},[11,28923],{},[14,28925,28926],{},"This is for the person in a Microsoft shop who needs data into a form, not just out of it. Migrating answers from an old system, sending a standard response on a schedule, testing a long form before it goes to the org, or feeding a form from a spreadsheet. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,28928,26304],{"id":26303},[11,28930],{},[14,28932,28933],{},"Map the sheet to the form first. Each column is an answer, each row is one submission. Open the form, fill the fields in order, handle the choices and ratings, and submit, then come back for the next row. If the form is restricted to your org, sign in first so the bot can reach it.",[14,28935,28936,28937,44],{},"One row, one submission, mapped to the fields. I would lay out the first draft with ",[322,28938,26316],{"href":26315},[21,28940,28942,28943],{"id":28941},"fill-microsoft-forms-from-a-description","Fill Microsoft Forms from a description ",[727,28944],{"id":513},[11,28946],{},[14,28948,28949,28950,26333,28953,26337,28955,26341],{},"Describe your form's fields in plain words in the ",[322,28951,26332],{"href":26330,"rel":28952},[2245],[322,28954,26336],{"href":26315},[29,28956,26340],{},[26343,28958,28960],{":instructions":28959,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open the Microsoft Form link\",\"Read the next row from a Google Sheet\",\"Type the name and email answers\",\"Pick the choice and the rating\",\"Submit, then start a fresh response\"]",[14,28961,28962],{},"To the right is an example. Describe your form's fields, and the AI lays out the steps.",[21,28964,28966,28967],{"id":28965},"fill-microsoft-forms-in-code","Fill Microsoft Forms in code ",[727,28968],{"id":90},[11,28970],{},[14,28972,28973,26367,28975],{},[29,28974,26366],{},[322,28976,26371],{"href":26370},[26373,28978,28980],{":secondaryLinks":26347,"code":28979,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Each row is one submission. These would come from your sheet.\n  const rows = [\n    { name: \"Ada Lovelace\", email: \"ada@example.com\",  rating: \"5\" },\n    { name: \"Alan Turing\",  email: \"alan@example.com\", rating: \"4\" },\n  ];\n\n  for (const row of rows) {\n    await page.goto(\"https:\u002F\u002Fforms.office.com\u002Fr\u002Fyour-form\");\n\n    \u002F\u002F Text answers, matched by their question label\n    await page.getByRole(\"textbox\", { name: \"Your name\" }).fill(row.name);\n    await page.getByRole(\"textbox\", { name: \"Email\" }).fill(row.email);\n\n    \u002F\u002F A choice or rating\n    await page.getByRole(\"radio\", { name: row.rating }).click();\n\n    await page.getByRole(\"button\", { name: \"Submit\" }).click();\n    await page.waitForSelector(\"text=Thanks\");\n  }\n} finally {\n  await browser.close();\n}\n",[14,28981,26380],{},[26382,28983],{"description":28984,"eyebrow":26385,"image":26386,"imageAlt":28985,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe your form's fields. It builds the bot for you, no-code or code, filling Microsoft Forms from your data and submitting.","Claude building a Microsoft Forms automation from a description",[21,28987,26395],{"id":26394},[11,28989],{},[14,28991,28992],{},"Filling and submitting, mostly. A couple of cases worth knowing first.",[26402,28994],{":cards":28995},"[{\"title\":\"Works well\",\"items\":[\"Filling text answers from a sheet\",\"Picking choices, ratings, and dates\",\"Submitting one response or a whole list\",\"Running a test response before launch\",\"Forms that anyone can respond to\"]},{\"title\":\"Harder\",\"items\":[\"Forms restricted to your org, which need a sign-in\",\"Branching that changes which questions show\",\"File-upload questions\"]},{\"title\":\"Don't try\",\"items\":[\"Stuffing a form with fake responses\",\"Submitting to forms you were not given\",\"Anything against your org's or Microsoft's terms\"]}]",[21,28997,26408],{"id":26407},[11,28999],{},[14,29001,29002],{},"Microsoft Forms is simple on the surface, but a few things trip up a fill bot. Here is what I would watch for.",[639,29004,29006],{"id":29005},"org-restricted-forms-need-a-sign-in","Org-restricted forms need a sign-in",[14,29008,29009],{},"A form set to your organization only will not open without a signed-in account. Carry your session so the bot is already in, or add a sign-in step. A public form skips this entirely.",[639,29011,28148],{"id":28147},[14,29013,29014,29015,29017],{},"Filling from a sheet works when the columns line up with the questions, in order. Pick each field with the ",[322,29016,26444],{"href":11340}," so the answers land in the right box, and run one row first before you loop a list.",[639,29019,29021],{"id":29020},"branching-changes-the-questions","Branching changes the questions",[14,29023,29024],{},"If the form shows different questions based on an answer, the fields shift mid-form. Build for the path your data takes, and test each branch you actually use.",[639,29026,29028],{"id":29027},"one-response-per-run","One response per run",[14,29030,29031],{},"Microsoft Forms loads a fresh form for each response. Reopen the form link at the top of every row rather than trying to reset the page, so each submission starts clean.",{"title":494,"searchDepth":495,"depth":495,"links":29033},[29034,29035,29036,29037,29038,29039,29040,29041,29042],{"id":28893,"depth":498,"text":28894},{"id":28901,"depth":498,"text":28902},{"id":28910,"depth":498,"text":28911},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":28941,"depth":498,"text":28942},{"id":28965,"depth":498,"text":28966},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":29043},[29044,29045,29046,29047],{"id":29005,"depth":495,"text":29006},{"id":28147,"depth":495,"text":28148},{"id":29020,"depth":495,"text":29021},{"id":29027,"depth":495,"text":29028},{},"\u002Fautomate\u002Fforms-office",{"description":494},"automate\u002Fforms-office","p9Gcmqlkjvl5Zvz4Fydi_9gqyG1SoHjJNHZUDJvl6sw",{"id":29054,"title":29055,"author":26259,"body":29056,"date":523,"description":29223,"extension":506,"meta":29224,"navigation":522,"order":523,"path":29225,"seo":29226,"stem":29227,"__hash__":29228},"automate\u002Fautomate\u002Fgoogle-drive.md","Automate Google Drive without code | axiom",{"type":8,"value":29057,"toc":29208},[29058,29062,29066,29068,29071,29075,29077,29088,29091,29093,29095,29098,29100,29102,29109,29112,29118,29120,29131,29137,29143,29145,29151,29157,29161,29165,29167,29170,29173,29175,29177,29180,29184,29187,29191,29194,29198,29201,29205],[26263,29059],{"description":29060,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":29061},"Google Drive is where most teams park their files, and most teams move them around by hand. Renaming a stack of attachments, dropping invoices into the right client folder, sharing a contract with the right people, pulling a daily export down to a local disk. axiom drives Drive from the browser, so the click work happens automatically, on a schedule, or one row at a time from a sheet. There are three ways to start, with no code, with code, or with a Claude skill.","Automate Google Drive",[21,29063,29065],{"id":29064},"what-i-mean-by-automating-google-drive","What I mean by automating Google Drive",[11,29067],{},[14,29069,29070],{},"Automating Google Drive means a bot does the file shuffling you would otherwise do by hand. Uploading a batch of files into a specific folder. Renaming each one to match a contract or invoice number. Moving items between folders as their status changes. Sharing a file with a list of email addresses and setting the right permission. Downloading a daily export from a folder a partner drops into. The bot opens Drive in Chrome, signed into your account, and clicks through it the way a person would.",[21,29072,29074],{"id":29073},"reading-and-writing-data-is-already-solved","Reading and writing data is already solved",[11,29076],{},[14,29078,29079,29080,29083,29084,29087],{},"Before you reach for a bot, know that Google Drive has a real API and Google Sheets has tight integrations across the rest of axiom. If you only need to ",[807,29081,29082],{},"read"," files (list them, fetch metadata, pull a Sheet's rows) the API is the right tool, and our ",[322,29085,29086],{"href":8384},"Google Sheets steps"," cover the common cases without any Drive code.",[14,29089,29090],{},"Where a browser bot earns its place is the click work the API does badly or doesn't do at all: moving items by drag-and-drop, sharing through the share dialog, applying the same set of clicks to a folder full of files, working across Drive plus another web app in one flow.",[21,29092,26295],{"id":26294},[11,29094],{},[14,29096,29097],{},"This is for anyone with a Drive folder that wants babysitting. Operations teams sorting a daily drop into client subfolders. Finance teams renaming bank statements to match a register. Hiring teams sharing each candidate's CV with the right interview panel. Anyone running a weekly report that ends with \"and then upload it to Drive\". And for the developer who wants the upload\u002Fshare\u002Fmove flow scripted, the same browser scripts run on our cloud Chromium without the Google Drive API surface area.",[21,29099,26304],{"id":26303},[11,29101],{},[14,29103,29104,29105,29108],{},"Start by listing the click work, not the file work. \"Upload this file, rename it, move it into that subfolder, share it with this email.\" Pull each of those values from a Google Sheet column, then loop the rows. Build the steps in the ",[322,29106,26332],{"href":26330,"rel":29107},[2245],", run it on one row to check, then let it loop.",[14,29110,29111],{},"For anything that's pure-API-shaped — read a list of files, fetch metadata, pull rows — I'd reach for the Google API directly. For everything else, a browser bot is the shortest path.",[21,29113,29115,29116],{"id":29114},"automate-google-drive-from-a-description","Automate Google Drive from a description ",[727,29117],{"id":513},[11,29119],{},[14,29121,29122,29123,29126,29127,26337,29129,26341],{},"Describe the Drive work in plain words in the ",[322,29124,26332],{"href":26330,"rel":29125},[2245]," and it builds the steps for you. Tell it the source folder, where to put each file, and how to name it. ",[322,29128,26336],{"href":26315},[29,29130,26340],{},[26343,29132,29134],{":instructions":29133,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open Google Drive in the browser\",\"Open the source folder\",\"For each file row in my Sheet, upload the file\",\"Rename it to the value in column B\",\"Move it to the subfolder named in column C\",\"Share it with the email in column D\"]",[14,29135,29136],{},"To the right is an example. Describe the Drive work and let the AI lay out the steps of your bot.",[21,29138,29140,29141],{"id":29139},"automate-google-drive-in-code","Automate Google Drive in code ",[727,29142],{"id":90},[11,29144],{},[14,29146,29147,26367,29149],{},[29,29148,26366],{},[322,29150,26371],{"href":26370},[26373,29152,29154],{":secondaryLinks":26347,"code":29153,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\nconst DRIVE = \"https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002FFOLDER_ID\";\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n  await page.goto(DRIVE);\n\n  \u002F\u002F Each row would come from your Google Sheet\n  const rows = [\n    { local: \"\u002Ftmp\u002Finvoice-001.pdf\", rename: \"ACME-2026-01.pdf\",  shareWith: \"ops@acme.example\" },\n    { local: \"\u002Ftmp\u002Finvoice-002.pdf\", rename: \"Globex-2026-01.pdf\", shareWith: \"ops@globex.example\" },\n  ];\n\n  for (const row of rows) {\n    \u002F\u002F Upload via the hidden file input Drive renders for drag-and-drop targets\n    await page.locator('input[type=\"file\"]').setInputFiles(row.local);\n    await page.getByText(row.rename.replace(\u002F\\.[^.]+$\u002F, \"\")).waitFor({ state: \"visible\", timeout: 15000 });\n\n    \u002F\u002F Rename\n    await page.getByRole(\"button\", { name: row.rename.replace(\u002F\\.[^.]+$\u002F, \"\") }).click({ button: \"right\" });\n    await page.getByRole(\"menuitem\", { name: \"Rename\" }).click();\n    await page.getByRole(\"textbox\").fill(row.rename);\n    await page.keyboard.press(\"Enter\");\n\n    \u002F\u002F Share\n    await page.getByRole(\"button\", { name: row.rename }).click({ button: \"right\" });\n    await page.getByRole(\"menuitem\", { name: \"Share\" }).click();\n    await page.getByPlaceholder(\"Add people\").fill(row.shareWith);\n    await page.getByRole(\"button\", { name: \"Send\" }).click();\n  }\n} finally {\n  await browser.close();\n}\n",[14,29155,29156],{},"Connect Playwright (or Puppeteer) to our cloud Chromium and write the same scripts you'd run locally, without managing the browser. The cookies for the Google account that owns the folder need to be loaded into the run.",[26382,29158],{"description":29159,"eyebrow":26385,"image":26386,"imageAlt":29160,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the Drive work. It builds the bot for you, no-code or code, handling the upload, rename, move, share clicks for each row in your sheet.","Claude building a Google Drive automation from a description",[21,29162,29164],{"id":29163},"what-can-you-automate-in-google-drive","What can you automate in Google Drive?",[11,29166],{},[14,29168,29169],{},"Most click-driven Drive work. A couple of cases worth knowing first.",[26402,29171],{":cards":29172},"[{\"title\":\"Works well\",\"items\":[\"Uploading files from local disk into a target folder\",\"Renaming a batch of files from a sheet\",\"Moving items between folders by name\",\"Sharing files with specific people and a permission level\",\"Downloading a daily export from a partner-shared folder\"]},{\"title\":\"Harder\",\"items\":[\"Bulk-applying permissions across thousands of items at once (slow in a browser; reach for the API)\",\"Folders containing >5,000 items (Drive's UI gets sluggish)\",\"Operations that require admin-console access\"]},{\"title\":\"Don't try\",\"items\":[\"Anything against Google's terms of service\",\"Driving someone else's Drive without their consent\",\"Mass scraping of shared files\"]}]",[21,29174,26408],{"id":26407},[11,29176],{},[14,29178,29179],{},"Google Drive looks simple in Chrome, but a few quirks bite a bot. Here's what I'd watch for.",[639,29181,29183],{"id":29182},"sign-in-state-matters","Sign-in state matters",[14,29185,29186],{},"The run needs to be signed into the Google account that owns the folder. Store the cookies for that account in axiom and load them on every run.",[639,29188,29190],{"id":29189},"the-ui-is-laggier-than-it-looks","The UI is laggier than it looks",[14,29192,29193],{},"Drive renders files asynchronously and the click targets don't always exist when a step thinks they do. Build short waits between the upload and the next interaction, or wait for a specific element to appear before continuing.",[639,29195,29197],{"id":29196},"right-click-menus-need-keyboard-or-context-click","Right-click menus need keyboard or context click",[14,29199,29200],{},"The Rename and Share menus open from a right-click. Some no-code steps default to a left-click — switch to context-click in the step's options when the menu doesn't open.",[639,29202,29204],{"id":29203},"test-one-row-first","Test one row first",[14,29206,29207],{},"Run a single row end-to-end before you loop. It's much easier to fix a selector than to undo a hundred wrongly-named files.",{"title":494,"searchDepth":495,"depth":495,"links":29209},[29210,29211,29212,29213,29214,29215,29216,29217],{"id":29064,"depth":498,"text":29065},{"id":29073,"depth":498,"text":29074},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":29114,"depth":498,"text":29115},{"id":29139,"depth":498,"text":29140},{"id":29163,"depth":498,"text":29164},{"id":26407,"depth":498,"text":26408,"children":29218},[29219,29220,29221,29222],{"id":29182,"depth":495,"text":29183},{"id":29189,"depth":495,"text":29190},{"id":29196,"depth":495,"text":29197},{"id":29203,"depth":495,"text":29204},"Move files in and out of Google Drive without writing scripts. Upload, download, rename, move, share — axiom drives Drive from the browser, no code needed.",{},"\u002Fautomate\u002Fgoogle-drive",{"title":29055,"description":29223},"automate\u002Fgoogle-drive","D-swOpcQHpAZl9bQIg46f5TtwszIROHjOYLoLWMjf-c",{"id":29230,"title":29231,"author":26259,"body":29232,"date":523,"description":29422,"extension":506,"meta":29423,"navigation":522,"order":523,"path":29424,"seo":29425,"stem":29426,"__hash__":29427},"automate\u002Fautomate\u002Fgoogle-forms.md","Automate Google Forms without code | axiom",{"type":8,"value":29233,"toc":29407},[29234,29238,29242,29244,29247,29251,29253,29256,29259,29261,29263,29266,29268,29270,29277,29283,29289,29291,29301,29307,29313,29315,29321,29326,29330,29334,29336,29339,29342,29344,29346,29349,29353,29359,29381,29384,29388,29391,29395,29398,29402,29405],[26263,29235],{"description":29236,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":29237},"Google Forms is good at collecting answers and dropping them in a Sheet. The hard part is the other direction, putting data into a form over and over. axiom fills and submits a Google Form for you, pulling each answer from a sheet and working through every row, the short answers, the multiple choice, the dropdowns, the dates. There are three ways to start, with no code, with code, or with a Claude skill.","Automate Google Forms",[21,29239,29241],{"id":29240},"what-i-mean-by-automating-google-forms","What I mean by automating Google Forms",[11,29243],{},[14,29245,29246],{},"Automating Google Forms means a bot does the filling and submitting you would otherwise do by hand. You point it at the form, map each answer to a question, and it works through your data one row at a time. Short answer, paragraph, multiple choice, checkboxes, dropdown, linear scale, date, the bot fills each one the way a person would, hits submit, and starts the next response.",[21,29248,29250],{"id":29249},"reading-responses-is-already-solved","Reading responses is already solved",[11,29252],{},[14,29254,29255],{},"Before you automate anything, know what Google already does. A Google Form pushes every response into a linked Google Sheet, and there is a Forms API and Apps Script on top of that. So if you only need to read the answers, you do not need a bot. The data is already in a Sheet.",[14,29257,29258],{},"The gap is the other direction, getting data into forms. Filling the same form again and again from a list. Seeding a form with test responses before you launch it. Submitting registrations or entries you have been asked to handle. That is where a browser bot earns its place, it does the typing and clicking a person would, at the pace you set.",[21,29260,26295],{"id":26294},[11,29262],{},[14,29264,29265],{},"This is for anyone who has to put the same answers into Google Forms over and over. Submitting entries from a spreadsheet, registering a list of people, logging the same weekly report through a form. And for the team that built a form and wants to test it with a hundred responses before it goes live. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,29267,26304],{"id":26303},[11,29269],{},[14,29271,29272,29273,29276],{},"First, ask if you even need a bot. If you own the form and just want the answers, open the linked Sheet and you are done. If you need to put data in, then map the form. List the questions in order and where each answer comes from in your sheet. Build the steps in the ",[322,29274,26332],{"href":26330,"rel":29275},[2245],", run one row to check it, then loop the rest.",[14,29278,29279,29280,29282],{},"Map first, test one, then let it run. That order saves you from submitting a hundred wrong responses. It is why I would reach for ",[322,29281,26316],{"href":26315}," to lay out the first draft.",[21,29284,29286,29287],{"id":29285},"automate-google-forms-from-a-description","Automate Google Forms from a description ",[727,29288],{"id":513},[11,29290],{},[14,29292,28774,29293,29296,29297,26337,29299,26341],{},[322,29294,26332],{"href":26330,"rel":29295},[2245]," and it builds the steps for you. Give it the questions and where each answer comes from, then run it. ",[322,29298,26336],{"href":26315},[29,29300,26340],{},[26343,29302,29304],{":instructions":29303,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Go to the Google Form page\",\"Enter the name\",\"Select the gender\",\"Enter the email\",\"Enter the address\",\"Enter the zip code\",\"Click submit\"]",[14,29305,29306],{},"To the right is an example. Describe the form and let the AI lay out the steps of your bot.",[21,29308,29310,29311],{"id":29309},"automate-google-forms-in-code","Automate Google Forms in code ",[727,29312],{"id":90},[11,29314],{},[14,29316,29317,26367,29319],{},[29,29318,26366],{},[322,29320,26371],{"href":26370},[26373,29322,29324],{":secondaryLinks":26347,"code":29323,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\nconst FORM = \"https:\u002F\u002Fdocs.google.com\u002Fforms\u002Fd\u002Fe\u002FFORM_ID\u002Fviewform\";\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Each row would come from your Google Sheet\n  const rows = [\n    { name: \"Ada Lovelace\", gender: \"Female\", email: \"ada@example.com\",  address: \"12 Hill St\", zip: \"EC1A 1BB\" },\n    { name: \"Alan Turing\",  gender: \"Male\",   email: \"alan@example.com\", address: \"5 King Rd\",  zip: \"M1 4WP\" },\n  ];\n\n  for (const row of rows) {\n    await page.goto(FORM);\n\n    \u002F\u002F Text fields, matched by their aria-label so a reorder does not break them\n    await page.locator('input[aria-label=\"Name\"]').fill(row.name);\n\n    \u002F\u002F Gender, a multiple choice option clicked by its label\n    await page.getByRole(\"radio\", { name: row.gender }).click();\n\n    await page.locator('input[aria-label=\"Email\"]').fill(row.email);\n    await page.locator('input[aria-label=\"Address\"]').fill(row.address);\n    await page.locator('input[aria-label=\"Zip code\"]').fill(row.zip);\n\n    \u002F\u002F Submit, then start a fresh response\n    await page.getByRole(\"button\", { name: \"Submit\" }).click();\n    await page.getByRole(\"link\", { name: \"Submit another response\" }).click();\n  }\n} finally {\n  await browser.close();\n}\n",[14,29325,26380],{},[26382,29327],{"description":29328,"eyebrow":26385,"image":26386,"imageAlt":29329,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the Google Form. It builds the bot for you, no-code or code, mapping each question to your data and handling the different answer types.","Claude building a Google Forms automation from a description",[21,29331,29333],{"id":29332},"what-can-you-automate-in-google-forms","What can you automate in Google Forms?",[11,29335],{},[14,29337,29338],{},"Most Google Forms. A couple of cases worth knowing first.",[26402,29340],{":cards":29341},"[{\"title\":\"Works well\",\"items\":[\"Submitting entries from a spreadsheet\",\"Short answer and paragraph questions\",\"Multiple choice, checkboxes, and dropdowns\",\"Dates, times, and linear scales\",\"Seeding a form with test responses\"]},{\"title\":\"Harder\",\"items\":[\"File upload questions, which need a signed-in Google account\",\"Forms that require sign-in\",\"Forms with section logic that branches\"]},{\"title\":\"Don't try\",\"items\":[\"Stuffing a poll or a ballot\",\"Submitting spam or fake entries\",\"Anything against Google's terms\"]}]",[21,29343,26408],{"id":26407},[11,29345],{},[14,29347,29348],{},"Google Forms looks simple, but a few things trip up a bot. Here is what I would watch for.",[639,29350,29352],{"id":29351},"target-the-question-with-a-custom-css-selector","Target the question with a custom CSS selector",[14,29354,29355,29356,29358],{},"Google Forms renders each question as a block without a stable id, so a selector tied to position breaks the moment you reorder a question. In the ",[322,29357,26444],{"href":11340},", switch to a custom CSS selector and match on an attribute that does not move, like the field's aria-label. For example:",[719,29360,29362],{"className":27008,"code":29361,"language":27010,"meta":494,"style":494},"input[aria-label=\"Email\"]\n",[90,29363,29364],{"__ignoreMap":494},[727,29365,29366,29369,29371,29374,29376,29379],{"class":729,"line":730},[727,29367,29368],{"class":7745},"input",[727,29370,27020],{"class":768},[727,29372,29373],{"class":1882},"aria-label",[727,29375,4970],{"class":1986},[727,29377,29378],{"class":737},"\"Email\"",[727,29380,17433],{"class":768},[14,29382,29383],{},"That finds the field by its accessible label rather than where it sits on the page, so the step keeps working when the form changes.",[639,29385,29387],{"id":29386},"file-uploads-need-a-google-sign-in","File uploads need a Google sign-in",[14,29389,29390],{},"A file upload question only works when the run is signed into a Google account. Store the cookies for that account, or leave upload questions out.",[639,29392,29394],{"id":29393},"required-questions-and-validation","Required questions and validation",[14,29396,29397],{},"If a required question is empty, or an answer fails validation, the form will not submit. Map every required question before you loop, or the whole run stalls on the first row.",[639,29399,29401],{"id":29400},"test-one-response-first","Test one response first",[14,29403,29404],{},"Run a single row and check the form's response Sheet before you let it loop. That is much easier than deleting a hundred bad responses later.",[811,29406,27174],{},{"title":494,"searchDepth":495,"depth":495,"links":29408},[29409,29410,29411,29412,29413,29414,29415,29416],{"id":29240,"depth":498,"text":29241},{"id":29249,"depth":498,"text":29250},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":29285,"depth":498,"text":29286},{"id":29309,"depth":498,"text":29310},{"id":29332,"depth":498,"text":29333},{"id":26407,"depth":498,"text":26408,"children":29417},[29418,29419,29420,29421],{"id":29351,"depth":495,"text":29352},{"id":29386,"depth":495,"text":29387},{"id":29393,"depth":495,"text":29394},{"id":29400,"depth":495,"text":29401},"Fill and submit Google Forms from a spreadsheet, no code needed. Map each answer to a question, loop every row, and run in the cloud. Google Forms automation from axiom.",{},"\u002Fautomate\u002Fgoogle-forms",{"title":29231,"description":29422},"automate\u002Fgoogle-forms","nEksJQbSADoYTP3X6tdJXdmdSDQB6MTKUAcDiqhP3U8",{"id":29429,"title":29430,"author":26259,"body":29431,"date":523,"description":29589,"extension":506,"meta":29590,"navigation":522,"order":523,"path":29591,"seo":29592,"stem":29593,"__hash__":29594},"automate\u002Fautomate\u002Fgoogle-search-scraper.md","Build a Google search scraper without code | axiom",{"type":8,"value":29432,"toc":29574},[29433,29437,29441,29443,29446,29450,29452,29455,29458,29460,29462,29465,29467,29469,29472,29477,29483,29485,29495,29501,29507,29509,29515,29520,29524,29528,29530,29533,29536,29538,29540,29543,29547,29550,29554,29557,29561,29564,29568],[26263,29434],{"description":29435,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":29436},"Sometimes you need the search results themselves, the titles, links, and snippets for a list of queries, or where your site ranks. A bot can read them off the page into a sheet. The catch is that Google fights scraping harder than anyone, so this works small and slow, on your own research. There are three ways to start, with no code, with code, or with a Claude skill.","Build a Google search scraper",[21,29438,29440],{"id":29439},"what-i-mean-by-a-google-search-scraper","What I mean by a Google search scraper",[11,29442],{},[14,29444,29445],{},"A Google search scraper is a bot that runs a query and reads the results into a sheet. The titles, the links, the snippets, the position each result sits in. Give it a list of queries and it works down them, gathering what comes back. People use it to check where a site ranks, to track results over time, or to pull a topic's results together for research.",[21,29447,29449],{"id":29448},"google-does-not-want-to-be-scraped","Google does not want to be scraped",[11,29451],{},[14,29453,29454],{},"Here is the honest truth up front. Google is the most defended search box on the internet, and it does not want to be scraped. Run too many queries too fast and it throws a CAPTCHA or an unusual-traffic block, and automated querying is against its terms. This is not a target you can hammer.",[14,29456,29457],{},"So set your expectations. For serious or large-scale search data, Google has an official Custom Search API, and there are SERP data providers built for exactly this, and those are the routes that scale. The browser is for the small and occasional, a handful of queries for your own research or rank checks, run slowly, spaced out, and stopped the moment Google pushes back. When you see a CAPTCHA, that is the signal to back off, not to push through.",[21,29459,26295],{"id":26294},[11,29461],{},[14,29463,29464],{},"This is for the person who needs a few search results, not a data empire. An SEO checking where a page ranks for a handful of keywords, a researcher gathering results on a topic, someone tracking how a result moves week to week. Low volume, your own research. If you need search data at scale, the API is your friend, not a scraper. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,29466,26304],{"id":26303},[11,29468],{},[14,29470,29471],{},"Keep it small and slow. Put your queries in a sheet, a handful, not thousands, and have the bot run each one, read the results, and write them back. Put a real pause between queries so you look like a person, not a flood. Watch for any block, and if Google throws a CAPTCHA, stop, do not try to get around it. For anything bigger, switch to the official API.",[14,29473,29474,29475,44],{},"A few queries, spaced out, stop on a block. I would lay out the first draft with ",[322,29476,26316],{"href":26315},[21,29478,29480,29481],{"id":29479},"build-a-google-search-scraper-from-a-description","Build a Google search scraper from a description ",[727,29482],{"id":513},[11,29484],{},[14,29486,29487,29488,26333,29491,26337,29493,26341],{},"Describe the queries in plain words in the ",[322,29489,26332],{"href":26330,"rel":29490},[2245],[322,29492,26336],{"href":26315},[29,29494,26340],{},[26343,29496,29498],{":instructions":29497,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Read the next query from a Google Sheet\",\"Search Google for it\",\"Wait a few seconds before reading\",\"Scrape the title, link, and snippet of each result\",\"Write them to a Google Sheet, then move on\"]",[14,29499,29500],{},"To the right is an example. Describe the queries and the fields you want, and the AI lays out the steps. Keep it slow.",[21,29502,29504,29505],{"id":29503},"build-a-google-search-scraper-in-code","Build a Google search scraper in code ",[727,29506],{"id":90},[11,29508],{},[14,29510,29511,26367,29513],{},[29,29512,26366],{},[322,29514,26371],{"href":26370},[26373,29516,29518],{":secondaryLinks":26347,"code":29517,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  const queries = [\"best running shoes\", \"no code automation\"];\n  const results = [];\n\n  for (const q of queries) {\n    await page.goto(`https:\u002F\u002Fwww.google.com\u002Fsearch?q=${encodeURIComponent(q)}`);\n    await page.waitForSelector(\"#search\");\n\n    const items = await page.$$eval(\"#search a h3\", els =>\n      els.map(h => ({\n        title: h.textContent.trim(),\n        link:  h.closest(\"a\")?.getAttribute(\"href\"),\n      }))\n    );\n    results.push({ query: q, items });\n\n    await page.waitForTimeout(8000); \u002F\u002F a real pause, do not flood\n  }\n\n  console.log(results); \u002F\u002F write these to your sheet\n} finally {\n  await browser.close();\n}\n",[14,29519,26380],{},[26382,29521],{"description":29522,"eyebrow":26385,"image":26386,"imageAlt":29523,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the queries you want. It builds the bot for you, no-code or code, running a few searches and reading the results into a sheet, slowly.","Claude building a Google search scraper from a description",[21,29525,29527],{"id":29526},"what-can-you-scrape","What can you scrape?",[11,29529],{},[14,29531,29532],{},"Small and slow, for your own research. A couple of cases worth knowing first.",[26402,29534],{":cards":29535},"[{\"title\":\"Works well\",\"items\":[\"Titles, links, and snippets for a query\",\"Where your site ranks for a keyword\",\"A handful of queries from a sheet\",\"Tracking a result over time\",\"Spacing queries out on a schedule\"]},{\"title\":\"Harder\",\"items\":[\"Anything at volume, which Google blocks\",\"Results that change by location and login\",\"Ads and features mixed into the results\"]},{\"title\":\"Don't try\",\"items\":[\"Bypassing a CAPTCHA or block\",\"Hammering Google with thousands of queries\",\"Anything against Google's terms\"]}]",[21,29537,26408],{"id":26407},[11,29539],{},[14,29541,29542],{},"Google is the hardest scrape there is, so read this one carefully. Here is what I would watch for.",[639,29544,29546],{"id":29545},"when-you-hit-a-captcha-back-off","When you hit a CAPTCHA, back off",[14,29548,29549],{},"A CAPTCHA or an unusual-traffic message means you have gone too fast. The answer is to slow down or stop, not to push through it. Space your queries out, run fewer, and give it time. There is no version of beating the block that ends well.",[639,29551,29553],{"id":29552},"use-the-api-for-anything-real","Use the API for anything real",[14,29555,29556],{},"For volume, or anything you depend on, Google's official Custom Search API and the SERP data providers exist for a reason. They are built to be queried. A browser scraper is for the small and occasional, not a pipeline.",[639,29558,29560],{"id":29559},"results-are-not-the-same-for-everyone","Results are not the same for everyone",[14,29562,29563],{},"What you scrape depends on location, language, and whether you are signed in. The ranking you see is not the ranking everyone sees, so note the conditions, and do not read too much into one run.",[639,29565,29567],{"id":29566},"go-slow-on-purpose","Go slow on purpose",[14,29569,29570,29571,29573],{},"Put real pauses between queries, run a few at a time, and spread them out. The slower you go, the longer it works. Pick what you read with the ",[322,29572,26444],{"href":11340},", since Google's result markup shifts.",{"title":494,"searchDepth":495,"depth":495,"links":29575},[29576,29577,29578,29579,29580,29581,29582,29583],{"id":29439,"depth":498,"text":29440},{"id":29448,"depth":498,"text":29449},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":29479,"depth":498,"text":29480},{"id":29503,"depth":498,"text":29504},{"id":29526,"depth":498,"text":29527},{"id":26407,"depth":498,"text":26408,"children":29584},[29585,29586,29587,29588],{"id":29545,"depth":495,"text":29546},{"id":29552,"depth":495,"text":29553},{"id":29559,"depth":495,"text":29560},{"id":29566,"depth":495,"text":29567},"Build a Google search scraper without code. Read titles, links, snippets, and rankings into a sheet, small and slow, for your own research. From axiom.",{},"\u002Fautomate\u002Fgoogle-search-scraper",{"title":29430,"description":29589},"automate\u002Fgoogle-search-scraper","x0cKorM3J3V5j7cxRpQyJ-SRRgcBnzCN9TpJWy6b66U",{"id":29596,"title":29597,"author":26259,"body":29598,"date":523,"description":29760,"extension":506,"meta":29761,"navigation":522,"order":523,"path":3377,"seo":29762,"stem":29763,"__hash__":29764},"automate\u002Fautomate\u002Fhelium10-login.md","Automate Helium 10 login and reporting without code | axiom",{"type":8,"value":29599,"toc":29745},[29600,29604,29608,29610,29613,29616,29618,29620,29623,29625,29627,29630,29633,29635,29637,29640,29643,29649,29651,29661,29667,29673,29675,29681,29687,29691,29695,29697,29700,29703,29705,29707,29710,29714,29724,29728,29731,29735,29738,29742],[26263,29601],{"description":29602,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":29603},"Helium 10 is full of data Amazon sellers need every day, and most of it lives behind a login. Cerebro keyword pulls. Magnet searches. Profits exports. Reports that are easier to copy by hand than to wire into a real pipeline. axiom logs into Helium 10 in a real Chromium, runs the report you'd run manually, and drops the result into a Google Sheet or sends it to a webhook. There are three ways to start, with no code, with code, or with a Claude skill.","Automate Helium 10",[21,29605,29607],{"id":29606},"what-i-mean-by-automating-helium-10","What I mean by automating Helium 10",[11,29609],{},[14,29611,29612],{},"Automating Helium 10 means a bot logs in, navigates to the tool you'd use (Cerebro, Magnet, Profits, Black Box, whichever), runs the query, and either downloads the export or scrapes the on-screen table. You point it at the ASINs or keywords from a sheet, and it works through them one at a time, on a schedule if you want.",[14,29614,29615],{},"The login is the hard part. Helium 10 sometimes adds a \"verify it's you\" check or a 2FA step, and a bot has to be prepared for that. axiom handles it by storing the session cookies after a one-time human sign-in, so subsequent runs walk straight past the login screen.",[21,29617,29074],{"id":29073},[11,29619],{},[14,29621,29622],{},"Helium 10 has an API on its highest-tier plans, but most sellers don't subscribe to that tier. The browser is the only path. The right pattern is: log in once (a real human), capture the session, then have axiom drive Chrome with that session loaded. The downloaded CSVs go into a Google Sheet or land in a webhook.",[21,29624,26295],{"id":26294},[11,29626],{},[14,29628,29629],{},"This is for Amazon sellers and agencies that hit Helium 10 every day or every hour. Pulling Cerebro on a list of competitor ASINs. Tracking Magnet results for a set of seed keywords. Checking Black Box for new product ideas on a schedule. Downloading the Profits export for the weekly P&L. If you keep refreshing the same tool with slightly different inputs, a bot can do that for you.",[14,29631,29632],{},"It's also for the developer who wants Helium 10 data wired into a real pipeline. The browser is the only stable surface, and our cloud Chromium runs the same Playwright or Puppeteer scripts you'd write locally.",[21,29634,26304],{"id":26303},[11,29636],{},[14,29638,29639],{},"Don't try to log in with a username and password from a bot. Helium 10 will block it, and even when it doesn't, the experience is fragile. Instead, sign in once by hand, capture the session cookies in axiom, and load those on every run. From there, the click work is the same as any other web app.",[14,29641,29642],{},"For the report itself, decide up front whether you're downloading the CSV or scraping the on-screen table. Downloading is more reliable but adds a \"wait for file\" step; scraping is faster but breaks when Helium 10 changes the table layout.",[21,29644,29646,29647],{"id":29645},"automate-helium-10-from-a-description","Automate Helium 10 from a description ",[727,29648],{"id":513},[11,29650],{},[14,29652,28246,29653,29656,29657,26337,29659,26341],{},[322,29654,26332],{"href":26330,"rel":29655},[2245]," and it builds the steps for you. Tell it the tool to open, the input list, and where the result should land. ",[322,29658,26336],{"href":26315},[29,29660,26340],{},[26343,29662,29664],{":instructions":29663,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Go to members.helium10.com and load my saved session\",\"Open Cerebro\",\"For each ASIN in my Google Sheet, paste it into the search box\",\"Click Get Keywords\",\"Download the CSV\",\"Append the rows to a results tab in the sheet\"]",[14,29665,29666],{},"To the right is an example. Describe the report and let the AI lay out the steps of your bot.",[21,29668,29670,29671],{"id":29669},"automate-helium-10-in-code","Automate Helium 10 in code ",[727,29672],{"id":90},[11,29674],{},[14,29676,29677,26367,29679],{},[29,29678,26366],{},[322,29680,26371],{"href":26370},[26373,29682,29684],{":secondaryLinks":26347,"code":29683,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\nconst CEREBRO = \"https:\u002F\u002Fmembers.helium10.com\u002Fcerebro\";\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Cookies for the signed-in Helium 10 session are loaded into the run\n  await page.goto(CEREBRO);\n  await page.waitForLoadState(\"networkidle\");\n\n  \u002F\u002F Each ASIN would come from your Google Sheet\n  const asins = [\"B08N5WRWNW\", \"B0BSHF7WHW\", \"B09B8V1LZ3\"];\n\n  for (const asin of asins) {\n    await page.locator('input[placeholder*=\"ASIN\"]').fill(asin);\n    await page.getByRole(\"button\", { name: \"Get Keywords\" }).click();\n    await page.getByRole(\"button\", { name: \u002FExport CSV\u002Fi }).waitFor({ state: \"visible\", timeout: 60000 });\n    const download = await Promise.all([\n      page.waitForEvent(\"download\"),\n      page.getByRole(\"button\", { name: \u002FExport CSV\u002Fi }).click(),\n    ]).then(([d]) => d);\n    console.log(asin, await download.path());\n  }\n} finally {\n  await browser.close();\n}\n",[14,29685,29686],{},"Connect Playwright (or Puppeteer) to our cloud Chromium and write the same scripts you'd run locally, without managing the browser. The cookies for the signed-in Helium 10 session need to be loaded into the run.",[26382,29688],{"description":29689,"eyebrow":26385,"image":26386,"imageAlt":29690,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the Helium 10 report you want. It builds the bot for you, no-code or code, handling the login, the query, and dropping the result into a sheet.","Claude building a Helium 10 automation from a description",[21,29692,29694],{"id":29693},"what-can-you-automate-in-helium-10","What can you automate in Helium 10?",[11,29696],{},[14,29698,29699],{},"Most of the click work in the seller tools. A couple of cases worth knowing first.",[26402,29701],{":cards":29702},"[{\"title\":\"Works well\",\"items\":[\"Pulling Cerebro keywords for a list of competitor ASINs\",\"Running Magnet on a list of seed keywords\",\"Downloading the Profits export on a schedule\",\"Black Box product searches with consistent filters\",\"Keyword tracker daily snapshots\"]},{\"title\":\"Harder\",\"items\":[\"The very first sign-in (do it once by hand and capture the session)\",\"Reports that take minutes to generate (add longer waits)\",\"Tools that gate behind extra 2FA on each open\"]},{\"title\":\"Don't try\",\"items\":[\"Sharing your session with anyone outside your team\",\"Anything against Helium 10's terms of service\",\"Running far above your plan's daily limit (you'll get rate-limited)\"]}]",[21,29704,26408],{"id":26407},[11,29706],{},[14,29708,29709],{},"Helium 10 is a friendly site for a bot once you're past the login. A few quirks bite if you don't plan for them.",[639,29711,29713],{"id":29712},"capture-the-session-cookies-once","Capture the session cookies once",[14,29715,29716,29717,450,29720,29723],{},"Don't script the username\u002Fpassword. Sign in once in a normal Chrome with axiom's extension, save the cookies for the ",[90,29718,29719],{},"helium10.com",[90,29721,29722],{},"members.helium10.com"," domains, and load those into every run.",[639,29725,29727],{"id":29726},"reports-take-time-to-generate","Reports take time to generate",[14,29729,29730],{},"Cerebro and Magnet can take 30-60 seconds to produce a result on a busy account. Wait for a specific element (the Export button, a row count, a results header) rather than a fixed timeout.",[639,29732,29734],{"id":29733},"watch-the-daily-limits","Watch the daily limits",[14,29736,29737],{},"Every Helium 10 plan has per-tool daily limits. A bot will burn through them fast if you don't pace the runs. Add a delay between iterations, or chunk the work across the day.",[639,29739,29741],{"id":29740},"test-one-input-first","Test one input first",[14,29743,29744],{},"Pick one ASIN or keyword and run it end-to-end. Confirm the result lands where you expect, then loop the rest.",{"title":494,"searchDepth":495,"depth":495,"links":29746},[29747,29748,29749,29750,29751,29752,29753,29754],{"id":29606,"depth":498,"text":29607},{"id":29073,"depth":498,"text":29074},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":29645,"depth":498,"text":29646},{"id":29669,"depth":498,"text":29670},{"id":29693,"depth":498,"text":29694},{"id":26407,"depth":498,"text":26408,"children":29755},[29756,29757,29758,29759],{"id":29712,"depth":495,"text":29713},{"id":29726,"depth":495,"text":29727},{"id":29733,"depth":495,"text":29734},{"id":29740,"depth":495,"text":29741},"Log into Helium 10 on a schedule, pull a Cerebro or Magnet report, and drop it in a Sheet. axiom handles the login and the click work, no code needed.",{},{"title":29597,"description":29760},"automate\u002Fhelium10-login","d5R36BqrwWfEYVsCQvCwS4_9RNoLuj_4JebWOhs4c7k",{"id":26222,"title":26223,"author":523,"body":29766,"date":523,"description":494,"extension":506,"meta":29784,"navigation":522,"order":523,"path":26251,"seo":29785,"stem":26253,"__hash__":26254},{"type":8,"value":29767,"toc":29782},[29768,29770,29772,29775,29779],[12701,29769],{"description":26228,"headline":26229},[26231,29771],{":perPage":26233,"folder":26234},[12744,29773],{"author":26237,"className":29774,"quote":26239},[12752],[26241,29776,29777],{"bg-class":12752},[12749,29778],{},[12755,29780],{"className":29781},[12752],{"title":494,"searchDepth":495,"depth":495,"links":29783},[],{},{"title":26223,"description":494},{"id":29787,"title":29788,"author":26259,"body":29789,"date":523,"description":29942,"extension":506,"meta":29943,"navigation":522,"order":523,"path":29944,"seo":29945,"stem":29946,"__hash__":29947},"automate\u002Fautomate\u002Finstagram.md","Automate Instagram on the web without code | axiom",{"type":8,"value":29790,"toc":29927},[29791,29795,29799,29801,29804,29808,29810,29813,29816,29818,29820,29823,29825,29827,29830,29835,29841,29843,29853,29859,29865,29867,29873,29878,29882,29886,29888,29891,29894,29896,29898,29901,29905,29908,29912,29915,29919,29922,29924],[26263,29792],{"description":29793,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":29794},"Instagram on the web can be automated for the things you would do by hand, posting, commenting, replying to DMs, liking, and scraping public profiles and search results. The catch is Instagram's limits. Push too hard and you get blocked, so the trick is doing it at a human pace on your own account. There are three ways to start, with no code, with code, or with a Claude skill.","Automate Instagram on the web",[21,29796,29798],{"id":29797},"what-i-mean-by-automating-instagram","What I mean by automating Instagram",[11,29800],{},[14,29802,29803],{},"Automating Instagram splits into two halves, both on the website. One is acting on your own account, posting content, replying to comments and DMs, liking, the routine upkeep you do by hand. The other is scraping public data, running a follower scraper on a public profile, pulling results from a search, or reading the pages and content types Instagram shows on the web. A bot can do either, within what the website exposes and what Instagram allows.",[21,29805,29807],{"id":29806},"the-whole-game-is-staying-under-instagrams-limits","The whole game is staying under Instagram's limits",[11,29809],{},[14,29811,29812],{},"Instagram is one of the strictest platforms to automate. It rate-limits actions hard and watches closely for anything that looks like a bot. Like, comment, follow, or DM too much too fast and you get action-blocked, then banned. Scraping Instagram too aggressively gets you the same.",[14,29814,29815],{},"So the whole game is staying under the line. A real person likes a handful of posts, sends a few DMs, leaves the odd comment, across a day, not a thousand in an hour. The automation that survives on Instagram mimics that, your own account, human pace, spread out, with waits and caps. axiom gives you the controls to set that pace. The moment you push past it, Instagram pushes back, so the limits are not a suggestion, they are the design.",[21,29817,26295],{"id":26294},[11,29819],{},[14,29821,29822],{},"This is for the creator, the small brand, or the researcher working with their own Instagram presence or with public data. Posting and replying on your account without living in the app, or pulling a public follower list or search result into a sheet for analysis. One account, human pace. If you are looking to spam, mass-DM, or run a follow-for-follow farm, this is not the tool. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,29824,26304],{"id":26303},[11,29826],{},[14,29828,29829],{},"Set the pace first. Decide how many actions a day is reasonable for a real person, then cap the bot well under Instagram's limits and spread the work out with waits. Run on your own account with your own logged-in session. For scraping, take only what is public, go slow, and pull it into a sheet to work with. Start with one task, watch for any block, and back off if you see one.",[14,29831,29832,29833,44],{},"Human pace, your account, public data, back off on a block. I would lay out the first draft with ",[322,29834,26316],{"href":26315},[21,29836,29838,29839],{"id":29837},"automate-instagram-from-a-description","Automate Instagram from a description ",[727,29840],{"id":513},[11,29842],{},[14,29844,29845,29846,26333,29849,26337,29851,26341],{},"Describe what you act on or scrape in plain words in the ",[322,29847,26332],{"href":26330,"rel":29848},[2245],[322,29850,26336],{"href":26315},[29,29852,26340],{},[26343,29854,29856],{":instructions":29855,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Read the profile links from a Google Sheet\",\"Go to each profile page\",\"Click the followers list\",\"Scrape the follower data\",\"Write it back to the Google Sheet\"]",[14,29857,29858],{},"To the right is an example. Describe what you act on or scrape, and the AI lays out the steps. Keep the pace human.",[21,29860,29862,29863],{"id":29861},"automate-instagram-in-code","Automate Instagram in code ",[727,29864],{"id":90},[11,29866],{},[14,29868,29869,26367,29871],{},[29,29870,26366],{},[322,29872,26371],{"href":26370},[26373,29874,29876],{":secondaryLinks":26347,"code":29875,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Your own logged-in session, on a public profile\n  await page.goto(\"https:\u002F\u002Fwww.instagram.com\u002Fsome_public_profile\u002F\");\n  await page.getByRole(\"link\", { name: \u002Ffollowers\u002F }).click();\n  await page.waitForSelector('div[role=\"dialog\"]');\n\n  const handles = new Set();\n  const cap = 200; \u002F\u002F keep it modest, do not hammer\n\n  \u002F\u002F Scroll the list slowly, collecting handles, stopping at the cap\n  while (handles.size \u003C cap) {\n    const found = await page.$$eval('div[role=\"dialog\"] a', els =>\n      els.map(a => a.getAttribute(\"href\")).filter(Boolean)\n    );\n    found.forEach(h => handles.add(h));\n\n    await page.mouse.wheel(0, 800);\n    await page.waitForTimeout(1500); \u002F\u002F a human-paced pause\n    if (found.length === 0) break;\n  }\n\n  console.log([...handles].slice(0, cap)); \u002F\u002F save to your sheet\n} finally {\n  await browser.close();\n}\n",[14,29877,26380],{},[26382,29879],{"description":29880,"eyebrow":26385,"image":26386,"imageAlt":29881,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe what you act on or scrape. It builds the bot for you, no-code or code, with the pace and caps that keep your account safe.","Claude building an Instagram automation from a description",[21,29883,29885],{"id":29884},"what-can-you-automate-and-scrape","What can you automate and scrape?",[11,29887],{},[14,29889,29890],{},"On the website, within Instagram's limits. A couple of lines to stay on the right side of.",[26402,29892],{":cards":29893},"[{\"title\":\"Works well\",\"items\":[\"Posting and scheduling your own content\",\"Replying to your comments and DMs\",\"Liking at a modest, human pace\",\"Scraping public followers from a profile\",\"Scraping public search results into a sheet\"]},{\"title\":\"Harder\",\"items\":[\"Anything the mobile app does but the web does not\",\"Instagram's rate limits and bot checks\",\"Lists too large to scrape in one sitting\"]},{\"title\":\"Don't try\",\"items\":[\"Mass likes, follows, or DMs\",\"Comment or follow-for-follow spam\",\"Scraping private data or anything against Instagram's terms\"]}]",[21,29895,26408],{"id":26407},[11,29897],{},[14,29899,29900],{},"Instagram punishes automation that overdoes it, so this is the page to read carefully. Here is what I would watch for.",[639,29902,29904],{"id":29903},"stay-well-under-the-limits","Stay well under the limits",[14,29906,29907],{},"Instagram caps actions per hour and per day, and the exact numbers move. Set your bot well below what you think the limit is, add waits, and spread work across the day. A block is the warning, a ban is what comes next.",[639,29909,29911],{"id":29910},"use-your-own-session-slowly","Use your own session, slowly",[14,29913,29914],{},"Sign in as yourself and store the cookies. Fresh logins, a new device, and bursts of activity are exactly what Instagram flags. Ease into it rather than running flat out on day one.",[639,29916,29918],{"id":29917},"scrape-only-what-is-public","Scrape only what is public",[14,29920,29921],{},"Pull public profiles and search results, not private data, and not faster than a person would scroll. Respect what people chose to make public and what Instagram's terms allow.",[639,29923,27642],{"id":27641},[14,29925,29926],{},"Instagram is mobile-first. Some content and actions only exist in the app, so a website bot reaches what the web exposes. Check the web can do the task before you build it.",{"title":494,"searchDepth":495,"depth":495,"links":29928},[29929,29930,29931,29932,29933,29934,29935,29936],{"id":29797,"depth":498,"text":29798},{"id":29806,"depth":498,"text":29807},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":29837,"depth":498,"text":29838},{"id":29861,"depth":498,"text":29862},{"id":29884,"depth":498,"text":29885},{"id":26407,"depth":498,"text":26408,"children":29937},[29938,29939,29940,29941],{"id":29903,"depth":495,"text":29904},{"id":29910,"depth":495,"text":29911},{"id":29917,"depth":495,"text":29918},{"id":27641,"depth":495,"text":27642},"Automate Instagram on the web without code. Post, comment, DM, like, and scrape public followers and search results, at a human pace within Instagram's limits. From axiom.",{},"\u002Fautomate\u002Finstagram",{"title":29788,"description":29942},"automate\u002Finstagram","vF_VNAWxy9K86xrJbCCJTHOo1Z1wXZMGk0sOjDW2lY4",{"id":29949,"title":29950,"author":26259,"body":29951,"date":523,"description":30123,"extension":506,"meta":30124,"navigation":522,"order":523,"path":30125,"seo":30126,"stem":30127,"__hash__":30128},"automate\u002Fautomate\u002Flike-a-macro-recorder.md","Browser macro recorder and iMacros alternative | axiom",{"type":8,"value":29952,"toc":30107},[29953,29957,29961,29963,29966,29970,29972,29975,29978,29982,29984,29987,29989,29991,29994,29996,29998,30005,30011,30017,30019,30029,30035,30041,30043,30050,30055,30059,30061,30063,30066,30069,30071,30073,30076,30080,30086,30090,30093,30097,30100,30104],[26263,29954],{"description":29955,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":29956},"A browser macro repeats a task you would otherwise do by hand. iMacros was the tool people used for twenty years, until it was discontinued in 2023 when browsers dropped the old extension tech it ran on. axiom picks up where it left off, but it does not capture your clicks the way the old tools did. You build the steps, or describe the task, tied to the page instead of to pixels. There are three ways to start, with no code, with code, or with a Claude skill.","A macro recorder for the browser",[21,29958,29960],{"id":29959},"what-i-mean-by-a-browser-macro-recorder","What I mean by a browser macro recorder",[11,29962],{},[14,29964,29965],{},"A browser macro is a set of steps you set up once and run again and again. iMacros, first released in 2001, was the first tool built for the browser, and for two decades it was how people filled forms and moved data without code. It was discontinued in November 2023, because it leaned on Manifest V2 extensions that Chrome and Firefox stopped supporting, and there was no one left to rebuild it. By a browser macro recorder I mean that same idea of setting a task up once, kept alive on tech browsers still support, and tied to the elements on the page so it does not fall apart the moment the layout shifts. The difference is that you build or describe the steps, you do not chase brittle clicks.",[21,29967,29969],{"id":29968},"how-it-does-more-and-where-it-draws-the-line","How it does more, and where it draws the line",[11,29971],{},[14,29973,29974],{},"The old browser tools captured your clicks and played them back, and not much else. axiom is step based, so each action is a step you can see, reorder, and edit. It targets elements, not screen positions, so a button that moves is still found. It adds logic and loops, so one macro runs every row in a sheet, not just the one you set up. It reads data from Google Sheets, Excel, or a webhook. And it runs in the cloud on a schedule, not only on your machine while you watch.",[14,29976,29977],{},"The line axiom draws is the browser. The old desktop macro tools roamed the whole operating system, opening apps and moving files. axiom stays in Chrome, the way iMacros did. If your repetitive work lives in a browser, that focus is the point. If it is spread across desktop apps, an old desktop macro tool still has its place.",[21,29979,29981],{"id":29980},"looking-for-an-imacros-alternative","Looking for an iMacros alternative",[11,29983],{},[14,29985,29986],{},"iMacros shut down in 2023 and left a lot of people with macros that no longer run. axiom is the closest replacement, built for the same job of filling forms and moving data in the browser, without the dead extension tech underneath. Your old iMacros scripts will not import, the formats are different, but you can rebuild the same flow in minutes, by describing it or building it step by step.",[21,29988,26295],{"id":26294},[11,29990],{},[14,29992,29993],{},"This is for the iMacros user left without a tool when it shut down. For anyone whose old browser macro broke the first time the site changed. For people pushing the same data into the same forms and dashboards every day who want a macro that survives a layout change. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,29995,26304],{"id":26303},[11,29997],{},[14,29999,30000,30001,30004],{},"I would build it step by step first. Open the page, add each step you would do by hand, and you have a macro. Then I would make it survive. Swap any shaky step for a ",[322,30002,30003],{"href":11340},"selector"," so it targets the element and not a spot on the page. Add a loop if you want it to run every row from a sheet. Then run it in the cloud on a schedule.",[14,30006,30007,30008,30010],{},"Build, harden, loop, schedule. That order keeps it simple, and it is the same order whether you stay no-code or move into code. That is why I would reach for ",[322,30009,26316],{"href":26315}," to lay out the first draft, then tidy the steps.",[21,30012,30014,30015],{"id":30013},"build-a-browser-macro-from-a-description","Build a browser macro from a description ",[727,30016],{"id":513},[11,30018],{},[14,30020,30021,30022,26333,30025,26337,30027,26341],{},"Describe the macro in plain words in the ",[322,30023,26332],{"href":26330,"rel":30024},[2245],[322,30026,26336],{"href":26315},[29,30028,26340],{},[26343,30030,30032],{":instructions":30031,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Go to the dashboard and log in\",\"Open the orders page\",\"Read each order number from a Google Sheet\",\"Update the status field for each one\",\"Save, then move to the next row\"]",[14,30033,30034],{},"To the right is an example. Describe the task and let the AI lay out the steps of your macro.",[21,30036,30038,30039],{"id":30037},"build-a-browser-macro-in-code","Build a browser macro in code ",[727,30040],{"id":90},[11,30042],{},[14,30044,30045,30047,30048],{},[29,30046,26366],{}," If you would rather script the macro yourself, this is the path. ",[322,30049,26371],{"href":26370},[26373,30051,30053],{":secondaryLinks":26347,"code":30052,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Log in once\n  await page.goto(\"https:\u002F\u002Fexample.com\u002Flogin\");\n  await page.fill(\"#email\", process.env.SITE_EMAIL);\n  await page.fill(\"#password\", process.env.SITE_PASSWORD);\n  await page.click(\"button[type=submit]\");\n\n  \u002F\u002F The macro, written as steps. Each row would come from your sheet.\n  const rows = [\n    { order: \"1001\", status: \"Shipped\" },\n    { order: \"1002\", status: \"Shipped\" },\n  ];\n\n  for (const row of rows) {\n    \u002F\u002F Run the same steps for every row\n    await page.goto(\"https:\u002F\u002Fexample.com\u002Forders\");\n    await page.fill(\"#search\", row.order);\n    await page.keyboard.press(\"Enter\");\n\n    \u002F\u002F Target the element, not a screen position, so a moved button is still found\n    await page.waitForSelector(\".order-row\");\n    await page.click(\".order-row .edit\");\n\n    await page.selectOption(\"#status\", row.status);\n    await page.click(\"button[type=submit]\");\n    await page.waitForSelector(\".saved\");\n  }\n} finally {\n  await browser.close();\n}\n",[14,30054,26380],{},[26382,30056],{"description":30057,"eyebrow":26385,"image":26386,"imageAlt":30058,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the macro. It builds the bot for you, no-code or code, and hardens the brittle steps so a layout change does not break it.","Claude building a browser macro from a description",[21,30060,26395],{"id":26394},[11,30062],{},[14,30064,30065],{},"Most repetitive browser tasks. A couple of cases worth knowing first.",[26402,30067],{":cards":30068},"[{\"title\":\"Works well\",\"items\":[\"Filling and submitting the same form repeatedly\",\"Moving data between a sheet and a web app\",\"Updating records in a dashboard\",\"Downloading reports on a schedule\",\"Logging in and checking a status\"]},{\"title\":\"Harder\",\"items\":[\"Long multi-page flows\",\"Sites that change their layout often\",\"Sites with throttling or rate limiting\"]},{\"title\":\"Don't try\",\"items\":[\"Replaying clicks to game a system\",\"Anything against a site's terms\",\"Spamming forms\"]}]",[21,30070,26408],{"id":26407},[11,30072],{},[14,30074,30075],{},"A browser macro is easy to start and easy to trip up. Here is what I would watch for.",[639,30077,30079],{"id":30078},"a-step-that-targets-the-wrong-place","A step that targets the wrong place",[14,30081,30082,30083,30085],{},"A click tied to a position breaks when the page moves. Repick the element with the ",[322,30084,26444],{"href":11340}," so the step targets the element itself. This is the single biggest reason old macros broke.",[639,30087,30089],{"id":30088},"timing-on-dynamic-pages","Timing on dynamic pages",[14,30091,30092],{},"If a step runs before the page is ready, the macro misses it. Add a wait for the element, or let the no-code tool handle the waiting for you. Pages that load in pieces need this most.",[639,30094,30096],{"id":30095},"login-state","Login state",[14,30098,30099],{},"If the macro needs to be signed in, store the cookies so the session carries over, rather than logging in on every run.",[639,30101,30103],{"id":30102},"the-tech-the-tool-runs-on","The tech the tool runs on",[14,30105,30106],{},"Old macro tools died when Chrome dropped Manifest V2 extensions, iMacros among them. If a tool still depends on V2, its days are numbered. Build your macros on current extension tech so the work you do now keeps running.",{"title":494,"searchDepth":495,"depth":495,"links":30108},[30109,30110,30111,30112,30113,30114,30115,30116,30117],{"id":29959,"depth":498,"text":29960},{"id":29968,"depth":498,"text":29969},{"id":29980,"depth":498,"text":29981},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":30013,"depth":498,"text":30014},{"id":30037,"depth":498,"text":30038},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":30118},[30119,30120,30121,30122],{"id":30078,"depth":495,"text":30079},{"id":30088,"depth":495,"text":30089},{"id":30095,"depth":495,"text":30096},{"id":30102,"depth":495,"text":30103},"Repeat any browser task without code. A modern browser macro recorder that survives layout changes, loops over your data, and runs in the cloud. The iMacros alternative from axiom.",{},"\u002Fautomate\u002Flike-a-macro-recorder",{"title":29950,"description":30123},"automate\u002Flike-a-macro-recorder","mqE5Fg95jzOkODdvE1xyZ8zQWooPcNEKU0SkvzYqCD8",{"id":30130,"title":30131,"author":26259,"body":30132,"date":523,"description":30287,"extension":506,"meta":30288,"navigation":522,"order":523,"path":30289,"seo":30290,"stem":30291,"__hash__":30292},"automate\u002Fautomate\u002Flogin.md","Automate login without code | axiom",{"type":8,"value":30133,"toc":30272},[30134,30138,30142,30144,30147,30151,30153,30156,30159,30161,30163,30166,30168,30170,30173,30178,30184,30186,30196,30202,30208,30210,30216,30221,30225,30229,30231,30234,30237,30239,30241,30244,30248,30251,30255,30258,30262,30265,30269],[26263,30135],{"description":30136,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":30137},"Most of the work worth automating sits behind a login. A bot can sign in for you, then do whatever you would do once you are in, fill a form, pull a report, download a file. There are two ways in, carry your existing session or sign in as steps. There are three ways to start, with no code, with code, or with a Claude skill.","Automate login",[21,30139,30141],{"id":30140},"what-i-mean-by-automating-login","What I mean by automating login",[11,30143],{},[14,30145,30146],{},"Automating login means a bot gets past the sign-in page so it can do its real job. It either reuses the session you are already logged into, or it enters a username and password the way you would, then carries on. Login is rarely the task by itself. It is the step that unlocks the form, the dashboard, or the file you actually came for.",[21,30148,30150],{"id":30149},"login-is-the-door-not-the-destination","Login is the door, not the destination",[11,30152],{},[14,30154,30155],{},"Nobody automates a login for its own sake. You automate it to reach what is behind it, the orders to update, the report to pull, the invoices to download. So the real question is not how to log in, it is how to stay logged in long enough to get the work done.",[14,30157,30158],{},"There are two ways in. Carry your session, where the bot uses the cookies from a browser you are already signed into, so it never types a password. Or sign in as steps, where the bot enters the username and password itself. Cookies are simpler and safer when they work. Steps are more reliable for a fresh cloud run with no session to borrow. Most setups use one or the other, and the right pick depends on where the bot runs.",[21,30160,26295],{"id":26294},[11,30162],{},[14,30164,30165],{},"This is for anyone whose work lives behind a login. Pulling numbers from a dashboard you sign into, updating records in a portal, downloading statements from a bank or a SaaS tool. The login is just the gate you pass every time, and a bot can pass it for you. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,30167,26304],{"id":26303},[11,30169],{},[14,30171,30172],{},"Try cookies first. If you run on the desktop, the bot can use the session from your own Chrome, so there is no password anywhere in the automation. If you run in the cloud with no session to borrow, sign in as steps and store the credentials securely rather than in plain text. Either way, build everything after the login first and add the sign-in last, so you are not logging in over and over while you test.",[14,30174,30175,30176,44],{},"Cookies if you can, steps if you must, login last. That order is faster and safer. I would lay out the first draft with ",[322,30177,26316],{"href":26315},[21,30179,30181,30182],{"id":30180},"automate-login-from-a-description","Automate login from a description ",[727,30183],{"id":513},[11,30185],{},[14,30187,30188,30189,26333,30192,26337,30194,26341],{},"Describe the sign-in in plain words in the ",[322,30190,26332],{"href":26330,"rel":30191},[2245],[322,30193,26336],{"href":26315},[29,30195,26340],{},[26343,30197,30199],{":instructions":30198,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Go to the login page\",\"Enter the username\",\"Enter the password\",\"Click sign in\",\"Carry on to the dashboard\"]",[14,30200,30201],{},"To the right is an example. Describe the sign-in, or skip it by carrying your session, and the AI lays out the steps.",[21,30203,30205,30206],{"id":30204},"automate-login-in-code","Automate login in code ",[727,30207],{"id":90},[11,30209],{},[14,30211,30212,26367,30214],{},[29,30213,26366],{},[322,30215,26371],{"href":26370},[26373,30217,30219],{":secondaryLinks":26347,"code":30218,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Sign in as steps. Keep the credentials in env vars, never in the code.\n  await page.goto(\"https:\u002F\u002Fexample.com\u002Flogin\");\n  await page.fill(\"#email\", process.env.SITE_EMAIL);\n  await page.fill(\"#password\", process.env.SITE_PASSWORD);\n  await page.click(\"button[type=submit]\");\n\n  \u002F\u002F Wait until you are actually in before doing the real work\n  await page.waitForSelector(\".dashboard\");\n\n  \u002F\u002F Now do whatever sits behind the login\n  await page.goto(\"https:\u002F\u002Fexample.com\u002Freports\");\n  \u002F\u002F ...extract, download, or input here\n} finally {\n  await browser.close();\n}\n",[14,30220,26380],{},[26382,30222],{"description":30223,"eyebrow":26385,"image":26386,"imageAlt":30224,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the site and how you sign in. It builds the bot for you, no-code or code, with cookies or a sign-in step, then on to the work behind the login.","Claude building a login automation from a description",[21,30226,30228],{"id":30227},"what-can-you-do-behind-a-login","What can you do behind a login?",[11,30230],{},[14,30232,30233],{},"Anything you can do once you are in. A couple of cases worth knowing first.",[26402,30235],{":cards":30236},"[{\"title\":\"Works well\",\"items\":[\"Pulling reports from a dashboard\",\"Updating records in a portal\",\"Downloading statements and files\",\"Filling forms behind a login\",\"Reusing your existing session with cookies\"]},{\"title\":\"Harder\",\"items\":[\"2FA and one-time codes\",\"Captcha on the login page\",\"Sessions that expire mid-run\"]},{\"title\":\"Don't try\",\"items\":[\"Logging into accounts that are not yours\",\"Sharing or selling credentials\",\"Anything against a site's terms\"]}]",[21,30238,26408],{"id":26407},[11,30240],{},[14,30242,30243],{},"The login is the riskiest part to get wrong, for your data and for the account. Here is what I would watch for.",[639,30245,30247],{"id":30246},"storing-passwords","Storing passwords",[14,30249,30250],{},"Never put a password in plain text in the bot. Use secure credential storage, or pull it from an environment variable. Better still, skip the password entirely by carrying your existing session with cookies.",[639,30252,30254],{"id":30253},"cookies-expire","Cookies expire",[14,30256,30257],{},"A stored session does not last forever. When the bot suddenly lands on the login page, the cookies have expired. Refresh them, or fall back to a sign-in step. Build for the day the session runs out, because it will.",[639,30259,30261],{"id":30260},"_2fa","2FA",[14,30263,30264],{},"Two-factor login is the hard one. Some flows work if the bot can read a code from email or an app, others cannot. The cleanest fix is often to carry a session that is already past 2FA, so the bot never faces the prompt.",[639,30266,30268],{"id":30267},"sign-in-last","Sign in last",[14,30270,30271],{},"Add the login step after everything else works. Testing a flow that logs in on every run is slow and can trip a site's checks. Build the work first, attach the login at the end.",{"title":494,"searchDepth":495,"depth":495,"links":30273},[30274,30275,30276,30277,30278,30279,30280,30281],{"id":30140,"depth":498,"text":30141},{"id":30149,"depth":498,"text":30150},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":30180,"depth":498,"text":30181},{"id":30204,"depth":498,"text":30205},{"id":30227,"depth":498,"text":30228},{"id":26407,"depth":498,"text":26408,"children":30282},[30283,30284,30285,30286],{"id":30246,"depth":495,"text":30247},{"id":30253,"depth":495,"text":30254},{"id":30260,"depth":495,"text":30261},{"id":30267,"depth":495,"text":30268},"Automate login without code, so a bot can work behind the wall. Sign in with stored cookies or as steps, then input, extract, or download anything behind a login. From axiom.",{},"\u002Fautomate\u002Flogin",{"title":30131,"description":30287},"automate\u002Flogin","umbyw2xJAdnP4hptDY7DztwqMkORwEvPeydIv9tZGRY",{"id":30294,"title":30295,"author":26259,"body":30296,"date":523,"description":30461,"extension":506,"meta":30462,"navigation":522,"order":523,"path":30463,"seo":30464,"stem":30465,"__hash__":30466},"automate\u002Fautomate\u002Fquora.md","Automate Quora without code | axiom",{"type":8,"value":30297,"toc":30446},[30298,30302,30306,30308,30311,30314,30318,30320,30323,30326,30328,30330,30333,30335,30337,30346,30349,30352,30358,30360,30371,30377,30383,30385,30391,30397,30401,30405,30407,30410,30413,30415,30417,30420,30424,30427,30431,30434,30438,30441,30443],[26263,30299],{"description":30300,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":30301},"Quora is a research goldmine and a research nightmare. The answers you want are buried in long threads, the feed reloads as you scroll, the topic pages don't paginate. axiom drives Quora in a real Chromium so you can pull the answers under a question, watch a topic feed for new posts, or schedule your own posts from a sheet. There are three ways to start, with no code, with code, or with a Claude skill.","Automate Quora",[21,30303,30305],{"id":30304},"what-i-mean-by-automating-quora","What I mean by automating Quora",[11,30307],{},[14,30309,30310],{},"Automating Quora means a bot does the reading and writing you would otherwise do by hand in the browser. Scrolling through a question and capturing every answer. Watching a topic feed for posts that mention your competitors or your product. Pulling the answers a specific writer has posted. Or, less often, posting an answer of your own on a schedule from a sheet of drafts.",[14,30312,30313],{},"Quora doesn't publish a useful API. The browser is the only path, and an infinite-scroll feed plus a login gate is exactly the shape a browser bot handles well.",[21,30315,30317],{"id":30316},"reading-the-firehose-isnt-already-solved","Reading the firehose isn't already solved",[11,30319],{},[14,30321,30322],{},"Quora has no developer API for reading answers or feeds. There's the Quora Partner Program for monetisation and Quora Ads, but neither lets you pull content. So if you want to track a topic, monitor a competitor, or collect answers for research, a browser bot is the only path that scales beyond manual copy-paste.",[14,30324,30325],{},"Posting is easier — you can post in a normal Chrome session — but doing it from a sheet, on a schedule, in a way that respects the per-day limits, is what makes a bot worth it.",[21,30327,26295],{"id":26294},[11,30329],{},[14,30331,30332],{},"This is for marketing teams tracking what's being said about a product on Quora. Researchers pulling answer data for a paper. SEO teams monitoring questions in their niche. Content teams scheduling answers from a content calendar. And for the developer who wants Quora data wired into a research pipeline.",[21,30334,26304],{"id":26303},[11,30336],{},[14,30338,30339,30340,3289,30342,30345],{},"Start by deciding ",[807,30341,29082],{},[807,30343,30344],{},"write",". They're different shapes.",[14,30347,30348],{},"For reading: pick the URL pattern you'll iterate over (question pages, topic feeds, writer profiles) and the data you want from each (answer text, author, upvote count, posted date). Build a step that scrolls until \"Show more\" stops appearing, then scrape the answers. Loop the URLs from a sheet.",[14,30350,30351],{},"For writing: load a saved session, paste the draft from your sheet, click Submit, then wait long enough that you're not posting at machine speed. Quora is sharp on machine-pattern detection.",[21,30353,30355,30356],{"id":30354},"automate-quora-from-a-description","Automate Quora from a description ",[727,30357],{"id":513},[11,30359],{},[14,30361,30362,30363,30366,30367,26337,30369,26341],{},"Describe the work in plain words in the ",[322,30364,26332],{"href":26330,"rel":30365},[2245]," and it builds the steps for you. Tell it the URL pattern and what to capture. ",[322,30368,26336],{"href":26315},[29,30370,26340],{},[26343,30372,30374],{":instructions":30373,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"For each Quora question URL in my Google Sheet, open it\",\"Scroll to the bottom until no new answers load\",\"For each answer block, capture the text, author, and upvote count\",\"Append the rows to a results tab in the sheet\",\"Move to the next URL\"]",[14,30375,30376],{},"To the right is an example. Describe the scrape and let the AI lay out the steps of your bot.",[21,30378,30380,30381],{"id":30379},"automate-quora-in-code","Automate Quora in code ",[727,30382],{"id":90},[11,30384],{},[14,30386,30387,26367,30389],{},[29,30388,26366],{},[322,30390,26371],{"href":26370},[26373,30392,30394],{":secondaryLinks":26347,"code":30393,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Each question URL would come from your Google Sheet\n  const questions = [\n    \"https:\u002F\u002Fwww.quora.com\u002FWhat-is-the-best-no-code-tool\",\n    \"https:\u002F\u002Fwww.quora.com\u002FHow-do-I-automate-web-scraping\",\n  ];\n\n  const out = [];\n  for (const url of questions) {\n    await page.goto(url, { waitUntil: \"networkidle\" });\n\n    \u002F\u002F Scroll until Quora stops loading more answers\n    let prev = 0;\n    for (let i = 0; i \u003C 30; i++) {\n      await page.mouse.wheel(0, 4000);\n      await page.waitForTimeout(800);\n      const count = await page.locator('[class*=\"Answer\"]').count();\n      if (count === prev) break;\n      prev = count;\n    }\n\n    const answers = await page.locator('[class*=\"Answer\"]').evaluateAll((els) =>\n      els.map((el) => ({\n        text: el.querySelector('[class*=\"qu-userSelect\"]')?.textContent ?? \"\",\n        author: el.querySelector('a[href*=\"\u002Fprofile\u002F\"]')?.textContent ?? \"\",\n      })),\n    );\n    out.push({ url, count: answers.length, answers });\n  }\n  console.log(JSON.stringify(out, null, 2));\n} finally {\n  await browser.close();\n}\n",[14,30395,30396],{},"Connect Playwright (or Puppeteer) to our cloud Chromium and write the same scripts you'd run locally, without managing the browser. Quora's class names change occasionally — match on stable text or aria attributes when you can.",[26382,30398],{"description":30399,"eyebrow":26385,"image":26386,"imageAlt":30400,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the Quora work. It builds the bot for you, no-code or code, handling the scroll, the scrape, and the column mapping.","Claude building a Quora automation from a description",[21,30402,30404],{"id":30403},"what-can-you-automate-on-quora","What can you automate on Quora?",[11,30406],{},[14,30408,30409],{},"Most of the click and scroll work. A couple of cases worth knowing first.",[26402,30411],{":cards":30412},"[{\"title\":\"Works well\",\"items\":[\"Scraping answers from a question page\",\"Tracking a topic feed for new posts\",\"Pulling a writer's recent answers\",\"Capturing question titles in a niche\",\"Posting answers from a sheet on a generous schedule\"]},{\"title\":\"Harder\",\"items\":[\"Long threads with hundreds of answers (scroll patience required)\",\"Spaces and group-specific gating\",\"Anything below the login wall on logged-out runs\"]},{\"title\":\"Don't try\",\"items\":[\"Posting at machine speed (Quora will flag the account)\",\"Mass-DMing users\",\"Anything against Quora's terms of service\"]}]",[21,30414,26408],{"id":26407},[11,30416],{},[14,30418,30419],{},"Quora is a fine site for a bot but a few things will bite if you don't plan for them.",[639,30421,30423],{"id":30422},"the-class-names-shift","The class names shift",[14,30425,30426],{},"Quora's CSS class names are auto-generated and change every few months. Match on stable signals (the link to a profile, an aria attribute, the upvote button's accessible name) rather than the class.",[639,30428,30430],{"id":30429},"infinite-scroll-never-ends","Infinite scroll never ends",[14,30432,30433],{},"The feed will load forever if you let it. Set a \"no new answers after N scrolls\" exit so the bot stops on its own.",[639,30435,30437],{"id":30436},"watch-posting-cadence","Watch posting cadence",[14,30439,30440],{},"A bot posting answers needs spacing. One every few hours is fine; one every minute is account-suicide. The fastest way to lose an account is to look like a machine.",[639,30442,29183],{"id":29182},[14,30444,30445],{},"A logged-out scrape sees a stripped-down version. If you want full answer text and metadata, run signed-in. Capture the session cookies once and load them into the run.",{"title":494,"searchDepth":495,"depth":495,"links":30447},[30448,30449,30450,30451,30452,30453,30454,30455],{"id":30304,"depth":498,"text":30305},{"id":30316,"depth":498,"text":30317},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":30354,"depth":498,"text":30355},{"id":30379,"depth":498,"text":30380},{"id":30403,"depth":498,"text":30404},{"id":26407,"depth":498,"text":26408,"children":30456},[30457,30458,30459,30460],{"id":30422,"depth":495,"text":30423},{"id":30429,"depth":495,"text":30430},{"id":30436,"depth":495,"text":30437},{"id":29182,"depth":495,"text":29183},"Scrape Quora answers, monitor topic feeds, or post on a schedule. axiom drives Quora in a real browser, no code needed.",{},"\u002Fautomate\u002Fquora",{"title":30295,"description":30461},"automate\u002Fquora","uBKXCy-ty95MDO-hNnczgAVZdl2z9ag5pVz521q6L3k",{"id":30468,"title":30469,"author":26259,"body":30470,"date":523,"description":30626,"extension":506,"meta":30627,"navigation":522,"order":523,"path":30628,"seo":30629,"stem":30630,"__hash__":30631},"automate\u002Fautomate\u002Freddit.md","Automate Reddit without code | axiom",{"type":8,"value":30471,"toc":30611},[30472,30476,30480,30482,30485,30489,30491,30494,30497,30499,30501,30504,30506,30508,30511,30516,30522,30524,30534,30540,30546,30548,30554,30559,30563,30565,30567,30570,30573,30575,30577,30580,30584,30587,30591,30594,30598,30604,30608],[26263,30473],{"description":30474,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":30475},"Reddit rewards being a real participant and punishes anything that smells like a bot. A bot can still help, monitoring subreddits for mentions, scraping posts and comments into a sheet, and handling the routine on the account you actually use. This is for genuine participation, not spam. There are three ways to start, with no code, with code, or with a Claude skill.","Automate Reddit",[21,30477,30479],{"id":30478},"what-i-mean-by-automating-reddit","What I mean by automating Reddit",[11,30481],{},[14,30483,30484],{},"Automating Reddit means a bot does the parts of Reddit that are mechanical, not the parts that need a human voice. Watching a set of subreddits for a keyword or a mention, scraping posts and comments into a sheet for research, pulling your own post performance, and handling routine upkeep on the account you actually use. The posting and replying that matters is still you. The repetitive watching and gathering is what a bot takes on.",[21,30486,30488],{"id":30487},"reddits-communities-are-the-real-moderators","Reddit's communities are the real moderators",[11,30490],{},[14,30492,30493],{},"Most platforms enforce their rules from the top. Reddit enforces from the bottom too. Every subreddit has its own rules, an automod that acts on them, and a crowd of people who downvote and report anything that reads as automated or promotional. You can stay inside the sitewide rules and still get buried by the community in an hour.",[14,30495,30496],{},"So the honest version of Reddit automation is narrow. Monitor and scrape all you like, that is just reading. But for posting, commenting, and voting, a bot that mass-produces them gets you shadowbanned and disliked into nothing. Genuine participation stays human, on your own account, respecting each subreddit's rules. The bot watches and gathers, you do the talking.",[21,30498,26295],{"id":26294},[11,30500],{},[14,30502,30503],{},"This is for the person who uses Reddit for real and wants the mechanical parts handled. A marketer monitoring mentions of their brand, a researcher gathering posts on a topic, a community member tracking a few subreddits, a creator checking how their own posts did. You participate genuinely and want a bot for the watching and gathering, not for faking a presence. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,30505,26304],{"id":26303},[11,30507],{},[14,30509,30510],{},"Lean on the reading side. Point the bot at the subreddits you care about, scrape the posts and comments that match what you are watching for, and pull them into a sheet you can scan. Keep posting and commenting human, your account, your words, within each subreddit's rules. If you do automate a post, make it one you would have written anyway, and never at volume.",[14,30512,30513,30514,44],{},"Watch and gather with the bot, talk as yourself. I would lay out the first draft with ",[322,30515,26316],{"href":26315},[21,30517,30519,30520],{"id":30518},"automate-reddit-from-a-description","Automate Reddit from a description ",[727,30521],{"id":513},[11,30523],{},[14,30525,30526,30527,26333,30530,26337,30532,26341],{},"Describe what you watch for in plain words in the ",[322,30528,26332],{"href":26330,"rel":30529},[2245],[322,30531,26336],{"href":26315},[29,30533,26340],{},[26343,30535,30537],{":instructions":30536,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open the subreddit on old.reddit.com\",\"Read the new posts on the page\",\"Keep the ones that match my keyword\",\"Scrape the title, author, and link\",\"Write the matches to a Google Sheet\"]",[14,30538,30539],{},"To the right is an example. Describe what you watch for or gather, and the AI lays out the steps.",[21,30541,30543,30544],{"id":30542},"automate-reddit-in-code","Automate Reddit in code ",[727,30545],{"id":90},[11,30547],{},[14,30549,30550,26367,30552],{},[29,30551,26366],{},[322,30553,26371],{"href":26370},[26373,30555,30557],{":secondaryLinks":26347,"code":30556,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F old.reddit.com is simpler to read than the new layout\n  await page.goto(\"https:\u002F\u002Fold.reddit.com\u002Fr\u002Fyoursubreddit\u002Fnew\u002F\");\n  await page.waitForSelector(\".thing\");\n\n  \u002F\u002F Read the new posts off the page\n  const posts = await page.$$eval(\".thing\", els =>\n    els.map(el => ({\n      title:  el.querySelector(\"a.title\")?.textContent.trim(),\n      author: el.querySelector(\".author\")?.textContent.trim(),\n      link:   el.querySelector(\"a.title\")?.getAttribute(\"href\"),\n    }))\n  );\n\n  \u002F\u002F Keep only the ones that mention what you are watching for\n  const matches = posts.filter(p => p.title?.toLowerCase().includes(\"axiom\"));\n  console.log(matches); \u002F\u002F write these to your sheet\n} finally {\n  await browser.close();\n}\n",[14,30558,26380],{},[26382,30560],{"description":30561,"eyebrow":26385,"image":26386,"imageAlt":30562,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe what you watch for or gather. It builds the bot for you, no-code or code, monitoring subreddits and scraping the matches into a sheet.","Claude building a Reddit monitoring automation from a description",[21,30564,26395],{"id":26394},[11,30566],{},[14,30568,30569],{},"The watching and gathering, mostly. A couple of lines to stay on the right side of.",[26402,30571],{":cards":30572},"[{\"title\":\"Works well\",\"items\":[\"Monitoring subreddits for a keyword or mention\",\"Scraping posts and comments into a sheet\",\"Tracking how your own posts did\",\"Watching a topic across several subreddits\",\"Pulling data on a schedule\"]},{\"title\":\"Harder\",\"items\":[\"The new Reddit layout, which is heavier to scrape\",\"Rate limits and bot checks\",\"Subreddit rules that differ everywhere\"]},{\"title\":\"Don't try\",\"items\":[\"Mass posting, commenting, or replying\",\"Vote manipulation of any kind\",\"Spam, self-promotion against the rules, or fake accounts\"]}]",[21,30574,26408],{"id":26407},[11,30576],{},[14,30578,30579],{},"Reddit is built to spot and punish bots, so read this one carefully. Here is what I would watch for.",[639,30581,30583],{"id":30582},"the-community-decides","The community decides",[14,30585,30586],{},"You can follow every sitewide rule and still get buried. Each subreddit has its own rules and a crowd that downvotes anything that smells automated. Read the rules of the subreddit before you post anything, and keep posting human.",[639,30588,30590],{"id":30589},"never-touch-the-votes","Never touch the votes",[14,30592,30593],{},"Automated voting, or anything that nudges votes, is vote manipulation, and it is one of the fastest ways to get an account banned sitewide. Do not go near it.",[639,30595,30597],{"id":30596},"use-oldreddit-for-scraping","Use old.reddit for scraping",[14,30599,30600,30601,30603],{},"The old layout at old.reddit.com is lighter and easier to read than the new one. Point the scraper there, pick the fields with the ",[322,30602,26444],{"href":11340},", and go at a reasonable pace, and you will catch fewer bot checks.",[639,30605,30607],{"id":30606},"keep-posting-human-and-rare","Keep posting human and rare",[14,30609,30610],{},"If you automate a post or comment at all, make it one you would have written yourself, on your own account, and never at volume. A bot that floods is a bot that gets shadowbanned.",{"title":494,"searchDepth":495,"depth":495,"links":30612},[30613,30614,30615,30616,30617,30618,30619,30620],{"id":30478,"depth":498,"text":30479},{"id":30487,"depth":498,"text":30488},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":30518,"depth":498,"text":30519},{"id":30542,"depth":498,"text":30543},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":30621},[30622,30623,30624,30625],{"id":30582,"depth":495,"text":30583},{"id":30589,"depth":495,"text":30590},{"id":30596,"depth":495,"text":30597},{"id":30606,"depth":495,"text":30607},"Automate Reddit without code. Monitor subreddits for mentions, scrape posts and comments into a sheet, and handle routine upkeep on your own account, genuinely. From axiom.",{},"\u002Fautomate\u002Freddit",{"title":30469,"description":30626},"automate\u002Freddit","Onwe_XddVqeVKDXZGGwriFJYnshKp37XnLi8mC1C57U",{"id":30633,"title":30634,"author":26259,"body":30635,"date":523,"description":30783,"extension":506,"meta":30784,"navigation":522,"order":523,"path":30785,"seo":30786,"stem":30787,"__hash__":30788},"automate\u002Fautomate\u002Fshopee-store.md","Automate your Shopee store without code | axiom",{"type":8,"value":30636,"toc":30768},[30637,30641,30645,30647,30650,30654,30656,30659,30662,30664,30666,30669,30671,30673,30676,30681,30687,30689,30698,30703,30709,30711,30717,30722,30726,30728,30730,30733,30736,30738,30740,30743,30747,30750,30754,30757,30759,30761,30763],[26263,30638],{"description":30639,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":30640},"Shopee runs on campaigns. Flash sales, vouchers, and seasonal pushes mean prices and stock change on a timer, over and over. A bot can take that repetitive prep off your hands, updating your Shopee shop from a sheet and pulling your orders into one. There are three ways to start, with no code, with code, or with a Claude skill.","Automate your Shopee store",[21,30642,30644],{"id":30643},"what-i-mean-by-automating-your-shopee-store","What I mean by automating your Shopee store",[11,30646],{},[14,30648,30649],{},"Automating your Shopee store means a bot handles the repetitive work in Seller Centre. Updating prices and stock across listings from a sheet, prepping products for a campaign or flash sale, pulling your orders into a spreadsheet, and refreshing listings before a big push. It is the back-office upkeep of a shop you run, done for you, so the campaign prep stops eating your evenings.",[21,30651,30653],{"id":30652},"shopee-runs-on-campaigns","Shopee runs on campaigns",[11,30655],{},[14,30657,30658],{},"Selling on Shopee means living by the calendar. Flash sales, vouchers, double-date campaigns, seasonal pushes, each one wanting prices dropped, stock checked, and listings prepped, then set back again after. For a catalogue of any size, that is the same edits across dozens of products, on a deadline, again and again.",[14,30660,30661],{},"Shopee's Seller Centre has bulk tools, and there is an open platform for larger sellers who can build against it. For everyone in between, the campaign prep is still a lot of manual editing. That is what a bot is good at. Keep your products and their campaign prices in a sheet, and let the bot apply the changes across the shop before the sale, and undo them after. The calendar still rules, but the clicking does not have to.",[21,30663,26295],{"id":26294},[11,30665],{},[14,30667,30668],{},"This is for the Shopee seller without a team, prepping for campaign after campaign by hand. The solo seller or small shop updating prices, checking stock, and pulling orders across Seller Centre. You manage the account, you just want the repetitive prep handled. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,30670,26304],{"id":26303},[11,30672],{},[14,30674,30675],{},"Put your products in a sheet, with a column for the normal price and one for the campaign price. Point the bot at Seller Centre, and let it update each listing to the campaign price before the sale, then back after. Start with one product to check it lands right, then run the catalogue. Run it on your own shop with your own logged-in session, and double-check any price change.",[14,30677,30678,30679,44],{},"Sheet to shop, one product first, then the catalogue. I would lay out the first draft with ",[322,30680,26316],{"href":26315},[21,30682,30684,30685],{"id":30683},"automate-your-shopee-store-from-a-description","Automate your Shopee store from a description ",[727,30686],{"id":513},[11,30688],{},[14,30690,26327,30691,26333,30694,26337,30696,26341],{},[322,30692,26332],{"href":26330,"rel":30693},[2245],[322,30695,26336],{"href":26315},[29,30697,26340],{},[26343,30699,30701],{":instructions":30700,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open Seller Centre and sign in\",\"Read the next product and its campaign price from a Google Sheet\",\"Open that product\",\"Update the price and the stock\",\"Save, then move to the next row\"]",[14,30702,28097],{},[21,30704,30706,30707],{"id":30705},"automate-your-shopee-store-in-code","Automate your Shopee store in code ",[727,30708],{"id":90},[11,30710],{},[14,30712,30713,26367,30715],{},[29,30714,26366],{},[322,30716,26371],{"href":26370},[26373,30718,30720],{":secondaryLinks":26347,"code":30719,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Your products and their campaign prices, from your sheet\n  const products = [\n    { url: \"https:\u002F\u002Fseller.shopee.com\u002Fportal\u002Fproduct\u002F111\u002Fedit\", price: \"9.90\", stock: \"50\" },\n    { url: \"https:\u002F\u002Fseller.shopee.com\u002Fportal\u002Fproduct\u002F222\u002Fedit\", price: \"14.90\", stock: \"20\" },\n  ];\n\n  for (const item of products) {\n    \u002F\u002F Open the product edit page on your own logged-in session\n    await page.goto(item.url);\n    await page.getByLabel(\"Price\").fill(item.price);\n    await page.getByLabel(\"Stock\").fill(item.stock);\n    await page.getByRole(\"button\", { name: \"Save\" }).click();\n    await page.waitForSelector(\".save-success\");\n  }\n} finally {\n  await browser.close();\n}\n",[14,30721,26380],{},[26382,30723],{"description":30724,"eyebrow":26385,"image":26386,"imageAlt":30725,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the Shopee task you need. It builds the bot for you, no-code or code, prepping campaign prices from a sheet or pulling your orders out.","Claude building a Shopee store automation from a description",[21,30727,26395],{"id":26394},[11,30729],{},[14,30731,30732],{},"The campaign prep, for the shop you run. A couple of cases worth knowing first.",[26402,30734],{":cards":30735},"[{\"title\":\"Works well\",\"items\":[\"Updating prices and stock from a sheet\",\"Prepping listings for a campaign or flash sale\",\"Setting prices back after a sale\",\"Pulling orders into a sheet\",\"Running it on a schedule\"]},{\"title\":\"Harder\",\"items\":[\"Joining campaigns with their own sign-up flow\",\"Frequent layout changes in Seller Centre\",\"2FA on the account\"]},{\"title\":\"Don't try\",\"items\":[\"Scraping buyers' personal details\",\"Fake orders or review manipulation\",\"Anything against Shopee's terms\"]}]",[21,30737,26408],{"id":26407},[11,30739],{},[14,30741,30742],{},"Seller Centre is a big app behind a login, so a few things trip up a shop bot. Here is what I would watch for.",[639,30744,30746],{"id":30745},"time-the-changes-to-the-sale","Time the changes to the sale",[14,30748,30749],{},"A campaign price set too early, or left on too long, costs you. Schedule the bot to apply prices just before the sale and put them back after, and double-check the timing against the campaign window.",[639,30751,30753],{"id":30752},"check-one-product-first","Check one product first",[14,30755,30756],{},"A bad price across a catalogue is an expensive mistake. Run one product, confirm the price and stock landed right, then loop the rest, with a cap on how many a run touches.",[639,30758,26431],{"id":26430},[14,30760,27657],{},[639,30762,26438],{"id":26437},[14,30764,30765,30766,26445],{},"Shopee updates Seller Centre often, and fields move. Repick anything that stops being found with the ",[322,30767,26444],{"href":11340},{"title":494,"searchDepth":495,"depth":495,"links":30769},[30770,30771,30772,30773,30774,30775,30776,30777],{"id":30643,"depth":498,"text":30644},{"id":30652,"depth":498,"text":30653},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":30683,"depth":498,"text":30684},{"id":30705,"depth":498,"text":30706},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":30778},[30779,30780,30781,30782],{"id":30745,"depth":495,"text":30746},{"id":30752,"depth":495,"text":30753},{"id":26430,"depth":495,"text":26431},{"id":26437,"depth":495,"text":26438},"Automate your Shopee store without code. Update prices and stock from a sheet, prep for campaigns and flash sales, and pull your orders into one. From axiom.",{},"\u002Fautomate\u002Fshopee-store",{"title":30634,"description":30783},"automate\u002Fshopee-store","ON_--kl9-fayhoaoXnmWwCu91Vlk6mQUi2qyQN-N8Ow",{"id":30790,"title":30791,"author":26259,"body":30792,"date":523,"description":30940,"extension":506,"meta":30941,"navigation":522,"order":523,"path":30942,"seo":30943,"stem":30944,"__hash__":30945},"automate\u002Fautomate\u002Fshutterstock.md","Automate Shutterstock without code | axiom",{"type":8,"value":30793,"toc":30925},[30794,30798,30802,30804,30807,30811,30813,30816,30819,30821,30823,30826,30828,30830,30833,30838,30844,30846,30855,30860,30866,30868,30874,30879,30883,30885,30887,30890,30893,30895,30897,30900,30904,30907,30911,30914,30916,30918,30920],[26263,30795],{"description":30796,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":30797},"Whether you sell on Shutterstock or pull from it, the work is repetitive. Keywording and titling every asset you upload, or gathering search results and metadata. A bot can take that grind off your hands, working from a sheet on the account you run. There are three ways to start, with no code, with code, or with a Claude skill.","Automate Shutterstock",[21,30799,30801],{"id":30800},"what-i-mean-by-automating-shutterstock","What I mean by automating Shutterstock",[11,30803],{},[14,30805,30806],{},"Automating Shutterstock means a bot handles the repetitive parts, on either side of the marketplace. As a contributor, uploading assets and filling in their titles and keywords, managing your portfolio, and pulling your earnings into a sheet. As a buyer or researcher, scraping search results and image metadata to work with. It is the busywork around the assets, done for you.",[21,30808,30810],{"id":30809},"an-asset-nobody-can-find-earns-nothing","An asset nobody can find earns nothing",[11,30812],{},[14,30814,30815],{},"For a contributor, Shutterstock is a discoverability game. An image with no keywords is invisible, and an invisible image earns nothing, no matter how good it is. So the real work is not the shooting, it is the metadata, the title, the dozens of keywords, the categories, on every single asset. Do that for a batch of fifty and an evening is gone.",[14,30817,30818],{},"That metadata grind is exactly what a bot is good at. Keep your filenames, titles, and keywords in a sheet, and let the bot fill them in across your uploads. On the buying side, Shutterstock has an API for search and licensing if you integrate properly, and the browser covers the quick research scrapes the API setup is not worth for. Either way, the repetitive part stops being yours.",[21,30820,26295],{"id":26294},[11,30822],{},[14,30824,30825],{},"This is for the contributor uploading and keywording by hand, or the buyer or researcher gathering assets and metadata. A photographer with a backlog to caption, a designer pulling references, a team tracking what is out there. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,30827,26304],{"id":26303},[11,30829],{},[14,30831,30832],{},"If you contribute, put your assets in a sheet, one row each, with the title and keywords, and let the bot fill them in as you upload. If you research, point the bot at a search and scrape the results and their metadata into a sheet. Take only what you are entitled to, and keep the pace reasonable.",[14,30834,30835,30836,44],{},"Sheet to portfolio, or search to sheet. I would lay out the first draft with ",[322,30837,26316],{"href":26315},[21,30839,30841,30842],{"id":30840},"automate-shutterstock-from-a-description","Automate Shutterstock from a description ",[727,30843],{"id":513},[11,30845],{},[14,30847,26327,30848,26333,30851,26337,30853,26341],{},[322,30849,26332],{"href":26330,"rel":30850},[2245],[322,30852,26336],{"href":26315},[29,30854,26340],{},[26343,30856,30858],{":instructions":30857,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open the contributor portal and sign in\",\"Read the next asset's title and keywords from a Google Sheet\",\"Open that asset\",\"Fill in the title and the keywords\",\"Save, then move to the next row\"]",[14,30859,28431],{},[21,30861,30863,30864],{"id":30862},"automate-shutterstock-in-code","Automate Shutterstock in code ",[727,30865],{"id":90},[11,30867],{},[14,30869,30870,26367,30872],{},[29,30871,26366],{},[322,30873,26371],{"href":26370},[26373,30875,30877],{":secondaryLinks":26347,"code":30876,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Research side, scraping search result metadata\n  await page.goto(\"https:\u002F\u002Fwww.shutterstock.com\u002Fsearch\u002Fmountains\");\n  await page.waitForSelector(\"[data-testid='asset']\");\n\n  const assets = await page.$$eval(\"[data-testid='asset']\", els =>\n    els.map(el => ({\n      title: el.querySelector(\"img\")?.getAttribute(\"alt\"),\n      id:    el.getAttribute(\"data-id\"),\n      link:  el.querySelector(\"a\")?.getAttribute(\"href\"),\n    }))\n  );\n\n  console.log(assets); \u002F\u002F metadata only, write to your sheet\n} finally {\n  await browser.close();\n}\n",[14,30878,26380],{},[26382,30880],{"description":30881,"eyebrow":26385,"image":26386,"imageAlt":30882,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the Shutterstock task you need. It builds the bot for you, no-code or code, keywording uploads from a sheet or scraping search metadata.","Claude building a Shutterstock automation from a description",[21,30884,26395],{"id":26394},[11,30886],{},[14,30888,30889],{},"The metadata grind, on either side of the marketplace. A couple of cases worth knowing first.",[26402,30891],{":cards":30892},"[{\"title\":\"Works well\",\"items\":[\"Filling titles and keywords on upload\",\"Managing your portfolio\",\"Pulling your earnings into a sheet\",\"Scraping search results and metadata\",\"Running it from a sheet\"]},{\"title\":\"Harder\",\"items\":[\"Bulk uploads of large files\",\"Category and model-release fields\",\"2FA on the account\"]},{\"title\":\"Don't try\",\"items\":[\"Downloading licensed images you have not paid for\",\"Reselling Shutterstock's content\",\"Anything against Shutterstock's terms\"]}]",[21,30894,26408],{"id":26407},[11,30896],{},[14,30898,30899],{},"Shutterstock is a large app behind a login, so a few things trip up a bot. Here is what I would watch for.",[639,30901,30903],{"id":30902},"keyword-from-a-sheet-not-by-guesswork","Keyword from a sheet, not by guesswork",[14,30905,30906],{},"The metadata is what sells the asset, so get the keywords right in your sheet first, then let the bot apply them. Run one asset and check it saved before the batch.",[639,30908,30910],{"id":30909},"take-only-the-metadata-not-the-asset","Take only the metadata, not the asset",[14,30912,30913],{},"Scraping titles and metadata for research is one thing. Downloading the full-resolution images without a license is not. Stay on the metadata unless you have paid for the asset.",[639,30915,26431],{"id":26430},[14,30917,26434],{},[639,30919,26438],{"id":26437},[14,30921,30922,30923,26445],{},"Shutterstock updates its pages, and fields move. Repick anything that stops being found with the ",[322,30924,26444],{"href":11340},{"title":494,"searchDepth":495,"depth":495,"links":30926},[30927,30928,30929,30930,30931,30932,30933,30934],{"id":30800,"depth":498,"text":30801},{"id":30809,"depth":498,"text":30810},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":30840,"depth":498,"text":30841},{"id":30862,"depth":498,"text":30863},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":30935},[30936,30937,30938,30939],{"id":30902,"depth":495,"text":30903},{"id":30909,"depth":495,"text":30910},{"id":26430,"depth":495,"text":26431},{"id":26437,"depth":495,"text":26438},"Automate Shutterstock without code. Fill titles and keywords on upload from a sheet, manage your portfolio, and scrape search results and metadata. From axiom.",{},"\u002Fautomate\u002Fshutterstock",{"title":30791,"description":30940},"automate\u002Fshutterstock","tRKTbGbsz_YggHYqcGSmemaTYZVRf79Cb5y0uKdnOW0",{"id":30947,"title":30948,"author":26259,"body":30949,"date":523,"description":31097,"extension":506,"meta":31098,"navigation":522,"order":523,"path":31099,"seo":31100,"stem":31101,"__hash__":31102},"automate\u002Fautomate\u002Fsnapchat.md","Automate Snapchat without code | axiom",{"type":8,"value":30950,"toc":31082},[30951,30955,30959,30961,30964,30968,30970,30973,30976,30978,30980,30983,30985,30987,30990,30995,31001,31003,31011,31016,31022,31024,31030,31035,31039,31041,31043,31046,31049,31051,31053,31056,31060,31063,31067,31070,31072,31075,31079],[26263,30952],{"description":30953,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":30954},"Keeping a Snapchat account active is a lot of small, repeated tasks. Uploading content, replying to messages, posting on a schedule. A bot can take the routine parts off your hands for the account you actually run. This is built for your own one or two accounts, not for farming masses of them. There are three ways to start, with no code, with code, or with a Claude skill.","Automate Snapchat",[21,30956,30958],{"id":30957},"what-i-mean-by-automating-snapchat","What I mean by automating Snapchat",[11,30960],{},[14,30962,30963],{},"Automating Snapchat means a bot handles the repetitive parts of running your account in the browser. Uploading a piece of content, posting it, replying to the same kinds of messages, checking what came in overnight. It is the routine upkeep of an account you manage, sped up, so the busywork does not eat your day. It is not about running a wall of accounts at once.",[21,30965,30967],{"id":30966},"for-your-accounts-not-a-farm","For your accounts, not a farm",[11,30969],{},[14,30971,30972],{},"There is a clear line with Snapchat automation, and which side you are on decides everything. One side is managing your own account, or maybe two, the way a creator or a small brand does. The other is spinning up masses of accounts to post, follow, and engage at scale. That second one is spam, it breaks Snapchat's terms, and it gets accounts banned in waves.",[14,30974,30975],{},"axiom is built for the first side. One or two accounts you actually run, at a human pace, doing the upkeep you would do yourself. There is also an honest limit to know. Snapchat is mobile-first, and the web app does less than the phone does, so a browser bot reaches what web Snapchat exposes, not everything the app can do.",[21,30977,26295],{"id":26294},[11,30979],{},[14,30981,30982],{},"This is for the creator or small brand running a Snapchat presence without a team. You post regularly, you reply to people, and you would rather not do every routine step by hand. One account, maybe two. If you are looking to run hundreds of accounts, this is not the tool, and that is on purpose. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,30984,26304],{"id":26303},[11,30986],{},[14,30988,30989],{},"Start with one account and one task. Take the thing you do most often, posting the daily content or clearing the same replies, and automate just that. Use your own logged-in session so the bot acts as you, and run it at the pace a person would. Keep a person checking what goes out, especially anything that posts publicly.",[14,30991,30992,30993,44],{},"One account, one task, your pace, reviewed. I would lay out the first draft with ",[322,30994,26316],{"href":26315},[21,30996,30998,30999],{"id":30997},"manage-snapchat-from-a-description","Manage Snapchat from a description ",[727,31000],{"id":513},[11,31002],{},[14,31004,26327,31005,26333,31008,31010],{},[322,31006,26332],{"href":26330,"rel":31007},[2245],[322,31009,26336],{"href":26315},". Note: Build from description is coming very soon . In the meantime you can still use the no-code builder.",[26343,31012,31014],{":instructions":31013,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open Snapchat on the web and sign in\",\"Open the upload screen\",\"Add today's content from a folder\",\"Add the caption\",\"Post it\"]",[14,31015,28431],{},[21,31017,31019,31020],{"id":31018},"manage-snapchat-in-code","Manage Snapchat in code ",[727,31021],{"id":90},[11,31023],{},[14,31025,31026,26367,31028],{},[29,31027,26366],{},[322,31029,26371],{"href":26370},[26373,31031,31033],{":secondaryLinks":26347,"code":31032,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Your own account, using your logged-in session\n  await page.goto(\"https:\u002F\u002Fweb.snapchat.com\");\n  await page.waitForSelector(\".chat-list\");\n\n  \u002F\u002F Open the first conversation and read the latest message\n  await page.locator(\".chat-list .conversation\").first().click();\n  const message = await page.locator(\".message\").last().innerText();\n  console.log(message);\n\n  \u002F\u002F Reply, after a person has approved the response\n  await page.getByRole(\"textbox\", { name: \"Send a chat\" })\n    .fill(\"Thanks for the message, we will get back to you today.\");\n  await page.keyboard.press(\"Enter\");\n} finally {\n  await browser.close();\n}\n",[14,31034,26380],{},[26382,31036],{"description":31037,"eyebrow":26385,"image":26386,"imageAlt":31038,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the task for your account. It builds the bot for you, no-code or code, for the one or two accounts you run, not a farm.","Claude building a Snapchat automation from a description",[21,31040,26395],{"id":26394},[11,31042],{},[14,31044,31045],{},"The upkeep of an account you run. A couple of lines to stay on the right side of.",[26402,31047],{":cards":31048},"[{\"title\":\"Works well\",\"items\":[\"Uploading and posting your content\",\"Replying to common messages\",\"Checking what came in overnight\",\"Posting on a schedule\",\"Pulling your own stats into a sheet\"]},{\"title\":\"Harder\",\"items\":[\"Anything the mobile app does but the web does not\",\"Snapchat's checks on automated activity\",\"Keeping replies in your own voice\"]},{\"title\":\"Don't try\",\"items\":[\"Running masses of accounts at once\",\"Fake follows, spam, or engagement farming\",\"Anything against Snapchat's terms\"]}]",[21,31050,26408],{"id":26407},[11,31052],{},[14,31054,31055],{},"Snapchat is mobile-first and watches for automation, so read this one carefully. Here is what I would watch for.",[639,31057,31059],{"id":31058},"one-or-two-accounts-not-a-farm","One or two accounts, not a farm",[14,31061,31062],{},"This works for the account you run. The moment it becomes dozens of accounts posting and following, it is spam, and Snapchat bans it. Stay on your own, and keep the volume human.",[639,31064,31066],{"id":31065},"snapchat-is-mobile-first","Snapchat is mobile-first",[14,31068,31069],{},"The web app does less than the phone. A browser bot reaches what web Snapchat exposes, so some content and features only the app has are out of reach. Check the web can do the task before you build it.",[639,31071,26431],{"id":26430},[14,31073,31074],{},"Sign in as yourself and store the cookies so the bot keeps the session. Fresh logins and odd activity are exactly what Snapchat flags.",[639,31076,31078],{"id":31077},"keep-a-person-on-public-posts","Keep a person on public posts",[14,31080,31081],{},"Anything that posts where people can see it should get a human glance first. A bot posting unchecked is how a small mistake becomes a public one.",{"title":494,"searchDepth":495,"depth":495,"links":31083},[31084,31085,31086,31087,31088,31089,31090,31091],{"id":30957,"depth":498,"text":30958},{"id":30966,"depth":498,"text":30967},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":30997,"depth":498,"text":30998},{"id":31018,"depth":498,"text":31019},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":31092},[31093,31094,31095,31096],{"id":31058,"depth":495,"text":31059},{"id":31065,"depth":495,"text":31066},{"id":26430,"depth":495,"text":26431},{"id":31077,"depth":495,"text":31078},"Automate Snapchat without code, for the one or two accounts you run. Upload content, reply to messages, and post on a schedule, at a human pace. From axiom.",{},"\u002Fautomate\u002Fsnapchat",{"title":30948,"description":31097},"automate\u002Fsnapchat","042o0VIvTgBll_UM69WEo6kn5tSS7hCtehX0vnpWkCA",{"id":31104,"title":31105,"author":26259,"body":31106,"date":523,"description":31251,"extension":506,"meta":31252,"navigation":522,"order":523,"path":31253,"seo":31254,"stem":31255,"__hash__":31256},"automate\u002Fautomate\u002Fsoundcloud.md","Automate SoundCloud without code | axiom",{"type":8,"value":31107,"toc":31236},[31108,31112,31116,31118,31121,31125,31127,31130,31133,31135,31137,31140,31142,31144,31147,31152,31158,31160,31167,31172,31178,31180,31186,31191,31195,31197,31199,31201,31204,31206,31208,31211,31215,31218,31222,31225,31227,31229,31231],[26263,31109],{"description":31110,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":31111},"Running a SoundCloud presence is a lot of small, repeated work. Uploading tracks, filling in titles and tags, reading your stats, replying to comments. A bot can take the routine off your hands for the account you actually run. This is for real plays from real people, not bought ones. There are three ways to start, with no code, with code, or with a Claude skill.","Automate SoundCloud",[21,31113,31115],{"id":31114},"what-i-mean-by-automating-soundcloud","What I mean by automating SoundCloud",[11,31117],{},[14,31119,31120],{},"Automating SoundCloud means a bot handles the mechanical parts of running your account. Uploading a track and filling in its title, tags, and description, scraping your play counts and comments into a sheet, checking how a release is doing, keeping your profile tidy. It is the upkeep of an account you run, sped up, so you spend your time on the music. It is not about inflating your numbers.",[21,31122,31124],{"id":31123},"real-plays-or-no-plays","Real plays or no plays",[11,31126],{},[14,31128,31129],{},"SoundCloud has a bot problem, and it runs the other way from most. The spam here is not posting, it is fake plays, fake likes, and fake followers, bought by the thousand to make a track look bigger than it is. SoundCloud purges those numbers when it finds them, and the accounts that bought them with it. Inflated stats are worth nothing and risk everything.",[14,31131,31132],{},"So the honest version is simple. Automate the work, not the numbers. A bot can upload your tracks, tidy your metadata, and pull your real stats so you can see what is landing. It cannot, and should not, manufacture an audience. Real plays from real listeners are the only ones that count, and the only ones worth chasing.",[21,31134,26295],{"id":26294},[11,31136],{},[14,31138,31139],{},"This is for the independent artist or label running their own SoundCloud without a team. You upload regularly, you want your metadata consistent, and you want to see your real numbers without checking by hand. One account, your music. If you are looking to buy plays or run a bot farm, this is not the tool. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,31141,26304],{"id":26303},[11,31143],{},[14,31145,31146],{},"Start with the part you repeat. Usually it is the upload-and-fill, dropping in a track and typing the same kind of title, tags, and description. Put the details in a sheet and let the bot fill the fields for each upload. For stats, point the bot at your own track and release pages and scrape the real numbers into a sheet you can scan. Run it on your own account with your own logged-in session.",[14,31148,31149,31150,44],{},"Upload and tidy with the bot, earn the plays for real. I would lay out the first draft with ",[322,31151,26316],{"href":26315},[21,31153,31155,31156],{"id":31154},"automate-soundcloud-from-a-description","Automate SoundCloud from a description ",[727,31157],{"id":513},[11,31159],{},[14,31161,26327,31162,26333,31165,31010],{},[322,31163,26332],{"href":26330,"rel":31164},[2245],[322,31166,26336],{"href":26315},[26343,31168,31170],{":instructions":31169,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open SoundCloud and sign in\",\"Open each of my track pages in turn\",\"Scrape the play count and likes\",\"Scrape the latest comments\",\"Write it all to a Google Sheet\"]",[14,31171,28431],{},[21,31173,31175,31176],{"id":31174},"automate-soundcloud-in-code","Automate SoundCloud in code ",[727,31177],{"id":90},[11,31179],{},[14,31181,31182,26367,31184],{},[29,31183,26366],{},[322,31185,26371],{"href":26370},[26373,31187,31189],{":secondaryLinks":26347,"code":31188,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Your own tracks, from your sheet\n  const tracks = [\"https:\u002F\u002Fsoundcloud.com\u002Fyou\u002Ftrack-one\"];\n  const stats = [];\n\n  for (const url of tracks) {\n    await page.goto(url);\n    await page.waitForSelector(\".playButton\");\n\n    stats.push({\n      title:  await page.locator(\".soundTitle__title\").innerText(),\n      plays:  await page.locator(\".sc-ministats-plays\").innerText(),\n      likes:  await page.locator(\".sc-button-like\").innerText(),\n    });\n  }\n\n  console.log(stats); \u002F\u002F write these to your sheet\n} finally {\n  await browser.close();\n}\n",[14,31190,26380],{},[26382,31192],{"description":31193,"eyebrow":26385,"image":26386,"imageAlt":31194,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the SoundCloud task for your account. It builds the bot for you, no-code or code, uploading tracks or pulling your real stats into a sheet.","Claude building a SoundCloud automation from a description",[21,31196,26395],{"id":26394},[11,31198],{},[14,31200,31045],{},[26402,31202],{":cards":31203},"[{\"title\":\"Works well\",\"items\":[\"Uploading tracks and filling metadata\",\"Editing titles, tags, and descriptions\",\"Scraping your real play counts and likes\",\"Pulling comments into a sheet\",\"Checking a release on a schedule\"]},{\"title\":\"Harder\",\"items\":[\"Large audio files, which take time to upload\",\"SoundCloud's checks on automated activity\",\"2FA on the account\"]},{\"title\":\"Don't try\",\"items\":[\"Buying or botting plays, likes, or followers\",\"Fake engagement of any kind\",\"Anything against SoundCloud's terms\"]}]",[21,31205,26408],{"id":26407},[11,31207],{},[14,31209,31210],{},"SoundCloud is built around audio and watches for fake activity, so a few things matter here. Here is what I would watch for.",[639,31212,31214],{"id":31213},"never-fake-the-numbers","Never fake the numbers",[14,31216,31217],{},"Bought or botted plays get purged, and the account with them. There is no version of inflating stats that ends well. Automate the work around your music, never the listening.",[639,31219,31221],{"id":31220},"uploads-take-time","Uploads take time",[14,31223,31224],{},"A track has to upload and process before it is live. Wait for the upload to finish and the page to settle before the bot fills the fields or moves to the next one.",[639,31226,26431],{"id":26430},[14,31228,26434],{},[639,31230,26438],{"id":26437},[14,31232,31233,31234,26445],{},"SoundCloud updates its pages, and elements move. Pick what you scrape with the ",[322,31235,26444],{"href":11340},{"title":494,"searchDepth":495,"depth":495,"links":31237},[31238,31239,31240,31241,31242,31243,31244,31245],{"id":31114,"depth":498,"text":31115},{"id":31123,"depth":498,"text":31124},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":31154,"depth":498,"text":31155},{"id":31174,"depth":498,"text":31175},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":31246},[31247,31248,31249,31250],{"id":31213,"depth":495,"text":31214},{"id":31220,"depth":495,"text":31221},{"id":26430,"depth":495,"text":26431},{"id":26437,"depth":495,"text":26438},"Automate SoundCloud without code, for the account you run. Upload tracks, edit metadata, and scrape your real stats and comments into a sheet. From axiom.",{},"\u002Fautomate\u002Fsoundcloud",{"title":31105,"description":31251},"automate\u002Fsoundcloud","NnKW8XHJD2sa4vy3QEa2TEyIR1OTPec4apC3YCZSh58",{"id":31258,"title":31259,"author":26259,"body":31260,"date":523,"description":31423,"extension":506,"meta":31424,"navigation":522,"order":523,"path":31425,"seo":31426,"stem":31427,"__hash__":31428},"automate\u002Fautomate\u002Fspotify-web-player.md","Scrape the Spotify web player without code | axiom",{"type":8,"value":31261,"toc":31408},[31262,31266,31270,31272,31275,31279,31281,31284,31287,31289,31291,31294,31296,31298,31301,31306,31312,31314,31334,31340,31346,31348,31354,31359,31363,31365,31367,31370,31373,31375,31377,31380,31384,31387,31391,31394,31398,31401,31405],[26263,31263],{"description":31264,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":31265},"Sometimes you just need the song info off a page, the track names, the artists, the albums, the release dates sitting in a playlist or a discography. A bot can read it straight off the Spotify web player and drop it in a sheet, with no copying by hand. There are three ways to start, with no code, with code, or with a Claude skill.","Scrape the Spotify web player",[21,31267,31269],{"id":31268},"what-i-mean-by-scraping-the-spotify-web-player","What I mean by scraping the Spotify web player",[11,31271],{},[14,31273,31274],{},"Scraping the Spotify web player means a bot reads the song information shown on the page and pulls it into a sheet. The tracks in a playlist, the albums in an artist's discography, the results of a search, the details you can see but do not want to copy by hand. It reads what the web player renders, row by row, and hands you clean data to work with.",[21,31276,31278],{"id":31277},"the-api-is-genuinely-good-here","The API is genuinely good here",[11,31280],{},[14,31282,31283],{},"Be honest about the easy path first. Spotify has a proper Web API, well documented and free for metadata, and for clean track, artist, and playlist data it is the right tool. If you are pulling a lot of structured song info, learn the API.",[14,31285,31286],{},"The browser route is for the gaps. When you do not want to set up credentials for a one-off pull. When you need exactly what the web player shows, a view the API does not expose. Or when a quick scrape into a sheet beats writing code against an endpoint. Same song info, a different door, useful when the API is more setup than the job is worth.",[21,31288,26295],{"id":26294},[11,31290],{},[14,31292,31293],{},"This is for anyone who wants song data without the developer setup. A music writer pulling a playlist into a spreadsheet, a researcher gathering release dates and credits, someone cataloguing an artist's full discography. You can read code or not, it does not matter here. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,31295,26304],{"id":26303},[11,31297],{},[14,31299,31300],{},"Check the API first, because for plain metadata it is usually cleaner. If it does not fit, drive the web player. The discography pattern is a good shape to copy, read a list of artist links from a sheet, visit each one's discography, scrape the albums, and write them to a second sheet. Delete each artist row once it is done, so a stop and restart picks up where it left off instead of repeating.",[14,31302,31303,31304,44],{},"API if it fits, the page if it does not, and clear the queue as you go. I would lay out the first draft with ",[322,31305,26316],{"href":26315},[21,31307,31309,31310],{"id":31308},"scrape-the-spotify-web-player-from-a-description","Scrape the Spotify web player from a description ",[727,31311],{"id":513},[11,31313],{},[14,31315,31316,31317,31320,31321,31325,31326,31329,31330,26337,31332,26341],{},"Describe what you want in plain words in the ",[322,31318,26332],{"href":26330,"rel":31319},[2245]," and it builds the steps for you. There is a full walkthrough in the ",[322,31322,31324],{"href":31323},"\u002Fguides\u002Fscrape-spotify-discography","Spotify discography scraper guide",", with a template you can install, and the example below follows it. To run it on a schedule, add a ",[322,31327,31328],{"href":993},"login step"," so it can sign in unattended. ",[322,31331,26336],{"href":26315},[29,31333,26340],{},[26343,31335,31337],{":instructions":31336,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Read the artist links from a Google Sheet\",\"Go to each artist's discography page\",\"Scrape the album links\",\"Open each album and scrape the title, copyright, and release date\",\"Write the rows to a second Google Sheet, then delete the artist row\"]",[14,31338,31339],{},"To the right is an example, the discography scraper from the guide. Describe your version and the AI lays out the steps.",[21,31341,31343,31344],{"id":31342},"scrape-the-spotify-web-player-in-code","Scrape the Spotify web player in code ",[727,31345],{"id":90},[11,31347],{},[14,31349,31350,26367,31352],{},[29,31351,26366],{},[322,31353,26371],{"href":26370},[26373,31355,31357],{":secondaryLinks":26347,"code":31356,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Artist links would come from your Google Sheet\n  const artists = [\"https:\u002F\u002Fopen.spotify.com\u002Fartist\u002F\u003Cid>\"];\n  const data = [];\n\n  for (const artist of artists) {\n    \u002F\u002F The discography view lives at \u002Fdiscography\u002Fall\n    await page.goto(`${artist}\u002Fdiscography\u002Fall`);\n    await page.waitForSelector(\"a[href*='\u002Falbum\u002F']\");\n\n    const albumLinks = await page.$$eval(\"a[href*='\u002Falbum\u002F']\", els =>\n      [...new Set(els.map(a => a.href))]\n    );\n\n    for (const link of albumLinks) {\n      await page.goto(link);\n      data.push({\n        title:     await page.locator(\"h1\").innerText(),\n        release:   await page.locator(\"[data-testid='release-date']\").innerText(),\n        copyright: await page.locator(\"[data-testid='copyright']\").innerText(),\n      });\n    }\n  }\n\n  console.log(data); \u002F\u002F write these to your second sheet\n} finally {\n  await browser.close();\n}\n",[14,31358,26380],{},[26382,31360],{"description":31361,"eyebrow":26385,"image":26386,"imageAlt":31362,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the song data you want. It builds the bot for you, no-code or code, reading the web player into a sheet.","Claude building a Spotify discography scraper from a description",[21,31364,29527],{"id":29526},[11,31366],{},[14,31368,31369],{},"Most of what the web player shows. A couple of cases worth knowing first.",[26402,31371],{":cards":31372},"[{\"title\":\"Works well\",\"items\":[\"Track, artist, and album names\",\"A whole discography into a sheet\",\"Album release dates and copyright\",\"Playlist and search results\",\"A list of artists from a sheet\"]},{\"title\":\"Harder\",\"items\":[\"Audio features the API exposes but the page does not\",\"Very large catalogues in one run\",\"Content behind your login\"]},{\"title\":\"Don't try\",\"items\":[\"Downloading audio or ripping tracks\",\"High-volume scraping against the terms\",\"Reselling Spotify's data\"]}]",[21,31374,26408],{"id":26407},[11,31376],{},[14,31378,31379],{},"The web player is a polished, lazy-loading app, so a few things trip up a scraper. Here is what I would watch for.",[639,31381,31383],{"id":31382},"try-the-api-first","Try the API first",[14,31385,31386],{},"Spotify's Web API gives clean metadata without scraping. For structured track and album data it is usually less work than driving the page. Reach for the browser when the API does not cover what you need, or the setup is not worth it.",[639,31388,31390],{"id":31389},"delete-as-you-go","Delete as you go",[14,31392,31393],{},"Process an artist, then remove that row from the source sheet. If the bot stops and starts again, it picks up the unfinished rows instead of scraping the same artist twice. It is the difference between a queue and a loop that repeats.",[639,31395,31397],{"id":31396},"let-the-page-load","Let the page load",[14,31399,31400],{},"The web player fills in as you scroll, and the discography view loads albums lazily. Wait for the rows to appear, and scroll if you need more, before you scrape, or you will catch a half-loaded page.",[639,31402,31404],{"id":31403},"respect-the-terms","Respect the terms",[14,31406,31407],{},"Spotify's terms restrict scraping, so keep it to reasonable, low-volume pulls for your own use, and lean on the official API for anything heavier. Do not hammer the player.",{"title":494,"searchDepth":495,"depth":495,"links":31409},[31410,31411,31412,31413,31414,31415,31416,31417],{"id":31268,"depth":498,"text":31269},{"id":31277,"depth":498,"text":31278},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":31308,"depth":498,"text":31309},{"id":31342,"depth":498,"text":31343},{"id":29526,"depth":498,"text":29527},{"id":26407,"depth":498,"text":26408,"children":31418},[31419,31420,31421,31422],{"id":31382,"depth":495,"text":31383},{"id":31389,"depth":495,"text":31390},{"id":31396,"depth":495,"text":31397},{"id":31403,"depth":495,"text":31404},"Scrape song info from the Spotify web player without code. Pull tracks, albums, release dates, and a full discography into a Google Sheet. From axiom.",{},"\u002Fautomate\u002Fspotify-web-player",{"title":31259,"description":31423},"automate\u002Fspotify-web-player","1zH_2aA5PH5tvdImFIUOLqZa458rIPEt-UUp2poSODI",{"id":31430,"title":31431,"author":26259,"body":31432,"date":523,"description":31581,"extension":506,"meta":31582,"navigation":522,"order":523,"path":31583,"seo":31584,"stem":31585,"__hash__":31586},"automate\u002Fautomate\u002Fsurveymonkey.md","Automate SurveyMonkey without code | axiom",{"type":8,"value":31433,"toc":31566},[31434,31438,31442,31444,31447,31451,31453,31456,31459,31461,31463,31466,31468,31470,31473,31478,31484,31486,31494,31500,31506,31508,31514,31519,31523,31525,31527,31530,31533,31535,31537,31540,31544,31547,31549,31552,31554,31559,31563],[26263,31435],{"description":31436,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":31437},"SurveyMonkey work pulls two ways, getting results out and putting test responses in. A bot can do both, scraping your report data into a sheet, and filling your survey with test answers so you catch a broken question before it goes live. Your own surveys, your own data. There are three ways to start, with no code, with code, or with a Claude skill.","Automate SurveyMonkey",[21,31439,31441],{"id":31440},"what-i-mean-by-automating-surveymonkey","What I mean by automating SurveyMonkey",[11,31443],{},[14,31445,31446],{},"Automating SurveyMonkey means a bot handles the repetitive parts of running and reading a survey. On one side it extracts your results, scraping the response data and reports out of the dashboard and into a sheet. On the other it tests the survey, completing it as a respondent would so you can check every question works before you send it out. Same survey, two jobs, both off your plate.",[21,31448,31450],{"id":31449},"data-out-tests-in","Data out, tests in",[11,31452],{},[14,31454,31455],{},"SurveyMonkey gives you a CSV export and an API for your results, and for raw response data those are the right tools. The browser route earns its place at the edges.",[14,31457,31458],{},"Getting data out, a bot can scrape a report view or a chart the export does not include, or pull results on a plan where the API and export are gated. Putting tests in, a bot can run your survey end to end with sample answers, page after page, so a skipped logic branch or a broken required question shows up before a real respondent hits it. So the question is which direction you need, results out or tests in, and the build follows from there.",[21,31460,26295],{"id":26294},[11,31462],{},[14,31464,31465],{},"This is for anyone who runs surveys and is tired of the manual parts. The researcher pulling results into a sheet every week, the team that wants last month's numbers without exporting by hand, and the person who has to test a long survey before it launches without clicking through it themselves. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,31467,26304],{"id":26303},[11,31469],{},[14,31471,31472],{},"Pick the direction first. If you are pulling results, point the bot at your report view, scrape the numbers you need, and write them to a sheet on a schedule. If you are testing, fill the survey with sample answers and walk every page, so the bot trips the broken question instead of a respondent. Run it on your own surveys with your own logged-in session.",[14,31474,31475,31476,44],{},"Direction first, your account, then schedule it. I would lay out the first draft with ",[322,31477,26316],{"href":26315},[21,31479,31481,31482],{"id":31480},"automate-surveymonkey-from-a-description","Automate SurveyMonkey from a description ",[727,31483],{"id":513},[11,31485],{},[14,31487,31488,31489,26333,31492,31010],{},"Describe what you need in plain words in the ",[322,31490,26332],{"href":26330,"rel":31491},[2245],[322,31493,26336],{"href":26315},[26343,31495,31497],{":instructions":31496,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open my survey's live link\",\"Pick an answer on each page\",\"Type a sample response in the text box\",\"Click next through every page\",\"Submit, then start a fresh test response\"]",[14,31498,31499],{},"To the right is an example. Describe whether you are pulling results or testing the survey, and the AI lays out the steps.",[21,31501,31503,31504],{"id":31502},"automate-surveymonkey-in-code","Automate SurveyMonkey in code ",[727,31505],{"id":90},[11,31507],{},[14,31509,31510,26367,31512],{},[29,31511,26366],{},[322,31513,26371],{"href":26370},[26373,31515,31517],{":secondaryLinks":26347,"code":31516,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Your own survey's results page, using your logged-in session\n  await page.goto(\"https:\u002F\u002Fwww.surveymonkey.com\u002Fanalyze\u002Fyour-survey\");\n  await page.waitForSelector(\".question-summary\");\n\n  \u002F\u002F Read each question's result off the summary\n  const results = await page.$$eval(\".question-summary\", els =>\n    els.map(el => ({\n      question:  el.querySelector(\".question-title\")?.textContent.trim(),\n      responses: el.querySelector(\".response-count\")?.textContent.trim(),\n    }))\n  );\n\n  console.log(results); \u002F\u002F write these to your sheet\n} finally {\n  await browser.close();\n}\n",[14,31518,26380],{},[26382,31520],{"description":31521,"eyebrow":26385,"image":26386,"imageAlt":31522,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe what you need, results out or a test run in. It builds the bot for you, no-code or code, scraping your reports or filling the survey with test answers.","Claude building a SurveyMonkey automation from a description",[21,31524,26395],{"id":26394},[11,31526],{},[14,31528,31529],{},"Most of running and reading a survey. A couple of cases worth knowing first.",[26402,31531],{":cards":31532},"[{\"title\":\"Works well\",\"items\":[\"Scraping results and report views into a sheet\",\"Pulling numbers a CSV export leaves out\",\"Filling a survey with test answers\",\"Walking every page to check the logic\",\"Running it on a schedule\"]},{\"title\":\"Harder\",\"items\":[\"Surveys with heavy branching logic\",\"Charts rendered as images\",\"2FA on the account\"]},{\"title\":\"Don't try\",\"items\":[\"Stuffing a survey with fake responses\",\"Pulling data from surveys you do not own\",\"Anything against SurveyMonkey's terms\"]}]",[21,31534,26408],{"id":26407},[11,31536],{},[14,31538,31539],{},"SurveyMonkey is a polished, changing app, so a few things trip up a bot. Here is what I would watch for.",[639,31541,31543],{"id":31542},"test-responses-are-still-responses","Test responses are still responses",[14,31545,31546],{},"When you fill a live survey to test it, those answers land in your real results. Use a draft or test mode if the survey has one, or filter the test rows out afterward, so your numbers stay clean.",[639,31548,26431],{"id":26430},[14,31550,31551],{},"Pull results signed in as yourself, on a survey you own. Store the cookies so the bot keeps the session rather than logging in fresh each run.",[639,31553,28310],{"id":28309},[14,31555,31556,31557,26445],{},"SurveyMonkey updates its analyze and survey pages often. Target what you need with the ",[322,31558,26444],{"href":11340},[639,31560,31562],{"id":31561},"charts-are-images","Charts are images",[14,31564,31565],{},"Some report charts render as pictures, so there are no numbers to scrape. Pull the underlying figures from the data table or the export instead, and use the chart only for a screenshot.",{"title":494,"searchDepth":495,"depth":495,"links":31567},[31568,31569,31570,31571,31572,31573,31574,31575],{"id":31440,"depth":498,"text":31441},{"id":31449,"depth":498,"text":31450},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":31480,"depth":498,"text":31481},{"id":31502,"depth":498,"text":31503},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":31576},[31577,31578,31579,31580],{"id":31542,"depth":495,"text":31543},{"id":26430,"depth":495,"text":26431},{"id":28309,"depth":495,"text":28310},{"id":31561,"depth":495,"text":31562},"Automate SurveyMonkey without code. Extract reports and scrape response data into a sheet, or test your survey with sample answers before it goes live. From axiom.",{},"\u002Fautomate\u002Fsurveymonkey",{"title":31431,"description":31581},"automate\u002Fsurveymonkey","T0323Tb0dvEEo0BgPDpQm2IxzpOOPqgO8FZgf_E27BU",{"id":31588,"title":31589,"author":26259,"body":31590,"date":523,"description":31736,"extension":506,"meta":31737,"navigation":522,"order":523,"path":31738,"seo":31739,"stem":31740,"__hash__":31741},"automate\u002Fautomate\u002Ftiktok.md","Automate TikTok on the web without code | axiom",{"type":8,"value":31591,"toc":31721},[31592,31596,31600,31602,31605,31609,31611,31614,31617,31619,31621,31624,31626,31628,31631,31636,31642,31644,31651,31656,31662,31664,31670,31675,31679,31681,31683,31686,31689,31691,31693,31696,31700,31703,31705,31708,31710,31713,31715],[26263,31593],{"description":31594,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":31595},"TikTok can be automated on the web for the routine around your own account. Scheduling posts, pulling your stats, scraping public data for research. What it cannot do is fake your way onto the For You page. This is for your own account at a human pace, not engagement farming. There are three ways to start, with no code, with code, or with a Claude skill.","Automate TikTok on the web",[21,31597,31599],{"id":31598},"what-i-mean-by-automating-tiktok","What I mean by automating TikTok",[11,31601],{},[14,31603,31604],{},"Automating TikTok means a bot handles the mechanical parts of running your presence, on the website. Posting or scheduling a video, replying to the same kinds of comments, scraping your own stats, and gathering public hashtag or search data for research. The creative part is still you. The repetitive upkeep and the data gathering are what a bot takes on, within what the web exposes.",[21,31606,31608],{"id":31607},"you-cannot-bot-your-way-onto-the-for-you-page","You cannot bot your way onto the For You page",[11,31610],{},[14,31612,31613],{},"TikTok's whole engine is the recommendation algorithm, and it runs on real engagement, watch time, rewatches, shares from actual people. Fake those with bots and TikTok does not just ignore them, it detects them, strips them, and suppresses the account that bought them. There is no automation that buys you reach. The For You page cannot be gamed by a script.",[14,31615,31616],{},"So the honest version is narrow. Automate the upkeep, the scheduling, the stat pulling, the research scrapes, on your own account at a human pace. TikTok is also deeply mobile-first, so a web bot reaches less than the app. Do the boring parts with a bot and earn the reach the only way that works, by making things people actually watch.",[21,31618,26295],{"id":26294},[11,31620],{},[14,31622,31623],{},"This is for the creator or small brand running their own TikTok without a team, and the researcher pulling public trend data. You post, you reply, you check your numbers, and you want the routine handled. One account, your content. If you are looking to farm engagement or run a wall of accounts, this is not the tool. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,31625,26304],{"id":26303},[11,31627],{},[14,31629,31630],{},"Start with the routine you repeat, usually scheduling or checking your stats. Let the bot post on the schedule you set, or read your recent videos and write the numbers to a sheet. For research, scrape a public hashtag or search into a sheet, slowly. Run it on your own account with your own logged-in session, and check the web can do the task, since much of TikTok lives only in the app.",[14,31632,31633,31634,44],{},"Upkeep with the bot, reach you earn. I would lay out the first draft with ",[322,31635,26316],{"href":26315},[21,31637,31639,31640],{"id":31638},"automate-tiktok-from-a-description","Automate TikTok from a description ",[727,31641],{"id":513},[11,31643],{},[14,31645,26327,31646,26333,31649,31010],{},[322,31647,26332],{"href":26330,"rel":31648},[2245],[322,31650,26336],{"href":26315},[26343,31652,31654],{":instructions":31653,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open TikTok on the web and sign in\",\"Open each of my recent videos\",\"Scrape the views, likes, and comments\",\"Write them to a Google Sheet\",\"Run it every evening\"]",[14,31655,28431],{},[21,31657,31659,31660],{"id":31658},"automate-tiktok-in-code","Automate TikTok in code ",[727,31661],{"id":90},[11,31663],{},[14,31665,31666,26367,31668],{},[29,31667,26366],{},[322,31669,26371],{"href":26370},[26373,31671,31673],{":secondaryLinks":26347,"code":31672,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Public hashtag page, for research, scraped slowly\n  await page.goto(\"https:\u002F\u002Fwww.tiktok.com\u002Ftag\u002Fyourtopic\");\n  await page.waitForSelector(\"[data-e2e='challenge-item']\");\n\n  const videos = await page.$$eval(\"[data-e2e='challenge-item']\", els =>\n    els.map(el => ({\n      caption: el.querySelector(\"[data-e2e='challenge-item-desc']\")?.textContent.trim(),\n      link:    el.querySelector(\"a\")?.getAttribute(\"href\"),\n    }))\n  );\n\n  console.log(videos); \u002F\u002F public data only, write to your sheet\n} finally {\n  await browser.close();\n}\n",[14,31674,26380],{},[26382,31676],{"description":31677,"eyebrow":26385,"image":26386,"imageAlt":31678,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the TikTok task for your account. It builds the bot for you, no-code or code, scheduling posts or pulling stats and public data into a sheet.","Claude building a TikTok automation from a description",[21,31680,26395],{"id":26394},[11,31682],{},[14,31684,31685],{},"The upkeep and the research, for the account you run. A couple of lines to stay on the right side of.",[26402,31687],{":cards":31688},"[{\"title\":\"Works well\",\"items\":[\"Scheduling your own posts\",\"Scraping your own stats\",\"Pulling comments into a sheet\",\"Scraping public hashtag and search data\",\"Running on a schedule\"]},{\"title\":\"Harder\",\"items\":[\"Anything the app does but the web does not\",\"TikTok's aggressive bot detection\",\"Large scrapes before a block\"]},{\"title\":\"Don't try\",\"items\":[\"Fake views, likes, or follows\",\"Mass engagement or follow farming\",\"Scraping private data or anything against TikTok's terms\"]}]",[21,31690,26408],{"id":26407},[11,31692],{},[14,31694,31695],{},"TikTok is mobile-first and hunts for bots, so read this one carefully. Here is what I would watch for.",[639,31697,31699],{"id":31698},"you-cannot-fake-reach","You cannot fake reach",[14,31701,31702],{},"Engagement bots get detected, purged, and suppressed, and they take the account down with them. There is no script that earns you the For You page. Automate the work, never the numbers.",[639,31704,27642],{"id":27641},[14,31706,31707],{},"TikTok is built for the phone, so a web bot reaches what the website exposes, which is not everything. Check the web can do the task before you build it.",[639,31709,29911],{"id":29910},[14,31711,31712],{},"Sign in as yourself and store the cookies. Fresh logins and bursts of activity are exactly what TikTok flags, so ease into it rather than running flat out.",[639,31714,29918],{"id":29917},[14,31716,31717,31718,31720],{},"Pull public hashtag and search data, not private accounts, and not faster than a person would. Pick what you scrape with the ",[322,31719,26444],{"href":11340},", and keep the pace reasonable.",{"title":494,"searchDepth":495,"depth":495,"links":31722},[31723,31724,31725,31726,31727,31728,31729,31730],{"id":31598,"depth":498,"text":31599},{"id":31607,"depth":498,"text":31608},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":31638,"depth":498,"text":31639},{"id":31658,"depth":498,"text":31659},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":31731},[31732,31733,31734,31735],{"id":31698,"depth":495,"text":31699},{"id":27641,"depth":495,"text":27642},{"id":29910,"depth":495,"text":29911},{"id":29917,"depth":495,"text":29918},"Automate TikTok on the web without code, for your own account. Schedule posts, scrape your stats, and gather public data, at a human pace. From axiom.",{},"\u002Fautomate\u002Ftiktok",{"title":31589,"description":31736},"automate\u002Ftiktok","v84XF-6ukDFx-UVULYcIndr0RnOMRoUFZZ4dsJJ_oas",{"id":31743,"title":31744,"author":26259,"body":31745,"date":523,"description":31896,"extension":506,"meta":31897,"navigation":522,"order":523,"path":31898,"seo":31899,"stem":31900,"__hash__":31901},"automate\u002Fautomate\u002Ftyping.md","Automate typing into web forms without code | axiom",{"type":8,"value":31746,"toc":31881},[31747,31751,31755,31757,31760,31764,31766,31769,31772,31774,31776,31779,31781,31783,31786,31791,31797,31799,31807,31813,31819,31821,31827,31832,31836,31838,31840,31843,31846,31848,31850,31853,31857,31860,31864,31867,31871,31874,31878],[26263,31748],{"description":31749,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":31750},"Typing the same things into the browser is some of the dullest work there is. Names, emails, codes, notes, the same fields filled over and over. A bot can type it all for you, pulling each value from a sheet and working through every row, so you fill a form once and never again. There are three ways to start, with no code, with code, or with a Claude skill.","Automate typing",[21,31752,31754],{"id":31753},"what-i-mean-by-automating-typing","What I mean by automating typing",[11,31756],{},[14,31758,31759],{},"Automating typing means a bot enters text into a page for you. It clicks into a field, types the value, moves to the next field with Tab or a click, and repeats. The value can be fixed, or it can come from your data, a name from one column, an email from another. That is the difference between typing once and typing a thousand rows without lifting a finger.",[21,31761,31763],{"id":31762},"typing-is-about-the-data-behind-it","Typing is about the data behind it",[11,31765],{},[14,31767,31768],{},"Pressing keys is the easy part. What makes automated typing worth it is where the text comes from. Pull it from a Google Sheet, an Excel file, or a webhook, and the same form fills with a different row every time. Map each column to a field once, then loop. A name lands in the name field, an order number in the order field, a note in the note field, row after row.",[14,31770,31771],{},"Without data behind it, typing is just a macro that types the same thing. With data, it clears a backlog. So the first question is not how to type, it is where the values live and how each one maps to a field.",[21,31773,26295],{"id":26294},[11,31775],{},[14,31777,31778],{},"This is for anyone who keys the same data into the browser all day. Entering orders, updating records, copying values from a spreadsheet into a web app one field at a time. And for anyone holding a list that has to go into a form, field by field, row by row. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,31780,26304],{"id":26303},[11,31782],{},[14,31784,31785],{},"Start with the data. Get your values into a Google Sheet or Excel with one column per field. Then map them, point each typing step at a field and pull its value from the matching column. Run one row and read it back to check every value landed in the right place. Then loop the rest.",[14,31787,31788,31789,44],{},"Data first, map second, test one, then run. That order keeps it honest. I would lay out the first draft with ",[322,31790,26316],{"href":26315},[21,31792,31794,31795],{"id":31793},"automate-typing-from-a-description","Automate typing from a description ",[727,31796],{"id":513},[11,31798],{},[14,31800,31801,31802,26333,31805,31010],{},"Describe the fields and where each value comes from in the ",[322,31803,26332],{"href":26330,"rel":31804},[2245],[322,31806,26336],{"href":26315},[26343,31808,31810],{":instructions":31809,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open the form\",\"Read each row from a Google Sheet\",\"Type the name and email into their fields\",\"Tab to the notes field and type the note\",\"Submit, then take the next row\"]",[14,31811,31812],{},"To the right is an example. Describe the fields and where each value comes from, and the AI lays out the steps.",[21,31814,31816,31817],{"id":31815},"automate-typing-in-code","Automate typing in code ",[727,31818],{"id":90},[11,31820],{},[14,31822,31823,26367,31825],{},[29,31824,26366],{},[322,31826,26371],{"href":26370},[26373,31828,31830],{":secondaryLinks":26347,"code":31829,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Each row would come from your Google Sheet\n  const rows = [\n    { name: \"Ada Lovelace\", email: \"ada@example.com\", note: \"VIP\" },\n    { name: \"Alan Turing\",  email: \"alan@example.com\", note: \"Follow up\" },\n  ];\n\n  for (const row of rows) {\n    await page.goto(\"https:\u002F\u002Fexample.com\u002Fnew\");\n\n    \u002F\u002F Set the value straight into each field\n    await page.fill(\"#name\", row.name);\n    await page.fill(\"#email\", row.email);\n\n    \u002F\u002F Some fields only register text typed key by key\n    await page.locator(\"#note\").pressSequentially(row.note, { delay: 20 });\n\n    await page.click(\"button[type=submit]\");\n    await page.waitForSelector(\".saved\");\n  }\n} finally {\n  await browser.close();\n}\n",[14,31831,26380],{},[26382,31833],{"description":31834,"eyebrow":26385,"image":26386,"imageAlt":31835,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the fields and your data. It builds the bot for you, no-code or code, mapping each column to a field and typing every row.","Claude building a typing automation from a description",[21,31837,26395],{"id":26394},[11,31839],{},[14,31841,31842],{},"Most text fields. A couple of cases worth knowing first.",[26402,31844],{":cards":31845},"[{\"title\":\"Works well\",\"items\":[\"Typing names, emails, and codes from a sheet\",\"Filling notes and descriptions\",\"Moving between fields with Tab\",\"Clearing a field before typing\",\"Filling the same form across many rows\"]},{\"title\":\"Harder\",\"items\":[\"Autocomplete fields that filter as you type\",\"Rich text and contenteditable boxes\",\"Masked inputs like phone or card numbers\"]},{\"title\":\"Don't try\",\"items\":[\"Posting spam or fake content\",\"Anything against a site's terms\",\"Filling a form with data you are not allowed to use\"]}]",[21,31847,26408],{"id":26407},[11,31849],{},[14,31851,31852],{},"Typing looks simple until a field refuses the text. Here is what I would watch for.",[639,31854,31856],{"id":31855},"fields-that-ignore-set-text","Fields that ignore set text",[14,31858,31859],{},"Some fields, often React or custom widgets, ignore text that is set in one go and only react to real keystrokes. If a value does not stick, type it key by key, or click the field first so it is focused.",[639,31861,31863],{"id":31862},"autocomplete-and-dropdowns","Autocomplete and dropdowns",[14,31865,31866],{},"A field that filters as you type needs a pause, then a click on the option. Typing the full value and moving on often leaves nothing selected. Type, wait for the list, then pick.",[639,31868,31870],{"id":31869},"clear-before-you-type","Clear before you type",[14,31872,31873],{},"Typing into a field that already holds text appends or jams the values together. Clear the field first, then type the new value.",[639,31875,31877],{"id":31876},"tabbing-between-fields","Tabbing between fields",[14,31879,31880],{},"Moving with Tab is faster than clicking each field, but only if the page tabs in the order you expect. Check the tab order once, or click each field to be safe.",{"title":494,"searchDepth":495,"depth":495,"links":31882},[31883,31884,31885,31886,31887,31888,31889,31890],{"id":31753,"depth":498,"text":31754},{"id":31762,"depth":498,"text":31763},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":31793,"depth":498,"text":31794},{"id":31815,"depth":498,"text":31816},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":31891},[31892,31893,31894,31895],{"id":31855,"depth":495,"text":31856},{"id":31862,"depth":495,"text":31863},{"id":31869,"depth":495,"text":31870},{"id":31876,"depth":495,"text":31877},"Automate typing in the browser without code. Type names, emails, and any text from a Google Sheet into the right fields, row after row. From axiom.",{},"\u002Fautomate\u002Ftyping",{"title":31744,"description":31896},"automate\u002Ftyping","hioe6NnAvFWyWgGgzqw0zWJnmJQP3cpKHDI1URqsZRo",{"id":31903,"title":31904,"author":26259,"body":31905,"date":523,"description":32058,"extension":506,"meta":32059,"navigation":522,"order":523,"path":32060,"seo":32061,"stem":32062,"__hash__":32063},"automate\u002Fautomate\u002Fwebsite-actions.md","Automate website actions without code | axiom",{"type":8,"value":31906,"toc":32045},[31907,31911,31915,31917,31920,31925,31927,31929,31932,31940,31942,31944,31953,31959,31965,31967,31980,31986,31992,31994,32000,32005,32009,32011,32013,32016,32019,32021,32023,32026,32030,32033,32035,32037,32039],[26263,31908],{"description":31909,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":31910},"A website action is any single thing you do in a browser. Clicking a button, filling a field. Small on their own, but they add up. We spend hours working in the browser. You can hand all of it to a bot. There are three ways to start, with no code, with code, or with a Claude skill.","Automate website actions",[21,31912,31914],{"id":31913},"what-i-mean-by-website-actions","What I mean by website actions",[11,31916],{},[14,31918,31919],{},"I don't just mean a single click or a file upload. A bot or AI can do something that simple on its own. By website actions I mean stringing a set of steps together to finish a real task. The kind of task that loops through every row in a sheet, or reads a value on the page and decides what to do next. That branching and that repetition is where the time goes.",[14,31921,31922,31923,44],{},"None of it has to stay manual. A complex set of actions breaks down into a sequence of small steps, and once it is in steps you can automate it three ways, with no code, with code, or with a ",[322,31924,28724],{"href":26390},[21,31926,26295],{"id":26294},[11,31928],{},[14,31930,31931],{},"This is for people like me who spend the day in the browser, filling in forms, uploading files, clicking the same buttons in the same order. You understand software, but you don't have to be a coder. On our team it is a mix of coders and non-coders, and we can all automate the same complex tasks.",[14,31933,31934,31935,31939],{},"If your work is a string of website actions you repeat, axiom chains them into one run you trigger again and again, with ",[322,31936,31938],{"href":31937},"\u002Fdocs\u002Fno-code-tool\u002Fhow-it-works\u002Flogic","looping and logic"," when a task needs to handle every row and every case, not just the first one. If you use something in Chrome and want to automate it, with code or without, this is for you.",[21,31941,26304],{"id":26303},[11,31943],{},[14,31945,31946,31947,31949,31950,31952],{},"I'm a no-coder, so my approach leans no-code. To any coders reading, wait, am I wrong? I don't think so. The no-code tool already handles the things that make browser automation hard. It waits for pages to load. It gives you a ",[322,31948,26444],{"href":11340}," to pick the exact element you want. It has ",[322,31951,28752],{"href":28751}," and security built in. That and a lot more. And if you do want code, you can use it inside the no-code tool anyway. So yes, my approach is no-code.",[14,31954,31955,31956,31958],{},"One more thing. Map out your use case first, the task you are trying to finish, before you break it into actions. Get that clear and the rest follows. That is why I would reach for ",[322,31957,26316],{"href":26315}," every time.",[21,31960,31962,31963],{"id":31961},"automate-website-actions-from-a-description","Automate website actions from a description ",[727,31964],{"id":513},[11,31966],{},[14,31968,26327,31969,26333,31972,26337,31974,447,31976,31979],{},[322,31970,26332],{"href":26330,"rel":31971},[2245],[322,31973,26336],{"href":26315},[29,31975,26340],{},[29,31977,31978],{},"coming very soon"," . In the meantime you can still use the no-code builder.",[26343,31981,31983],{":instructions":31982,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Log into my website\",\"Click into the search field\",\"Enter these values from a Google Sheet\",\"Click search\",\"Scrape the results, then click the pager\"]",[14,31984,31985],{},"To the right is an example. Break the task down and let the AI generate the steps of your bot.",[21,31987,31989,31990],{"id":31988},"automate-website-actions-in-code","Automate website actions in code ",[727,31991],{"id":90},[11,31993],{},[14,31995,31996,28801,31998],{},[29,31997,26366],{},[322,31999,26371],{"href":26370},[26373,32001,32003],{":secondaryLinks":26347,"code":32002,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F 1. Log into the site\n  await page.goto(\"https:\u002F\u002Fexample.com\u002Flogin\");\n  await page.fill(\"#email\", process.env.SITE_EMAIL);\n  await page.fill(\"#password\", process.env.SITE_PASSWORD);\n  await page.click(\"button[type=submit]\");\n\n  \u002F\u002F 2-4. Search each value (these would come from your Google Sheet)\n  const queries = [\"widget\", \"gadget\", \"gizmo\"];\n  const results = [];\n\n  for (const query of queries) {\n    await page.click(\"#search\");\n    await page.fill(\"#search\", query);\n    await page.keyboard.press(\"Enter\");\n\n    \u002F\u002F 5. Scrape every result page, clicking the pager until it runs out\n    while (true) {\n      await page.waitForSelector(\".result\");\n      const rows = await page.$$eval(\".result\", els =>\n        els.map(el => el.textContent.trim())\n      );\n      results.push(...rows);\n\n      const next = page.locator(\".pager-next\");\n      if ((await next.count()) === 0 || (await next.isDisabled())) break;\n      await next.click();\n    }\n  }\n\n  console.log(results);\n} finally {\n  await browser.close();\n}\n",[14,32004,26380],{},[26382,32006],{"description":32007,"eyebrow":26385,"image":26386,"imageAlt":32008,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe what you want. It builds the bot for you, no-code or code, and handles the tricky parts like proxies and schedules.","Claude building an automation from a description",[21,32010,26395],{"id":26394},[11,32012],{},[14,32014,32015],{},"Most things. A few worth knowing up front.",[26402,32017],{":cards":32018},"[{\"title\":\"Works well\",\"tone\":\"green\",\"icon\":\"check\",\"items\":[\"Automating reporting\",\"Automating file uploads and downloads\",\"Extracting data from websites\"]},{\"title\":\"Harder\",\"tone\":\"amber\",\"icon\":\"warning\",\"items\":[\"2FA-protected sites\",\"CAPTCHA sites\",\"Sites with throttling or rate limiting\"]},{\"title\":\"Don't try\",\"tone\":\"red\",\"icon\":\"block\",\"items\":[\"Automating gambling\",\"Rigging votes with web automation\"]}]",[21,32020,26408],{"id":26407},[11,32022],{},[14,32024,32025],{},"As we covered, the range of actions we perform in a browser is broad, so the use cases for automating web work are broad too. I won't pretend it is all easy. Complexity and a learning curve are both real in browser automation, for any number of reasons. That is why we are building axiom.",[639,32027,32029],{"id":32028},"selector-issues","Selector issues",[14,32031,32032],{},"\"Element not found\" means the element is either missing from the page or the selector is wrong. If you can see the element on the page while the run happens, the selector is the problem, and that you can fix.",[639,32034,28850],{"id":28849},[14,32036,28853],{},[639,32038,28857],{"id":28856},[14,32040,32041,32042],{},"To act on anything inside an iframe, turn iframe support on in the selector tool first. ",[322,32043,32044],{"href":11340},"Selector tool docs",{"title":494,"searchDepth":495,"depth":495,"links":32046},[32047,32048,32049,32050,32051,32052,32053],{"id":31913,"depth":498,"text":31914},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":31961,"depth":498,"text":31962},{"id":31988,"depth":498,"text":31989},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":32054},[32055,32056,32057],{"id":32028,"depth":495,"text":32029},{"id":28849,"depth":495,"text":28850},{"id":28856,"depth":495,"text":28857},"Automate the website actions you repeat by hand, filling forms, uploading files, clicking through results. Build it no-code in the browser or in code with axiom.",{},"\u002Fautomate\u002Fwebsite-actions",{"title":31904,"description":32058},"automate\u002Fwebsite-actions","TncBmO919nSLZ4s7zFjyG-gcImJMNW7xWis8DAdTKX0",{"id":32065,"title":32066,"author":26259,"body":32067,"date":523,"description":32218,"extension":506,"meta":32219,"navigation":522,"order":523,"path":32220,"seo":32221,"stem":32222,"__hash__":32223},"automate\u002Fautomate\u002Fwebull.md","Automate Webull reporting without code | axiom",{"type":8,"value":32068,"toc":32203},[32069,32073,32077,32079,32082,32086,32088,32091,32094,32096,32098,32101,32103,32105,32108,32113,32119,32121,32128,32134,32140,32142,32148,32153,32157,32159,32161,32164,32167,32169,32171,32174,32178,32181,32185,32188,32192,32195,32197],[26263,32070],{"description":32071,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":32072},"A bot can pull your own Webull data into a sheet, your positions, watchlist prices, statements, and tax documents, so tracking your account does not mean logging in to check. It does not place trades. This is for reporting on your own account, not automated trading. There are three ways to start, with no code, with code, or with a Claude skill.","Automate Webull reporting",[21,32074,32076],{"id":32075},"what-i-mean-by-automating-webull","What I mean by automating Webull",[11,32078],{},[14,32080,32081],{},"Automating Webull, the sensible way, means a bot pulls your own account data into a sheet. Your positions and their values, the prices on your watchlist, your statements, your tax documents. It reads what you can already see when you log in, and gathers it where you can work with it. It is reporting and tracking, not trading.",[21,32083,32085],{"id":32084},"automate-the-tracking-not-the-trades","Automate the tracking, not the trades",[11,32087],{},[14,32089,32090],{},"There is a version of this you should not build. Pointing a bot at a brokerage to place trades on its own is a real way to lose real money, fast, and it is not something I would help you set up. Automated trade execution carries risk that a landing page cannot wave away, and it is not what this is for.",[14,32092,32093],{},"What is safe and useful is the reporting. Your positions, your watchlist, your statements, all sitting behind a login you have to open and read by hand. A bot can pull that into a sheet on a schedule, so you track your account without the clicking, and never place an order. Read and report, never trade. None of this is financial advice, it is just getting your own numbers out.",[21,32095,26295],{"id":26294},[11,32097],{},[14,32099,32100],{},"This is for the investor who wants their own account data in one place, not a trading bot. Tracking positions across accounts, watching prices, pulling statements at tax time. You want the numbers gathered, you do not want a script trading for you. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,32102,26304],{"id":26303},[11,32104],{},[14,32106,32107],{},"Decide what you want to track, positions, watchlist, or statements, and have the bot read those screens and write them to a sheet on a schedule. Use your own logged-in session, and never enter your credentials into the bot itself. Keep it read-only, nothing that places or cancels an order.",[14,32109,32110,32111,44],{},"Read your own data, write it to a sheet, leave the trading to you. I would lay out the first draft with ",[322,32112,26316],{"href":26315},[21,32114,32116,32117],{"id":32115},"automate-webull-reporting-from-a-description","Automate Webull reporting from a description ",[727,32118],{"id":513},[11,32120],{},[14,32122,26327,32123,26333,32126,31010],{},[322,32124,26332],{"href":26330,"rel":32125},[2245],[322,32127,26336],{"href":26315},[26343,32129,32131],{":instructions":32130,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open Webull on the web and sign in\",\"Go to my positions\",\"Read each holding and its value\",\"Write them to a Google Sheet\",\"Run it every evening\"]",[14,32132,32133],{},"To the right is an example. Describe what you want to track, and the AI lays out the steps. Read-only, nothing that trades.",[21,32135,32137,32138],{"id":32136},"automate-webull-reporting-in-code","Automate Webull reporting in code ",[727,32139],{"id":90},[11,32141],{},[14,32143,32144,26367,32146],{},[29,32145,26366],{},[322,32147,26371],{"href":26370},[26373,32149,32151],{":secondaryLinks":26347,"code":32150,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Your own account, using your logged-in session. Read-only.\n  await page.goto(\"https:\u002F\u002Fapp.webull.com\u002Fpositions\");\n  await page.waitForSelector(\".position-row\");\n\n  \u002F\u002F Read each holding off the page, no orders placed\n  const holdings = await page.$$eval(\".position-row\", els =>\n    els.map(el => ({\n      symbol: el.querySelector(\".symbol\")?.textContent.trim(),\n      qty:    el.querySelector(\".quantity\")?.textContent.trim(),\n      value:  el.querySelector(\".market-value\")?.textContent.trim(),\n    }))\n  );\n\n  console.log(holdings); \u002F\u002F write these to your sheet\n} finally {\n  await browser.close();\n}\n",[14,32152,26380],{},[26382,32154],{"description":32155,"eyebrow":26385,"image":26386,"imageAlt":32156,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe what you want to track. It builds the bot for you, no-code or code, reading your own account data into a sheet. Read-only, never trading.","Claude building a Webull reporting automation from a description",[21,32158,26395],{"id":26394},[11,32160],{},[14,32162,32163],{},"The tracking, never the trading. A couple of cases worth knowing first.",[26402,32165],{":cards":32166},"[{\"title\":\"Works well\",\"items\":[\"Pulling positions into a sheet\",\"Tracking watchlist prices\",\"Downloading statements\",\"Gathering tax documents\",\"Running it on a schedule\"]},{\"title\":\"Harder\",\"items\":[\"2FA on the brokerage account\",\"Frequent layout changes\",\"Charts rendered as images\"]},{\"title\":\"Don't try\",\"items\":[\"Placing or cancelling trades\",\"Entering your credentials into the bot\",\"Anything against Webull's terms\"]}]",[21,32168,26408],{"id":26407},[11,32170],{},[14,32172,32173],{},"This one is a brokerage behind a login, so the cautions matter more than usual. Here is what I would watch for.",[639,32175,32177],{"id":32176},"read-only-never-trading","Read-only, never trading",[14,32179,32180],{},"The bot reports, it does not place orders. Do not build trade execution. An automated trade gone wrong is real money lost, and it is not a thing to hand to a script.",[639,32182,32184],{"id":32183},"never-put-credentials-in-the-bot","Never put credentials in the bot",[14,32186,32187],{},"Carry your own logged-in session rather than storing a brokerage password in the automation. Your login is the last thing you want sitting in a bot's settings.",[639,32189,32191],{"id":32190},"this-is-not-financial-advice","This is not financial advice",[14,32193,32194],{},"Gathering your own numbers is not advice, and neither is anything here. What you do with the data is your call, and worth talking through with someone qualified.",[639,32196,26431],{"id":26430},[14,32198,32199,32200,32202],{},"Sign in as yourself, store the cookies so the bot keeps the session, and repick anything that moves with the ",[322,32201,26444],{"href":11340}," after an update.",{"title":494,"searchDepth":495,"depth":495,"links":32204},[32205,32206,32207,32208,32209,32210,32211,32212],{"id":32075,"depth":498,"text":32076},{"id":32084,"depth":498,"text":32085},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":32115,"depth":498,"text":32116},{"id":32136,"depth":498,"text":32137},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":32213},[32214,32215,32216,32217],{"id":32176,"depth":495,"text":32177},{"id":32183,"depth":495,"text":32184},{"id":32190,"depth":495,"text":32191},{"id":26430,"depth":495,"text":26431},"Automate Webull reporting without code. Pull your positions, watchlist prices, statements, and tax docs into a sheet. Read-only tracking, not automated trading. From axiom.",{},"\u002Fautomate\u002Fwebull",{"title":32066,"description":32218},"automate\u002Fwebull","7yLcM9Gf4UCXGJLYl7Qojh7g8p1ZTJ3FD1dw-1eaCAg",{"id":32225,"title":32226,"author":26259,"body":32227,"date":523,"description":32376,"extension":506,"meta":32377,"navigation":522,"order":523,"path":32378,"seo":32379,"stem":32380,"__hash__":32381},"automate\u002Fautomate\u002Fyoutube.md","Automate YouTube without code | axiom",{"type":8,"value":32228,"toc":32361},[32229,32233,32237,32239,32242,32246,32248,32251,32254,32256,32258,32261,32263,32265,32268,32273,32279,32281,32288,32294,32300,32302,32308,32313,32317,32319,32321,32324,32327,32329,32331,32334,32338,32341,32343,32346,32350,32353,32355],[26263,32230],{"description":32231,"primaryText":26266,"primaryTo":26267,"secondaryText":26268,"secondaryTo":26269,"title":32232},"Running a YouTube channel is a lot of repeated work in Studio. Uploading videos, fixing titles and descriptions, posting updates, pulling your numbers. A bot can take the grind off your hands for the one or two channels you run. This is for your own channels, not a spam operation. There are three ways to start, with no code, with code, or with a Claude skill.","Automate YouTube",[21,32234,32236],{"id":32235},"what-i-mean-by-automating-youtube","What I mean by automating YouTube",[11,32238],{},[14,32240,32241],{},"Automating YouTube means a bot handles the repetitive parts of running your channel. Uploading a video and setting its title, description, and tags, editing those fields across a back catalogue, posting a community update, scraping data off your videos, and pulling reporting numbers into a sheet. Most of it lives in YouTube Studio, the creator back office, and a bot works it the way you would, for the channels you actually run.",[21,32243,32245],{"id":32244},"studio-is-the-back-office","Studio is the back office",[11,32247],{},[14,32249,32250],{},"Almost everything a creator does happens in YouTube Studio, uploading, editing metadata, scheduling, posting, and reading analytics. Two of those are already well served. The analytics screens are solid, and the YouTube Data API gives you reporting numbers cleanly, so for heavy data pulls, reach for the API.",[14,32252,32253],{},"The part that stays manual is the content grind. Uploading a batch and filling in every title, description, and tag. Fixing the metadata on fifty old videos. Scheduling a week of posts. That is clicking, the same fields over and over, and it is exactly what a bot takes off your plate. For the one or two channels you run, not a farm of them, a browser bot turns the Studio grind into a job that runs itself.",[21,32255,26295],{"id":26294},[11,32257],{},[14,32259,32260],{},"This is for the creator or small team running a channel without a back office of staff. You upload regularly, you keep your metadata tidy, you check your numbers, and you would rather not do every step by hand. One channel, maybe two. If you are looking to run a network of channels pumping out spam, this is not the tool. No-coders and coders both, since you can build it without code and drop into code when you want.",[21,32262,26304],{"id":26303},[11,32264],{},[14,32266,32267],{},"Pick the grind you feel most. Usually it is the upload-and-fill, dropping in a video and typing the same kind of title, description, and tags. Put the details in a sheet, point the bot at Studio, and let it fill the fields for each upload. For reporting, decide between the API for clean numbers and a quick scrape of the Studio screen for what you can see. Run it on your own channel with your own logged-in session.",[14,32269,32270,32271,44],{},"One task, your channel, your pace. I would lay out the first draft with ",[322,32272,26316],{"href":26315},[21,32274,32276,32277],{"id":32275},"manage-youtube-from-a-description","Manage YouTube from a description ",[727,32278],{"id":513},[11,32280],{},[14,32282,26327,32283,26333,32286,31010],{},[322,32284,26332],{"href":26330,"rel":32285},[2245],[322,32287,26336],{"href":26315},[26343,32289,32291],{":instructions":32290,":maxChars":26346,":secondaryLinks":26347,"instructionsLabel":26348,"panelHeading":26349,"panelStatus":26350,"primaryText":26332,"primaryTo":26330},"[\"Open YouTube Studio and sign in\",\"Read the next video and its new details from a Google Sheet\",\"Open that video's details page\",\"Update the title, description, and tags\",\"Save, then move to the next row\"]",[14,32292,32293],{},"To the right is an example. Describe the task for your channel, and the AI lays out the steps.",[21,32295,32297,32298],{"id":32296},"manage-youtube-in-code","Manage YouTube in code ",[727,32299],{"id":90},[11,32301],{},[14,32303,32304,26367,32306],{},[29,32305,26366],{},[322,32307,26371],{"href":26370},[26373,32309,32311],{":secondaryLinks":26347,"code":32310,"primaryText":26376,"primaryTo":26377,"toolUrl":26377},"import { chromium } from \"playwright\";\n\nconst browser = await chromium.connectOverCDP(\n  `wss:\u002F\u002Fcdp-lb.axiom.ai\u002F?token=${process.env.AXIOM_API_KEY}`\n);\n\ntry {\n  const context = browser.contexts()[0];\n  const page = context.pages()[0] ?? await context.newPage();\n\n  \u002F\u002F Your own channel's content page, using your logged-in session\n  await page.goto(\"https:\u002F\u002Fstudio.youtube.com\");\n  await page.waitForSelector(\"#video-list\");\n\n  \u002F\u002F Read views and other stats off each video row\n  const videos = await page.$$eval(\"#video-list .video-row\", els =>\n    els.map(el => ({\n      title:     el.querySelector(\".video-title\")?.textContent.trim(),\n      views:     el.querySelector(\".views\")?.textContent.trim(),\n      published: el.querySelector(\".date\")?.textContent.trim(),\n    }))\n  );\n\n  console.log(videos); \u002F\u002F write these to your sheet\n} finally {\n  await browser.close();\n}\n",[14,32312,26380],{},[26382,32314],{"description":32315,"eyebrow":26385,"image":26386,"imageAlt":32316,"primaryText":26388,"primaryTo":26389,"secondaryText":19278,"secondaryTo":26390,"title":26391},"Add the Claude skill and describe the YouTube task for your channel. It builds the bot for you, no-code or code, filling Studio from a sheet or pulling your numbers out.","Claude building a YouTube automation from a description",[21,32318,26395],{"id":26394},[11,32320],{},[14,32322,32323],{},"The Studio grind, for the channels you run. A couple of cases worth knowing first.",[26402,32325],{":cards":32326},"[{\"title\":\"Works well\",\"items\":[\"Filling titles, descriptions, and tags on upload\",\"Editing metadata across a back catalogue\",\"Scheduling and posting community updates\",\"Scraping your video stats into a sheet\",\"Pulling reporting numbers on a schedule\"]},{\"title\":\"Harder\",\"items\":[\"Uploading large video files, which take time to process\",\"Studio layout changes after an update\",\"2FA on the account\"]},{\"title\":\"Don't try\",\"items\":[\"Running a network of channels for spam\",\"Fake views, likes, or comment spam\",\"Anything against YouTube's terms\"]}]",[21,32328,26408],{"id":26407},[11,32330],{},[14,32332,32333],{},"Studio is a big app behind a login, so a few things trip up a channel bot. Here is what I would watch for.",[639,32335,32337],{"id":32336},"your-own-channel-not-a-network","Your own channel, not a network",[14,32339,32340],{},"This is for the one or two channels you run. A network of channels pumping out spam or fake engagement is what YouTube hunts and bans. Stay on your own, keep it real.",[639,32342,31221],{"id":31220},[14,32344,32345],{},"A video is not posted the second it finishes uploading, YouTube processes it. Wait for the upload to complete and the page to settle before the bot fills the fields or moves on, or it will act on a half-ready video.",[639,32347,32349],{"id":32348},"api-for-heavy-reporting","API for heavy reporting",[14,32351,32352],{},"For clean numbers in volume, the YouTube Data API beats scraping the screen. Use the browser for the content grind and quick looks, and reach for the API when reporting is the main job.",[639,32354,26431],{"id":26430},[14,32356,32357,32358,32360],{},"Sign in as yourself and store the cookies so the bot keeps the session. Repick anything that moves with the ",[322,32359,26444],{"href":11340}," after a Studio update.",{"title":494,"searchDepth":495,"depth":495,"links":32362},[32363,32364,32365,32366,32367,32368,32369,32370],{"id":32235,"depth":498,"text":32236},{"id":32244,"depth":498,"text":32245},{"id":26294,"depth":498,"text":26295},{"id":26303,"depth":498,"text":26304},{"id":32275,"depth":498,"text":32276},{"id":32296,"depth":498,"text":32297},{"id":26394,"depth":498,"text":26395},{"id":26407,"depth":498,"text":26408,"children":32371},[32372,32373,32374,32375],{"id":32336,"depth":495,"text":32337},{"id":31220,"depth":495,"text":31221},{"id":32348,"depth":495,"text":32349},{"id":26430,"depth":495,"text":26431},"Automate YouTube without code, for the one or two channels you run. Upload and edit videos, fill titles and tags, post updates, and scrape your reporting into a sheet. From axiom.",{},"\u002Fautomate\u002Fyoutube",{"title":32226,"description":32376},"automate\u002Fyoutube","YQVwgCTsVZcQ8PNVyAPLi-0XXZKVyjRlTrTN2MDP4XI",1781274738608]