Step API: Scrape, click, and type with one call each.

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.

Step API
1import { AxiomApi } from 'axiom-api';2 3const axiom = new AxiomApi(process.env.AXIOM_API_KEY);4 5await axiom.browserOpen();6try {7  await axiom.goto("https://example.com/products");8  await axiom.click("button[data-load-more]");9  const rows = await axiom.scrape({ maxResults: 200 });10  console.log(rows.length);11} finally {12  await axiom.browserClose();13}
Scrape 200 rows in four lines.Step API docs

Single calls

Nine steps, one line each.

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.

Why steps

The No-Code Tool's engine, as functions.

Each step does a whole job rather than a single browser instruction, and it runs on the same engine as the No-Code Tool.

Write less code

In Puppeteer or Playwright 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.

Error handling built in

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.

Mix with your own code

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.

Drive it from an MCP client

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.

How to call it

Three ways to drive a session.

Same steps, same cloud browsers, same key. Pick whichever fits how you already work.

MCP server

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.

Worked examples

Chain the steps to fit the job.

Log in, fill a form, call AI mid-run, or drop the steps into code you already have.

Log in and scrape
1await axiom.browserOpen();2try {3  await axiom.goto("https://example.com/login");4  await axiom.enterText("#email", "user@example.com");5  await axiom.enterText("#password", process.env.PW);6  await axiom.click("button[type=submit]");7  await axiom.wait(2000);8 9  const rows = await axiom.scrape(null, { hierarchy: ".product-card" }, null, 50, {});10} finally {11  await axiom.browserClose();12}13 
Fill in a form
1await axiom.goto("https://example.com/apply");2await axiom.enterText("#full-name", row.name);3await axiom.selectList("#country", row.country);4await axiom.click("button[type=submit]");5 
Use AI mid-run
1const [[title], [description]] = await axiom.scrapeMetadata([2  { id: "general_metadata_title" },3  { id: "meta_description", value: 'meta[name="description"]' }4]);5const verdict = await axiom.integrateAI({6  aiFunction: "generate",7  prompt: `Product page or category page? ${title} ${description}`8});9 
Combine with your own code
1const targets = await db.query("SELECT url FROM watchlist");2 3await axiom.browserOpen();4try {5  for (const { url } of targets) {6    await axiom.goto(url);7    const [[price]] = await axiom.scrape(null, { hierarchy: ".price" }, null, 1, {});8    if (Number(price) < 100) await notifySlack(url, price);9  }10} finally {11  await axiom.browserClose();12}13 

The surface

All twenty steps.

Five groups. Everything you need to open a browser, get to a page, act on it, take data off it, and close it down.

Session

Open a cloud browser and give it back when you're done.

browserOpen()Start an isolated cloud browser
browserClose()End the session and stop the meter
restartBrowser()Recover a wedged browser, keep the session

Navigation

Get to the page you want to work on.

goto(url)Load a URL and wait for it
switchBrowserTab(selectTab)Move between open tabs

Interaction

Everything you'd do with a mouse and keyboard.

click(select)Click one element
clickMultiple(select)Click every match in turn
clickEngagementButton(select)Like, follow, and similar controls
hover(select)Trigger hover menus and tooltips
clickAndDrag(start, end)Drag between two points
enterText(selectTextField, text)Type into a field
pressKeys(key)Send raw key presses
selectList(select, text)Choose from a dropdown
datePicker(...)Walk a calendar widget to a date

Scraping

Take data off the page and into your code.

scrape(url, selector, pager, max_results, settings)Load, wait, page through, return records
scrapeMetadata(metadata)Title, description, and other page metadata
getClipboardContents()Read what the page copied

AI and utility

The parts that usually need a third-party service.

integrateAI(aiOptions)Run an LLM prompt mid-session
solveCaptcha(apiKey)Send the captcha and submit the answer
wait(time)Pause for a fixed period

Docs

Every layer, documented.

Quickstarts, worked examples, and full endpoint references for each layer. Start with the quickstart, generate a key, and build from there.

Start with the quickstart

Get an API key and try the Step API for free.

2 free hours of runtime. No card required.