# Kaabist documentation > Kaabist is a web automation API. You describe what to do on a website (sign in, fill in forms, download files, extract data) as a versioned JSON program, and every run of it is a job that returns typed data in one envelope. When a site moves an element, asks for a one-time code or puts a dialog in the way, the job heals, parks for a person or dismisses the obstacle instead of returning a wrong answer. These docs cover getting started, the concepts, task guides, the panel, and the generated reference for the HTTP API, the program DSL, error and warning codes, webhook events, the CLI, the SDKs and the plans. Every page of this site is also served as Markdown at its address plus `.md` (the home page at `/index.md`), and every page in one file at https://docs.kaab.ist/llms-full.txt. ## Instructions for agents - The current API version is 1.39 (the OpenAPI document's `info.version`). The base URL is https://api.kaab.ist/v1; every request carries `Authorization: Bearer `. - Use a test key (`sk_test_...`) while you build and try programs: test jobs run for real but reserve no credits, within a daily quota. Ask the user before you use a live key (`sk_live_...`), and never print a key. - Coding agents can build, test and maintain programs over MCP: connect to https://mcp.kaab.ist/mcp (for example `claude mcp add --transport http kaab https://mcp.kaab.ist/mcp`). - The API reference is under https://docs.kaab.ist/reference/api (one page per operation and per schema); the OpenAPI document itself is at https://docs.kaab.ist/openapi/v1.json. The program DSL is under https://docs.kaab.ist/reference/dsl, and error and warning codes at https://docs.kaab.ist/reference/codes. ## Overview - [Kaabist documentation](https://docs.kaab.ist/index.md): Kaabist runs versioned web automation programs as an API, with typed results, human-in-the-loop parking, self-healing locators and side-effect safety. ## Getting started - [What Kaabist is](https://docs.kaab.ist/getting-started.md): The Kaabist model in one page (programs, jobs, tiers, parking, healing and side-effect safety) and the path through Getting started. - [API keys and modes](https://docs.kaab.ist/getting-started/keys-and-modes.md): API keys, their scopes and rotation, live and test mode, and the conventions every Kaabist endpoint shares: errors, pagination, idempotency and waiting. - [Your first job](https://docs.kaab.ist/getting-started/first-job.md): Install an SDK or the kaab CLI, run one job against a product page, and read the envelope that comes back. - [Understanding the envelope](https://docs.kaab.ist/getting-started/envelope.md): The one shape every job read returns, which keys each status carries, a worked example of every status, and how each SDK waits for a job. ## Concepts - [Overview](https://docs.kaab.ist/concepts.md): The ideas behind Kaabist, one page each: programs, tiers, sessions, parking, healing, obstacles, validation, credits, limits and data. - [Programs and versions](https://docs.kaab.ist/concepts/programs-and-versions.md): Programs are versioned JSON: immutable versions, the latest and production aliases, the one-step shorthand, lint, publishing, diffs and replay. - [Tiers and escalation](https://docs.kaab.ist/concepts/tiers-and-escalation.md): Which tier a job starts at and why it moves up, what Kaabist learns about each site, when a discovered API makes a job cheaper, and the shared cache. - [The http tier](https://docs.kaab.ist/concepts/http-tier.md): The cheapest way to read a page: what Kaabist can do without a browser, what makes a job need one, and how conditions behave on a document. - [The browser tier](https://docs.kaab.ist/concepts/browser-tier.md): What Kaabist does with a real browser: isolation, asset blocking, real clicks, waiting for a one-time code, what a page can see, and the limits. - [Sessions](https://docs.kaab.ist/concepts/sessions.md): Staying signed in across jobs: what a session stores, how jobs bind and lock it, how Kaabist checks it, what happens when it expires, and refresh programs. - [Human in the loop](https://docs.kaab.ist/concepts/human-in-the-loop.md): How a job parks for a person (awaiting_input and needs_attention) and the ways to answer it: inputs, the five resume actions, hosted pages and takeover. - [How healing works](https://docs.kaab.ist/concepts/self-healing.md): What Kaabist does when an element your program points at moves, how confident it has to be, and why a person approves every change to a program. - [Obstacles and captchas](https://docs.kaab.ist/concepts/obstacles.md): What Kaabist does about the dialog, consent banner, tour or toast in the way of your step, how it learns a site, and what it does about a captcha. - [Validation and warnings](https://docs.kaab.ist/concepts/validation-and-warnings.md): How Kaabist turns page text into typed values, what it does when a value is missing or unreadable, and every warning a job can carry. - [Credits and billing](https://docs.kaab.ist/concepts/credits-and-billing.md): What a job costs, how credits are reserved and settled, the pools they come from, running out, plans, packs, auto-recharge and overage. - [Limits](https://docs.kaab.ist/concepts/limits.md): Request rates, concurrent jobs, test-mode quotas, per-job budgets and plan gates: every limit Kaabist applies, and the error each one answers with. - [Locators](https://docs.kaab.ist/concepts/locators.md): How Kaabist points at an element, why it stores several candidate selectors, which classes it refuses to use, and how frames and shadow DOM are reached. - [Snapshots](https://docs.kaab.ist/concepts/snapshots.md): What Kaabist stores for each step of a job, what it deliberately leaves out, how to fetch a step's snapshot, and how to replay a program against one. - [Egress and proxies](https://docs.kaab.ist/concepts/egress-and-proxies.md): How a job's traffic reaches a site: proxy pools, countries, your own proxy, pacing per site, what is refused before it leaves, and what is recorded. - [Queueing and fairness](https://docs.kaab.ist/concepts/queueing.md): Why your job starts when it does: priorities, plan weights, concurrency, credits, session locks, and what happens to a job when its worker dies. - [Accounts, organisations and roles](https://docs.kaab.ist/concepts/accounts-and-roles.md): Signing in to the panel, organisations and invitations, the five roles and what each may do, API key scopes, and two-factor authentication. - [Data retention](https://docs.kaab.ist/concepts/data-retention.md): What Kaabist stores about your work, where it lives, when it is deleted, and how to ask for everything to be erased. - [Documents and PDFs](https://docs.kaab.ist/concepts/documents-and-pdfs.md): How Kaabist handles PDFs: the gate every PDF passes before it is stored or read, the limits it enforces, and the codes you get when a file is refused. ## Guides - [Overview](https://docs.kaab.ist/guides.md): Step-by-step guides for the tasks Kaabist is used for, from logins with a one-time code to schedules, webhooks and testing. - [Authenticated flows](https://docs.kaab.ist/guides/authenticated-flows.md): Sign in with a password and a one-time code, save the session, and let the next job start already signed in. - [Hosted resolve pages](https://docs.kaab.ist/guides/hosted-resolve.md): Let your own end users finish a parked job on a page with no account: type a one-time code, apply a fix, or take over. - [Lists and pagination](https://docs.kaab.ist/guides/lists-and-pagination.md): Extract lists of objects, follow "next" links across pages, and load infinite lists by scrolling, with bounds lint can check. - [JSON and network locators](https://docs.kaab.ist/guides/json-and-network-locators.md): Read the JSON a page embeds or fetches instead of the HTML drawn from it, capture API responses, and let a discovered API move a job to the http tier. - [Schedules and change detection](https://docs.kaab.ist/guides/schedules-and-change-detection.md): Run a program on a cron in your timezone, compare each result with the last one, and get a webhook only when a watched field changes. - [Webhooks](https://docs.kaab.ist/guides/webhooks.md): How Kaabist tells your systems that something happened: the events, the signature, retries, ordering and how to receive them safely. - [Bring your own providers](https://docs.kaab.ist/guides/byo-providers.md): Use your own proxies, language models and captcha solvers: configuration, fallback, billing, health checks and how credentials are kept. - [Testing: replay, dry-run and test mode](https://docs.kaab.ist/guides/testing.md): Test programs without spending credits or touching live data: test keys, cost estimates, lint, dry runs and replays against stored pages. - [Side-effect safety](https://docs.kaab.ist/guides/side-effect-safety.md): Mark the steps that change something, checkpoint after them, and send an idempotency key, so an order is never placed twice. - [Security & data handling](https://docs.kaab.ist/guides/security-and-data.md): What Kaabist stores about your jobs, how secrets and sessions are protected, how long data is kept, and how to delete it. - [Migrating from other tools](https://docs.kaab.ist/guides/migrating.md): Move Playwright or Puppeteer scripts, scraping-API calls and no-code scrapers to Kaabist programs, with a concept map and a worked conversion. - [Drift detection and canaries](https://docs.kaab.ist/guides/drift-and-canaries.md): How Kaabist notices that a program has quietly started returning worse data, and how it finds out before your next job does. - [SDKs](https://docs.kaab.ist/guides/sdks.md): The official TypeScript, Python and Go clients: install, authenticate, run a job, wait for it, answer it, and verify webhooks. - [The kaab CLI](https://docs.kaab.ist/guides/cli.md): Run jobs, push and lint programs, review proposals and manage schedules and webhooks from a terminal. - [Coding agents (MCP)](https://docs.kaab.ist/guides/mcp.md): Connect Claude Code, Codex, Cursor or any MCP client to Kaabist and let it build, test and maintain programs in a real Kaabist browser. ## Panel - [Overview](https://docs.kaab.ist/panel.md): Signing in, organisations, members, API keys, programs, jobs, sessions, schedules, webhooks, BYO providers, usage, billing and the audit log at app.kaab.ist. - [The program builder](https://docs.kaab.ist/panel/builder.md): Build, test and publish programs in the panel: visually or in JSON, by recording, by picking on live pages and stored snapshots. - [Picking and recording](https://docs.kaab.ist/panel/picking-and-recording.md): Point at elements in a live page to get locators and list fields, and record what you do as program steps. - [Taking over a job](https://docs.kaab.ist/panel/takeover.md): Open a live browser on a parked job, finish what the program could not, and turn what you did into steps the next run can take. - [Getting help](https://docs.kaab.ist/panel/support.md): Open a support ticket from the panel or from a job, follow Kaabist's answers, attach files, and know when to expect a reply on your plan. - [Referrals](https://docs.kaab.ist/panel/referrals.md): Share your organisation's referral link, see what your referrals did, and know what both sides earn on a referred organisation's first payment. ## Reference - [Overview](https://docs.kaab.ist/reference.md): Generated references for the API, the program DSL, codes, events, the CLI, the SDKs and plans. ### API - [Overview](https://docs.kaab.ist/reference/api.md): Every endpoint of the Kaabist API v1.39. - [Interactive reference](https://docs.kaab.ist/reference/api/explorer.md): Browse the OpenAPI document of the Kaabist API with Scalar. ### API / Jobs - [Create job](https://docs.kaab.ist/reference/api/jobs/create-job.md): POST /v1/jobs: Create a job from a program reference or the url + extract shorthand - [List jobs](https://docs.kaab.ist/reference/api/jobs/list-jobs.md): GET /v1/jobs: List jobs, newest first - [Create job batch](https://docs.kaab.ist/reference/api/jobs/create-job-batch.md): POST /v1/jobs/batch: Create up to 1000 jobs from one program - [Estimate job](https://docs.kaab.ist/reference/api/jobs/estimate-job.md): POST /v1/jobs/estimate: Estimate the credit cost of a job without enqueuing it - [Get job](https://docs.kaab.ist/reference/api/jobs/get-job.md): GET /v1/jobs/{id}: Read the job envelope; `Prefer: wait` long-polls for a state change - [List job steps](https://docs.kaab.ist/reference/api/jobs/list-job-steps.md): GET /v1/jobs/{id}/steps: Per-step records with timings, snapshots and healing information - [Get job snapshot](https://docs.kaab.ist/reference/api/jobs/get-job-snapshot.md): GET /v1/jobs/{id}/snapshot: Redirect to a presigned snapshot JSON URL - [Get job screenshot](https://docs.kaab.ist/reference/api/jobs/get-job-screenshot.md): GET /v1/jobs/{id}/screenshot: Redirect to a presigned screenshot URL - [Get job artifact](https://docs.kaab.ist/reference/api/jobs/get-job-artifact.md): GET /v1/jobs/{id}/artifacts/{name}: Redirect to a presigned artifact URL - [Submit job input](https://docs.kaab.ist/reference/api/jobs/submit-job-input.md): POST /v1/jobs/{id}/input: Supply the value an `await_input` step is waiting for - [Resume job](https://docs.kaab.ist/reference/api/jobs/resume-job.md): POST /v1/jobs/{id}/resume: Apply a proposal, skip a step, retry from a checkpoint, continue or abort - [Takeover job](https://docs.kaab.ist/reference/api/jobs/takeover-job.md): POST /v1/jobs/{id}/takeover: Open a live browser session on a parked job - [Cancel job](https://docs.kaab.ist/reference/api/jobs/cancel-job.md): POST /v1/jobs/{id}/cancel: Cancel a job and release its reserved credits ### API / Batches - [Get batch](https://docs.kaab.ist/reference/api/batches/get-batch.md): GET /v1/batches/{id}: Read batch counters - [List batch jobs](https://docs.kaab.ist/reference/api/batches/list-batch-jobs.md): GET /v1/batches/{id}/jobs: List the jobs of a batch ### API / Programs - [Create program](https://docs.kaab.ist/reference/api/programs/create-program.md): POST /v1/programs: Create a program and its first version - [List programs](https://docs.kaab.ist/reference/api/programs/list-programs.md): GET /v1/programs: List programs - [Lint program](https://docs.kaab.ist/reference/api/programs/lint-program.md): POST /v1/programs/lint: Lint a program definition and return the normalized document - [Get program](https://docs.kaab.ist/reference/api/programs/get-program.md): GET /v1/programs/{id}: Read a program by id or name - [Update program](https://docs.kaab.ist/reference/api/programs/update-program.md): PATCH /v1/programs/{id}: Rename a program or change its description and canary settings - [Delete program](https://docs.kaab.ist/reference/api/programs/delete-program.md): DELETE /v1/programs/{id}: Soft-delete a program - [List program versions](https://docs.kaab.ist/reference/api/programs/list-program-versions.md): GET /v1/programs/{id}/versions: List the versions of a program - [Create program version](https://docs.kaab.ist/reference/api/programs/create-program-version.md): POST /v1/programs/{id}/versions: Add a version to a program - [Update program version](https://docs.kaab.ist/reference/api/programs/update-program-version.md): PUT /v1/programs/{id}/versions/{n}: Replace a draft version's definition in place; published versions are immutable - [Delete program version](https://docs.kaab.ist/reference/api/programs/delete-program-version.md): DELETE /v1/programs/{id}/versions/{n}: Delete a draft version (it is archived); published versions are immutable - [Get program version](https://docs.kaab.ist/reference/api/programs/get-program-version.md): GET /v1/programs/{id}/versions/{n}: Read one version including its definition - [Publish program version](https://docs.kaab.ist/reference/api/programs/publish-program-version.md): POST /v1/programs/{id}/versions/{n}/publish: Publish a draft version and move the `latest` alias - [Diff program version](https://docs.kaab.ist/reference/api/programs/diff-program-version.md): GET /v1/programs/{id}/versions/{n}/diff: RFC 6902 JSON Patch between two versions - [Replay program version](https://docs.kaab.ist/reference/api/programs/replay-program-version.md): POST /v1/programs/{id}/versions/{n}/replay: Run extraction against a stored snapshot without fetching - [Set program alias](https://docs.kaab.ist/reference/api/programs/set-program-alias.md): PUT /v1/programs/{id}/aliases/{alias}: Point an alias at a version - [Delete program alias](https://docs.kaab.ist/reference/api/programs/delete-program-alias.md): DELETE /v1/programs/{id}/aliases/{alias}: Remove an alias ### API / Sessions - [Create session](https://docs.kaab.ist/reference/api/sessions/create-session.md): POST /v1/sessions: Store a browser storage state as a reusable session - [List sessions](https://docs.kaab.ist/reference/api/sessions/list-sessions.md): GET /v1/sessions: List sessions - [Get session](https://docs.kaab.ist/reference/api/sessions/get-session.md): GET /v1/sessions/{id}: Read a session by id or name - [Update session](https://docs.kaab.ist/reference/api/sessions/update-session.md): PATCH /v1/sessions/{id}: Rename a session or replace its storage state - [Delete session](https://docs.kaab.ist/reference/api/sessions/delete-session.md): DELETE /v1/sessions/{id}: Delete a session - [Verify session](https://docs.kaab.ist/reference/api/sessions/verify-session.md): POST /v1/sessions/{id}/verify: Run the validity probe - [Refresh session](https://docs.kaab.ist/reference/api/sessions/refresh-session.md): POST /v1/sessions/{id}/refresh: Enqueue the session's refresh program ### API / Proposals - [List proposals](https://docs.kaab.ist/reference/api/proposals/list-proposals.md): GET /v1/proposals: List proposals - [Get proposal](https://docs.kaab.ist/reference/api/proposals/get-proposal.md): GET /v1/proposals/{id}: Read a proposal - [Approve proposal](https://docs.kaab.ist/reference/api/proposals/approve-proposal.md): POST /v1/proposals/{id}/approve: Approve a proposal, optionally promoting it to a new version - [Reject proposal](https://docs.kaab.ist/reference/api/proposals/reject-proposal.md): POST /v1/proposals/{id}/reject: Reject a proposal - [Edit proposal](https://docs.kaab.ist/reference/api/proposals/edit-proposal.md): POST /v1/proposals/{id}/edit: Replace the proposed change before approval ### API / Schedules - [Create schedule](https://docs.kaab.ist/reference/api/schedules/create-schedule.md): POST /v1/schedules: Create a cron schedule for a program - [List schedules](https://docs.kaab.ist/reference/api/schedules/list-schedules.md): GET /v1/schedules: List schedules - [Get schedule](https://docs.kaab.ist/reference/api/schedules/get-schedule.md): GET /v1/schedules/{id}: Read a schedule - [Update schedule](https://docs.kaab.ist/reference/api/schedules/update-schedule.md): PATCH /v1/schedules/{id}: Change a schedule - [Delete schedule](https://docs.kaab.ist/reference/api/schedules/delete-schedule.md): DELETE /v1/schedules/{id}: Delete a schedule - [Pause schedule](https://docs.kaab.ist/reference/api/schedules/pause-schedule.md): POST /v1/schedules/{id}/pause: Pause a schedule - [Resume schedule](https://docs.kaab.ist/reference/api/schedules/resume-schedule.md): POST /v1/schedules/{id}/resume: Resume a paused schedule - [List schedule runs](https://docs.kaab.ist/reference/api/schedules/list-schedule-runs.md): GET /v1/schedules/{id}/runs: List the runs of a schedule - [Get schedule run diff](https://docs.kaab.ist/reference/api/schedules/get-schedule-run-diff.md): GET /v1/schedules/{id}/runs/{job_id}/diff: Redirect to a presigned URL of a run's JSON Patch against the previous run ### API / Webhooks - [Create webhook](https://docs.kaab.ist/reference/api/webhooks/create-webhook.md): POST /v1/webhooks: Register a webhook endpoint; the secret is shown once - [List webhooks](https://docs.kaab.ist/reference/api/webhooks/list-webhooks.md): GET /v1/webhooks: List webhook endpoints - [Get webhook](https://docs.kaab.ist/reference/api/webhooks/get-webhook.md): GET /v1/webhooks/{id}: Read a webhook endpoint - [Update webhook](https://docs.kaab.ist/reference/api/webhooks/update-webhook.md): PATCH /v1/webhooks/{id}: Change a webhook endpoint - [Delete webhook](https://docs.kaab.ist/reference/api/webhooks/delete-webhook.md): DELETE /v1/webhooks/{id}: Delete a webhook endpoint - [Rotate webhook secret](https://docs.kaab.ist/reference/api/webhooks/rotate-webhook-secret.md): POST /v1/webhooks/{id}/rotate-secret: Rotate the signing secret - [List webhook deliveries](https://docs.kaab.ist/reference/api/webhooks/list-webhook-deliveries.md): GET /v1/webhooks/{id}/deliveries: List delivery attempts - [Resend webhook delivery](https://docs.kaab.ist/reference/api/webhooks/resend-webhook-delivery.md): POST /v1/webhooks/{id}/deliveries/{delivery_id}/resend: Resend one delivery as a new attempt row; the original is never changed - [Test webhook](https://docs.kaab.ist/reference/api/webhooks/test-webhook.md): POST /v1/webhooks/{id}/test: Send a `ping` event to the endpoint and wait up to 10 s for its answer ### API / Organisation - [Rotate org webhook secret](https://docs.kaab.ist/reference/api/org/rotate-org-webhook-secret.md): POST /v1/org/webhook-secret/rotate: Rotate the secret ad-hoc `webhook_url` deliveries are signed with; shown once - [Get org](https://docs.kaab.ist/reference/api/org/get-org.md): GET /v1/org: Read the calling organisation - [Request data deletion](https://docs.kaab.ist/reference/api/org/request-data-deletion.md): POST /v1/org/data-deletion: Purge the organisation's data within 24 hours ### API / Credits - [Get credits](https://docs.kaab.ist/reference/api/credits/get-credits.md): GET /v1/credits: Read credit balance and pools ### API / Ledger - [List ledger entries](https://docs.kaab.ist/reference/api/ledger/list-ledger-entries.md): GET /v1/ledger: List ledger entries ### API / Usage - [Get usage](https://docs.kaab.ist/reference/api/usage/get-usage.md): GET /v1/usage: Aggregated usage over a period ### API / API keys - [List API keys](https://docs.kaab.ist/reference/api/api-keys/list-api-keys.md): GET /v1/api-keys: List API keys - [Create API key](https://docs.kaab.ist/reference/api/api-keys/create-api-key.md): POST /v1/api-keys: Create an API key; the secret is shown once - [Rotate API key](https://docs.kaab.ist/reference/api/api-keys/rotate-api-key.md): POST /v1/api-keys/{id}/rotate: Rotate an API key with an optional grace period - [Revoke API key](https://docs.kaab.ist/reference/api/api-keys/revoke-api-key.md): DELETE /v1/api-keys/{id}: Revoke an API key ### API / BYO providers - [List BYO providers](https://docs.kaab.ist/reference/api/byo-providers/list-byo-providers.md): GET /v1/byo-providers: List bring-your-own providers - [Create BYO provider](https://docs.kaab.ist/reference/api/byo-providers/create-byo-provider.md): POST /v1/byo-providers: Register a bring-your-own provider - [Get BYO provider](https://docs.kaab.ist/reference/api/byo-providers/get-byo-provider.md): GET /v1/byo-providers/{id}: Read a bring-your-own provider - [Update BYO provider](https://docs.kaab.ist/reference/api/byo-providers/update-byo-provider.md): PATCH /v1/byo-providers/{id}: Change a bring-your-own provider - [Delete BYO provider](https://docs.kaab.ist/reference/api/byo-providers/delete-byo-provider.md): DELETE /v1/byo-providers/{id}: Delete a bring-your-own provider - [Test BYO provider](https://docs.kaab.ist/reference/api/byo-providers/test-byo-provider.md): POST /v1/byo-providers/{id}/test: Health-check a bring-your-own provider ### API / Sites - [Get site profile](https://docs.kaab.ist/reference/api/sites/get-site-profile.md): GET /v1/sites/{hostname}: Read the learned site profile visible to the organisation ### API / Objects - [Overview](https://docs.kaab.ist/reference/api/schemas.md): Every named object the Kaabist API reads and returns. - [ApiKey](https://docs.kaab.ist/reference/api/schemas/api-key.md): The ApiKey object of the Kaabist API. - [Batch](https://docs.kaab.ist/reference/api/schemas/batch.md): The Batch object of the Kaabist API. - [ByoProvider](https://docs.kaab.ist/reference/api/schemas/byo-provider.md): The ByoProvider object of the Kaabist API. - [Credits](https://docs.kaab.ist/reference/api/schemas/credits.md): The Credits object of the Kaabist API. - [ErrorResponse](https://docs.kaab.ist/reference/api/schemas/error-response.md): The ErrorResponse object of the Kaabist API. - [ExtractSchema](https://docs.kaab.ist/reference/api/schemas/extract-schema.md): A Kaabist extract schema. Full grammar: https://kaab.ist/schemas/program-1.json - [Job](https://docs.kaab.ist/reference/api/schemas/job.md): The Job object of the Kaabist API. - [LedgerEntry](https://docs.kaab.ist/reference/api/schemas/ledger-entry.md): The LedgerEntry object of the Kaabist API. - [LintResult](https://docs.kaab.ist/reference/api/schemas/lint-result.md): The LintResult object of the Kaabist API. - [Org](https://docs.kaab.ist/reference/api/schemas/org.md): The Org object of the Kaabist API. - [Program](https://docs.kaab.ist/reference/api/schemas/program.md): The Program object of the Kaabist API. - [ProgramDefinition](https://docs.kaab.ist/reference/api/schemas/program-definition.md): A Kaabist program definition. Full grammar: https://kaab.ist/schemas/program-1.json - [ProgramVersion](https://docs.kaab.ist/reference/api/schemas/program-version.md): The ProgramVersion object of the Kaabist API. - [Proposal](https://docs.kaab.ist/reference/api/schemas/proposal.md): The Proposal object of the Kaabist API. - [Schedule](https://docs.kaab.ist/reference/api/schemas/schedule.md): The Schedule object of the Kaabist API. - [Session](https://docs.kaab.ist/reference/api/schemas/session.md): The Session object of the Kaabist API. - [SiteProfile](https://docs.kaab.ist/reference/api/schemas/site-profile.md): The SiteProfile object of the Kaabist API. - [StepRecord](https://docs.kaab.ist/reference/api/schemas/step-record.md): The StepRecord object of the Kaabist API. - [Webhook](https://docs.kaab.ist/reference/api/schemas/webhook.md): The Webhook object of the Kaabist API. - [WebhookDelivery](https://docs.kaab.ist/reference/api/schemas/webhook-delivery.md): The WebhookDelivery object of the Kaabist API. - [WebhookEvent](https://docs.kaab.ist/reference/api/schemas/webhook-event.md): The WebhookEvent object of the Kaabist API. ### DSL - [Overview](https://docs.kaab.ist/reference/dsl.md): Every key of a Kaabist program, generated from the program JSON Schema. - [Inputs](https://docs.kaab.ist/reference/dsl/inputs.md): The keys of an input definition. - [Options](https://docs.kaab.ist/reference/dsl/options.md): Every key of a program's `options`. - [Policies](https://docs.kaab.ist/reference/dsl/policies.md): Every key of a program's `policies`. - [Steps](https://docs.kaab.ist/reference/dsl/steps.md): The actions a step can take and the keys every step accepts. ### DSL / Actions - [Overview](https://docs.kaab.ist/reference/dsl/actions.md): One page per step action. - [fill](https://docs.kaab.ist/reference/dsl/actions/fill.md): The `fill` step. - [click](https://docs.kaab.ist/reference/dsl/actions/click.md): The `click` step. - [press](https://docs.kaab.ist/reference/dsl/actions/press.md): The `press` step. - [hover](https://docs.kaab.ist/reference/dsl/actions/hover.md): The `hover` step. - [select](https://docs.kaab.ist/reference/dsl/actions/select.md): The `select` step. - [check](https://docs.kaab.ist/reference/dsl/actions/check.md): The `check` step. - [uncheck](https://docs.kaab.ist/reference/dsl/actions/uncheck.md): The `uncheck` step. - [upload](https://docs.kaab.ist/reference/dsl/actions/upload.md): The `upload` step. - [scroll](https://docs.kaab.ist/reference/dsl/actions/scroll.md): The `scroll` step. - [wait_for](https://docs.kaab.ist/reference/dsl/actions/wait-for.md): The `wait_for` step. - [set_session](https://docs.kaab.ist/reference/dsl/actions/set-session.md): The `set_session` step. - [extract](https://docs.kaab.ist/reference/dsl/actions/extract.md): The `extract` step. - [capture_response](https://docs.kaab.ist/reference/dsl/actions/capture-response.md): The `capture_response` step. - [evaluate](https://docs.kaab.ist/reference/dsl/actions/evaluate.md): The `evaluate` step. - [paginate](https://docs.kaab.ist/reference/dsl/actions/paginate.md): The `paginate` step. - [download](https://docs.kaab.ist/reference/dsl/actions/download.md): The `download` step. - [read_pdf](https://docs.kaab.ist/reference/dsl/actions/read-pdf.md): The `read_pdf` step. - [set_vars](https://docs.kaab.ist/reference/dsl/actions/set-vars.md): The `set_vars` step. - [sleep](https://docs.kaab.ist/reference/dsl/actions/sleep.md): The `sleep` step. - [reload](https://docs.kaab.ist/reference/dsl/actions/reload.md): The `reload` step. - [goto](https://docs.kaab.ist/reference/dsl/actions/goto.md): The `goto` step. - [await_input](https://docs.kaab.ist/reference/dsl/actions/await-input.md): The `await_input` step. - [checkpoint](https://docs.kaab.ist/reference/dsl/actions/checkpoint.md): The `checkpoint` step. - [screenshot](https://docs.kaab.ist/reference/dsl/actions/screenshot.md): The `screenshot` step. - [when](https://docs.kaab.ist/reference/dsl/actions/when.md): The `when` step. - [loop_until](https://docs.kaab.ist/reference/dsl/actions/loop-until.md): The `loop_until` step. ### DSL / Conditions - [Overview](https://docs.kaab.ist/reference/dsl/conditions.md): Every kind of condition, for landmarks, expectations and control flow. - [url](https://docs.kaab.ist/reference/dsl/conditions/url.md): The `url` condition. - [title](https://docs.kaab.ist/reference/dsl/conditions/title.md): The `title` condition. - [visible](https://docs.kaab.ist/reference/dsl/conditions/visible.md): The `visible` condition. - [hidden](https://docs.kaab.ist/reference/dsl/conditions/hidden.md): The `hidden` condition. - [exists](https://docs.kaab.ist/reference/dsl/conditions/exists.md): The `exists` condition. - [absent](https://docs.kaab.ist/reference/dsl/conditions/absent.md): The `absent` condition. - [text](https://docs.kaab.ist/reference/dsl/conditions/text.md): The `text` condition. - [count](https://docs.kaab.ist/reference/dsl/conditions/count.md): The `count` condition. - [network](https://docs.kaab.ist/reference/dsl/conditions/network.md): The `network` condition. - [var](https://docs.kaab.ist/reference/dsl/conditions/var.md): The `var` condition. - [landmark](https://docs.kaab.ist/reference/dsl/conditions/landmark.md): The `landmark` condition. - [all](https://docs.kaab.ist/reference/dsl/conditions/all.md): The `all` condition. - [any](https://docs.kaab.ist/reference/dsl/conditions/any.md): The `any` condition. - [not](https://docs.kaab.ist/reference/dsl/conditions/not.md): The `not` condition. ### DSL - [Targets](https://docs.kaab.ist/reference/dsl/targets.md): How a step or a condition names an element. ### DSL / Fields - [Overview](https://docs.kaab.ist/reference/dsl/fields.md): Every option of an extract field. - [allow_suffix](https://docs.kaab.ist/reference/dsl/fields/allow-suffix.md): The `allow_suffix` option of an extract field. - [attr](https://docs.kaab.ist/reference/dsl/fields/attr.md): The `attr` option of an extract field. - [base_url](https://docs.kaab.ist/reference/dsl/fields/base-url.md): The `base_url` option of an extract field. - [candidates](https://docs.kaab.ist/reference/dsl/fields/candidates.md): The `candidates` option of an extract field. - [case_insensitive](https://docs.kaab.ist/reference/dsl/fields/case-insensitive.md): The `case_insensitive` option of an extract field. - [country](https://docs.kaab.ist/reference/dsl/fields/country.md): The `country` option of an extract field. - [currency](https://docs.kaab.ist/reference/dsl/fields/currency.md): The `currency` option of an extract field. - [date_format](https://docs.kaab.ist/reference/dsl/fields/date-format.md): The `date_format` option of an extract field. - [decimal](https://docs.kaab.ist/reference/dsl/fields/decimal.md): The `decimal` option of an extract field. - [false_values](https://docs.kaab.ist/reference/dsl/fields/false-values.md): The `false_values` option of an extract field. - [fields](https://docs.kaab.ist/reference/dsl/fields/fields.md): The `fields` option of an extract field. - [flags](https://docs.kaab.ist/reference/dsl/fields/flags.md): The `flags` option of an extract field. - [follow_redirects](https://docs.kaab.ist/reference/dsl/fields/follow-redirects.md): The `follow_redirects` option of an extract field. - [frame](https://docs.kaab.ist/reference/dsl/fields/frame.md): The `frame` option of an extract field. - [json](https://docs.kaab.ist/reference/dsl/fields/json.md): The `json` option of an extract field. - [locale](https://docs.kaab.ist/reference/dsl/fields/locale.md): The `locale` option of an extract field. - [many](https://docs.kaab.ist/reference/dsl/fields/many.md): The `many` option of an extract field. - [max](https://docs.kaab.ist/reference/dsl/fields/max.md): The `max` option of an extract field. - [max_items](https://docs.kaab.ist/reference/dsl/fields/max-items.md): The `max_items` option of an extract field. - [max_length](https://docs.kaab.ist/reference/dsl/fields/max-length.md): The `max_length` option of an extract field. - [min](https://docs.kaab.ist/reference/dsl/fields/min.md): The `min` option of an extract field. - [min_items](https://docs.kaab.ist/reference/dsl/fields/min-items.md): The `min_items` option of an extract field. - [min_length](https://docs.kaab.ist/reference/dsl/fields/min-length.md): The `min_length` option of an extract field. - [name](https://docs.kaab.ist/reference/dsl/fields/name.md): The `name` option of an extract field. - [network](https://docs.kaab.ist/reference/dsl/fields/network.md): The `network` option of an extract field. - [null_markers](https://docs.kaab.ist/reference/dsl/fields/null-markers.md): The `null_markers` option of an extract field. - [nullable](https://docs.kaab.ist/reference/dsl/fields/nullable.md): The `nullable` option of an extract field. - [on_invalid](https://docs.kaab.ist/reference/dsl/fields/on-invalid.md): The `on_invalid` option of an extract field. - [pattern](https://docs.kaab.ist/reference/dsl/fields/pattern.md): The `pattern` option of an extract field. - [presence](https://docs.kaab.ist/reference/dsl/fields/presence.md): The `presence` option of an extract field. - [regex](https://docs.kaab.ist/reference/dsl/fields/regex.md): The `regex` option of an extract field. - [required](https://docs.kaab.ist/reference/dsl/fields/required.md): The `required` option of an extract field. - [role](https://docs.kaab.ist/reference/dsl/fields/role.md): The `role` option of an extract field. - [sample](https://docs.kaab.ist/reference/dsl/fields/sample.md): The `sample` option of an extract field. - [selector](https://docs.kaab.ist/reference/dsl/fields/selector.md): The `selector` option of an extract field. - [source](https://docs.kaab.ist/reference/dsl/fields/source.md): The `source` option of an extract field. - [strip_fragment](https://docs.kaab.ist/reference/dsl/fields/strip-fragment.md): The `strip_fragment` option of an extract field. - [testid](https://docs.kaab.ist/reference/dsl/fields/testid.md): The `testid` option of an extract field. - [text](https://docs.kaab.ist/reference/dsl/fields/text.md): The `text` option of an extract field. - [thousands](https://docs.kaab.ist/reference/dsl/fields/thousands.md): The `thousands` option of an extract field. - [timezone](https://docs.kaab.ist/reference/dsl/fields/timezone.md): The `timezone` option of an extract field. - [transforms](https://docs.kaab.ist/reference/dsl/fields/transforms.md): The `transforms` option of an extract field. - [true_values](https://docs.kaab.ist/reference/dsl/fields/true-values.md): The `true_values` option of an extract field. - [type](https://docs.kaab.ist/reference/dsl/fields/type.md): The `type` option of an extract field. - [unique](https://docs.kaab.ist/reference/dsl/fields/unique.md): The `unique` option of an extract field. - [values](https://docs.kaab.ist/reference/dsl/fields/values.md): The `values` option of an extract field. - [xpath](https://docs.kaab.ist/reference/dsl/fields/xpath.md): The `xpath` option of an extract field. ### DSL - [Assertions](https://docs.kaab.ist/reference/dsl/assertions.md): Checks across the fields of one extract. - [Transforms](https://docs.kaab.ist/reference/dsl/transforms.md): Text transforms a field applies before its value is parsed. ### DSL / Lint codes - [Overview](https://docs.kaab.ist/reference/dsl/lint.md): Every finding `POST /programs/lint` can report. - [E001](https://docs.kaab.ist/reference/dsl/lint/e001.md): unknown key or wrong type - [E002](https://docs.kaab.ist/reference/dsl/lint/e002.md): `loop_until`/`scroll.until`/`paginate` without `max`/`max_pages` - [E003](https://docs.kaab.ist/reference/dsl/lint/e003.md): `evaluate` without `timeout_ms` or `max_result_bytes` within limits - [E004](https://docs.kaab.ist/reference/dsl/lint/e004.md): target/field has no locator key - [E005](https://docs.kaab.ist/reference/dsl/lint/e005.md): more than one locator key without `candidates` - [E006](https://docs.kaab.ist/reference/dsl/lint/e006.md): duplicate step `id` - [E007](https://docs.kaab.ist/reference/dsl/lint/e007.md): template references unknown `inputs`/`vars` - [E008](https://docs.kaab.ist/reference/dsl/lint/e008.md): invalid field name or reserved `$` key - [E009](https://docs.kaab.ist/reference/dsl/lint/e009.md): invalid regex / glob / JSONPath - [E010](https://docs.kaab.ist/reference/dsl/lint/e010.md): `paginate` extract has no `many:true` field - [E011](https://docs.kaab.ist/reference/dsl/lint/e011.md): `side_effect` step with `retry` or `optional` - [E012](https://docs.kaab.ist/reference/dsl/lint/e012.md): nesting depth > 3, > 200 steps, > 256 KB, > 500 extract fields or nested deeper than 32 - [E013](https://docs.kaab.ist/reference/dsl/lint/e013.md): secret input used in `extract` or rendered into a URL - [E014](https://docs.kaab.ist/reference/dsl/lint/e014.md): `download.name` or `read_pdf.artifact` renders to no usable artifact name - [W001](https://docs.kaab.ist/reference/dsl/lint/w001.md): `goto`/`click` without `expect` - [W002](https://docs.kaab.ist/reference/dsl/lint/w002.md): locator list contains only structural/positional candidates (rank ≤ 20) - [W003](https://docs.kaab.ist/reference/dsl/lint/w003.md): `sleep` used - [W004](https://docs.kaab.ist/reference/dsl/lint/w004.md): `side_effect` step not followed by a `checkpoint` before the next side effect - [W005](https://docs.kaab.ist/reference/dsl/lint/w005.md): `type: number|money` without `locale`/`decimal` and sample contains both `.` and `,` - [W006](https://docs.kaab.ist/reference/dsl/lint/w006.md): `evaluate` present (healing-opaque) - [W007](https://docs.kaab.ist/reference/dsl/lint/w007.md): `await_input` with `collect: hosted` but no `hosted.notify` - [W008](https://docs.kaab.ist/reference/dsl/lint/w008.md): `{{vars.x}}` read after a block that sets `x` on one branch only - [W009](https://docs.kaab.ist/reference/dsl/lint/w009.md): top-level `extract` alongside an `extract` step that writes `data` (nested ones included) - [W010](https://docs.kaab.ist/reference/dsl/lint/w010.md): `read_pdf` with no earlier `goto` or `download` that could produce a PDF ### Reference - [Codes](https://docs.kaab.ist/reference/codes.md): Job statuses, attention reasons, error codes with their HTTP status, warnings, events and the other closed sets. - [Events](https://docs.kaab.ist/reference/events.md): Every event type Kaabist emits, with the shape of its data. ### CLI - [Overview](https://docs.kaab.ist/reference/cli.md): Every command of the kaab command-line interface, generated from the CLI itself. - [kaab](https://docs.kaab.ist/reference/cli/kaab.md): The Kaabist command-line interface - [kaab auth](https://docs.kaab.ist/reference/cli/kaab-auth.md): Store, show and forget API keys - [kaab auth login](https://docs.kaab.ist/reference/cli/kaab-auth-login.md): Check an API key and store it in a profile - [kaab auth logout](https://docs.kaab.ist/reference/cli/kaab-auth-logout.md): Forget a profile and its keys - [kaab auth status](https://docs.kaab.ist/reference/cli/kaab-auth-status.md): Show the profiles and check the selected one's key - [kaab completion](https://docs.kaab.ist/reference/cli/kaab-completion.md): Generate the autocompletion script for the specified shell - [kaab completion bash](https://docs.kaab.ist/reference/cli/kaab-completion-bash.md): Generate the autocompletion script for bash - [kaab completion fish](https://docs.kaab.ist/reference/cli/kaab-completion-fish.md): Generate the autocompletion script for fish - [kaab completion powershell](https://docs.kaab.ist/reference/cli/kaab-completion-powershell.md): Generate the autocompletion script for powershell - [kaab completion zsh](https://docs.kaab.ist/reference/cli/kaab-completion-zsh.md): Generate the autocompletion script for zsh - [kaab credits](https://docs.kaab.ist/reference/cli/kaab-credits.md): Show the credit balance and its lots - [kaab jobs](https://docs.kaab.ist/reference/cli/kaab-jobs.md): Run, inspect and answer jobs - [kaab jobs cancel](https://docs.kaab.ist/reference/cli/kaab-jobs-cancel.md): Cancel a job (refunds what it reserved and did not use) - [kaab jobs get](https://docs.kaab.ist/reference/cli/kaab-jobs-get.md): Print a job (its data, or with --json its envelope) - [kaab jobs input](https://docs.kaab.ist/reference/cli/kaab-jobs-input.md): Answer a job waiting for an input - [kaab jobs list](https://docs.kaab.ist/reference/cli/kaab-jobs-list.md): List jobs, newest first - [kaab jobs resume](https://docs.kaab.ist/reference/cli/kaab-jobs-resume.md): Resume a job that needs attention - [kaab jobs run](https://docs.kaab.ist/reference/cli/kaab-jobs-run.md): Create a job and, with --wait, print its data - [kaab jobs snapshot](https://docs.kaab.ist/reference/cli/kaab-jobs-snapshot.md): Download a job's page snapshot (the final step's by default) - [kaab jobs steps](https://docs.kaab.ist/reference/cli/kaab-jobs-steps.md): List a job's steps with their status and timing - [kaab jobs takeover](https://docs.kaab.ist/reference/cli/kaab-jobs-takeover.md): Open a live browser on a parked job and print its URL - [kaab open](https://docs.kaab.ist/reference/cli/kaab-open.md): Open a resource in the panel - [kaab open job](https://docs.kaab.ist/reference/cli/kaab-open-job.md): Open a job's page in the panel - [kaab programs](https://docs.kaab.ist/reference/cli/kaab-programs.md): Push, pull, lint and compare programs - [kaab programs alias](https://docs.kaab.ist/reference/cli/kaab-programs-alias.md): Point a program's aliases at versions - [kaab programs alias set](https://docs.kaab.ist/reference/cli/kaab-programs-alias-set.md): Point ALIAS at VERSION (alias latest is managed by publishing) - [kaab programs diff](https://docs.kaab.ist/reference/cli/kaab-programs-diff.md): Print the JSON Patch from version V1 to version V2 - [kaab programs lint](https://docs.kaab.ist/reference/cli/kaab-programs-lint.md): Lint a definition; exit 1 when it has errors - [kaab programs list](https://docs.kaab.ist/reference/cli/kaab-programs-list.md): List programs - [kaab programs pull](https://docs.kaab.ist/reference/cli/kaab-programs-pull.md): Print (or save) a program version's definition - [kaab programs push](https://docs.kaab.ist/reference/cli/kaab-programs-push.md): Create the program a definition file names, or add a version to it - [kaab proposals](https://docs.kaab.ist/reference/cli/kaab-proposals.md): Review healing proposals - [kaab proposals approve](https://docs.kaab.ist/reference/cli/kaab-proposals-approve.md): Approve a proposal; --promote publishes it as a new version - [kaab proposals list](https://docs.kaab.ist/reference/cli/kaab-proposals-list.md): List proposals (pending by default) - [kaab proposals reject](https://docs.kaab.ist/reference/cli/kaab-proposals-reject.md): Reject a proposal - [kaab proposals show](https://docs.kaab.ist/reference/cli/kaab-proposals-show.md): Print a proposal - [kaab schedules](https://docs.kaab.ist/reference/cli/kaab-schedules.md): Run programs on a cron - [kaab schedules create](https://docs.kaab.ist/reference/cli/kaab-schedules-create.md): Create a schedule - [kaab schedules list](https://docs.kaab.ist/reference/cli/kaab-schedules-list.md): List schedules - [kaab schedules pause](https://docs.kaab.ist/reference/cli/kaab-schedules-pause.md): Pause a schedule - [kaab schedules resume](https://docs.kaab.ist/reference/cli/kaab-schedules-resume.md): Resume a paused schedule - [kaab schedules runs](https://docs.kaab.ist/reference/cli/kaab-schedules-runs.md): List a schedule's runs, newest first - [kaab sessions](https://docs.kaab.ist/reference/cli/kaab-sessions.md): Store, check and delete browser sessions - [kaab sessions create](https://docs.kaab.ist/reference/cli/kaab-sessions-create.md): Store a Playwright storage state as a session - [kaab sessions delete](https://docs.kaab.ist/reference/cli/kaab-sessions-delete.md): Delete a session - [kaab sessions list](https://docs.kaab.ist/reference/cli/kaab-sessions-list.md): List sessions - [kaab sessions verify](https://docs.kaab.ist/reference/cli/kaab-sessions-verify.md): Run a session's validity probe (costs verify credits) - [kaab usage](https://docs.kaab.ist/reference/cli/kaab-usage.md): Show usage grouped by day, program, tier or tag - [kaab version](https://docs.kaab.ist/reference/cli/kaab-version.md): Print the CLI's version - [kaab webhooks](https://docs.kaab.ist/reference/cli/kaab-webhooks.md): Manage webhook endpoints - [kaab webhooks create](https://docs.kaab.ist/reference/cli/kaab-webhooks-create.md): Create an endpoint; its secret is printed once - [kaab webhooks deliveries](https://docs.kaab.ist/reference/cli/kaab-webhooks-deliveries.md): List an endpoint's deliveries, newest first - [kaab webhooks list](https://docs.kaab.ist/reference/cli/kaab-webhooks-list.md): List endpoints - [kaab webhooks test](https://docs.kaab.ist/reference/cli/kaab-webhooks-test.md): Send a ping to an endpoint and show its answer ### Reference - [SDKs](https://docs.kaab.ist/reference/sdks.md): Every API operation by its name in the TypeScript, Python and Go SDKs. - [Plans and pricing](https://docs.kaab.ist/reference/plans.md): What each plan includes and what a credit buys. ## Changelog - [Overview](https://docs.kaab.ist/changelog.md): What changed in each Kaabist release: the API, the SDKs, the CLI and the docs. - [Deprecations](https://docs.kaab.ist/changelog/deprecations.md): API features scheduled for removal, their replacement and the date they stop working. Nothing in /v1 is deprecated today. - [2026-10-24: API 1.38](https://docs.kaab.ist/changelog/v2026.10.24-1.md): Safer side effects, lists that never skip a row, idempotency per mode, and two new warnings. - [2026-10-25: API 1.39](https://docs.kaab.ist/changelog/v2026.10.25-1.md): The `read_pdf` step returns the tables of a PDF as data, billed by the pages it reads. - [2026-10-27: API 1.39](https://docs.kaab.ist/changelog/v2026.10.27-1.md): Downloads, responses and PDFs up to 64 MB, model tokens priced per model, and PDF tables that keep their headings.