Web automation API
Automate any website.Even behind a login.
Sign-ins, forms, downloads, data. Your coding agent sets it up once. Kaabist runs it for you and keeps it working when the site changes.
claude mcp add --transport http kaab https://mcp.kaab.ist/mcpyou asked
Every Monday, sign in to our supplier portal and bring me the new invoices.
kaabist runs it
- open portal.example.com
- sign in as [email protected]
- 2FA code asked · link emailed to you
- you typed the code · run continues
- open Invoices · 3 new
you get
[
{ "invoice": "INV-1042", "total": "€1,240.00" },
{ "invoice": "INV-1043", "total": "€318.50" },
{ "invoice": "INV-1044", "total": "€2,075.00" }
]How it works
Three steps.Then it runs itself.
01
Tell your agent
“Get the new invoices from our supplier portal every Monday.” Plain words, in Claude Code, Codex or Cursor.
02
It builds the program
Your agent works through the site in a real Kaabist browser and saves the steps.
03
Kaabist runs it
On a schedule or when you call it. Results land in your app as JSON.
Why it doesn’t break
Sites change.Your automation doesn’t.
- 01
Waits for your 2FA code
The site asks for a code? You get a link, type it, and the run picks up where it paused.
- 02
Fixes itself
A button moved? Kaabist finds it again and asks you to approve the fix.
- 03
Never submits twice
A crash halfway through a payment never pays twice. You decide what happens.
- 04
Built by your coding agent
Claude Code, Codex or Cursor builds the program. One line to connect.
- 05
Finds the hidden API
Spots the JSON behind the page and skips the browser next time. Faster, cheaper.
- 06
Stays signed in
Logs in once, runs on a schedule, and tells you only when something changed.
Built by your coding agent
One line to connect.Your agent does the rest.
$ 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 you type the code 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.
You get an emailed link to type the code; the job waits until you do.
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.
Or call it yourself
Any URL in.Clean JSON 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"}}'Also included
Everything elseyou would build yourself.
Signed webhooks
Every result reaches your server, retried until it lands.
Watch a run live and step in when you want.
TypeScript, Python, Go, REST, CLI and MCP.
How it compares
Not anotherscraping API.
| Capability | Kaabist | Remote browser platforms | Scraping APIs |
|---|---|---|---|
| Waits for your 2FA code, then resumes | Yes | Partly | No |
| Never submits twice, even after a crash | Yes | No | No |
| Fixes itself, with your approval | Yes | Partly | No |
| Built by your coding agent | Yes | Partly | Partly |
Categories summarised from vendors' public documentation. Last verified 2026-10-10. Product by product: /vs.
Plans
Start free.Grow by credits.
Free
500
Developer
10,000
Team
60,000
Scale
300,000
From config/plans.yaml.
Questions