Step function vs No-Code step
If you've built an automation in the No-Code Tool and want to drive the equivalent flow via the axiom-api library, this table maps each step to its closest method. Steps without a direct equivalent are flagged in the Notes column with the recommended workaround.
Mapping table
| No-Code Tool step | axiom-api method | Notes |
|---|---|---|
| Go to page | axiom.goto(url, ...) | Direct equivalent. |
| Click element | axiom.click(select, ...) | Direct equivalent. Supports left/right click and "click if present" via the optionalClick flag. |
| Click multiple elements | axiom.clickMultiple(select, ...) | Direct equivalent. |
| Click engagement button | axiom.clickEngagementButton(select, setValueToCheck) | Direct equivalent for like/follow/subscribe-style toggles. |
| Enter text | axiom.enterText(selectTextField, text, ...) | Direct equivalent. Per-character delay, append-vs-replace, and a custom-line-break token are all supported. |
| Press key(s) | axiom.pressKeys(key, delimiter, delay) | Direct equivalent. |
| Rollover element | axiom.hover(select) | Direct equivalent. |
| Mouse click & drag | axiom.clickAndDrag(start, end) | Direct equivalent. |
| Select list | axiom.selectList(select, text) | Direct equivalent for native <select> elements. |
| Date picker | axiom.datePicker(...) | Direct equivalent for calendar-widget date pickers. |
| Wait | axiom.wait(time) | Direct equivalent. Pauses on the pod so the session's inactivity timer stays reset. |
| Random wait | Compose in code | Compute the delay in your code, then call axiom.wait(delay). |
| Switch browser tab | axiom.switchBrowserTab(selectTab) | Direct equivalent. |
| Open a new tab | axiom.goto(url, false, true) | Pass openInNewTab: true (third arg) to goto. |
| Close browser tab | axiom.browserClose() | Closes the whole session. There is no single-tab close today. |
| Get data from bot's current page | axiom.scrape(url, selector, pager, max_results, settings) | Direct equivalent. Pass null for url to scrape the page already loaded. |
| Get page metadata | axiom.scrapeMetadata(metadata) | Direct equivalent for title/description/OG-tag style fields. |
| Get a list of links to pages from bot's current page | axiom.scrape(...) | Pass a selector that targets the links you want. |
| Read clipboard | axiom.getClipboardContents() | Direct equivalent. |
| Save screenshot locally | Not exposed | Fall back to a No-Code Tool automation triggered via /trigger, or take the screenshot yourself over CDP (Page.captureScreenshot). |
| Save page HTML | Not exposed | Use axiom.scrape() for structured extraction, or drop down to CDP and read DOM.getOuterHTML. |
| Download file from URL | Not exposed | Use a normal HTTP client in your code. |
| Write javascript | Not exposed | Fall back to /trigger for arbitrary JS execution, or use CDP Runtime.evaluate. |
| Clear cookies | Not exposed | Open a fresh session for cookie isolation. The doNotShareLocalstorage flag on axiom.goto() handles the localStorage case for a single navigation. |
| Current Url | Not exposed | Track URLs in your own code from each axiom.goto() call. |
| Solve Captcha | axiom.solveCaptcha(apiKey) | Direct equivalent. You supply the solver API key. |
| Generate text with ChatGPT / AI | axiom.integrateAI(aiOptions) | Direct equivalent for the inline-AI step. For arbitrary OpenAI/Anthropic usage, call those APIs from your code instead. |
| Try / Catch | Native language construct | try { ... } catch (e) { ... } |
| If condition | Native language construct | Branch based on data returned by previous calls. |
| Loop through data | Native language construct | for loop in your code. |
| Read data from a Google Sheet | Not exposed | Use the Google Sheets API directly from your code. |
| Write data to a Google Sheet | Not exposed | Use the Google Sheets API directly from your code. |
| Send an email | Not exposed | Use your language's email library or a service like SendGrid. |
| Trigger webhook | Native HTTP call | fetch(url, { method: "POST", body }) from your code. |
When to fall back to /trigger
The step-trigger surface covers the common interaction and extraction steps directly. For everything else (screenshots, raw HTML readout, arbitrary JS, file downloads, sheet I/O, email), the recommended workaround is:
- Build the missing capability into a No-Code Tool automation.
- Trigger that automation via
/triggerfrom your code.
This gives you the imperative control of axiom-api for the parts of the flow that need it, plus the full No-Code Tool step library for the parts that don't.
When to port and when not to
Porting a No-Code Tool automation to axiom-api makes sense when:
- The flow needs to branch based on what each step returned.
- The flow needs to live alongside other code in your stack (in a backend service, a CI job, a scheduled function).
- You want version control, code review, and tests on your automation logic.
Stick with the No-Code Tool when:
- The flow is short and stable, with no runtime branching.
- The person maintaining it isn't a developer.
- Triggering it via
/triggerfrom your code already covers your needs.
The two surfaces aren't either-or. A common pattern is keeping the visual automation as the source of truth for stable workflows, then using axiom-api for the dynamic, branchy parts of your application.