# Browse AI

> Point a Browse AI robot at a webpage and get structured data back, no scraper to write. Run a robot on demand or over a whole list of pages at once, read the text fields, tables, and screenshots it captured, schedule monitors that watch pages for changes, and have Browse AI call a webhook when a task finishes.

App · AI Agents · 18 actions. Web page: https://docs.lodol.com/docs/integrations/browse-ai

## Actions

### Bulk run robot

Run one robot over many sets of input parameters at once, a list of pages to scrape, for example. Browse AI queues one task per entry (up to 50,000) and returns a bulk run ID; poll 'Get bulk run' with it until the run finishes to read the results.

**Inputs**

- Robot ID (`robot_id`, text, required): The ID of the robot to use (the UUID in the address bar when you open the robot on the Browse AI dashboard, or an 'id' returned by 'List robots').
- Input parameters per task (`input_parameters`, list, required): A list of input parameter objects, one per task, for example [{"originUrl": "https://example.com/a"}, {"originUrl": "https://example.com/b"}].
- Title (`title`, text): A name for the bulk run, shown on the Browse AI dashboard. Up to 200 characters.

**Outputs**

- `created_at` (number): When the bulk run was created, as a Unix timestamp in ms.
- `failed_tasks` (number): How many of those tasks have failed.
- `id` (text): The bulk run's ID. Pass it to 'Get bulk run' to follow its progress and read the results.
- `robot_id` (text): ID of the robot running the tasks.
- `status` (text): One of in-progress, finished, paused, or stopped.
- `successful_tasks` (number): How many of those tasks have succeeded.
- `tasks_count` (number): How many tasks the bulk run queued.
- `title` (text): The bulk run's title, if one was given.

**Example output**

```json
{
  "created_at": 1678795867879,
  "failed_tasks": 0,
  "id": "5aa4df52-25bb-48da-bf38-ce4f2bd98dd5",
  "robot_id": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
  "status": "in-progress",
  "successful_tasks": 0,
  "tasks_count": 2,
  "title": "Competitor pricing sweep"
}
```

### Check system status

Check whether Browse AI's task queue is running or under maintenance, to hold off starting robots while it is down.

**Inputs**: None.

**Outputs**

- `is_operational` (true/false): True while the task queue is OK.
- `tasks_queue_status` (text): OK, or UNDER_MAINTENANCE.

**Example output**

```json
{
  "is_operational": true,
  "tasks_queue_status": "OK"
}
```

### Create monitor

Set a robot to run on a schedule, for example every weekday at 09:00, to watch a page for changes. Each check uses a task credit. Read the results with 'List tasks', or have Browse AI call a URL on each change with 'Create webhook'.

**Inputs**

- Robot ID (`robot_id`, text, required): The ID of the robot to use (the UUID in the address bar when you open the robot on the Browse AI dashboard, or an 'id' returned by 'List robots').
- Name (`name`, text, required): A name for the monitor, shown on the Browse AI dashboard. Up to 200 characters.
- Check (`frequency`, text, required): How often the monitor runs the robot. One of: `hourly`, `daily`, `weekly`. Default: `daily`.
- Every (`interval`, number): Run every this many hours, days, or weeks, for example 2 with Hourly to check every two hours. Defaults to 1. Browse AI refuses schedules that check more often than your plan allows. Only when Check is Hourly, Daily or Weekly. At least 1.
- On these days (`weekdays`, list): Only run on these days of the week. Leave empty for every day. Only when Check is Hourly, Daily or Weekly. One or more of: `MO` (Monday), `TU` (Tuesday), `WE` (Wednesday), `TH` (Thursday), `FR` (Friday), `SA` (Saturday), `SU` (Sunday).
- At these hours (`hours`, list): Hours of the day to run at, for example 09:00 and 17:00. Leave empty to run at any hour the frequency allows. Only when Check is Hourly, Daily or Weekly. One or more of: `0` (00:00), `1` (01:00), `2` (02:00), `3` (03:00), `4` (04:00), `5` (05:00), `6` (06:00), `7` (07:00), `8` (08:00), `9` (09:00), and 14 more.
- Input parameters (`input_parameters`, object): Values the robot runs with on every check, one row per parameter (for example 'originUrl' set to the page to watch). Use the names 'Get robot' lists. Leave empty to use the robot's own defaults.
- Email me when captured text changes (`notify_on_text_change`, true/false): Have Browse AI email the account when a check captures different text from the last one. Default: `false`.
- Email me when a screenshot changes (`notify_on_screenshot_change`, true/false): Have Browse AI email the account when a captured screenshot changes by more than the threshold below. Default: `false`.
- Screenshot change threshold (%) (`screenshot_change_threshold`, number): How much a screenshot must change, as a percentage from 1 to 100, before Browse AI emails about it. Defaults to 15. From 1 to 100.

**Outputs**

- `created_at` (number): When the monitor was created, as a Unix timestamp in ms.
- `id` (text): The monitor's ID.
- `input_parameters` (object): The input parameters the robot runs with on each check.
- `name` (text): The monitor's name.
- `notify_on_screenshot_change` (true/false): Whether Browse AI emails when a screenshot changes.
- `notify_on_text_change` (true/false): Whether Browse AI emails when captured text changes.
- `paused_at` (number): When the monitor was paused, as a Unix timestamp in ms.
- `paused_reason` (text): Why a paused monitor stopped: lowCredits, tooManyFailures, userRequested, or userInactivity. Null while active.
- `schedule` (text): When the monitor runs, as an RFC 5545 recurrence rule, for example FREQ=DAILY;INTERVAL=1;BYHOUR=9.
- `screenshot_change_threshold` (number): Percentage a screenshot must change by before Browse AI emails.
- `status` (text): Either active or paused.
- `updated_at` (number): When the monitor last changed, as a Unix timestamp in ms.

**Example output**

```json
{
  "created_at": 1678795867879,
  "id": "8d2b6f0e-71c4-4f7a-9a3e-2c5d1b0f9e44",
  "input_parameters": {
    "originUrl": "https://example.com/pricing"
  },
  "name": "Pricing page \u2014 weekdays",
  "notify_on_screenshot_change": false,
  "notify_on_text_change": false,
  "paused_at": null,
  "paused_reason": null,
  "schedule": "FREQ=DAILY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR;BYHOUR=9",
  "screenshot_change_threshold": 15,
  "status": "active",
  "updated_at": 1678795867879
}
```

### Create webhook

Have Browse AI POST to a URL whenever one of the robot's tasks finishes, fails, or captures changed data, with the task and its captured data in the request body. Browse AI retries a delivery up to three times if the URL doesn't answer 200.

**Inputs**

- Robot ID (`robot_id`, text, required): The ID of the robot to use (the UUID in the address bar when you open the robot on the Browse AI dashboard, or an 'id' returned by 'List robots').
- Webhook URL (`url`, text, required): The http(s) URL Browse AI should POST each event to.
- Event (`event`, text, required): When Browse AI should call the URL. One of: `taskFinished` (A task finishes), `taskFinishedSuccessfully` (A task finishes successfully), `taskFinishedWithError` (A task fails), `taskCapturedDataChanged` (A task's captured data changes), `tableExportFinishedSuccessfully` (A table export finishes (beta)). Default: `taskFinished`.

**Outputs**

- `created_at` (number): When the webhook was created, as a Unix timestamp in ms.
- `event` (text): What the webhook fires on: taskFinished, taskFinishedSuccessfully, taskFinishedWithError, taskCapturedDataChanged, or tableExportFinishedSuccessfully.
- `id` (text): The webhook's ID. Pass it to 'Delete webhook' to stop it.
- `url` (text): The URL Browse AI POSTs the event to.

**Example output**

```json
{
  "created_at": 1678795867879,
  "event": "taskFinishedSuccessfully",
  "id": "6d7f1218-43fb-4735-ac71-21e81b1ab23e",
  "url": "https://hooks.example.com/browse-ai/finished"
}
```

### Delete monitor

Delete one of a robot's monitors so it stops running. The robot and the tasks the monitor already ran are kept.

**Inputs**

- Robot ID (`robot_id`, text, required): The ID of the robot to use (the UUID in the address bar when you open the robot on the Browse AI dashboard, or an 'id' returned by 'List robots').
- Monitor ID (`monitor_id`, text, required): The ID of the monitor (an 'id' returned by 'List monitors' or 'Create monitor', or the UUID in the address bar when you open the monitor on the Browse AI dashboard).

**Outputs**

- `deleted` (true/false): True once Browse AI has deleted it.
- `monitor_id` (text): ID of the deleted monitor.
- `robot_id` (text): ID of the robot the monitor belonged to.

**Example output**

```json
{
  "deleted": true,
  "monitor_id": "8d2b6f0e-71c4-4f7a-9a3e-2c5d1b0f9e44",
  "robot_id": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06"
}
```

### Delete webhook

Stop Browse AI calling one of the robot's webhooks.

**Inputs**

- Robot ID (`robot_id`, text, required): The ID of the robot to use (the UUID in the address bar when you open the robot on the Browse AI dashboard, or an 'id' returned by 'List robots').
- Webhook ID (`webhook_id`, text, required): The ID of the webhook (the 'id' returned by 'Create webhook' or 'List webhooks').

**Outputs**

- `deleted` (true/false): True once Browse AI has deleted it.
- `robot_id` (text): ID of the robot the webhook belonged to.
- `webhook_id` (text): ID of the deleted webhook.

**Example output**

```json
{
  "deleted": true,
  "robot_id": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
  "webhook_id": "6d7f1218-43fb-4735-ac71-21e81b1ab23e"
}
```

### Get bulk run

Fetch a bulk run's progress and a page of its tasks, with the data each one captured. Poll this after 'Bulk run robot' until 'is_finished' is true, then page through the tasks.

**Inputs**

- Robot ID (`robot_id`, text, required): The ID of the robot to use (the UUID in the address bar when you open the robot on the Browse AI dashboard, or an 'id' returned by 'List robots').
- Bulk run ID (`bulk_run_id`, text, required): The ID of the bulk run (the 'id' returned by 'Bulk run robot' or 'List bulk runs').
- Tasks page (`page`, number): Which page of the bulk run's tasks to return. Starts at 1. At least 1.

**Outputs**

- `created_at` (number): When the bulk run was created, as a Unix timestamp in ms.
- `failed_tasks` (number): How many of those tasks have failed.
- `has_more` (true/false): Whether another page of tasks is available.
- `id` (text): The bulk run's ID. Pass it to 'Get bulk run' to follow its progress and read the results.
- `is_finished` (true/false): True once the bulk run has finished or was stopped. False while tasks may still run.
- `page_number` (number): Which page of tasks this is.
- `robot_id` (text): ID of the robot running the tasks.
- `status` (text): One of in-progress, finished, paused, or stopped.
- `successful_tasks` (number): How many of those tasks have succeeded.
- `tasks` (list): This page of the bulk run's tasks, with their captured data.
- `tasks_count` (number): How many tasks the bulk run queued.
- `tasks_total_count` (number): How many tasks the bulk run has so far.
- `title` (text): The bulk run's title, if one was given.

**Example output**

```json
{
  "created_at": 1678795867879,
  "failed_tasks": 0,
  "has_more": false,
  "id": "5aa4df52-25bb-48da-bf38-ce4f2bd98dd5",
  "is_finished": true,
  "page_number": 1,
  "robot_id": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
  "status": "finished",
  "successful_tasks": 2,
  "tasks": [
    {
      "bulk_run_id": "5aa4df52-25bb-48da-bf38-ce4f2bd98dd5",
      "captured_data_url": "https://prod-browseai-captured-data.s3.amazonaws.com/example.json",
      "captured_lists": {
        "companies": [
          {
            "Position": "1",
            "description": "Book accommodations around the world.",
            "location": "San Francisco, CA, USA",
            "name": "Airbnb"
          },
          {
            "Position": "2",
            "description": "Buy, sell, and manage cryptocurrencies.",
            "location": "San Francisco, CA, USA",
            "name": "Coinbase"
          },
          {
            "Position": "3",
            "description": "Restaurant delivery.",
            "location": "San Francisco, CA, USA",
            "name": "DoorDash"
          }
        ]
      },
      "captured_screenshots": {},
      "captured_texts": {
        "Page Title": "Y Combinator Companies"
      },
      "created_at": 1678795867879,
      "error": null,
      "finished_at": 1678795901044,
      "id": "f6fb62b6-f06a-4bf7-a623-c6a35c2e70b0",
      "input_parameters": {
        "companies_limit": 3,
        "originUrl": "https://www.ycombinator.com/companies"
      },
      "is_finished": true,
      "retried_by_task_id": null,
      "retried_original_task_id": null,
      "robot_id": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
      "run_by_api": true,
      "run_by_monitor_id": null,
      "run_by_user_id": null,
      "started_at": 1678795869120,
      "status": "successful",
      "tried_recording_video": false,
      "video_removed_at": null,
      "video_url": null
    },
    {
      "bulk_run_id": "5aa4df52-25bb-48da-bf38-ce4f2bd98dd5",
      "captured_data_url": "https://prod-browseai-captured-data.s3.amazonaws.com/example.json",
      "captured_lists": {
        "companies": [
          {
            "Position": "1",
            "description": "Book accommodations around the world.",
            "location": "San Francisco, CA, USA",
            "name": "Airbnb"
          },
          {
            "Position": "2",
            "description": "Buy, sell, and manage cryptocurrencies.",
            "location": "San Francisco, CA, USA",
            "name": "Coinbase"
          },
          {
            "Position": "3",
            "description": "Restaurant delivery.",
            "location": "San Francisco, CA, USA",
            "name": "DoorDash"
          }
        ]
      },
      "captured_screenshots": {},
      "captured_texts": {
        "Page Title": "Y Combinator Companies"
      },
      "created_at": 1678795867879,
      "error": null,
      "finished_at": 1678795901044,
      "id": "a3e1c9d2-5b7f-4c8e-9d0a-1b2c3d4e5f60",
      "input_parameters": {
        "originUrl": "https://www.ycombinator.com/companies?batch=W24"
      },
      "is_finished": true,
      "retried_by_task_id": null,
      "retried_original_task_id": null,
      "robot_id": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
      "run_by_api": true,
      "run_by_monitor_id": null,
      "run_by_user_id": null,
      "started_at": 1678795869120,
      "status": "successful",
      "tried_recording_video": false,
      "video_removed_at": null,
      "video_url": null
    }
  ],
  "tasks_count": 2,
  "tasks_total_count": 2,
  "title": "Competitor pricing sweep"
}
```

### Get monitor

Fetch one of a robot's monitors: its schedule, whether it is active or paused (and why), its inputs, and its email settings.

**Inputs**

- Robot ID (`robot_id`, text, required): The ID of the robot to use (the UUID in the address bar when you open the robot on the Browse AI dashboard, or an 'id' returned by 'List robots').
- Monitor ID (`monitor_id`, text, required): The ID of the monitor (an 'id' returned by 'List monitors' or 'Create monitor', or the UUID in the address bar when you open the monitor on the Browse AI dashboard).

**Outputs**

- `created_at` (number): When the monitor was created, as a Unix timestamp in ms.
- `id` (text): The monitor's ID.
- `input_parameters` (object): The input parameters the robot runs with on each check.
- `name` (text): The monitor's name.
- `notify_on_screenshot_change` (true/false): Whether Browse AI emails when a screenshot changes.
- `notify_on_text_change` (true/false): Whether Browse AI emails when captured text changes.
- `paused_at` (number): When the monitor was paused, as a Unix timestamp in ms.
- `paused_reason` (text): Why a paused monitor stopped: lowCredits, tooManyFailures, userRequested, or userInactivity. Null while active.
- `schedule` (text): When the monitor runs, as an RFC 5545 recurrence rule, for example FREQ=DAILY;INTERVAL=1;BYHOUR=9.
- `screenshot_change_threshold` (number): Percentage a screenshot must change by before Browse AI emails.
- `status` (text): Either active or paused.
- `updated_at` (number): When the monitor last changed, as a Unix timestamp in ms.

**Example output**

```json
{
  "created_at": 1678795867879,
  "id": "8d2b6f0e-71c4-4f7a-9a3e-2c5d1b0f9e44",
  "input_parameters": {
    "originUrl": "https://example.com/pricing"
  },
  "name": "Pricing page \u2014 weekdays",
  "notify_on_screenshot_change": false,
  "notify_on_text_change": false,
  "paused_at": null,
  "paused_reason": null,
  "schedule": "FREQ=DAILY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR;BYHOUR=9",
  "screenshot_change_threshold": 15,
  "status": "active",
  "updated_at": 1678795867879
}
```

### Get robot

Fetch one robot by ID with the input parameters it accepts: each one's name, type, default, and, for number and select parameters, the range or choices it allows.

**Inputs**

- Robot ID (`robot_id`, text, required): The ID of the robot to use (the UUID in the address bar when you open the robot on the Browse AI dashboard, or an 'id' returned by 'List robots').

**Outputs**

- `created_at` (number): When the robot was created, as a Unix timestamp in ms.
- `id` (text): The robot's ID.
- `input_parameters` (list): The input parameters the robot accepts.
- `name` (text): The robot's name.

**Example output**

```json
{
  "created_at": 1678795867879,
  "id": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
  "input_parameters": [
    {
      "default_value": "https://www.ycombinator.com/companies",
      "encrypted": false,
      "label": "Origin URL",
      "max": null,
      "min": null,
      "name": "originUrl",
      "options": [],
      "required": true,
      "type": "url"
    },
    {
      "default_value": 10,
      "encrypted": false,
      "label": "Companies limit",
      "max": 200,
      "min": 1,
      "name": "companies_limit",
      "options": [],
      "required": false,
      "type": "number"
    }
  ],
  "name": "Extract companies from Y Combinator"
}
```

### Get task

Fetch one of a robot's tasks by ID, including everything it captured: text fields, list tables, and screenshots. Poll this after 'Run robot' until 'is_finished' is true.

**Inputs**

- Robot ID (`robot_id`, text, required): The ID of the robot to use (the UUID in the address bar when you open the robot on the Browse AI dashboard, or an 'id' returned by 'List robots').
- Task ID (`task_id`, text, required): The ID of the task (the 'id' returned by 'Run robot' or 'List tasks').

**Outputs**

- `bulk_run_id` (text): ID of the bulk run this task belongs to, if any.
- `captured_data_url` (text): Temporary link to the full captured data as JSON, for results too large to inline.
- `captured_lists` (object): The tables the robot captured, keyed by list name. Each value is an array of row objects.
- `captured_screenshots` (object): The screenshots the robot captured, keyed by screenshot name, each with a temporary 'src' link and its dimensions.
- `captured_texts` (object): The single values the robot captured, keyed by the field name given in the recorder, for example {'Product Name': 'Alexis'}.
- `created_at` (number): When the task was created, as a Unix timestamp in ms.
- `error` (text): Why the task failed, or null if it did not fail.
- `finished_at` (number): When the task finished, as a Unix timestamp in ms.
- `id` (text): The task's ID.
- `input_parameters` (object): The input parameters the robot ran with.
- `is_finished` (true/false): True once the task is successful or failed. False while the robot is still working; poll 'Get task' until it turns true.
- `retried_by_task_id` (text): ID of the task that retried this one, if any.
- `retried_original_task_id` (text): ID of the task this one is a retry of, if any.
- `robot_id` (text): ID of the robot that ran the task.
- `run_by_api` (true/false): Whether the task was started through the API.
- `run_by_monitor_id` (text): ID of the monitor that started the task, if one did.
- `run_by_user_id` (text): ID of the user who started the task, if a person did.
- `started_at` (number): When the task started, as a Unix timestamp in ms.
- `status` (text): One of in-progress, successful, or failed.
- `tried_recording_video` (true/false): Whether the robot tried to record a video of the run.
- `video_removed_at` (number): When the recording was deleted at the end of the account's data retention period, as a Unix timestamp in ms.
- `video_url` (text): Temporary link to the session recording, when one was made.

**Example output**

```json
{
  "bulk_run_id": null,
  "captured_data_url": "https://prod-browseai-captured-data.s3.amazonaws.com/example.json",
  "captured_lists": {
    "companies": [
      {
        "Position": "1",
        "description": "Book accommodations around the world.",
        "location": "San Francisco, CA, USA",
        "name": "Airbnb"
      },
      {
        "Position": "2",
        "description": "Buy, sell, and manage cryptocurrencies.",
        "location": "San Francisco, CA, USA",
        "name": "Coinbase"
      },
      {
        "Position": "3",
        "description": "Restaurant delivery.",
        "location": "San Francisco, CA, USA",
        "name": "DoorDash"
      }
    ]
  },
  "captured_screenshots": {},
  "captured_texts": {
    "Page Title": "Y Combinator Companies"
  },
  "created_at": 1678795867879,
  "error": null,
  "finished_at": 1678795901044,
  "id": "f6fb62b6-f06a-4bf7-a623-c6a35c2e70b0",
  "input_parameters": {
    "companies_limit": 3,
    "originUrl": "https://www.ycombinator.com/companies"
  },
  "is_finished": true,
  "retried_by_task_id": null,
  "retried_original_task_id": null,
  "robot_id": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
  "run_by_api": true,
  "run_by_monitor_id": null,
  "run_by_user_id": null,
  "started_at": 1678795869120,
  "status": "successful",
  "tried_recording_video": false,
  "video_removed_at": null,
  "video_url": null
}
```

### List bulk runs

List a robot's bulk runs, newest first, with each one's status and how many of its tasks have succeeded or failed.

**Inputs**

- Robot ID (`robot_id`, text, required): The ID of the robot to use (the UUID in the address bar when you open the robot on the Browse AI dashboard, or an 'id' returned by 'List robots').
- Page (`page`, number): Which page of results to return. Starts at 1. At least 1.

**Outputs**

- `bulk_runs` (list): The robot's bulk runs.
- `has_more` (true/false): Whether another page is available.
- `page_number` (number): Which page these bulk runs came from.
- `total_count` (number): How many bulk runs the robot has had.

**Example output**

```json
{
  "bulk_runs": [
    {
      "created_at": 1678795867879,
      "failed_tasks": 0,
      "id": "5aa4df52-25bb-48da-bf38-ce4f2bd98dd5",
      "robot_id": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
      "status": "in-progress",
      "successful_tasks": 0,
      "tasks_count": 2,
      "title": "Competitor pricing sweep"
    },
    {
      "created_at": 1678695867879,
      "failed_tasks": 2,
      "id": "0c1f5e7a-9b3d-4e2f-8a6c-5d4b3a2f1e0d",
      "robot_id": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
      "status": "finished",
      "successful_tasks": 118,
      "tasks_count": 120,
      "title": "Product catalogue refresh"
    }
  ],
  "has_more": false,
  "page_number": 1,
  "total_count": 2
}
```

### List monitors

List the monitors that run a robot on a schedule to watch pages for changes, with each one's schedule, status, and inputs.

**Inputs**

- Robot ID (`robot_id`, text, required): The ID of the robot to use (the UUID in the address bar when you open the robot on the Browse AI dashboard, or an 'id' returned by 'List robots').

**Outputs**

- `monitors` (list): The robot's monitors.
- `total_count` (number): How many monitors the robot has.

**Example output**

```json
{
  "monitors": [
    {
      "created_at": 1678795867879,
      "id": "8d2b6f0e-71c4-4f7a-9a3e-2c5d1b0f9e44",
      "input_parameters": {
        "originUrl": "https://example.com/pricing"
      },
      "name": "Pricing page \u2014 weekdays",
      "notify_on_screenshot_change": false,
      "notify_on_text_change": false,
      "paused_at": null,
      "paused_reason": null,
      "schedule": "FREQ=DAILY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR;BYHOUR=9",
      "screenshot_change_threshold": 15,
      "status": "active",
      "updated_at": 1678795867879
    },
    {
      "created_at": 1678795867879,
      "id": "2f9c4a1b-6e3d-4b8a-a7c5-0d1e2f3a4b5c",
      "input_parameters": {
        "originUrl": "https://example.com/careers"
      },
      "name": "Careers page \u2014 hourly",
      "notify_on_screenshot_change": false,
      "notify_on_text_change": false,
      "paused_at": 1679795867879,
      "paused_reason": "userRequested",
      "schedule": "FREQ=HOURLY;INTERVAL=1",
      "screenshot_change_threshold": 15,
      "status": "paused",
      "updated_at": 1678795867879
    }
  ],
  "total_count": 2
}
```

### List robots

List the robots on your Browse AI account, each with the input parameters it accepts: the starting point for finding a robot's ID and what to pass it.

**Inputs**: None.

**Outputs**

- `robots` (list): The robots on the account.
- `total_count` (number): How many robots the account has.

**Example output**

```json
{
  "robots": [
    {
      "created_at": 1678795867879,
      "id": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
      "input_parameters": [
        {
          "default_value": "https://www.ycombinator.com/companies",
          "encrypted": false,
          "label": "Origin URL",
          "max": null,
          "min": null,
          "name": "originUrl",
          "options": [],
          "required": true,
          "type": "url"
        },
        {
          "default_value": 10,
          "encrypted": false,
          "label": "Companies limit",
          "max": 200,
          "min": 1,
          "name": "companies_limit",
          "options": [],
          "required": false,
          "type": "number"
        }
      ],
      "name": "Extract companies from Y Combinator"
    },
    {
      "created_at": 1679795867879,
      "id": "c3689adb-50aa-44af-b265-a7e0d4e5846e",
      "input_parameters": [
        {
          "default_value": "https://example.com/pricing",
          "encrypted": false,
          "label": "Origin URL",
          "max": null,
          "min": null,
          "name": "originUrl",
          "options": [],
          "required": true,
          "type": "url"
        }
      ],
      "name": "Monitor competitor pricing page"
    }
  ],
  "total_count": 2
}
```

### List tasks

List a robot's tasks with the data each one captured. Filter by status to pick up only successful runs, or by bulk run ID to collect the results of a bulk run.

**Inputs**

- Robot ID (`robot_id`, text, required): The ID of the robot to use (the UUID in the address bar when you open the robot on the Browse AI dashboard, or an 'id' returned by 'List robots').
- Status (`status`, text): Only return tasks with this status. Leave blank for all. One of: `successful`, `failed`, `in-progress` (In progress).
- Page (`page`, number): Which page of results to return. Starts at 1. At least 1.
- Page size (`page_size`, number): How many tasks to return per page, from 1 to 10. Defaults to Browse AI's own page size. From 1 to 10.
- Bulk run ID (`bulk_run_id`, text): Only return the tasks that belong to this bulk run (the 'id' returned by 'Bulk run robot' or 'List bulk runs').
- Sort by (`sort`, text): Comma-separated fields to sort by, such as '-createdAt'. A leading '-' sorts newest first; without it, oldest first.
- Include retried tasks (`include_retried`, true/false): Include tasks that were later retried. Turn this off to see only the task that ended up counting. Default: `true`.
- Created after (`from_date`, date and time): Only return tasks created at or after this time.
- Created before (`to_date`, date and time): Only return tasks created at or before this time.

**Outputs**

- `has_more` (true/false): Whether another page of tasks is available.
- `page_number` (number): Which page these tasks came from.
- `tasks` (list): The matching tasks, with their captured data.
- `total_count` (number): How many tasks match the filters.

**Example output**

```json
{
  "has_more": false,
  "page_number": 1,
  "tasks": [
    {
      "bulk_run_id": null,
      "captured_data_url": "https://prod-browseai-captured-data.s3.amazonaws.com/example.json",
      "captured_lists": {
        "companies": [
          {
            "Position": "1",
            "description": "Book accommodations around the world.",
            "location": "San Francisco, CA, USA",
            "name": "Airbnb"
          },
          {
            "Position": "2",
            "description": "Buy, sell, and manage cryptocurrencies.",
            "location": "San Francisco, CA, USA",
            "name": "Coinbase"
          },
          {
            "Position": "3",
            "description": "Restaurant delivery.",
            "location": "San Francisco, CA, USA",
            "name": "DoorDash"
          }
        ]
      },
      "captured_screenshots": {},
      "captured_texts": {
        "Page Title": "Y Combinator Companies"
      },
      "created_at": 1678795867879,
      "error": null,
      "finished_at": 1678795901044,
      "id": "f6fb62b6-f06a-4bf7-a623-c6a35c2e70b0",
      "input_parameters": {
        "companies_limit": 3,
        "originUrl": "https://www.ycombinator.com/companies"
      },
      "is_finished": true,
      "retried_by_task_id": null,
      "retried_original_task_id": null,
      "robot_id": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
      "run_by_api": true,
      "run_by_monitor_id": null,
      "run_by_user_id": null,
      "started_at": 1678795869120,
      "status": "successful",
      "tried_recording_video": false,
      "video_removed_at": null,
      "video_url": null
    }
  ],
  "total_count": 1
}
```

### List webhooks

List the URLs Browse AI calls when the robot's tasks finish, fail, or capture changed data.

**Inputs**

- Robot ID (`robot_id`, text, required): The ID of the robot to use (the UUID in the address bar when you open the robot on the Browse AI dashboard, or an 'id' returned by 'List robots').

**Outputs**

- `total_count` (number): How many webhooks the robot has.
- `webhooks` (list): The robot's webhooks.

**Example output**

```json
{
  "total_count": 2,
  "webhooks": [
    {
      "created_at": 1678795867879,
      "event": "taskFinishedSuccessfully",
      "id": "6d7f1218-43fb-4735-ac71-21e81b1ab23e",
      "url": "https://hooks.example.com/browse-ai/finished"
    },
    {
      "created_at": 1679795867879,
      "event": "taskCapturedDataChanged",
      "id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
      "url": "https://hooks.example.com/browse-ai/changed"
    }
  ]
}
```

### Run robot

Run a Browse AI robot once: it opens a real browser, follows the steps it was trained on, and extracts the data you recorded. The robot works in the background: this action returns a task ID straight away, so follow it with 'Get task' until the task finishes to read the captured data, or have Browse AI call a URL when it does with 'Create webhook'.

**Inputs**

- Robot ID (`robot_id`, text, required): The ID of the robot to use (the UUID in the address bar when you open the robot on the Browse AI dashboard, or an 'id' returned by 'List robots').
- Input parameters (`input_parameters`, object): Values to run the robot with, one row per parameter (for example 'originUrl' set to the page to open). Use the parameter names the robot declares, which 'List robots' returns under 'input_parameters'. Leave this empty to use the robot's own defaults.
- Record a video (`record_video`, true/false): Try to record a video of the run, viewable on the Browse AI dashboard. Browse AI skips recording on pages that are too heavy, so it is not guaranteed. Default: `false`.

**Outputs**

- `bulk_run_id` (text): ID of the bulk run this task belongs to, if any.
- `captured_data_url` (text): Temporary link to the full captured data as JSON, for results too large to inline.
- `captured_lists` (object): The tables the robot captured, keyed by list name. Each value is an array of row objects.
- `captured_screenshots` (object): The screenshots the robot captured, keyed by screenshot name, each with a temporary 'src' link and its dimensions.
- `captured_texts` (object): The single values the robot captured, keyed by the field name given in the recorder, for example {'Product Name': 'Alexis'}.
- `created_at` (number): When the task was created, as a Unix timestamp in ms.
- `error` (text): Why the task failed, or null if it did not fail.
- `finished_at` (number): When the task finished, as a Unix timestamp in ms.
- `id` (text): The task's ID.
- `input_parameters` (object): The input parameters the robot ran with.
- `is_finished` (true/false): True once the task is successful or failed. False while the robot is still working; poll 'Get task' until it turns true.
- `retried_by_task_id` (text): ID of the task that retried this one, if any.
- `retried_original_task_id` (text): ID of the task this one is a retry of, if any.
- `robot_id` (text): ID of the robot that ran the task.
- `run_by_api` (true/false): Whether the task was started through the API.
- `run_by_monitor_id` (text): ID of the monitor that started the task, if one did.
- `run_by_user_id` (text): ID of the user who started the task, if a person did.
- `started_at` (number): When the task started, as a Unix timestamp in ms.
- `status` (text): One of in-progress, successful, or failed.
- `tried_recording_video` (true/false): Whether the robot tried to record a video of the run.
- `video_removed_at` (number): When the recording was deleted at the end of the account's data retention period, as a Unix timestamp in ms.
- `video_url` (text): Temporary link to the session recording, when one was made.

**Example output**

```json
{
  "bulk_run_id": null,
  "captured_data_url": null,
  "captured_lists": {},
  "captured_screenshots": {},
  "captured_texts": {},
  "created_at": 1678795867879,
  "error": null,
  "finished_at": null,
  "id": "f6fb62b6-f06a-4bf7-a623-c6a35c2e70b0",
  "input_parameters": {
    "companies_limit": 3,
    "originUrl": "https://www.ycombinator.com/companies"
  },
  "is_finished": false,
  "retried_by_task_id": null,
  "retried_original_task_id": null,
  "robot_id": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
  "run_by_api": true,
  "run_by_monitor_id": null,
  "run_by_user_id": null,
  "started_at": 1678795869120,
  "status": "in-progress",
  "tried_recording_video": false,
  "video_removed_at": null,
  "video_url": null
}
```

### Update monitor

Change a monitor's name, schedule, inputs, or email settings, or pause and resume it. Only the fields you fill in change.

**Inputs**

- Robot ID (`robot_id`, text, required): The ID of the robot to use (the UUID in the address bar when you open the robot on the Browse AI dashboard, or an 'id' returned by 'List robots').
- Monitor ID (`monitor_id`, text, required): The ID of the monitor (an 'id' returned by 'List monitors' or 'Create monitor', or the UUID in the address bar when you open the monitor on the Browse AI dashboard).
- Status (`status`, text): Pause the monitor to stop its checks, or set it active to resume them. Leave blank to keep the current status. One of: `active`, `paused`.
- Name (`name`, text): A new name for the monitor. Leave blank to keep the current one.
- Check (`frequency`, text): Choose a frequency to change the monitor's schedule. Leave blank to keep the current one. One of: `hourly`, `daily`, `weekly`.
- Every (`interval`, number): Run every this many hours, days, or weeks, for example 2 with Hourly to check every two hours. Defaults to 1. Browse AI refuses schedules that check more often than your plan allows. Only when Check is Hourly, Daily or Weekly. At least 1.
- On these days (`weekdays`, list): Only run on these days of the week. Leave empty for every day. Only when Check is Hourly, Daily or Weekly. One or more of: `MO` (Monday), `TU` (Tuesday), `WE` (Wednesday), `TH` (Thursday), `FR` (Friday), `SA` (Saturday), `SU` (Sunday).
- At these hours (`hours`, list): Hours of the day to run at, for example 09:00 and 17:00. Leave empty to run at any hour the frequency allows. Only when Check is Hourly, Daily or Weekly. One or more of: `0` (00:00), `1` (01:00), `2` (02:00), `3` (03:00), `4` (04:00), `5` (05:00), `6` (06:00), `7` (07:00), `8` (08:00), `9` (09:00), and 14 more.
- Input parameters (`input_parameters`, object): Values the robot runs with on every check, one row per parameter (for example 'originUrl' set to the page to watch). Use the names 'Get robot' lists. Leave empty to keep the current ones.
- Email me when captured text changes (`notify_on_text_change`, true/false): Have Browse AI email the account when a check captures different text from the last one. Leave blank to keep the current setting.
- Email me when a screenshot changes (`notify_on_screenshot_change`, true/false): Have Browse AI email the account when a captured screenshot changes by more than the threshold below. Leave blank to keep the current setting.
- Screenshot change threshold (%) (`screenshot_change_threshold`, number): How much a screenshot must change, as a percentage from 1 to 100, before Browse AI emails about it. Leave blank to keep the current setting. From 1 to 100.

**Outputs**

- `created_at` (number): When the monitor was created, as a Unix timestamp in ms.
- `id` (text): The monitor's ID.
- `input_parameters` (object): The input parameters the robot runs with on each check.
- `name` (text): The monitor's name.
- `notify_on_screenshot_change` (true/false): Whether Browse AI emails when a screenshot changes.
- `notify_on_text_change` (true/false): Whether Browse AI emails when captured text changes.
- `paused_at` (number): When the monitor was paused, as a Unix timestamp in ms.
- `paused_reason` (text): Why a paused monitor stopped: lowCredits, tooManyFailures, userRequested, or userInactivity. Null while active.
- `schedule` (text): When the monitor runs, as an RFC 5545 recurrence rule, for example FREQ=DAILY;INTERVAL=1;BYHOUR=9.
- `screenshot_change_threshold` (number): Percentage a screenshot must change by before Browse AI emails.
- `status` (text): Either active or paused.
- `updated_at` (number): When the monitor last changed, as a Unix timestamp in ms.

**Example output**

```json
{
  "created_at": 1678795867879,
  "id": "8d2b6f0e-71c4-4f7a-9a3e-2c5d1b0f9e44",
  "input_parameters": {
    "originUrl": "https://example.com/pricing"
  },
  "name": "Pricing page \u2014 weekdays",
  "notify_on_screenshot_change": false,
  "notify_on_text_change": false,
  "paused_at": 1679795867879,
  "paused_reason": "userRequested",
  "schedule": "FREQ=DAILY;INTERVAL=1;BYWEEKDAY=MO,TU,WE,TH,FR;BYHOUR=9",
  "screenshot_change_threshold": 15,
  "status": "paused",
  "updated_at": 1679795867879
}
```

### Update robot cookies

Add or replace cookies the robot sends when it opens pages, such as a fresh session cookie so it stays signed in to a site. Cookies with the same name are replaced; the step's output lists the cookies without their values.

**Inputs**

- Robot ID (`robot_id`, text, required): The ID of the robot to use (the UUID in the address bar when you open the robot on the Browse AI dashboard, or an 'id' returned by 'List robots').
- Cookies (`cookies`, list, required): The cookies to set, each with a 'name', a 'value' and the 'domain' it is for, and optionally 'path' (/ if left out), 'expirationDate' (seconds since 1970), and 'secure', 'httpOnly' and 'hostOnly' (off if left out). A cookie export from a browser extension can be pasted as is; settings Browse AI doesn't store are dropped.

**Outputs**

- `cookies` (list): The cookies as Browse AI stored them, without their values.
- `robot_id` (text): ID of the robot the cookies were set on.
- `updated_count` (number): How many cookies were sent.

**Example output**

```json
{
  "cookies": [
    {
      "domain": ".example.com",
      "expiration_date": 1723659417,
      "host_only": false,
      "http_only": true,
      "name": "session_id",
      "path": "/",
      "secure": true
    },
    {
      "domain": ".example.com",
      "expiration_date": 1755195417,
      "host_only": false,
      "http_only": false,
      "name": "locale",
      "path": "/",
      "secure": false
    }
  ],
  "robot_id": "4f5cd7ff-6c98-4cac-8cf0-d7d0cb050b06",
  "updated_count": 2
}
```
