Documentation Index
Fetch the complete documentation index at: https://docs.optexity.com/llms.txt
Use this file to discover all available pages before exploring further.
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 |
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.
{
"extraction_action": {
"llm": {
"source": ["axtree"],
"extraction_format": {
"product_name": "str",
"price": "str",
"availability": "str"
},
"extraction_instructions": "Extract product details from the product page"
}
}
}
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:
{
"extraction_format": {
"title": "str",
"items": "List[str]",
"count": "str"
}
}
Only str and List[str] are supported types.
Storing as Variables
Use output_variable_names to make extracted values available for subsequent actions:
{
"extraction_action": {
"llm": {
"extraction_format": {
"order_ids": "List[str]",
"total": "str"
},
"extraction_instructions": "Extract order IDs from the table",
"output_variable_names": ["order_ids"]
}
}
}
After this action, use {order_ids[0]}, {order_ids[index]}, or iterate with for_loop_node.
Writing Good Instructions
Good examples:
{"extraction_instructions": "Extract all authorization numbers from the Auth Nbr column in the Authorizations table"}
{"extraction_instructions": "From the patient info section, extract: name (shown as 'Name:'), DOB, and member ID"}
Poor examples:
{"extraction_instructions": "Get the data"}
{"extraction_instructions": "Extract the numbers"}
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.
{
"extraction_action": {
"locator": {
"command": "get_by_role(\"cell\", name=\"Authorization Number\").locator(\"+ td\")",
"output_variable_name": "auth_number",
"extraction_format": {
"auth_number": "str"
}
}
}
}
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
{
"extraction_action": {
"locator": {
"command": "get_by_label(\"Total Amount\")",
"output_variable_name": "total_amount",
"extraction_format": {
"total_amount": "str"
},
"extraction_instructions": "Extract the total amount shown on the invoice page"
}
}
}
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:
{
"extraction_action": {
"network_call": {
"url_pattern": "https://api.example.com/orders"
}
}
}
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 |
Save a screenshot for later analysis:
{
"extraction_action": {
"screenshot": {
"filename": "confirmation.png",
"full_page": true
}
}
}
| 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:
{
"extraction_action": {
"state": {}
}
}
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:
{
"extraction_action": {
"two_fa_action": {
"action": "email_two_fa_action",
"output_variable_name": "two_fa_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:
{
"type": "action_node",
"extraction_action": {
"llm": { ... }
},
"before_sleep_time": 5.0
}
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 | network_call |
| Visual proof/documentation | screenshot |
| Validate navigation | state |