Drive any browser flow.
From one API call.

Click, type, wait, evaluate JavaScript, solve reCAPTCHA — all from a single request body. The same patterns that drive a real user, in clean JSON, without a line of Puppeteer.

# Click a "show more" button, wait for the network, then extract.
curl -X POST https://api.datasonar.dev/v1/scrape \
  -H "Authorization: Bearer osk_..." \
  -d '{
    "url": "https://example.com/products",
    "actions": [
      {"type": "click", "selector": ".load-more"},
      {"type": "wait", "ms": 2000},
      {"type": "click", "selector": ".load-more"},
      {"type": "wait", "ms": 2000}
    ],
    "format": "markdown"
  }'

Action macros, not Puppeteer code

Describe what the browser should do in a JSON array — click, type, wait. No Puppeteer scripts to maintain, no headless Chrome to deploy. The same JSON works on every site.

JavaScript eval for anything else

When a page returns data your declarative actions can't shape, drop in a JavaScript expression. We execute it inside the rendered page and return the result. Anything you can pull with browser DevTools, you can pull with one API call.

Captcha detection in the same call

Set solve_captcha: true on any scrape. We detect reCAPTCHA v3 site keys automatically and solve them inline. The token comes back in the response, ready to attach to your follow-up request.

Stealth countermeasures built in

Every automation request runs with browser fingerprint randomization, headless-flag stripping, and the JavaScript checks bot defenses use — neutralized. The same protections that work on simple scrapes work on multi-step flows.

Recipes that ship today

Scrape pages behind a login

Type credentials, click submit, wait for the dashboard, then extract — all in one request body. The session lives only for the call, so there's no token storage to manage.

Walk an infinite-scroll feed

Loop click and wait actions to scroll through endless feeds. Each scroll triggers the next page of results; the final extraction captures everything loaded so far.

Submit a search and parse results

Type a query, click search, wait for the results to render, extract structured product data. Useful for monitoring competitor inventory or testing your own search relevance.

Extract data only a script knows how to find

Pages that store data in JavaScript variables, React state, or post-render DOM mutations — use js_eval to read it directly from the runtime instead of fighting the rendered HTML.

Solve reCAPTCHA v3 inline

Pages with reCAPTCHA v3 challenges block standard scrapers. With solve_captcha: true, we detect and solve the challenge in the same call, returning the verification token.

Multi-step checkout flow

Drive a complete user journey — add to cart, click next, fill shipping, click pay — and capture the final state. Useful for end-to-end testing and pricing intelligence.

Automation questions

What action types are supported?
Three primitives that cover almost every page interaction: click (target any CSS selector), type (typing into form fields), and wait (fixed delays). Combined with js_eval for arbitrary in-page evaluation, this covers the vast majority of interactive flows.
Can I combine actions with JavaScript eval?
Yes. Actions run first, then js_eval runs against the post-action DOM, then format-based extraction runs. The response includes both the eval result and the formatted content.
Are sessions persisted between requests?
Sessions are per-request. Each call starts with a fresh browser context. For workflows that need persistent state across calls — long-running login sessions, multi-day account interactions — use the remote browser endpoint, which lets you keep a session open across many CDP calls.
How long can a single automation call take?
Up to 120 seconds per request. For longer workflows, split the work across multiple calls or use the async pattern with webhook delivery.
Does this work on JavaScript-heavy single page apps?
Yes. The browser fully renders SPAs before actions run, and actions wait for the DOM to settle. The wait_until parameter lets you specify exactly when to consider the page ready.
How is captcha solving billed?
Captcha solving is included on every scrape call when you enable solve_captcha: true, and is also available standalone at /v1/captcha/solve and /v1/captcha/auto. Each call counts as a single API request. Typical solve latency is 300–800 ms.
What if the action fails — wrong selector, element not found?
The response returns a structured error with the index of the failing action and the reason — selector not found, element not visible, timeout. Your client can decide whether to retry, log, or proceed without that step.
How is this different from running Puppeteer myself?
You skip browser infrastructure, stealth tuning, IP rotation, captcha integration, and the operational overhead of maintaining a headless Chrome fleet. The same automation primitives, hosted, at predictable per-call pricing.

Skip the Puppeteer boilerplate.

Every endpoint, every automation primitive, free up to 1,000 requests a month.