Unbreakable web automation API
Automate any website,even behind a login.
Kaabist is an API that does work on websites for you: it signs in, fills in forms, downloads reports and returns the data as JSON. Your coding agent builds the automation, and Kaabist runs it whenever you call it or on a schedule. If the site asks for a 2FA code, Kaabist emails you a link; you type the code and the run carries on from where it paused.
claude mcp add --transport http kaab https://mcp.kaab.ist/mcpHow it works
Describe the task.Kaabist runs it.
01
Describe the task
Tell Claude Code, Codex or Cursor what you need, in plain words: “download last month’s invoices from our supplier portal on the 1st of every month”.
02
Your agent builds a program
It works through the site in a real Kaabist browser and saves the steps as a program: a short JSON file you can read, test and version, not a pile of selectors.
03
Kaabist runs it
Call it from your code, the CLI or a schedule. It runs in Kaabist’s browsers, signs in with the details you pass, and sends the results to your app as typed data or a signed webhook.
04
It keeps working
If the site moves a button, Kaabist finds it again and sends you the fix to approve. If it asks for a 2FA code, you get a link. If a payment step crashes, it is never pressed twice.
Where Kaabist fits
Your agent writes the program.Kaabist keeps it running.
- Any agent
- Claude Code · Codex · Cursor · any MCP client
- Any flow
- logins · 2FA · iframes · shadow DOM · downloads
- Your code
- TypeScript · Python · Go · REST · CLI
Why it doesn’t break
Built for flows,not just pages.
- 01
Resumes where it stopped
When a site asks for a 2FA code, a captcha or an approval, the run pauses and Kaabist emails you a link. You answer, and it continues from its last saved step, not from the start.
- 02
Built by your coding agent
Connect Claude Code, Codex or Cursor with one line. Your agent tries the site in a real Kaabist browser, and what works is saved as a program you can review and version.
- 03
Never submits twice
Steps that submit, pay or order are marked. If a server crashes in the middle of one, Kaabist does not click again; it pauses and asks you to check what happened.
Built by your coding agent
One line in your agent.A program in your account.
$ claude mcp add --transport http kaab https://mcp.kaab.ist/mcpAdded HTTP MCP server kaab$ claude "renew my subscription on portal.example.test every month"› browser_open https://portal.example.test/login› browser_fill #email, #password› await_input otp a person answers from a link› browser_click Renew marked side_effect: true› test_program dry_run stops before the first side effect✓ program prg_4Rb · v1 saved · schedule: monthly
The portal redirects to /login; the form has email and password fields.
Sign in is a button with an accessible name, so I target it by role.
After sign in the site asks for a one-time code sent by e-mail.
I cannot read that inbox, so the step becomes await_input otp.
The person gets a hosted page; the job parks until they answer.
I add a checkpoint after login, so a retry does not log in again.
Renew changes the subscription: side_effect true, never retried blindly.
A dry run stops before Renew; every locator resolved uniquely.
Done. The program logs in, waits for your one-time code on a hosted page, and renews exactly once.
Never submits twice
A worker crashes on “Pay now”.Kaabist doesn’t press it again.
fill
card details
checkpoint
before_payment
fence
about_to_execute
crash
worker lost
park
side_effect_ambiguous
confirm
you check the order
await page.goto('https://portal.example.test/login');await page.fill('#root > div:nth-child(2) input', email);await page.fill('.css-1x9f2k input[type=password]', pw);await page.click('button.btn-primary');// 2FA? someone has to be at the keyboardconst code = await waitForSlackMessage();await page.fill('#otp', code);await page.click('text=Renew');// crashed here? the retry renews twice
{ "goto": "https://portal.example.test/login" },{ "fill": "#email", "value": "{{inputs.email}}" },{ "fill": "#password", "value": "{{inputs.password}}" },{ "click": { "role": "button", "name": "Sign in" } },{ "await_input": "otp" },{ "fill": "#otp", "value": "{{vars.otp}}" },{ "checkpoint": "after_login" },{ "click": { "role": "button", "name": "Renew" }, "side_effect": true }
Around every program
The promises rest onthe rest of the platform.
Self-healing locators
When a site changes, Kaabist finds the moved element again and sends you the fix to approve.
API discovery
A browser run spots the JSON API behind the page. Later runs call it directly, without a browser: faster and cheaper.
Sessions
Log in once. Later runs reuse the saved session and skip the login entirely.
Schedules and change detection
Run on a schedule, and get an event only when the extracted data actually changed.
Signed webhooks
Every result reaches your server as a signed event, retried with backoff until it lands.
Answer from a link
When a run needs you, Kaabist emails you a link. Open it, type the code, and the run carries on. No account needed.
Live
Every job tells youwhat it did.
- to answer a 2FA link, by default
- 24h
- a paused run can wait
- 7days
- per webhook
- 5retries
Start in one call
Any URL in.Structured data out.
import { Kaab } from "@kaabist/sdk";
const kaab = new Kaab(); // KAAB_API_KEY
const job = await kaab.jobs.create({
url: "https://shop.example.test/p/1",
extract: { title: "h1", price: { selector: ".price", type: "money" } },
wait: 30,
});
console.log(job.data);from kaabist import Kaab
with Kaab() as kaab: # KAAB_API_KEY
job = kaab.jobs.create(
url="https://shop.example.test/p/1",
extract={"title": "h1", "price": {"selector": ".price", "type": "money"}},
wait=30,
)
print(job.data)c := kaab.New("") // KAAB_API_KEY
body, _ := kaab.Body[client.CreateJobJSONBody](map[string]any{
"url": "https://shop.example.test/p/1",
"extract": map[string]any{"title": "h1"},
})
job, _ := c.Jobs.Create(ctx, body, kaab.WithWait(30))
fmt.Println(*job.Data)curl https://api.kaab.ist/v1/jobs \
-H "Authorization: Bearer $KAAB_API_KEY" \
-H "Prefer: wait=30" \
-d '{"url":"https://shop.example.test/p/1","extract":{"title":"h1"}}'Plans
Start free.Grow by credits.
Free
500
Developer
10,000
Team
60,000
Scale
300,000
From config/plans.yaml.
How it compares
Not anotherscraping API.
| Capability | Kaabist | Remote browser platforms | Crawl-to-markdown APIs |
|---|---|---|---|
| Pause for your 2FA code or approval, then continue from the last checkpoint | Yes | Partly | No |
| A submit or payment never runs twice, even after a crash | Yes | No | No |
| Your coding agent builds the program over MCP | Yes | Partly | Partly |
| Self-healing locators, delivered as proposals you review | Yes | Partly | No |
Categories summarised from vendors' public documentation. Last verified 2026-10-10.
Questions