[{"data":1,"prerenderedAt":96},["ShallowReactive",2],{"content-\u002Fbuild-with-code\u002Fapi\u002Fstep":3,"content-doc-\u002Fbuild-with-code\u002Fapi\u002Fstep-inline":3},{"id":4,"title":5,"body":6,"date":85,"description":86,"extension":87,"meta":88,"navigation":89,"order":85,"path":90,"seo":91,"stem":94,"__hash__":95},"content\u002Fbuild-with-code\u002Fapi\u002Fstep.md","Step API: Scrape, Click, and Type With One Call Each | axiom.ai",{"type":7,"value":8,"toc":82},"minimark",[9,16,22,33,40,46,53,56,64,75],[10,11],"left-hero",{"description":12,"primaryText":13,"primaryTo":14,"title":15},"The engine behind the No-Code Tool, exposed as functions you can call. Each one does a whole job: scrape a paginated list, solve a captcha, walk a date picker, run an LLM prompt without leaving the session. Call them from Node, from any CDP client, or hand them to your agent over MCP.","Get API key","https:\u002F\u002Fcode.axiom.ai","Step API: Scrape, click, and type with one call each.",[17,18],"api-code-example",{"caption":19,"example":20,"link-text":21},"Scrape 200 rows in four lines.","step","Step API docs",[23,24],"feature-grid-staggered",{":items":25,"description":26,"eyebrow":27,"title":28,"variant":29,":reverse-stagger":30,"cols":31,"section-id":32},"[{\"title\":\"Solve a captcha\",\"code\":\"await axiom.solveCaptcha(key);\",\"description\":\"The step finds the challenge, gets the answer, and submits it. Your script carries on as though it were never there.\"},{\"title\":\"Page through 500 rows\",\"code\":\"await axiom.scrape(url,\\n  \\\".row\\\", \\\".next\\\", 500, {});\\n\",\"description\":\"One call loads the page, waits for it, and clicks through the pages until it has your results.\"},{\"title\":\"Ask a model about the page\",\"code\":\"await axiom.integrateAI({\\n  prompt: \\\"Is this in stock?\\\"\\n});\\n\",\"description\":\"Classify a page, summarize reviews, or pull a field out of messy text, mid-run, with no model call of your own to stand up.\"},{\"title\":\"Set a date picker\",\"code\":\"await axiom.datePicker(sel, date);\",\"description\":\"The widget that breaks everyone's scraper. Hand it a date and the step clicks its way to the right cell.\"},{\"title\":\"Drag a thing to another thing\",\"code\":\"await axiom.clickAndDrag(a, b);\",\"description\":\"Range sliders, kanban cards, map handles, drop zones. Two selectors, real mouse events.\"},{\"title\":\"Like, follow, upvote\",\"code\":\"await axiom.clickEngagementButton(sel);\",\"description\":\"For the controls that hide behind a hover state and re-render the moment you touch them.\"},{\"title\":\"Read the clipboard\",\"code\":\"await axiom.getClipboardContents();\",\"description\":\"Some pages will only hand over the data through a copy button. This reads what landed there.\"},{\"title\":\"Unwedge a hung browser\",\"code\":\"await axiom.restartBrowser();\",\"description\":\"Some pages take Chrome down with them. Get a fresh one inside the same session and keep the run alive.\"},{\"title\":\"Open a browser nobody has touched\",\"code\":\"await axiom.browserOpen();\",\"description\":\"An isolated cloud Chrome with clean cookies, held open across as many steps as you like.\"}]","Nine of the twenty steps, with the line of code each one takes. The arguments are the selectors and values you already have. The steps that read something hand the data back, the rest act on the page and move on.","Single calls","Nine steps, one line each.","solid","true",3,"one-liners",[34,35],"feature-list",{":items":36,"description":37,"eyebrow":38,"title":39},"[{\"title\":\"Write less code\",\"description\":\"In [Puppeteer](\u002Fbuild-with-code\u002Fpuppeteer) or [Playwright](\u002Fbuild-with-code\u002Fplaywright) you write the mechanics yourself: waitForSelector, $$eval, click next, wait, loop. A step is that sequence already written. Pass it what it needs: click takes the button selector, scrape takes the data selector, the next-page selector, and a result count. A dozen lines come out as one.\"},{\"title\":\"Error handling built in\",\"description\":\"The steps run on the same engine as the No-Code Tool, so they wait for elements, retry flaky actions, and time out sensibly by default. Long-running steps poll transparently until they finish. You handle business logic, not browser flakiness.\"},{\"title\":\"Mix with your own code\",\"description\":\"Steps are ordinary async functions, so they sit in the middle of the JavaScript you already write. Pull rows from your database and loop them through a step. Drop to raw CDP with Puppeteer or Playwright when a step doesn't cover something, then carry on with steps in the same session, on the same browser.\"},{\"title\":\"Drive it from an MCP client\",\"description\":\"Give your agents hands on a real browser. The steps become tools an MCP client calls on its own: scrape a page for the data it needs, or chain a series to log in, fill a form, and read the result back. Claude, Cursor, or an agent you built yourself, all on your account key.\"}]","Each step does a whole job rather than a single browser instruction, and it runs on the same engine as the No-Code Tool.","Why steps","The No-Code Tool's engine, as functions.",[34,41],{":items":42,"description":43,"eyebrow":44,"title":45},"[{\"title\":\"Node library\",\"description\":\"The canonical wrapper. Named methods, HTTP boilerplate handled, transparent retries when a long-running step times out.\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\",\"linkText\":\"Browse every step function\"},{\"title\":\"Puppeteer or any CDP client\",\"description\":\"Prefer full DevTools Protocol control? Point any CDP-speaking client at the same cloud browser WebSocket.\",\"to\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fcdp\",\"linkText\":\"Read the Chrome API docs\"},{\"title\":\"MCP server\",\"description\":\"Expose step functions as MCP tools so Claude or another LLM client can drive a session step by step. The axiom.ai MCP server arrives in the next release.\"}]","Same steps, same cloud browsers, same key. Pick whichever fits how you already work.","How to call it","Three ways to drive a session.",[47,48],"code-tiles-grid",{":tiles":49,"description":50,"eyebrow":51,"title":52},"[{\"title\":\"Log in and scrape\",\"code\":\"await axiom.browserOpen();\\ntry {\\n  await axiom.goto(\\\"https:\u002F\u002Fexample.com\u002Flogin\\\");\\n  await axiom.enterText(\\\"#email\\\", \\\"user@example.com\\\");\\n  await axiom.enterText(\\\"#password\\\", process.env.PW);\\n  await axiom.click(\\\"button[type=submit]\\\");\\n  await axiom.wait(2000);\\n\\n  const rows = await axiom.scrape(null, { hierarchy: \\\".product-card\\\" }, null, 50, {});\\n} finally {\\n  await axiom.browserClose();\\n}\\n\"},{\"title\":\"Fill in a form\",\"code\":\"await axiom.goto(\\\"https:\u002F\u002Fexample.com\u002Fapply\\\");\\nawait axiom.enterText(\\\"#full-name\\\", row.name);\\nawait axiom.selectList(\\\"#country\\\", row.country);\\nawait axiom.click(\\\"button[type=submit]\\\");\\n\"},{\"title\":\"Use AI mid-run\",\"code\":\"const [[title], [description]] = await axiom.scrapeMetadata([\\n  { id: \\\"general_metadata_title\\\" },\\n  { id: \\\"meta_description\\\", value: 'meta[name=\\\"description\\\"]' }\\n]);\\nconst verdict = await axiom.integrateAI({\\n  aiFunction: \\\"generate\\\",\\n  prompt: `Product page or category page? ${title} ${description}`\\n});\\n\"},{\"title\":\"Combine with your own code\",\"code\":\"const targets = await db.query(\\\"SELECT url FROM watchlist\\\");\\n\\nawait axiom.browserOpen();\\ntry {\\n  for (const { url } of targets) {\\n    await axiom.goto(url);\\n    const [[price]] = await axiom.scrape(null, { hierarchy: \\\".price\\\" }, null, 1, {});\\n    if (Number(price) \u003C 100) await notifySlack(url, price);\\n  }\\n} finally {\\n  await axiom.browserClose();\\n}\\n\"}]","Log in, fill a form, call AI mid-run, or drop the steps into code you already have.","Worked examples","Chain the steps to fit the job.",[54,55],"step-groups",{},[23,57],{":items":58,"description":59,"eyebrow":60,"title":61,"variant":29,":flat":30,"link":62,"linkText":63},"[{\"shape\":\"cube\",\"title\":\"Chrome API docs\",\"link\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fcdp\",\"linkText\":\"Read the Chrome API docs\"},{\"shape\":\"staircase\",\"title\":\"Step API docs\",\"link\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fstep-functions\",\"linkText\":\"Read the Step API docs\"},{\"shape\":\"integration\",\"title\":\"Orchestrate API docs\",\"link\":\"\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Frun-automations\",\"linkText\":\"Read the Orchestrate API docs\"}]","Quickstarts, worked examples, and full endpoint references for each layer. Start with the quickstart, generate a key, and build from there.","Docs","Every layer, documented.","\u002Fdocs\u002Fdeveloper-hub\u002Fapi\u002Fquickstart","Start with the quickstart",[65,66,69],"grid-fade-wrap",{"bg":67,"color":68},"gray-to-white","default",[70,71],"call-to-action",{":shapes":72,"headline":73,"linkText":13,"linkTo":14,"text":74},"[\"staircase\"]","Get an API key and try the Step API for free.\n","2 free hours of runtime. No card required.",[76,77],"cross-links",{":links":78,"className":79},"[{\"eyebrow\":\"Go deeper\",\"title\":\"Chrome API\",\"to\":\"\u002Fbuild-with-code\u002Fapi\u002Fchrome\"},{\"eyebrow\":\"Go deeper\",\"title\":\"Orchestrate API\",\"to\":\"\u002Fbuild-with-code\u002Fapi\u002Forchestrate\"}]",[80,81],"gray","iso-grid-gray-100",{"title":83,"searchDepth":31,"depth":31,"links":84},"",[],null,"[object Object]","md",{},true,"\u002Fbuild-with-code\u002Fapi\u002Fstep",{"title":5,"description":92},{"Drive a cloud browser with high-level actions":93},"goto, click, enterText, scrape, solveCaptcha. Call them from Node, any CDP client, or hand them to Claude as MCP tools.","build-with-code\u002Fapi\u002Fstep","t-YXuhxpcwe17NYrrVNjFovdVIM2TYfdEHtmsUpkeLc",1785947370379]