Skip to main content
This page covers all parameters you can pass when creating and running workflows.

Quick reference: Creating a workflow

ParameterTypeUse this to
title (Required)stringName the workflow for identification
workflow_definition (Required)objectDefine blocks, parameters, and logic
descriptionstringDocument what the workflow does
proxy_locationstring or objectSet default proxy for all blocks
webhook_callback_urlstringGet notified when any run of this workflow completes
persist_browser_sessionbooleanKeep the browser session alive across blocks

Quick reference: Running a workflow

ParameterTypeUse this to
workflow_id (Required)stringSpecify which workflow to run
parametersobjectPass values for workflow input parameters
titlestringName this specific workflow run
proxy_locationstring or objectOverride the default proxy location
webhook_urlstringGet notified when the workflow completes
browser_session_idstringReuse a persistent browser session
browser_profile_idstringReuse a browser profile (cookies, storage)

Creating a workflow

All create parameters (title, workflow_definition, description, proxy_location, etc.) are nested inside a json_definition object — not passed at the top level. You can alternatively use yaml_definition (a YAML string) instead.
workflow = await client.create_workflow(
    json_definition={
        "title": "...",
        "workflow_definition": {...}
    }
)

title

Required. Display name for the workflow. This field goes inside the json_definition object.
workflow = await client.create_workflow(
    json_definition={
        "title": "Invoice Downloader",
        "workflow_definition": {...}
    }
)

workflow_definition

Required. The workflow structure containing parameters and blocks.
{
  "workflow_definition": {
    "parameters": [...],
    "blocks": [...]
  }
}

parameters

Input parameters the workflow accepts. Each parameter has:
FieldTypeDescription
keystringParameter name, used to reference via {{ key }}
parameter_typestringAlways "workflow" for input parameters
workflow_parameter_typestringData type: string, integer, float, boolean, json, file_url, credential_id
default_valueanyOptional default value
descriptionstringOptional description
workflow = await client.create_workflow(
    json_definition={
        "title": "Job Application Workflow",
        "workflow_definition": {
            "parameters": [
                {
                    "key": "resume",
                    "parameter_type": "workflow",
                    "workflow_parameter_type": "file_url",
                    "description": "URL to the resume PDF"
                },
                {
                    "key": "job_urls",
                    "parameter_type": "workflow",
                    "workflow_parameter_type": "json",
                    "default_value": []
                },
                {
                    "key": "cover_letter",
                    "parameter_type": "workflow",
                    "workflow_parameter_type": "string",
                    "default_value": ""
                }
            ],
            "blocks": [...]
        }
    }
)
Parameter types:
TypeDescriptionExample
stringText value"John Smith"
integerWhole number42
floatDecimal number99.99
booleanTrue/falsetrue
jsonJSON object or array{"key": "value"} or ["a", "b"]
file_urlURL to a file"https://example.com/resume.pdf"
credential_idReference to a stored credential"cred_abc123"

blocks

Array of blocks that execute in sequence. See Workflow Blocks Reference for all block types.

description

Optional description of what the workflow does.
workflow = await client.create_workflow(
    json_definition={
        "title": "Invoice Downloader",
        "description": "Downloads all invoices from the vendor portal since a given date",
        "workflow_definition": {...}
    }
)

proxy_location (create)

Default proxy location for all blocks in the workflow. Individual blocks can override this. See Proxy & Geo Targeting for all available locations.
workflow = await client.create_workflow(
    json_definition={
        "title": "UK Price Checker",
        "proxy_location": "RESIDENTIAL_GB",
        "workflow_definition": {...}
    }
)

webhook_callback_url

URL to receive a POST request whenever any run of this workflow completes. This is set at the workflow level and applies to all runs. To set a webhook for a single run instead, use webhook_url when running the workflow.
workflow = await client.create_workflow(
    json_definition={
        "title": "Invoice Downloader",
        "webhook_callback_url": "https://your-server.com/webhook",
        "workflow_definition": {...}
    }
)

persist_browser_session

If true, the browser session is kept alive across all blocks in the workflow. This means blocks share the same browser context including cookies, local storage, and login state. Defaults to false.
workflow = await client.create_workflow(
    json_definition={
        "title": "Multi-Step Portal Scraper",
        "persist_browser_session": True,
        "workflow_definition": {...}
    }
)
Additional advanced parameters are available when creating a workflow, including totp_verification_url, totp_identifier, model, and extra_http_headers. See the API Reference for the full list.

Running a workflow

workflow_id

Required. The ID of the workflow to run. This is the workflow_permanent_id returned when creating the workflow.
run = await client.run_workflow(
    workflow_id="wpid_123456789",
    parameters={...}
)

parameters

Values for the workflow’s input parameters. Keys must match the key field in the workflow’s parameter definitions.
run = await client.run_workflow(
    workflow_id="wpid_123456789",
    parameters={
        "resume": "https://example.com/resume.pdf",
        "job_urls": [
            "https://jobs.lever.co/company/position-1",
            "https://jobs.lever.co/company/position-2"
        ],
        "cover_letter": "I am excited to apply for this position..."
    }
)
Parameters with default_value in the workflow definition are optional. Parameters without defaults are required.

proxy_location (run)

Override the workflow’s default proxy location for this run.
run = await client.run_workflow(
    workflow_id="wpid_123456789",
    parameters={...},
    proxy_location="RESIDENTIAL_CA"
)
Proxy locations:
ValueLocation
RESIDENTIALUnited States (default)
RESIDENTIAL_ISPUnited States (static ISP IPs)
RESIDENTIAL_ARArgentina
RESIDENTIAL_AUAustralia
RESIDENTIAL_BRBrazil
RESIDENTIAL_CACanada
RESIDENTIAL_DEGermany
RESIDENTIAL_ESSpain
RESIDENTIAL_FRFrance
RESIDENTIAL_GBUnited Kingdom
RESIDENTIAL_IEIreland
RESIDENTIAL_INIndia
RESIDENTIAL_ITItaly
RESIDENTIAL_JPJapan
RESIDENTIAL_MXMexico
RESIDENTIAL_NLNetherlands
RESIDENTIAL_NZNew Zealand
RESIDENTIAL_PHPhilippines
RESIDENTIAL_KRSouth Korea
RESIDENTIAL_TRTürkiye
RESIDENTIAL_ZASouth Africa
NONENo proxy
For US state or city-level targeting, pass a GeoTarget object instead:
{
  "proxy_location": {
    "country": "US",
    "subdivision": "CA",
    "city": "San Francisco"
  }
}
country is required (ISO 3166-1 alpha-2 code). subdivision and city are optional. See Proxy & Geo Targeting for more details.

webhook_url

URL to receive a POST request when the workflow completes.
run = await client.run_workflow(
    workflow_id="wpid_123456789",
    parameters={...},
    webhook_url="https://your-server.com/webhook"
)
The webhook payload contains the same data as the polling response. See Webhooks for authentication and retry options.

title (run)

Optional display name for this specific workflow run. Useful for distinguishing runs in the UI and API responses.
run = await client.run_workflow(
    workflow_id="wpid_123456789",
    title="January 2025 Invoice Batch",
    parameters={...}
)

browser_session_id

ID of an existing Skyvern browser session to reuse. The workflow run continues from the current screen state of that session. Browser session IDs start with pbs_.
run = await client.run_workflow(
    workflow_id="wpid_123456789",
    browser_session_id="pbs_abc123",
    parameters={...}
)

browser_profile_id

ID of a browser profile to reuse. Browser profiles persist cookies, local storage, and other browser state across runs. Profile IDs start with bp_.
run = await client.run_workflow(
    workflow_id="wpid_123456789",
    browser_profile_id="bp_xyz789",
    parameters={...}
)
Additional advanced parameters are available when running a workflow, including totp_url, totp_identifier, browser_address, extra_http_headers, and max_screenshot_scrolls. See the API Reference for the full list.

Run response

When you run a workflow, the response contains:
FieldTypeDescription
run_idstringUnique ID for this run (starts with wr_).
statusstringOne of: created, queued, running, completed, failed, terminated, timed_out, canceled.
outputobject/array/string/nullExtracted data from the workflow, if any.
failure_reasonstring/nullWhy the run failed, if applicable.
errorsarray/nullList of errors encountered during the run.
downloaded_filesarray/nullFiles downloaded during the run.
recording_urlstring/nullURL to the browser recording.
screenshot_urlsarray/nullLatest screenshots in reverse chronological order.
app_urlstring/nullLink to view this run in the Skyvern UI.
created_atdatetimeWhen the run was created.
started_atdatetime/nullWhen execution started.
finished_atdatetime/nullWhen execution finished.

Next steps

Build a Workflow

Create and run your first workflow

Workflow Blocks Reference

Detailed documentation for all block types

Proxy & Geo Targeting

Full list of proxy locations

Webhooks

Handle webhook authentication and retries