Extraction actions capture data from web pages during automation—essential for scraping, validation, and feeding dynamic values into subsequent actions.
| Type | Purpose | Best For |
|---|
llm | AI-powered structured data extraction | Tables, forms, text content |
locator | Extract text directly via Playwright locator | Single values, fast extraction, no LLM tokens |
network_call | Capture API/AJAX responses | API data, JSON responses |
api_call | Call an external REST API directly | Webhooks, triggering jobs, polling for async results |
screenshot | Save visual snapshot | Receipts, proofs, visual records |
state | Capture page state (URL, title, storage, cookies) | Debugging auth, navigation validation |
two_fa_action | Wait for and extract 2FA code | 2FA codes |
The most powerful extraction method. Uses AI to parse page content into structured data.
Properties
| Property | Type | Default | Description |
|---|
source | list["axtree" | "screenshot"] | ["axtree"] | Data sources to analyze |
extraction_format | dict | Required | Expected output structure |
extraction_instructions | str | Required | What to extract |
output_variable_names | list[str] | None | Store values as variables |
llm_model_name | str | "gemini-2.5-flash" | LLM model to use |
Source Selection
| Source | Best For |
|---|
["axtree"] | Text, tables, forms (default, fastest) |
["screenshot"] | Charts, images, visual layouts |
["axtree", "screenshot"] | Complex pages needing both |
Define output structure with type hints:
Only str and List[str] are supported types.
Storing as Variables
Use output_variable_names to make extracted values available for subsequent actions:
After this action, use {order_ids[0]}, {order_ids[index]}, or iterate with for_loop_node.
Writing Good Instructions
Good examples:
Poor examples:
Be specific about where data appears, what it looks like, and expected format.
Extract text from a specific element on the page using a Playwright locator — no LLM tokens consumed. If the locator fails, it can fall back to LLM extraction.
Properties
| Property | Type | Default | Description |
|---|
command | str | Required | Playwright locator command to find the element |
output_variable_name | str | Required | Variable name to store the extracted text |
extraction_format | dict | Required | Must contain output_variable_name as a key |
extraction_instructions | str | None | None | LLM fallback instructions if the locator fails |
llm_provider | "gemini" | "gemini" | LLM provider to use for fallback |
llm_model_name | str | "gemini-2.5-flash" | LLM model for fallback |
extraction_format must contain output_variable_name as a key, or validation will fail.
Fallback Behavior
If the locator fails to find the element or find text content, two outcomes are possible:
- With
extraction_instructions — falls back to LLM extraction automatically
- Without
extraction_instructions — variable is set to None
When to Use Locator vs LLM
| Situation | Use |
|---|
| Element has a stable, reliable locator | locator (faster, no cost) |
| Page structure changes often | llm |
| Single known value to extract | locator with LLM fallback |
| Multiple fields at once | llm |
Always provide extraction_instructions as a fallback. This makes the extraction resilient if the page structure changes.
Capture data from API requests and responses:
Properties
| Property | Type | Default | Description |
|---|
url_pattern | str | None | None | URL substring to match |
extract_from | "request" | "response" | None | Extract from request or response |
download_from | "request" | "response" | None | Download as file |
download_filename | str | None | Auto-generated | Filename for download |
Use network_call to intercept requests the page already makes. Use api_call (below) to initiate your own HTTP request to any external endpoint.
Make an outbound REST API call directly from the automation—useful for hitting webhooks, triggering backend jobs, enriching data from a third-party service, or polling an async endpoint until it’s ready. The full response is stored as a variable for use in later actions.
Properties
| Property | Type | Default | Description |
|---|
url | str | Required | Endpoint to call |
method | "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "GET" | HTTP method |
headers | dict[str, str] | {} | Request headers |
body | dict | str | None | None | Request body. A dict is sent as JSON; a str is sent as raw content |
query_params | dict[str, str] | {} | URL query parameters |
output_variable_names | list[str] | ["api_result"] | Variable name(s) to store the response under |
timeout | float | 30.0 | Request timeout in seconds |
poll_condition | str | None | None | Expression to re-poll until satisfied (see Polling) |
poll_interval | float | 5.0 | Seconds to wait between poll attempts |
max_poll_attempts | int | 10 | Maximum number of poll attempts |
Response Shape
The stored variable holds a dict with the following keys:
| Key | Type | Description |
|---|
status_code | int | null | HTTP status code (null on a connection error or timeout) |
headers | dict[str, str] | Response headers |
body | any | Parsed JSON if the response is JSON, otherwise the raw text |
error | str | Present only on failure—"timeout" or "http_error" |
Using the Response
Reference fields of the response in later actions with dot-path syntax: {var.field}, {var.nested.field}, and {var.array[0].field}. Both object keys and array indices are supported.
After this action, {create_result.body.id} resolves to the new customer’s ID, and {create_result.status_code} resolves to 201.
Dot-path resolution ({var.field}) applies only to dict-valued variables such as API responses. The existing list-indexing format {var[0]} from llm extraction is unaffected.
Polling
For asynchronous endpoints, set poll_condition to keep re-requesting until the condition is met (or max_poll_attempts is reached). The condition is a Python-style boolean expression evaluated against the response dict, supporting both top-level keys and dot-paths:
Example conditions:
| Condition | Meaning |
|---|
status_code == 200 | Stop once the request returns HTTP 200 |
body.status == 'completed' | Stop once the response body’s status field is "completed" |
body.progress >= 100 | Stop once progress reaches 100 |
If the condition is never met within max_poll_attempts, the last response is stored and the automation continues.
Save a screenshot for later analysis:
| Property | Type | Default | Description |
|---|
filename | str | Required | Output filename |
full_page | bool | True | Entire page or viewport only |
Capture page state, including URL/title plus browser storage and cookies:
Output
state extraction appends an OutputData.json_data object with the following shape:
| Key | Type | Description |
|---|
page_url | str | Current page URL |
page_title | str | Current page title |
local_storage | dict[str, str | null] | All localStorage key/value pairs |
session_storage | dict[str, str | null] | All sessionStorage key/value pairs |
cookies | list[dict] | Cookies from the current browser context |
document_cookie | str | document.cookie string for the current page |
Wait for and extract 2FA code:
Properties
| Property | Type | Default | Description |
|---|
action | "email_two_fa_action" | "slack_two_fa_action" | "sms_two_fa_action" | Required | The type of 2FA action to use |
output_variable_name | str | Required | The name of the variable to store the 2FA code in |
instructions | str | None | Optional Custom instructions for code extraction |
max_wait_time | float | 300.0 | The maximum time to wait for the 2FA code |
check_interval | float | 10.0 | The interval to check for the 2FA code |
Action Types
| Action Type | Description |
|---|
email_two_fa_action | Wait for and extract 2FA code from email |
slack_two_fa_action | Wait for and extract 2FA code from Slack |
sms_two_fa_action | Wait for and extract 2FA code from SMS via Twilio |
For more information on how to use the 2FA code in your automation, please refer to the Two-Factor Authentication Integration documentation.
Timing
Extraction actions have different timing defaults to allow pages to fully load:
| Property | Default for Extractions |
|---|
before_sleep_time | 3.0 seconds |
end_sleep_time | 0.0 seconds |
Override if needed:
When to Use Each Type
| Scenario | Recommended |
|---|
| Extract text/tables from page | llm with axtree |
| Extract a single known element | locator |
| Extract with locator + LLM fallback | locator with extraction_instructions |
| Charts, images, visual content | llm with screenshot |
| Intercept API data the page requests | network_call |
| Call an external API / webhook directly | api_call |
| Poll an async endpoint until ready | api_call with poll_condition |
| Visual proof/documentation | screenshot |
| Validate navigation | state |