# Options

Every key of a program's `options`.

| Key | Type | Description |
|---|---|---|
| `region` | `"eu" \| "us"` | The execution region, `eu` or `us`. Defaults to your organisation's region. |
| `max_tier` | `"http" \| "browser" \| "stealth"` | The most expensive tier the job may escalate to: `http`, `browser` or `stealth`. Defaults to your plan's maximum; a page that needs more fails the job with `max_tier_exceeded`. |
| `prefer_tier` | `"http" \| "browser" \| "stealth"` | The tier the job starts at: `http`, `browser` or `stealth`. Defaults to `http` for a program that only uses `goto` and `extract`, and `browser` otherwise; a site profile may raise it. |
| `assets` | `"block" \| "allow"` | Whether browser tiers load images, fonts and media: `block` (the default) or `allow`. |
| `block_urls` | `string[]` | Up to 50 URL globs, matched against the full URL, whose requests a browser tier aborts before they are sent, whatever `assets` says. Use it for a site's own analytics; a pattern that matches something the page needs breaks the page, and the `http` tier ignores it. |
| `proxy` | `object` | Which proxy the job's traffic goes through. Defaults to `{ "mode": "platform", "fallback": "none" }`. |
| `proxy.mode` | `"platform" \| "byo"` | `platform` uses Kaabist's proxy pool; `byo` uses a proxy your organisation registered. Defaults to `platform`. |
| `proxy.byo_id` | `string` | The `byo_…` id of the bring-your-own proxy to use with `mode: "byo"`. Without it, `byo` uses your organisation's default proxy. |
| `proxy.country` | `string` | The exit country, as an uppercase ISO-3166-1 alpha-2 code such as `DE`. |
| `proxy.pool` | `"datacenter" \| "residential" \| "mobile"` | The platform proxy class: `datacenter`, `residential` or `mobile`. |
| `proxy.fallback` | `"platform" \| "none"` | What happens when a bring-your-own proxy fails. `none` (the default) fails the job with `byo_proxy_unreachable`; `platform` runs on the platform pool, adds the warning `byo_fallback_used` and bills the proxy traffic. |
| `llm` | `object` | The language model that heals locators and classifies unrecognised pages. Defaults to your organisation's configured model, else the platform's model when it is enabled. |
| `llm.byo_id` | `string` | The `byo_…` id of a bring-your-own model. Only `capable` models heal, and a bring-your-own model's tokens are not billed. |
| `captcha` | `object` | The captcha solver `policies.captcha: "solve"` uses. Defaults to your organisation's configured solver, else the platform's. |
| `captcha.byo_id` | `string` | The `byo_…` id of a bring-your-own captcha solver. Its solves are not billed. |
| `session` | `string` | The name of a session to bind. Its storage state is loaded before step 1, so the job starts signed in. |
| `resume_from_session` | `boolean` | When `true` and the bound session is valid, the job skips ahead to the step after the `checkpoint` that saved this session, instead of signing in again. Defaults to `false`. |
| `session_probe` | `"http" \| "browser"` | Which tier checks the bound session before the job runs: `http` (the default, one request) or `browser`, for a site whose signed-in landmark needs JavaScript. A `browser` probe is billed as a browser page load. |
| `cache` | `object` | Lets the job reuse a recent snapshot of the same page. Ignored when the program binds a session or has secret inputs. |
| `cache.max_age` | `integer` | The oldest snapshot the job accepts, in seconds, from `0` to `86400`. |
| `viewport` | `object` | The browser window size for browser tiers. Defaults to 1280×800. |
| `viewport.width` | `integer` | Viewport width in pixels, from `320` to `3840`. |
| `viewport.height` | `integer` | Viewport height in pixels, from `240` to `2160`. |
| `browser_profile` | `"desktop" \| "mobile"` | The user agent and viewport bundle: `desktop` (the default) or `mobile`. |
| `engine` | `"chromium" \| "firefox"` | The stealth tier's browser. Without it, a stealth job starts on a hardened Chromium and switches to Camoufox (a Firefox build) for a hostname where Chromium was refused. `firefox` always runs Camoufox; `chromium` never switches. The browser tier always runs Chromium. |
| `fill_mode` | `"insert" \| "type"` | How `fill` puts text into a field at a browser tier. `insert` (the default) commits the whole value at once, as a paste does; `type` sends one key event per character, for fields with an input mask or a per-keystroke validator. |
| `follow_popups` | `boolean` | Browser tiers: when `true`, a page the program opens in a popup (`window.open`, `target=_blank`) is opened in the same tab instead, so a one-time sign-in token is spent by the tab the program drives. Defaults to `false`. |
| `locale` | `string` | The browser locale as a BCP-47 tag. Defaults to `en-US`, or to the locale of `proxy.country` when one is set. |
| `timezone` | `string` | The browser time zone as an IANA name. Defaults to `UTC`, or to the time zone of `proxy.country` when one is set. |
| `max_duration_ms` | `integer` | The whole job's time budget in milliseconds, from `1000` to `3600000`, not counting time spent parked. Defaults to your plan's limit. |
| `max_credits` | `integer` | The most credits the job may spend; exceeding it fails the job. Defaults to your plan's limit. |
| `max_steps` | `integer` | The most steps the job may execute, from `1` to `200`. Defaults to `200`. |
| `headers` | `map of string` | Extra request headers, as a map of name to value, sent by the `http` tier and, on the browser tiers, on the page's own top-level navigations only: never on its images, scripts or `fetch` calls, nor to another host the page talks to. |
| `canary` | `object` | The canary probe that runs the program on a schedule to notice when a site changes. The stored canary settings on the program override these key by key. |
| `canary.enabled` | `boolean` | `true` opts in and `false` opts out. When absent, a program used in the last seven days that has a `canary.url` or is only `goto` and `extract` gets a canary. |
| `canary.cron` | `string` | The schedule the canary runs on, as a cron expression such as `0 */6 * * *`. |
| `canary.url` | `string` | The URL the canary runs against, a template. It is bound as the input named `url`, which `{{inputs.url}}` reads. |
| `canary.inputs` | `object` | Input values the canary runs with. Credentials do not belong here; they are stored separately on the program. |
| `obstacles` | `object` | How the obstacle layer treats cookie banners, dialogs, overlays, toasts and tours. Defaults to `{ "allow_hide": true }`. |
| `obstacles.allow_hide` | `boolean` | Whether a `dialog` or `consent` obstacle that cannot be dismissed may be hidden as a last resort. Defaults to `true`; set `false` for a page whose modal is the page, such as an age gate or a paywall, so the job parks for a person instead. |
| `obstacles.ignore` | `string[]` | Up to 20 CSS selectors the obstacle probe never reports, for elements such as a chat bubble or a sticky header that are part of the page. |
