---
title: Task Parameters
subtitle: Configure how your task runs
slug: running-automations/task-parameters
---

This page covers all parameters you can pass to `run_task`.

Only `prompt` is a required parameter.


---

## Quick reference

| Parameter | Type | Use this to |
|-----------|------|-------------|
| [`prompt`](#prompt) **(Required)** | string | Give natural language instructions for the AI |
| [`url`](#url) | string | Give a starting URL for the task |
| [`engine`](#engine) | string | Choose a different Agent model |
| [`data_extraction_schema`](#data_extraction_schema) | object | Get consistent, structured JSON output |
| [`max_steps`](#max_steps) | integer | Limit how long the Agent runs and cap costs |
| [`proxy_location`](#proxy_location) | string \| object | Access geo-restricted content or reduce bot detection |
| [`browser_session_id`](#browser_session_id) | string | Maintain state (cookies, login) across multiple tasks |
| [`totp_identifier`](#totp_identifier) | string | Handle 2FA when pushing codes to Skyvern |
| [`totp_url`](#totp_url) | string | Have Skyvern fetch 2FA codes from your endpoint |
| [`error_code_mapping`](#error_code_mapping) | object | Get custom error codes for programmatic handling |
| [`webhook_url`](#webhook_url) | string | Get notified when the task completes |
| [`title`](#title) | string | Label the task in the Skyvern UI |
| [`extra_http_headers`](#extra_http_headers) | object | Add custom headers (e.g., Authorization) to browser requests |
| [`publish_workflow`](#publish_workflow) | boolean | Convert this task into a reusable workflow |
| [`max_screenshot_scrolls`](#max_screenshot_scrolls) | integer | Capture lazy-loaded content in screenshots |
| [`browser_address`](#browser_address) | string | Connect to your own browser for local development |
| [`include_action_history_in_verification`](#include_action_history_in_verification) | boolean | Improve verification accuracy for multi-step forms |
| [`run_with`](#run_with) | string | Choose whether to run with the AI agent or generated code |
| [`model`](#model) | object | Configure model settings (e.g., temperature) |

---

## `prompt`

**Required.** Natural language instructions describing what the AI should do.

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Find the cheapest flight from NYC to LAX on March 15"
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Find the cheapest flight from NYC to LAX on March 15",
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Find the cheapest flight from NYC to LAX on March 15"
  }'
```
</CodeGroup>

Be specific about your goal and what data you want extracted. The more detailed your prompt, the better the results.

---

## `url`

The starting page for the automation. Skyvern navigates from here based on your prompt.

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Get the top headline",
    url="https://news.ycombinator.com"
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Get the top headline",
    url: "https://news.ycombinator.com",
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Get the top headline",
    "url": "https://news.ycombinator.com"
  }'
```
</CodeGroup>

If not provided, Skyvern attempts to determine an appropriate starting URL from your prompt.

---

## `engine`

The AI engine that powers the task. These are not iterations—they're suited for different purposes.

| Engine | Description |
|--------|-------------|
| `skyvern-2.0` | **Default.** Multi-objective, flexible, handles complex multi-step tasks. 85.85% on WebVoyager benchmark. Slower and more expensive. |
| `skyvern-1.0` | Single objective, precise, faster, cheaper. Best for simple tasks like form filling or single-page extraction. |
| `openai-cua` | OpenAI's Computer Use Agent |
| `anthropic-cua` | Anthropic Claude Sonnet with computer use |
| `ui-tars` | UI-TARS model (Seed1.5-VL) via Doubao API |

<Tip>
Use `skyvern-1.0` when you have a clear, single goal and want faster, cheaper execution. Use `skyvern-2.0` when the task requires flexibility or multiple steps.
</Tip>

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Fill out the contact form",
    engine="skyvern-1.0"
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Fill out the contact form",
    engine: "skyvern-1.0",
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Fill out the contact form",
    "engine": "skyvern-1.0"
  }'
```
</CodeGroup>

---

## `data_extraction_schema`

A [JSON Schema](https://json-schema.org/) defining the structure of output data.

Use this when you need consistent, typed responses.

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Find the top post on Hacker News",
    data_extraction_schema={
        "type": "object",
        "properties": {
            "title": {
                "type": "string",
                "description": "The title of the top post"
            },
            "points": {
                "type": "integer",
                "description": "Number of points"
            }
        }
    }
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Find the top post on Hacker News",
    data_extraction_schema: {
      type: "object",
      properties: {
        title: {
          type: "string",
          description: "The title of the top post",
        },
        points: {
          type: "integer",
          description: "Number of points",
        },
      },
    },
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Find the top post on Hacker News",
    "data_extraction_schema": {
      "type": "object",
      "properties": {
        "title": {
          "type": "string",
          "description": "The title of the top post"
        },
        "points": {
          "type": "integer",
          "description": "Number of points"
        }
      }
    }
  }'
```
</CodeGroup>

Without a schema, output format varies based on what the AI extracts. With a schema, output matches your defined structure.

---

## `max_steps`

Maximum number of steps the task can take. The task fails if it exceeds this limit.

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Get the current stock price of AAPL",
    max_steps=10
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Get the current stock price of AAPL",
    max_steps: 10,
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Get the current stock price of AAPL",
    "max_steps": 10
  }'
```
</CodeGroup>

On the cloud-hosted version, you're billed per step. Set this to a reasonable value during development to cap costs.

<Warning>
Set `max_steps` during development to avoid runaway costs. A task that loops or gets stuck will keep consuming steps until it hits this limit.
</Warning>

---

## `proxy_location`

Route browser traffic through a residential proxy in a specific location.

Use this for geo-restricted content or to reduce bot detection.

**Country-level pools:**

| Value | Location |
|-------|----------|
| `RESIDENTIAL` | Random US residential (default) |
| `RESIDENTIAL_GB` | United Kingdom |
| `RESIDENTIAL_DE` | Germany |
| `RESIDENTIAL_FR` | France |
| `RESIDENTIAL_ES` | Spain |
| `RESIDENTIAL_IE` | Ireland |
| `RESIDENTIAL_IN` | India |
| `RESIDENTIAL_JP` | Japan |
| `RESIDENTIAL_AU` | Australia |
| `RESIDENTIAL_CA` | Canada |
| `RESIDENTIAL_BR` | Brazil |
| `RESIDENTIAL_MX` | Mexico |
| `RESIDENTIAL_AR` | Argentina |
| `RESIDENTIAL_NZ` | New Zealand |
| `RESIDENTIAL_ZA` | South Africa |
| `RESIDENTIAL_IT` | Italy |
| `RESIDENTIAL_NL` | Netherlands |
| `RESIDENTIAL_PH` | Philippines |
| `RESIDENTIAL_KR` | South Korea |
| `RESIDENTIAL_TR` | Turkey |
| `RESIDENTIAL_ISP` | ISP proxy |
| `US-CA` | California, US |
| `US-NY` | New York, US |
| `US-TX` | Texas, US |
| `US-FL` | Florida, US |
| `US-WA` | Washington, US |
| `NONE` | No proxy |

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Get UK-specific pricing",
    proxy_location="RESIDENTIAL_GB"
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Get UK-specific pricing",
    proxy_location: "RESIDENTIAL_GB",
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Get UK-specific pricing",
    "proxy_location": "RESIDENTIAL_GB"
  }'
```
</CodeGroup>

**Granular targeting (state/city level):**

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Get California pricing",
    proxy_location={
        "country": "US",
        "subdivision": "CA",
        "city": "San Francisco"
    }
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Get California pricing",
    proxy_location: {
      country: "US",
      subdivision: "CA",
      city: "San Francisco",
    },
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Get California pricing",
    "proxy_location": {
      "country": "US",
      "subdivision": "CA",
      "city": "San Francisco"
    }
  }'
```
</CodeGroup>

The full list of available proxy locations is shown above. Use `NONE` to disable proxies.

<Warning>
For geo-restricted sites, `proxy_location` is required—without it, you'll get blocked or see wrong regional content (e.g., US prices instead of UK prices).
</Warning>

---

## `browser_session_id`

Run the task in an existing persistent browser session.

Use this to maintain state (cookies, localStorage) across multiple tasks.

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Extract account data",
    browser_session_id="pbs_123"
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Extract account data",
    browser_session_id: "pbs_123",
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Extract account data",
    "browser_session_id": "pbs_123"
  }'
```
</CodeGroup>

Browser sessions persist cookies, localStorage, and authentication state across multiple tasks.

---

## `totp_identifier`

Identifier for TOTP codes when you push codes to Skyvern's API.

Use this for two-factor authentication during task execution.

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Log in and extract account balance",
    totp_identifier="my-2fa-credential"
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Log in and extract account balance",
    totp_identifier: "my-2fa-credential",
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Log in and extract account balance",
    "totp_identifier": "my-2fa-credential"
  }'
```
</CodeGroup>

TOTP codes are used for two-factor authentication during automated logins.

---

## `totp_url`

URL that Skyvern calls to fetch TOTP codes when needed.

Use this when Skyvern should retrieve codes from your endpoint.

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Log in and extract account balance",
    totp_url="https://your-server.com/totp"
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Log in and extract account balance",
    totp_url: "https://your-server.com/totp",
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Log in and extract account balance",
    "totp_url": "https://your-server.com/totp"
  }'
```
</CodeGroup>

TOTP codes are used for two-factor authentication during automated logins.

---

## `error_code_mapping`

Map specific error conditions to custom error codes.

Use this to make programmatic error handling easier.

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Log in and extract data",
    error_code_mapping={
        "login_failed": "The login credentials are incorrect or the account is locked",
        "maintenance_mode": "The website is down for maintenance"
    }
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Log in and extract data",
    error_code_mapping: {
      login_failed: "The login credentials are incorrect or the account is locked",
      maintenance_mode: "The website is down for maintenance",
    },
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Log in and extract data",
    "error_code_mapping": {
      "login_failed": "The login credentials are incorrect or the account is locked",
      "maintenance_mode": "The website is down for maintenance"
    }
  }'
```
</CodeGroup>

If Skyvern encounters a login failure matching your description, `output` contains `{"error": "login_failed"}` instead of a generic error message.

---

## `webhook_url`

URL to receive a POST request when the task completes.

Use this instead of polling for production systems.

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Extract pricing data",
    webhook_url="https://your-server.com/webhook"
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Extract pricing data",
    webhook_url: "https://your-server.com/webhook",
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Extract pricing data",
    "webhook_url": "https://your-server.com/webhook"
  }'
```
</CodeGroup>

Skyvern sends a POST request with the full run data when the task completes or fails.

---

## `title`

Display name for the task in the Skyvern UI.

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Get the top post",
    title="HN Top Post Scraper"
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Get the top post",
    title: "HN Top Post Scraper",
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Get the top post",
    "title": "HN Top Post Scraper"
  }'
```
</CodeGroup>

---

## `extra_http_headers`

Additional HTTP headers to include in browser requests.

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Access protected resource",
    extra_http_headers={
        "Authorization": "Bearer your-token"
    }
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Access protected resource",
    extra_http_headers: {
      Authorization: "Bearer your-token",
    },
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Access protected resource",
    "extra_http_headers": {
      "Authorization": "Bearer your-token"
    }
  }'
```
</CodeGroup>

---

## `publish_workflow`

Convert this task into a reusable workflow. Only available for `skyvern-2.0`.

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Fill out the contact form with provided data",
    publish_workflow=True
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Fill out the contact form with provided data",
    publish_workflow: true,
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Fill out the contact form with provided data",
    "publish_workflow": true
  }'
```
</CodeGroup>

---

## `max_screenshot_scrolls`

Number of scrolls for post-action screenshots.

Use this for pages with lazy-loaded content.

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Extract all product listings",
    max_screenshot_scrolls=3
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Extract all product listings",
    max_screenshot_scrolls: 3,
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Extract all product listings",
    "max_screenshot_scrolls": 3
  }'
```
</CodeGroup>

---

## `browser_address`

Connect to a browser at a specific CDP address.

Use this for local development only.

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Automate my local browser",
    browser_address="http://127.0.0.1:9222"
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Automate my local browser",
    browser_address: "http://127.0.0.1:9222",
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Automate my local browser",
    "browser_address": "http://127.0.0.1:9222"
  }'
```
</CodeGroup>

---

## `run_with`

Choose whether the task runs with the AI agent or generated code.

| Value | Description |
|-------|-------------|
| `agent` | Run with the AI agent (default). The agent analyzes screenshots and decides actions in real time. |
| `code` | Run with generated code. Faster and more deterministic, but requires a previously published workflow. |

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Fill out the contact form",
    run_with="agent"
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Fill out the contact form",
    run_with: "agent",
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Fill out the contact form",
    "run_with": "agent"
  }'
```
</CodeGroup>

---

## `model`

Optional model configuration for the task.

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Extract data from the page",
    model={"temperature": 0.5}
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Extract data from the page",
    model: { temperature: 0.5 },
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Extract data from the page",
    "model": {"temperature": 0.5}
  }'
```
</CodeGroup>

---

## `include_action_history_in_verification`

Include action history when verifying task completion. Default: `false`.

<CodeGroup>
```python Python
result = await client.run_task(
    prompt="Complete the multi-step form",
    include_action_history_in_verification=True
)
```

```typescript TypeScript
const result = await client.runTask({
  body: {
    prompt: "Complete the multi-step form",
    include_action_history_in_verification: true,
  },
});
```

```bash cURL
curl -X POST "https://api.skyvern.com/v1/run/tasks" \
  -H "x-api-key: $SKYVERN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Complete the multi-step form",
    "include_action_history_in_verification": true
  }'
```
</CodeGroup>

---

## Next steps

<CardGroup cols={2}>
  <Card
    title="Extract Structured Data"
    icon="database"
    href="/running-automations/extract-structured-data"
  >
    Define a schema to get typed JSON output
  </Card>
  <Card
    title="Run a Task"
    icon="play"
    href="/running-automations/run-a-task"
  >
    Execute tasks and retrieve results
  </Card>
</CardGroup>
