[{"data":1,"prerenderedAt":288},["ShallowReactive",2],{"content-\u002Fautomate\u002Fai-form-filler":3,"content-doc-\u002Fautomate\u002Fai-form-filler-inline":3},{"id":4,"title":5,"author":6,"body":7,"date":6,"description":280,"extension":281,"meta":282,"navigation":283,"order":6,"path":284,"seo":285,"stem":286,"__hash__":287},"automate\u002Fautomate\u002Fai-form-filler.md","AI Form Filler | axiom",null,{"type":8,"value":9,"toc":263},"minimark",[10,19,24,27,31,34,38,40,43,46,55,58,62,64,67,70,74,76,84,87,95,97,111,123,130,132,148,157,167,171,173,176,180,184,186,189,194,202,238,242,245,249,252,256,259],[11,12],"left-hero-automate",{"description":13,"primaryText":14,"primaryTo":15,"secondaryText":16,"secondaryTo":17,"title":18},"Describe your form and axiom's AI builds a bot that fills and submits it from your spreadsheet, then helps you run and fix it. Start no-code, in code, or with a Claude skill.","Get started no-code","#no-code","Get started code","#code","AI Form Filler",[20,21,23],"h2",{"id":22},"what-an-ai-form-filler-does","What an AI form filler does",[25,26],"hr",{},[28,29,30],"p",{},"An AI form filler is a browser bot that types your answers into a web form and submits it.",[28,32,33],{},"Describe the form once, the AI maps each answer to a field, and it works through your data one row at a time, text, dropdowns, radios, checkboxes, dates, then clicks submit and starts the next.",[20,35,37],{"id":36},"where-the-ai-actually-helps","Where the AI actually helps",[25,39],{},[28,41,42],{},"Three places. First, building: you describe the form in plain words and the AI lays out the steps to review before anything runs.",[28,44,45],{},"Second, the data: an AI step can tidy a value before it goes in, so a name in the wrong case or a two-line address lands clean.",[28,47,48,49,54],{},"Third, help while you build: a no-code ",[50,51,53],"a",{"href":52},"\u002Fai-assistant","AI assistant"," in the extension, powered by Claude, adds steps, loops a range, or fixes a broken selector on request.",[28,56,57],{},"The typing itself is plain automation; the AI builds it and handles the judgment.",[20,59,61],{"id":60},"who-this-is-for","Who this is for",[25,63],{},[28,65,66],{},"Anyone who fills the same form again and again.",[28,68,69],{},"Submitting entries from a spreadsheet, registering a list of people, re-keying records into a portal with no import button, or seeding a new form with test responses before it goes live.",[20,71,73],{"id":72},"how-id-approach-it","How I'd approach it",[25,75],{},[28,77,78,79,83],{},"Describe the form, listing the questions and where each answer comes from, and let ",[50,80,82],{"href":81},"\u002Fbuild-with-no-code\u002Fdescription","Build with description"," lay out the first draft.",[28,85,86],{},"Run one row to check the mapping before you loop the rest, so you don't submit a hundred wrong responses.",[20,88,90,91],{"id":89},"build-the-form-filler-from-a-description","Build the form filler from a description ",[92,93],"span",{"id":94},"no-code",[25,96],{},[28,98,99,100,106,107,110],{},"Describe the form in the ",[50,101,105],{"href":102,"rel":103},"https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Faxiom-browser-automation\u002Fcpgamigjcbffkaiciiepndmonbfdimbb",[104],"nofollow","Chrome extension"," and the AI builds the steps for you. ",[50,108,109],{"href":81},"Explore no-code",".",[112,113,120],"build-with-description",{":instructions":114,":maxChars":115,":secondaryLinks":116,"instructionsLabel":117,"panelHeading":118,"panelStatus":119,"primaryText":105,"primaryTo":102},"[\"Read the rows from my Google Sheet\",\"Go to the form page\",\"Enter the first name\",\"Enter the last name\",\"Select the country\",\"Enter the email\",\"Click submit\"]","500","[]","Instructions","Describe your form filler","Ready",[28,121,122],{},"An example is on the right. Describe the form and the AI lays out the steps.",[20,124,126,127],{"id":125},"build-the-form-filler-in-code","Build the form filler in code ",[92,128],{"id":129},"code",[25,131],{},[28,133,134,138,139,143,144,110],{},[135,136,137],"strong",{},"Build with code."," Describe the form to our ",[50,140,142],{"href":141},"\u002Fbuild-in-claude","Claude skill"," and it generates and debugs a ready-to-run script you own. Prefer to write it yourself? ",[50,145,147],{"href":146},"\u002Fbuild-with-code","Explore the code tool",[149,150,154],"build-with-code",{":secondaryLinks":116,"code":151,"filename":152,"primaryText":153,"primaryTo":141},"import { AxiomApi } from \"axiom-api\";\n\nconst axiom = new AxiomApi(process.env.AXIOM_API_KEY);\n\n\u002F\u002F One row from your Google Sheet\nconst row = { first: \"Ada\", last: \"Lovelace\", email: \"ada@example.com\" };\n\nawait axiom.browserOpen();\ntry {\n  await axiom.goto(\"https:\u002F\u002Fexample.com\u002Fsignup\");\n  await axiom.enterText('input[aria-label=\"First name\"]', row.first);\n  await axiom.enterText('input[aria-label=\"Last name\"]', row.last);\n  await axiom.enterText('input[aria-label=\"Email\"]', row.email);\n  await axiom.click('button[type=submit]');\n} finally {\n  await axiom.browserClose();\n}\n","fill-form.js","Generate it with the Claude skill",[28,155,156],{},"axiom's step functions, the same library the no-code builder uses. The Claude skill generates and debugs the script for you, and it runs on our cloud Chromium.",[158,159],"ask-claude-automate",{"description":160,"eyebrow":161,"image":162,"imageAlt":163,"primaryText":164,"primaryTo":52,"secondaryText":165,"secondaryTo":141,"title":166},"axiom's no-code AI assistant is built into the Chrome extension, powered by Claude. Describe the form and it adds, loops, and edits the steps, maps each field, and debugs anything that breaks. Prefer to drive from Claude itself? The Claude skill builds it too.","AI assistant, built in","\u002Flanding\u002Fai-assistant-merge.webp","axiom's AI assistant building a form filler in the extension","Meet the AI assistant","Use the Claude skill","An AI assistant helps you build the form filler.",[20,168,170],{"id":169},"what-can-the-form-filler-handle","What can the form filler handle?",[25,172],{},[28,174,175],{},"Most web forms. A couple of cases worth knowing first.",[177,178],"tone-cards",{":cards":179},"[{\"title\":\"Works well\",\"items\":[\"Filling forms from a spreadsheet, row by row\",\"Text, paragraph, dropdown, radio, and checkbox fields\",\"Dates, times, and number inputs\",\"Mapping each field with the AI builder\",\"Multi-page and multi-step forms\"]},{\"title\":\"Harder\",\"items\":[\"Forms behind a login, which need a signed-in session\",\"File upload fields\",\"CAPTCHAs and bot checks\",\"Fields whose id changes on every page load\"]},{\"title\":\"Don't try\",\"items\":[\"Submitting spam or fake entries\",\"Stuffing a poll or a signup\",\"Anything against a site's terms\"]}]",[20,181,183],{"id":182},"what-id-watch-out-for","What I'd watch out for",[25,185],{},[28,187,188],{},"Simple to build, but a few things trip up a bot.",[190,191,193],"h3",{"id":192},"target-each-field-with-a-custom-css-selector","Target each field with a custom CSS selector",[28,195,196,197,201],{},"Some forms render fields without a stable id, so a position-based selector breaks when a field moves. In the ",[50,198,200],{"href":199},"\u002Fdocs\u002Fno-code-tool\u002Fthe-builder\u002Fselector-tool","selector tool",", use a custom CSS selector on an attribute that does not move, like the field's aria-label. For example:",[203,204,209],"pre",{"className":205,"code":206,"language":207,"meta":208,"style":208},"language-css shiki shiki-themes github-light-default github-dark-default","input[aria-label=\"Email\"]\n","css","",[129,210,211],{"__ignoreMap":208},[92,212,215,219,223,227,231,235],{"class":213,"line":214},"line",1,[92,216,218],{"class":217},"sjgCt","input",[92,220,222],{"class":221},"s4rv2","[",[92,224,226],{"class":225},"sHrmB","aria-label",[92,228,230],{"class":229},"sjeE4","=",[92,232,234],{"class":233},"sSVrQ","\"Email\"",[92,236,237],{"class":221},"]\n",[190,239,241],{"id":240},"logins-and-file-uploads-need-a-signed-in-session","Logins and file uploads need a signed-in session",[28,243,244],{},"A login-gated form or a file upload only works when the run is signed in. Store that account's cookies, or leave those parts out.",[190,246,248],{"id":247},"map-every-required-field-before-you-loop","Map every required field before you loop",[28,250,251],{},"If a required field is empty or fails validation, the form won't submit and the run stalls on the first row. Map every required field first.",[190,253,255],{"id":254},"test-one-record-first","Test one record first",[28,257,258],{},"Run one row and check the result before you loop, it is much easier than undoing a hundred bad submissions.",[260,261,262],"style",{},"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":208,"searchDepth":264,"depth":264,"links":265},3,[266,268,269,270,271,272,273,274],{"id":22,"depth":267,"text":23},2,{"id":36,"depth":267,"text":37},{"id":60,"depth":267,"text":61},{"id":72,"depth":267,"text":73},{"id":89,"depth":267,"text":90},{"id":125,"depth":267,"text":126},{"id":169,"depth":267,"text":170},{"id":182,"depth":267,"text":183,"children":275},[276,277,278,279],{"id":192,"depth":264,"text":193},{"id":240,"depth":264,"text":241},{"id":247,"depth":264,"text":248},{"id":254,"depth":264,"text":255},"An AI form filler that builds itself from a description. Map each answer to a field, loop every row of your spreadsheet, and submit in the cloud. No-code, code, or a Claude skill.","md",{},true,"\u002Fautomate\u002Fai-form-filler",{"title":5,"description":280},"automate\u002Fai-form-filler","4_1UhuLh4nKcNfD_UiChQ5sbgBYktQ_z65Dcs6-SFq0",1783069574967]