# OpenWAF Tasks

> Scheduled jobs where a script or an AI agent acts on the web through OpenWAF Browsers, with human approval of the exact action before any write.

OpenWAF Tasks runs scheduled jobs on the web. A task is either a **script** (your JavaScript, with the Playwright API) or an **agent** (our agent loop, with the model you choose). It browses with a declared [OpenWAF Browsers](https://developers.openwaf.dev/browsers/) Chrome, calls its model through [OpenWAF Egress](https://developers.openwaf.dev/egress/), and everything it would write on a site (post, submit, delete) waits for a person to approve **the exact action** first.

## Status

**Public beta, free within quota, subject to approval.** An operator turns OpenWAF Tasks on for each organization. During the beta it is free within the [quota](https://developers.openwaf.dev/tasks/limits/): 200 runs a month, 5 tasks and 1 run at a time. Browser time counts against your [Browsers quota](https://developers.openwaf.dev/browsers/limits/). There is no paid plan yet. See [how to get access](#get-access).

## What a task does

- **Runs on a schedule**: a 5-field cron with a time zone (at most every 15 minutes), once at a given time, or by hand.
- **Reads freely, writes only with approval.** While the task prepares, the browser is read-only: every request that is not `GET`, `HEAD` or `OPTIONS` fails. To write, the task proposes an action, a typed list of browser steps. A person sees the summary, the target, the steps and a screenshot, and approves that exact list. See [approvals](https://developers.openwaf.dev/tasks/approvals/).
- **Stays on its domains.** Each task lists the domains it may visit (`example.com`, `*.example.com`); the browser goes nowhere else.
- **Keeps a record.** Every run has its logs, screenshots, output, a recording if you ask for one, the requests the read-only guard blocked, and the model calls of an agent.
- **Is declared, not disguised.** The browser is a real Chrome that signs its requests with [Web Bot Auth](https://developers.openwaf.dev/browsers/web-bot-auth/), with no fingerprint spoofing, no residential proxy and no CAPTCHA solving. See [what OpenWAF Browsers is not](https://developers.openwaf.dev/browsers/what-it-is-not/).

Good fits: scheduled QA checks of your own public pages, posting or form submissions you want to review before they go out, and agent research that ends in a report.

## How it works

```text
schedule / run now
        ▼
 prepare (read-only browser) ── script or agent
        ▼                         └─ model via OpenWAF Egress
 proposal: summary, target, steps, screenshot
        ▼
 a person approves the exact steps (payload_sha256)
        ▼
 act: the runner replays only those steps
        ▼
 result, final screenshot, webhook
```

1. At the scheduled time the run starts in a new browser of the task's browser key, with the task's profile if it has one.
2. Your script or the agent works in a sandbox with no network and no secrets. It reaches the browser and the model only through the runner.
3. If it wants to write, it proposes an action. The run waits in `awaiting_approval`; the browser is closed meanwhile.
4. When someone approves, a new browser with the same profile replays the approved steps. Neither your code nor the model runs in this phase.

Tasks, runs and approvals are managed from the dashboard (**Tasks**), the [API](https://developers.openwaf.dev/tasks/reference/#api), the [CLI](https://developers.openwaf.dev/tasks/reference/#cli) or the [MCP server](https://developers.openwaf.dev/tasks/reference/#mcp-tools). The approvals inbox works on a phone.

## Get access

1. Your organization needs [OpenWAF Browsers](https://developers.openwaf.dev/browsers/#get-access) approved, and at least one browser key. An `agent` task also needs [OpenWAF Egress](https://developers.openwaf.dev/egress/cloud/get-started/) with a credential on the target the agent will use.
2. Every owner and admin of the organization needs a verified email and [two-factor authentication](https://developers.openwaf.dev/fundamentals/account-security/).
3. Write to support@openwaf.dev with your organization id, or use **Request access** in **Tasks** in the dashboard. An operator reviews it.


Until then, `GET /v1/orgs/{org}/tasks` answers with `"enabled": false` and the requirements, and the writes answer `403 feature_disabled`.

## Next steps

- [Quickstart: script](https://developers.openwaf.dev/tasks/quickstart-script/): a scheduled script that checks a page and proposes a form submission.
- [Quickstart: agent](https://developers.openwaf.dev/tasks/quickstart-agent/): give an agent a goal, a model and a step budget.
- [Approvals](https://developers.openwaf.dev/tasks/approvals/): the read-only guard, the steps, the hash and the webhook.
- [Limits and quotas](https://developers.openwaf.dev/tasks/limits/): runs, tasks, concurrency, per-domain limits and retention.
- [Security model](https://developers.openwaf.dev/tasks/security/): the sandbox, the model token and prompt injection.
- [API reference](https://developers.openwaf.dev/tasks/reference/): routes, JSON, CLI and MCP tools.
