diff --git a/config/_default/menus/main.en.yaml b/config/_default/menus/main.en.yaml
index 6eee19b60e8..2e044d3ae15 100644
--- a/config/_default/menus/main.en.yaml
+++ b/config/_default/menus/main.en.yaml
@@ -7793,6 +7793,16 @@ menu:
parent: synthetics_notifications
identifier: synthetics_notifications_template_variables
weight: 1001
+ - name: Browser and Mobile
+ url: synthetics/notifications/template_variables/browser_mobile
+ parent: synthetics_notifications_template_variables
+ identifier: synthetics_notifications_template_variables_browser_mobile
+ weight: 10001
+ - name: API
+ url: synthetics/notifications/template_variables/api
+ parent: synthetics_notifications_template_variables
+ identifier: synthetics_notifications_template_variables_api
+ weight: 10002
- name: Conditional Alerting
url: synthetics/notifications/conditional_alerting
parent: synthetics_notifications
diff --git a/content/en/synthetics/notifications/template_variables.md b/content/en/synthetics/notifications/template_variables.md
deleted file mode 100644
index dde18cb4d6a..00000000000
--- a/content/en/synthetics/notifications/template_variables.md
+++ /dev/null
@@ -1,937 +0,0 @@
----
-title: Synthetic Monitoring Template Variables
-aliases:
- - /synthetics/guide/synthetic-test-monitors/
-further_reading:
-- link: "/monitors/manage/"
- tag: "Documentation"
- text: "Learn how to manage monitors"
-- link: "/monitors/templates/"
- tag: "Documentation"
- text: "Learn more about monitor templates"
----
-
-## Overview
-
-Template variables allow you to insert dynamic values from your test results and configuration into Synthetic Monitoring notification messages. Access these variables using the `synthetics.attributes` prefix. For example:
-
-```text
-Test failed at step {{synthetics.failed_step.name}} with error: {{synthetics.failed_step.failure.message}}.
-```
-
-**Note**: For information about accessing local (config) variables, see the [Variables](#variables) section.
-
-### Common variable shortcuts
-
-`{{synthetics.failed_step.name}}`
-: The name of the failing step (for example, `Test div #title content`).
-
-`{{synthetics.failed_step.failure.message}}`
-: The error message (for example, `Element's content should match the given regex`).
-
-`{{synthetics.failed_step.url}}`
-: The URL of the failed step (for example, `https://www.datadoghq.com/blog/`).
-
-`{{synthetics.attributes.result.response.statusCode}}`
-: The HTTP status code (for example, `403`).
-
-`{{synthetics.result.step_count}}`
-: Number of steps (for example, `4`).
-
-`{{synthetics.result.duration}}`
-: Duration of the test run (in milliseconds) (for example, `9096`).
-
-`{{tags.env}}`
-: The environment tag value (for example, `prod`).
-
-**Note:** Not all variables are available for every test type. You may need to test different outputs to verify the data returned. You can export the result as a JSON file from the **Actions** tab, then reference the path directly within your monitor configuration.
-
-
-### Result attributes
-
-{{< tabs >}}
-{{% tab "Test Info" %}}
-
-`{{synthetics.attributes.test}}`
-: The `test` object contains information about the test like its `name`, `type`, `subtype`, and `id`
-
-`{{synthetics.attributes.test.name}}`
-: The name of the test
-
-`{{synthetics.attributes.test.type}}`
-: Test type (for example, `api`)
-
-`{{synthetics.attributes.test.subType}}`
-: Subtype for API tests (for example, `http`, `dns`, and `multi`)
-
-`{{synthetics.attributes.test.id}}`
-: The test's public ID (for example, `abc-def-ghi`)
-
-{{% /tab %}}
-{{% tab "Location" %}}
-
-`{{synthetics.attributes.location}}`
-: The `location` object contains information about the location of where the test is run from
-
-`{{synthetics.attributes.location.id}}`
-: Location ID (for example, `aws:eu-central-1`)
-
-`{{synthetics.attributes.location.name}}`
-: Name of the location (for example, `Frankfurt (AWS)`)
-
-`{{synthetics.attributes.location.privateLocation}}`
-: `true` for Private Locations
-
-{{% /tab %}}
-{{% tab "Device" %}}
-
-Applies to browser and mobile tests.
-
-`{{synthetics.attributes.device}}`
-: The `device` object contains information about the device on which the test is run on
-
-`{{synthetics.attributes.device.id}}`
-: Device identifier
-
-`{{synthetics.attributes.device.name}}`
-: Human-readable device name
-
-`{{synthetics.attributes.device.type}}`
-: Device type classification
-
-`{{synthetics.attributes.device.width}}`, `{{synthetics.attributes.device.height}}`
-: Screen resolution dimensions
-
-`{{synthetics.attributes.device.browser.type}}`
-: Browser type (browser tests only)
-
-`{{synthetics.attributes.device.platform.name}}`, `{{synthetics.attributes.device.platform.version}}`
-: Platform information (mobile tests only)
-
-**Example values:**
-```json
-{
- "device": {
- "id": "chrome.laptop_large",
- "name": "Laptop Large",
- "type": "laptop",
- "resolution": {"width": 1440, "height": 1100},
- "browser": {"type": "Chrome"},
- "platform": {"name": "Android", "version": "14"}
- }
-}
-```
-
-{{% /tab %}}
-{{% tab "Result" %}}
-
-`{{synthetics.attributes.result}}`
-: The `result` object contains information about the executed test run
-
-`{{synthetics.attributes.result.id}}`
-: Unique result ID
-
-`{{synthetics.attributes.result.status}}`
-: Test execution status (for example, `passed` or `failed`)
-
-`{{synthetics.attributes.result.duration}}`
-: Test duration in milliseconds
-
-`{{synthetics.attributes.result.testStartedAt}}`, `{{synthetics.attributes.result.testFinishedAt}}`, `{{synthetics.attributes.result.testTriggeredAt}}`
-: Epoch timestamps in milliseconds
-
-`{{synthetics.attributes.result.failure}}`
-: The `failure` object contains information about why the test failed
-
-`{{synthetics.attributes.result.failure.message}}`
-: The failure message
-
-`{{synthetics.attributes.result.failure.code}}`
-: The failure code
-
-**Example values:**
-```json
-{
- "result": {
- "id": "3015485096247415772",
- "status": "failed",
- "duration": 9096,
- "testStartedAt": 1743760758904,
- "testFinishedAt": 1743760772025,
- "testTriggeredAt": 1743760758593,
- "failure": {
- "message": "Error: Element's content should match the given regex",
- "code": "ASSERTION_FAILURE"
- }
- }
-}
-```
-
-{{% /tab %}}
-{{% tab "Count" %}}
-
-Applies to Multistep, Browser, and Mobile tests.
-
-`{{synthetics.attributes.count}}`
-: The `count` object contains step statistics about the test
-
-`{{synthetics.attributes.count.steps.total}}`
-: The total number of steps
-
-`{{synthetics.attributes.count.steps.completed}}`
-: The number of steps that were run
-
-`{{synthetics.attributes.count.errors}}`
-: The total number of errors that occurred while running the test. For multistep and mobile tests, this is the number of failed steps. For browser tests, this is the sum of all browser errors.
-
-`{{synthetics.attributes.count.hops}}`
-: The number of traceroute hops for TCP and ICMP tests
-
-{{% /tab %}}
-{{< /tabs >}}
-
-## Variables
-
-{{< tabs >}}
-{{% tab "Local config variables" %}}
-
-These are local variables configured for API tests or defined outside individual steps in step-based tests. This also includes variables created by JavaScript code execution.
-
-Located at `{{synthetics.attributes.result.variables.config}}`:
-
-`{{synthetics.attributes.result.variables.config.name}}`
-: Variable name
-
-`{{synthetics.attributes.result.variables.config.type}}`
-: Variable type
-
-`{{synthetics.attributes.result.variables.config.secure}}`
-: Whether the variable value is obfuscated
-
-`{{synthetics.attributes.result.variables.config.value}}`
-: Variable value (non-obfuscated only)
-
-**Examples:**
-```json
-{
- "name": "RANDOM_NUMBER",
- "type": "text",
- "secure": false,
- "value": "133245995"
-}
-```
-
-{{% /tab %}}
-{{% tab "Global variables" %}}
-
-These are extracted variables whose value updates a global variable value.
-
-Available only for **successful test results** and **recovery notifications**.
-
-Located at `{{synthetics.attributes.result.variables.extracted}}`:
-
-`{{synthetics.attributes.result.variables.extracted.id}}`
-: Global variable ID
-
-`{{synthetics.attributes.result.variables.extracted.name}}`
-: Variable name
-
-`{{synthetics.attributes.result.variables.extracted.secure}}`
-: Whether the variable value is obfuscated
-
-`{{synthetics.attributes.result.variables.extracted.val}}`
-: Variable value (note: uses `.val`, not `.value`)
-
-**Examples:**
-```json
-{
- "id": "ec734823-536e-4aba-8b5f-55733189d936",
- "name": "EXTRACTED_NUMBER",
- "secure": false,
- "val": "250661"
-}
-```
-
-{{% /tab %}}
-{{% tab "Step extracted variables" %}}
-
-For tests with steps, step data is contained in `{{synthetics.attributes.result.steps}}`.
-
-`.extractedValue.name`
-: Variable name
-
-`.extractedValue.secure`
-: Whether the variable value is obfuscated
-
-`.extractedValue.value`
-: Variable value (if step was successful)
-
-**Examples:**
-```json
-{
- "extractedValue": {
- "name": "EXTRACTED_COUNT",
- "secure": false,
- "value": "12"
- }
-}
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-### Variables extracted by steps
-
-Similar to standard API tests, the variables are listed in the `variables.extracted` property, but inside steps themselves. These values are available as long as the step is successful.
-
-{{< tabs >}}
-{{% tab "General steps" %}}
-
-**For multistep/browser/mobile tests**:
-
-`.steps.allowFailure`
-: Whether the step is allowed to fail without failing the entire test
-
-`.steps.duration`
-: Step execution duration in milliseconds
-
-`.steps.failure`
-: Failure information object containing `.code` and `.message`
-
-`.steps.id`
-: Unique step identifier
-
-`.steps.isCritical`
-: Whether the step is critical to the test
-
-`.steps.status`
-: Step execution status
-
-`.steps.type`
-: Type of step being executed
-
-**Subtest information:**
-
-`.steps.subTest.id`
-: Subtest identifier
-
-`.steps.subStep.parentStep.id`
-: Parent step identifier
-
-`.steps.subStep.parentTest.id`
-: Parent test identifier
-
-`.steps.subStep.level`
-: Nesting level (1 for subtests, 2 for subtests of subtests)
-
-**Examples:**
-```json
-{
- "steps": [
- {
- "allowFailure": false,
- "duration": 10955,
- "failure": {
- "code": "ASSERTION_FAILURE",
- "message": "Element's content should not equal given value."
- },
- "id": "g8e-q4a-fix",
- "isCritical": true,
- "status": "failed",
- "type": "assertElementContent",
- "subTest": {
- "id": "m2i-fcy-eva"
- },
- "subStep": {
- "parentStep": {"id": "ikj-juk-z2u"},
- "parentTest": {"id": "th5-wic-5mj"},
- "level": 1
- }
- }
- ]
-}
-```
-
-{{% /tab %}}
-{{% tab "Browser Tests" %}}
-
-**General:**
-
-`{{synthetics.attributes.result.startUrl}}`
-: URL from test configuration
-
-**Steps:**
-
-`.apiTest.request`
-: API test request configuration (only for "Run API Test" steps where `type` is `runApiTest`)
-
-`.apiTest.result`
-: API test result data (similar to `attributes.result` for API tests)
-
-`.assertionResult.expected`
-: Expected value for assertions
-
-`.assertionResults.checkType`
-: Type of assertion check
-
-`.assertionResults.actual`
-: Actual value found during assertion
-
-`.browserErrors`
-: List of browser errors encountered
-
-`.timings.firstByte`
-: Time to first byte
-
-`.timings.tcp`
-: TCP connection timing
-
-`.description`
-: Step description
-
-**Examples:**
-```json
-{
- "startUrl": "https://datadoghq.com",
- "apiTest": {
- "request": {
- "subType": "http",
- "method": "GET",
- "url": "https://datadoghq.com"
- },
- "result": {
- "statusCode": 200
- }
- },
- "assertionResults": {
- "expected": "100",
- "checkType": "equals",
- "actual": "200"
- },
- "timings": {
- "firstByte": 7.1,
- "tcp": 5.2
- }
-}
-```
-
-Examples for `.browserErrors`:
-
-```json
-{
- "name": "Console error",
- "description": "Failed to load resource: the server responded with a status of 403 ()",
- "type": "js"
-},
-{
- "name": "[GET] 403 - https://accounts.google.com/v3/signin/identifier?dsh=S688774280%3A1687962864348747&conti",
- "description": "https://accounts.google.com/v3/signin/identifier?dsh=S688774280%3A1687962864348747&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3D%252Fsignin_passive%26feature%3Dpassive&hl=en&ifkv=AeDOFXjMKzxp0wt-b9IzWKz6RS9Kk-VmW5z_fzLP_cjbSWd4hWeP5g53fvdrhX6b2cDVQrNtJ5B7vA&passive=true&service=youtube&uilel=3&flowName=GlifWebSignIn&flowEntry=ServiceLogin\n}}
-
-{{% collapse-content title= "gRPC" level="h4" expanded=false %}}
-
-`.callType`
-: Call type (`unary` or `healthcheck`)
-
-`.timings.rpc`
-: RPC call timing
-
-`.response.healthcheck.status`
-: Health check status
-
-`.request.message`
-: gRPC request message
-
-`.response.message`
-: gRPC response message
-
-**Examples:**
-```json
-{
- "callType": "healthcheck",
- "timings": {
- "total": 55.3,
- "rpc": 9.2,
- "dns": 46.1
- },
- "response": {
- "healthcheck": {
- "status": 1
- }
- },
- "request": {
- "message": "Ping"
- },
- "response": {
- "message": "Pong" // Responses can be truncated if too big (only the start is available)
- }
-}
-```
-
-{{< /collapse-content >}}
-
-{{% collapse-content title= "UDP" level="h4" expanded=false %}}
-
-`.request.message`
-: UDP request message
-
-`.response.message`
-: UDP response message
-
-`.timings.message`
-: Message timing
-
-**Examples:**
-```json
-{
- "timings": {
- "total": 135.3,
- "dns": 14.4,
- "message": 120.9
- },
- "request": {
- "message": "Ping"
- },
- "response": {
- "message": "Pong"
- }
-}
-```
-
-{{< /collapse-content >}}
-
-{{% collapse-content title= "TCP" level="h4" expanded=false %}}
-
-`.connectionOutcome`
-: Connection result
-
-`.netpath.routers.ip`
-: Router IP addresses
-
-`.traceroute.latency.min`
-: Minimum latency
-
-`.traceroute.latency.max`
-: Maximum latency
-
-`.traceroute.latency.avg`
-: Average latency
-
-`.traceroute.latency.stddev`
-: Standard deviation
-
-`.traceroute.latency.values`
-: Latency values array
-
-**Examples:**
-```json
-[
- {
- "packetLossPercentage": 1,
- "packetsReceived": 0,
- "packetsSent": 2,
- "routers": [
- {
- "ip": "???"
- }
- ]
- },
- {
- "packetLossPercentage": 0,
- "packetsReceived": 2,
- "latency": {
- "avg": 0.2375,
- "min": 0.189,
- "max": 0.286,
- "values": [
- 0.189,
- 0.286
- ],
- "stddev": 0.04849999999999999
- },
- "packetsSent": 2,
- "routers": [
- {
- "ip": "10.241.134.75"
- }
- ]
- }
-]
-```
-
-{{< /collapse-content >}}
-
-{{% collapse-content title= "ICMP" level="h4" expanded=false %}}
-
-`.traceroute`
-: Same structure as TCP traceroute
-
-`.request.host`
-: Target host
-
-`.ping`
-: Ping results
-
-`.latency.min`, `.latency.max`, `.latency.avg`, `.latency.stddev`, `.latency.values`
-: Latency measurements (same as TCP)
-
-**Examples:**
-```json
-{
- "ping": {
- "packetLossPercentage": 0,
- "packetsReceived": 4,
- "latency": {
- "avg": 1.47375,
- "min": 1.442,
- "max": 1.516,
- "values": [
- 1.467,
- 1.442,
- 1.47,
- 1.516
- ],
- "stddev": 0.02670557057993708
- },
- "resolvedIp": "18.245.199.70",
- "packetsSent": 4,
- "packetSize": 56
- }
-}
-```
-
-{{< /collapse-content >}}
-
-{{% /tab %}}
-{{% tab "Protocol tests" %}}
-
-{{% collapse-content title= "SSL" level="h4" expanded=false %}}
-
-`.cert`
-: SSL certificate information
-
-`.cipher`
-: Cipher suite used
-
-`.issuer`
-: Certificate issuer
-
-`.subject`
-: Certificate subject
-
-`.valid.from`
-: Certificate valid from date
-
-`.valid.to`
-: Certificate valid to date
-
-`.ocsp`
-: OCSP (Online Certificate Status Protocol) information
-
-`.timings.handshake`
-: SSL handshake timing
-
-**Examples:**
-```json
- "cipher": TLS_AES_128_GCM_SHA256,
- "issuer": {
- "C": "US",
- "CN": "DigiCert Global G2 TLS RSA SHA256 2020 CA1",
- "O": "DigiCert Inc"
- },
-```
-```json
-{
- "issuer": {
- "C": "US",
- "CN": "DigiCert Global G2 TLS RSA SHA256 2020 CA1",
- "O": "DigiCert Inc"
- },
- "valid.from": 1751414400000, //milliseconds
- "valid.to": 1783036799000 //milliseconds
-}
-```
-
-{{< /collapse-content >}}
-
-{{% collapse-content title= "DNS" level="h4" expanded=false %}}
-
-`.response.records.type`
-: DNS record type
-
-`.response.records.values`
-: DNS record values
-
-**Examples:**
-```json
-{
- "dns": {
- "response": {
- "records": {
- "type": "A",
- "values": ["192.0.2.1", "192.0.2.2"]
- }
- }
- }
-}
-```
-
-{{< /collapse-content >}}
-
-{{% /tab %}}
-{{% tab "Step summary" %}}
-
-**Step Summary:**
-- `.result.steps.`
- - `.id`, `.status`, `.type`, `.duration`, `.description`, `.failure.message`, `.code`, `.url`
-
-The step summary contains the same data as described in [steps](#variables-extracted-by-steps), but you can access it in several ways:
-
-By step index (0-based):
-- `.steps.0` - first step
-- `.steps.1` - second step
-- `.steps.-1` - last step
-- `.steps.-2` - step before last
-
-By step name:
-- `.steps[Click button]`
-
-By step id:
-- `.steps.abc-def-ghi`
-
-Then you access the data as usual, for example:
-- `.steps.-1.status`
-- `.steps[Click button].status`
-- `.steps.abc-def-ghi.status`
-
-**Summary Data:**
-- `.count.steps.{total,completed}`, `.count.errors`, `.count.hops` (for example, `4`)
-
-**Service Tag:**
-If `service` tag is set:
-- `{{service.name}}`
-- `{{service.team}}`
-- `{{service.docs}}`, `{{service.links}}`
-
-**Examples**:
-```json
-{
- "service.name": "API Server",
- "service.team": "Backend team",
- "service.docs": "https://docs.datadoghq.com/api/"
-}
-```
-
-{{% /tab %}}
-{{< /tabs >}}
-
-
-## Further Reading
-
-{{< partial name="whats-next/whats-next.html" >}}
diff --git a/content/en/synthetics/notifications/template_variables/_index.md b/content/en/synthetics/notifications/template_variables/_index.md
new file mode 100644
index 00000000000..f03abb308cc
--- /dev/null
+++ b/content/en/synthetics/notifications/template_variables/_index.md
@@ -0,0 +1,29 @@
+---
+title: Synthetic Monitoring Template Variables
+aliases:
+ - /synthetics/guide/synthetic-test-monitors/
+further_reading:
+- link: "/monitors/manage/"
+ tag: "Documentation"
+ text: "Learn how to manage monitors"
+- link: "/monitors/templates/"
+ tag: "Documentation"
+ text: "Learn more about monitor templates"
+---
+
+## Overview
+
+Template variables allow you to insert dynamic values from your test results and configuration into Synthetic Monitoring notification messages.
+
+These variables are accessed using the `synthetics.attributes` prefix.
+
+## Variable reference
+
+{{< whatsnext desc="Select your test type to see available template variables:">}}
+ {{< nextlink href="/synthetics/notifications/template_variables/browser_mobile" >}}Browser and Mobile Test Variables{{< /nextlink >}}
+ {{< nextlink href="/synthetics/notifications/template_variables/api" >}}API Test Variables{{< /nextlink >}}
+{{< /whatsnext >}}
+
+## Further Reading
+
+{{< partial name="whats-next/whats-next.html" >}}
diff --git a/content/en/synthetics/notifications/template_variables/api.md b/content/en/synthetics/notifications/template_variables/api.md
new file mode 100644
index 00000000000..408f0a54b1c
--- /dev/null
+++ b/content/en/synthetics/notifications/template_variables/api.md
@@ -0,0 +1,528 @@
+---
+title: API Test Variables
+further_reading:
+- link: "/synthetics/notifications/template_variables/"
+ tag: "Documentation"
+ text: "Template Variables Overview"
+- link: "/synthetics/notifications/template_variables/browser_mobile/"
+ tag: "Documentation"
+ text: "Browser and Mobile Test Variables"
+
+multifiltersearch:
+ headers:
+ - name: Variable
+ id: variable
+ - name: Subtype
+ id: subtype
+ filter_by: true
+ - name: Category
+ id: category
+ filter_by: true
+ - name: Description
+ id: description
+ data:
+ # Test Info
+ - variable: '`{{synthetics.attributes.test}}`'
+ subtype: All
+ category: Test Info
+ description: The test object containing name, type, subtype, and id
+ - variable: '`{{synthetics.attributes.test.name}}`'
+ subtype: All
+ category: Test Info
+ description: The name of the test
+ - variable: '`{{synthetics.attributes.test.type}}`'
+ subtype: All
+ category: Test Info
+ description: 'Test type (`api`)'
+ - variable: '`{{synthetics.attributes.test.subType}}`'
+ subtype: All
+ category: Test Info
+ description: 'Subtype for API tests (for example, `http`, `dns`, `multi`)'
+ - variable: '`{{synthetics.attributes.test.id}}`'
+ subtype: All
+ category: Test Info
+ description: 'The test public ID (for example, `abc-def-ghi`)'
+
+ # Location
+ - variable: '`{{synthetics.attributes.location}}`'
+ subtype: All
+ category: Location
+ description: The location object for where the test runs
+ - variable: '`{{synthetics.attributes.location.id}}`'
+ subtype: All
+ category: Location
+ description: 'Location ID (for example, `aws:eu-central-1`)'
+ - variable: '`{{synthetics.attributes.location.name}}`'
+ subtype: All
+ category: Location
+ description: 'Name of the location (for example, `Frankfurt (AWS)`)'
+ - variable: '`{{synthetics.attributes.location.privateLocation}}`'
+ subtype: All
+ category: Location
+ description: '`true` for Private Locations'
+
+ # Result
+ - variable: '`{{synthetics.attributes.result}}`'
+ subtype: All
+ category: Result
+ description: The result object for the executed test run
+ - variable: '`{{synthetics.attributes.result.id}}`'
+ subtype: All
+ category: Result
+ description: Unique result ID
+ - variable: '`{{synthetics.attributes.result.status}}`'
+ subtype: All
+ category: Result
+ description: 'Test execution status (`passed` or `failed`)'
+ - variable: '`{{synthetics.attributes.result.duration}}`'
+ subtype: All
+ category: Result
+ description: Test duration in milliseconds
+ - variable: '`{{synthetics.attributes.result.testStartedAt}}`'
+ subtype: All
+ category: Result
+ description: Epoch timestamp when test started (milliseconds)
+ - variable: '`{{synthetics.attributes.result.testFinishedAt}}`'
+ subtype: All
+ category: Result
+ description: Epoch timestamp when test finished (milliseconds)
+ - variable: '`{{synthetics.attributes.result.testTriggeredAt}}`'
+ subtype: All
+ category: Result
+ description: Epoch timestamp when test was triggered (milliseconds)
+ - variable: '`{{synthetics.attributes.result.failure}}`'
+ subtype: All
+ category: Result
+ description: The failure object with failure details
+ - variable: '`{{synthetics.attributes.result.failure.message}}`'
+ subtype: All
+ category: Result
+ description: The failure message
+ - variable: '`{{synthetics.attributes.result.failure.code}}`'
+ subtype: All
+ category: Result
+ description: The failure code
+
+ # Count - Multistep
+ - variable: '`{{synthetics.attributes.count}}`'
+ subtype: Multistep
+ category: Count
+ description: The count object with step statistics
+ - variable: '`{{synthetics.attributes.count.steps.total}}`'
+ subtype: Multistep
+ category: Count
+ description: The total number of steps
+ - variable: '`{{synthetics.attributes.count.steps.completed}}`'
+ subtype: Multistep
+ category: Count
+ description: The number of steps that were run
+ - variable: '`{{synthetics.attributes.count.errors}}`'
+ subtype: Multistep
+ category: Count
+ description: Total number of failed steps
+ - variable: '`{{synthetics.attributes.count.hops}}`'
+ subtype: TCP
+ category: Count
+ description: The number of traceroute hops
+ - variable: '`{{synthetics.attributes.count.hops}}`'
+ subtype: ICMP
+ category: Count
+ description: The number of traceroute hops
+
+ # Local Config Variables
+ - variable: '`{{synthetics.attributes.result.variables.config}}`'
+ subtype: All
+ category: Local Variables
+ description: Local variables configured for the test
+ - variable: '`{{synthetics.attributes.result.variables.config.name}}`'
+ subtype: All
+ category: Local Variables
+ description: Variable name
+ - variable: '`{{synthetics.attributes.result.variables.config.type}}`'
+ subtype: All
+ category: Local Variables
+ description: Variable type
+ - variable: '`{{synthetics.attributes.result.variables.config.secure}}`'
+ subtype: All
+ category: Local Variables
+ description: Whether the variable value is obfuscated
+ - variable: '`{{synthetics.attributes.result.variables.config.value}}`'
+ subtype: All
+ category: Local Variables
+ description: Variable value (non-obfuscated only)
+
+ # Global/Extracted Variables
+ - variable: '`{{synthetics.attributes.result.variables.extracted}}`'
+ subtype: All
+ category: Global Variables
+ description: Extracted variables that update global variable values
+ - variable: '`{{synthetics.attributes.result.variables.extracted.id}}`'
+ subtype: All
+ category: Global Variables
+ description: Global variable ID
+ - variable: '`{{synthetics.attributes.result.variables.extracted.name}}`'
+ subtype: All
+ category: Global Variables
+ description: Variable name
+ - variable: '`{{synthetics.attributes.result.variables.extracted.secure}}`'
+ subtype: All
+ category: Global Variables
+ description: Whether the variable value is obfuscated
+ - variable: '`{{synthetics.attributes.result.variables.extracted.val}}`'
+ subtype: All
+ category: Global Variables
+ description: 'Variable value (note: uses `.val`, not `.value`)'
+
+ # Step Extracted Variables - Multistep
+ - variable: '`{{synthetics.attributes.result.steps..extractedValue.name}}`'
+ subtype: Multistep
+ category: Step Variables
+ description: Extracted variable name from a specific step
+ - variable: '`{{synthetics.attributes.result.steps..extractedValue.secure}}`'
+ subtype: Multistep
+ category: Step Variables
+ description: Whether the extracted value is obfuscated
+ - variable: '`{{synthetics.attributes.result.steps..extractedValue.value}}`'
+ subtype: Multistep
+ category: Step Variables
+ description: Extracted variable value (if step was successful)
+
+ # General Step Properties - Multistep
+ - variable: '`{{synthetics.attributes.result.steps..id}}`'
+ subtype: Multistep
+ category: Steps
+ description: Unique step identifier
+ - variable: '`{{synthetics.attributes.result.steps..status}}`'
+ subtype: Multistep
+ category: Steps
+ description: Step execution status
+ - variable: '`{{synthetics.attributes.result.steps..type}}`'
+ subtype: Multistep
+ category: Steps
+ description: Type of step being executed
+ - variable: '`{{synthetics.attributes.result.steps..duration}}`'
+ subtype: Multistep
+ category: Steps
+ description: Step execution duration in milliseconds
+ - variable: '`{{synthetics.attributes.result.steps..description}}`'
+ subtype: Multistep
+ category: Steps
+ description: Step description
+ - variable: '`{{synthetics.attributes.result.steps..failure.message}}`'
+ subtype: Multistep
+ category: Steps
+ description: Step failure message
+ - variable: '`{{synthetics.attributes.result.steps..failure.code}}`'
+ subtype: Multistep
+ category: Steps
+ description: Step failure code
+ - variable: '`{{synthetics.attributes.result.steps..allowFailure}}`'
+ subtype: Multistep
+ category: Steps
+ description: Whether the step can fail without failing the test
+ - variable: '`{{synthetics.attributes.result.steps..isCritical}}`'
+ subtype: Multistep
+ category: Steps
+ description: Whether the step is critical to the test
+
+ # Subtest Information - Multistep
+ - variable: '`{{synthetics.attributes.variables.extracted.steps.subTest.id}}`'
+ subtype: Multistep
+ category: Subtests
+ description: Subtest identifier
+ - variable: '`{{synthetics.attributes.variables.extracted.steps.subStep.parentStep.id}}`'
+ subtype: Multistep
+ category: Subtests
+ description: Parent step identifier
+ - variable: '`{{synthetics.attributes.variables.extracted.steps.subStep.parentTest.id}}`'
+ subtype: Multistep
+ category: Subtests
+ description: Parent test identifier
+ - variable: '`{{synthetics.attributes.variables.extracted.steps.subStep.level}}`'
+ subtype: Multistep
+ category: Subtests
+ description: Nesting level (1 for subtests, 2 for subtests of subtests)
+
+ # Multistep specific
+ - variable: '`{{synthetics.attributes.variables.extracted.name}}`'
+ subtype: Multistep
+ category: Steps
+ description: Step name
+ - variable: '`{{synthetics.attributes.variables.extracted.type}}`'
+ subtype: Multistep
+ category: Steps
+ description: Step type
+
+ # HTTP
+ - variable: '`{{synthetics.attributes.variables.extracted.timings.tcp}}`'
+ subtype: HTTP
+ category: Timings
+ description: TCP connection timing
+ - variable: '`{{synthetics.attributes.variables.extracted.assertions.actual}}`'
+ subtype: HTTP
+ category: Assertions
+ description: Actual value from assertion
+ - variable: '`{{synthetics.attributes.variables.extracted.assertions.expected}}`'
+ subtype: HTTP
+ category: Assertions
+ description: Expected value for assertion
+ - variable: '`{{synthetics.attributes.variables.extracted.assertions.operator}}`'
+ subtype: HTTP
+ category: Assertions
+ description: Assertion operator
+ - variable: '`{{synthetics.attributes.variables.extracted.assertions.type}}`'
+ subtype: HTTP
+ category: Assertions
+ description: Assertion type
+ - variable: '`{{synthetics.attributes.variables.extracted.dnsResolution.resolvedIp}}`'
+ subtype: HTTP
+ category: DNS
+ description: Resolved IP address
+ - variable: '`{{synthetics.attributes.variables.extracted.dnsResolution.server}}`'
+ subtype: HTTP
+ category: DNS
+ description: DNS server used
+ - variable: '`{{synthetics.attributes.variables.extracted.timings.dns}}`'
+ subtype: HTTP
+ category: Timings
+ description: DNS resolution time
+ - variable: '`{{synthetics.attributes.variables.extracted.request.url}}`'
+ subtype: HTTP
+ category: Request
+ description: Request URL
+ - variable: '`{{synthetics.attributes.variables.extracted.request.host}}`'
+ subtype: HTTP
+ category: Request
+ description: Request host
+ - variable: '`{{synthetics.attributes.variables.extracted.response.body}}`'
+ subtype: HTTP
+ category: Response
+ description: Response body content
+ - variable: '`{{synthetics.attributes.variables.extracted.response.statusCode}}`'
+ subtype: HTTP
+ category: Response
+ description: HTTP status code
+ - variable: '`{{synthetics.attributes.variables.extracted.response.headers}}`'
+ subtype: HTTP
+ category: Response
+ description: Response headers
+ - variable: '`{{synthetics.attributes.variables.extracted.response.httpVersion}}`'
+ subtype: HTTP
+ category: Response
+ description: HTTP version
+ - variable: '`{{synthetics.attributes.variables.extracted.response.redirects}}`'
+ subtype: HTTP
+ category: Response
+ description: Redirect information
+
+ # WebSocket
+ - variable: '`{{synthetics.attributes.variables.extracted.timings.open}}`'
+ subtype: WebSocket
+ category: Timings
+ description: Time to open connection (milliseconds)
+ - variable: '`{{synthetics.attributes.variables.extracted.timings.receive}}`'
+ subtype: WebSocket
+ category: Timings
+ description: Time to receive response
+ - variable: '`{{synthetics.attributes.variables.extracted.handshake.request}}`'
+ subtype: WebSocket
+ category: Handshake
+ description: Handshake request data
+ - variable: '`{{synthetics.attributes.variables.extracted.handshake.response}}`'
+ subtype: WebSocket
+ category: Handshake
+ description: Handshake response data
+ - variable: '`{{synthetics.attributes.variables.extracted.request.message}}`'
+ subtype: WebSocket
+ category: Request
+ description: Request message
+ - variable: '`{{synthetics.attributes.variables.extracted.response.message}}`'
+ subtype: WebSocket
+ category: Response
+ description: Response message
+ - variable: '`{{synthetics.attributes.variables.extracted.close.reason}}`'
+ subtype: WebSocket
+ category: Connection
+ description: Connection close reason
+ - variable: '`{{synthetics.attributes.variables.extracted.close.statusCode}}`'
+ subtype: WebSocket
+ category: Connection
+ description: Connection close status code
+
+ # gRPC
+ - variable: '`{{synthetics.attributes.variables.extracted.request.message}}`'
+ subtype: gRPC
+ category: Request
+ description: Request message
+ - variable: '`{{synthetics.attributes.variables.extracted.response.message}}`'
+ subtype: gRPC
+ category: Response
+ description: Response message
+ - variable: '`{{synthetics.attributes.variables.extracted.callType}}`'
+ subtype: gRPC
+ category: Request
+ description: 'Call type (`unary` or `healthcheck`)'
+ - variable: '`{{synthetics.attributes.variables.extracted.timings.rpc}}`'
+ subtype: gRPC
+ category: Timings
+ description: RPC call timing
+ - variable: '`{{synthetics.attributes.variables.extracted.response.healthcheck.status}}`'
+ subtype: gRPC
+ category: Response
+ description: Health check status
+
+ # UDP
+ - variable: '`{{synthetics.attributes.variables.extracted.request.message}}`'
+ subtype: UDP
+ category: Request
+ description: Request message
+ - variable: '`{{synthetics.attributes.variables.extracted.response.message}}`'
+ subtype: UDP
+ category: Response
+ description: Response message
+ - variable: '`{{synthetics.attributes.variables.extracted.timings.message}}`'
+ subtype: UDP
+ category: Timings
+ description: Message timing
+
+ # TCP
+ - variable: '`{{synthetics.attributes.variables.extracted.connectionOutcome}}`'
+ subtype: TCP
+ category: Connection
+ description: Connection result
+ - variable: '`{{synthetics.attributes.variables.extracted.netpath.routers.ip}}`'
+ subtype: TCP
+ category: Network Path
+ description: Router IP addresses
+ - variable: '`{{synthetics.attributes.variables.extracted.traceroute.latency.min}}`'
+ subtype: TCP
+ category: Traceroute
+ description: Minimum latency
+ - variable: '`{{synthetics.attributes.variables.extracted.traceroute.latency.max}}`'
+ subtype: TCP
+ category: Traceroute
+ description: Maximum latency
+ - variable: '`{{synthetics.attributes.variables.extracted.traceroute.latency.avg}}`'
+ subtype: TCP
+ category: Traceroute
+ description: Average latency
+ - variable: '`{{synthetics.attributes.variables.extracted.traceroute.latency.stddev}}`'
+ subtype: TCP
+ category: Traceroute
+ description: Latency standard deviation
+ - variable: '`{{synthetics.attributes.variables.extracted.traceroute.latency.values}}`'
+ subtype: TCP
+ category: Traceroute
+ description: Latency values array
+
+ # ICMP
+ - variable: '`{{synthetics.attributes.variables.extracted.request.host}}`'
+ subtype: ICMP
+ category: Request
+ description: Target host
+ - variable: '`{{synthetics.attributes.variables.extracted.traceroute}}`'
+ subtype: ICMP
+ category: Traceroute
+ description: Traceroute object
+ - variable: '`{{synthetics.attributes.variables.extracted.traceroute.latency.min}}`'
+ subtype: ICMP
+ category: Traceroute
+ description: Minimum latency
+ - variable: '`{{synthetics.attributes.variables.extracted.traceroute.latency.max}}`'
+ subtype: ICMP
+ category: Traceroute
+ description: Maximum latency
+ - variable: '`{{synthetics.attributes.variables.extracted.traceroute.latency.avg}}`'
+ subtype: ICMP
+ category: Traceroute
+ description: Average latency
+ - variable: '`{{synthetics.attributes.variables.extracted.traceroute.latency.stddev}}`'
+ subtype: ICMP
+ category: Traceroute
+ description: Latency standard deviation
+ - variable: '`{{synthetics.attributes.variables.extracted.traceroute.latency.values}}`'
+ subtype: ICMP
+ category: Traceroute
+ description: Latency values array
+ - variable: '`{{synthetics.attributes.variables.extracted.ping}}`'
+ subtype: ICMP
+ category: Network
+ description: Ping results
+ - variable: '`{{synthetics.attributes.variables.extracted.latency.min}}`'
+ subtype: ICMP
+ category: Latency
+ description: Minimum latency
+ - variable: '`{{synthetics.attributes.variables.extracted.latency.max}}`'
+ subtype: ICMP
+ category: Latency
+ description: Maximum latency
+ - variable: '`{{synthetics.attributes.variables.extracted.latency.avg}}`'
+ subtype: ICMP
+ category: Latency
+ description: Average latency
+ - variable: '`{{synthetics.attributes.variables.extracted.latency.stddev}}`'
+ subtype: ICMP
+ category: Latency
+ description: Latency standard deviation
+ - variable: '`{{synthetics.attributes.variables.extracted.latency.values}}`'
+ subtype: ICMP
+ category: Latency
+ description: Latency values array
+
+ # SSL
+ - variable: '`{{synthetics.attributes.variables.extracted.cert}}`'
+ subtype: SSL
+ category: Certificate
+ description: SSL certificate information
+ - variable: '`{{synthetics.attributes.variables.extracted.cipher}}`'
+ subtype: SSL
+ category: Certificate
+ description: Cipher suite used
+ - variable: '`{{synthetics.attributes.variables.extracted.issuer}}`'
+ subtype: SSL
+ category: Certificate
+ description: Certificate issuer
+ - variable: '`{{synthetics.attributes.variables.extracted.subject}}`'
+ subtype: SSL
+ category: Certificate
+ description: Certificate subject
+ - variable: '`{{synthetics.attributes.variables.extracted.valid.from}}`'
+ subtype: SSL
+ category: Certificate
+ description: Certificate valid from date
+ - variable: '`{{synthetics.attributes.variables.extracted.valid.to}}`'
+ subtype: SSL
+ category: Certificate
+ description: Certificate valid to date
+ - variable: '`{{synthetics.attributes.variables.extracted.ocsp}}`'
+ subtype: SSL
+ category: Certificate
+ description: OCSP (Online Certificate Status Protocol) information
+ - variable: '`{{synthetics.attributes.variables.extracted.timings.handshake}}`'
+ subtype: SSL
+ category: Timings
+ description: SSL handshake timing
+
+ # DNS
+ - variable: '`{{synthetics.attributes.variables.extracted.response.records.type}}`'
+ subtype: DNS
+ category: DNS
+ description: DNS record type
+ - variable: '`{{synthetics.attributes.variables.extracted.response.records.values}}`'
+ subtype: DNS
+ category: DNS
+ description: DNS record values
+
+---
+
+## Overview
+
+Use the filters below to find template variables for API tests. Filter by **Subtype** to see variables specific to each protocol (HTTP, TCP, UDP, WebSocket, SSL, DNS, ICMP, gRPC, or Multistep). Replace `` in step variables with a step number (0-based), step name in brackets, or step ID. See the [step reference methods][1] section for more information.
+
+{{< multifilter-search >}}
+
+## Further Reading
+
+{{< partial name="whats-next/whats-next.html" >}}
+
+[1]: /synthetics/notifications/template_variables/browser_mobile/#step-reference-methods
diff --git a/content/en/synthetics/notifications/template_variables/browser_mobile.md b/content/en/synthetics/notifications/template_variables/browser_mobile.md
new file mode 100644
index 00000000000..ba73cc8d73d
--- /dev/null
+++ b/content/en/synthetics/notifications/template_variables/browser_mobile.md
@@ -0,0 +1,471 @@
+---
+title: Browser and Mobile Test Variables
+further_reading:
+- link: "/synthetics/notifications/template_variables/"
+ tag: "Documentation"
+ text: "Template Variables Overview"
+- link: "/synthetics/notifications/template_variables/api/"
+ tag: "Documentation"
+ text: "API Test Variables"
+
+multifiltersearch:
+ headers:
+ - name: Variable
+ id: variable
+ - name: Test Type
+ id: test_type
+ filter_by: true
+ - name: Category
+ id: category
+ filter_by: true
+ - name: Description
+ id: description
+ data:
+ # Test Info - All test types
+ - variable: '`{{synthetics.attributes.test}}`'
+ test_type: All
+ category: Test Info
+ description: The test object containing name, type, subtype, and id
+ - variable: '`{{synthetics.attributes.test.name}}`'
+ test_type: All
+ category: Test Info
+ description: The name of the test
+ - variable: '`{{synthetics.attributes.test.type}}`'
+ test_type: All
+ category: Test Info
+ description: 'Test type (for example, `browser`)'
+ - variable: '`{{synthetics.attributes.test.id}}`'
+ test_type: All
+ category: Test Info
+ description: 'The test public ID (for example, `abc-def-ghi`)'
+
+ # Location - All test types
+ - variable: '`{{synthetics.attributes.location}}`'
+ test_type: All
+ category: Location
+ description: The location object for where the test runs
+ - variable: '`{{synthetics.attributes.location.id}}`'
+ test_type: All
+ category: Location
+ description: 'Location ID (for example, `aws:eu-central-1`)'
+ - variable: '`{{synthetics.attributes.location.name}}`'
+ test_type: All
+ category: Location
+ description: 'Name of the location (for example, `Frankfurt (AWS)`)'
+ - variable: '`{{synthetics.attributes.location.privateLocation}}`'
+ test_type: All
+ category: Location
+ description: '`true` for Private Locations'
+
+ # Device - Browser
+ - variable: '`{{synthetics.attributes.device}}`'
+ test_type: Browser
+ category: Device
+ description: The device object for the test environment
+ - variable: '`{{synthetics.attributes.device}}`'
+ test_type: Mobile
+ category: Device
+ description: The device object for the test environment
+ - variable: '`{{synthetics.attributes.device.id}}`'
+ test_type: Browser
+ category: Device
+ description: Device identifier
+ - variable: '`{{synthetics.attributes.device.id}}`'
+ test_type: Mobile
+ category: Device
+ description: Device identifier
+ - variable: '`{{synthetics.attributes.device.name}}`'
+ test_type: Browser
+ category: Device
+ description: Human-readable device name
+ - variable: '`{{synthetics.attributes.device.name}}`'
+ test_type: Mobile
+ category: Device
+ description: Human-readable device name
+ - variable: '`{{synthetics.attributes.device.type}}`'
+ test_type: Browser
+ category: Device
+ description: Device type classification
+ - variable: '`{{synthetics.attributes.device.type}}`'
+ test_type: Mobile
+ category: Device
+ description: Device type classification
+ - variable: '`{{synthetics.attributes.device.width}}`'
+ test_type: Browser
+ category: Device
+ description: Screen width in pixels
+ - variable: '`{{synthetics.attributes.device.width}}`'
+ test_type: Mobile
+ category: Device
+ description: Screen width in pixels
+ - variable: '`{{synthetics.attributes.device.height}}`'
+ test_type: Browser
+ category: Device
+ description: Screen height in pixels
+ - variable: '`{{synthetics.attributes.device.height}}`'
+ test_type: Mobile
+ category: Device
+ description: Screen height in pixels
+ - variable: '`{{synthetics.attributes.device.browser.type}}`'
+ test_type: Browser
+ category: Device
+ description: Browser type
+ - variable: '`{{synthetics.attributes.device.platform.name}}`'
+ test_type: Mobile
+ category: Device
+ description: Platform name (iOS, Android)
+ - variable: '`{{synthetics.attributes.device.platform.version}}`'
+ test_type: Mobile
+ category: Device
+ description: Platform version
+
+ # Result - All test types
+ - variable: '`{{synthetics.attributes.result}}`'
+ test_type: All
+ category: Result
+ description: The result object for the executed test run
+ - variable: '`{{synthetics.attributes.result.id}}`'
+ test_type: All
+ category: Result
+ description: Unique result ID
+ - variable: '`{{synthetics.attributes.result.status}}`'
+ test_type: All
+ category: Result
+ description: 'Test execution status (`passed` or `failed`)'
+ - variable: '`{{synthetics.attributes.result.duration}}`'
+ test_type: All
+ category: Result
+ description: Test duration in milliseconds
+ - variable: '`{{synthetics.attributes.result.testStartedAt}}`'
+ test_type: All
+ category: Result
+ description: Epoch timestamp when test started (milliseconds)
+ - variable: '`{{synthetics.attributes.result.testFinishedAt}}`'
+ test_type: All
+ category: Result
+ description: Epoch timestamp when test finished (milliseconds)
+ - variable: '`{{synthetics.attributes.result.testTriggeredAt}}`'
+ test_type: All
+ category: Result
+ description: Epoch timestamp when test was triggered (milliseconds)
+ - variable: '`{{synthetics.attributes.result.failure}}`'
+ test_type: All
+ category: Result
+ description: The failure object with failure details
+ - variable: '`{{synthetics.attributes.result.failure.message}}`'
+ test_type: All
+ category: Result
+ description: The failure message
+ - variable: '`{{synthetics.attributes.result.failure.code}}`'
+ test_type: All
+ category: Result
+ description: The failure code
+ - variable: '`{{synthetics.attributes.result.startUrl}}`'
+ test_type: Browser
+ category: Result
+ description: URL from test configuration
+
+ # Count
+ - variable: '`{{synthetics.attributes.count}}`'
+ test_type: Browser
+ category: Count
+ description: The count object with step statistics
+ - variable: '`{{synthetics.attributes.count}}`'
+ test_type: Mobile
+ category: Count
+ description: The count object with step statistics
+ - variable: '`{{synthetics.attributes.count.steps.total}}`'
+ test_type: Browser
+ category: Count
+ description: The total number of steps
+ - variable: '`{{synthetics.attributes.count.steps.total}}`'
+ test_type: Mobile
+ category: Count
+ description: The total number of steps
+ - variable: '`{{synthetics.attributes.count.steps.completed}}`'
+ test_type: Browser
+ category: Count
+ description: The number of steps that were run
+ - variable: '`{{synthetics.attributes.count.steps.completed}}`'
+ test_type: Mobile
+ category: Count
+ description: The number of steps that were run
+ - variable: '`{{synthetics.attributes.count.errors}}`'
+ test_type: Browser
+ category: Count
+ description: Total number of browser errors
+ - variable: '`{{synthetics.attributes.count.errors}}`'
+ test_type: Mobile
+ category: Count
+ description: Total number of failed steps
+
+ # Local Config Variables
+ - variable: '`{{synthetics.attributes.result.variables.config}}`'
+ test_type: All
+ category: Local Variables
+ description: Local variables configured for the test
+ - variable: '`{{synthetics.attributes.result.variables.config.name}}`'
+ test_type: All
+ category: Local Variables
+ description: Variable name
+ - variable: '`{{synthetics.attributes.result.variables.config.type}}`'
+ test_type: All
+ category: Local Variables
+ description: Variable type
+ - variable: '`{{synthetics.attributes.result.variables.config.secure}}`'
+ test_type: All
+ category: Local Variables
+ description: Whether the variable value is obfuscated
+ - variable: '`{{synthetics.attributes.result.variables.config.value}}`'
+ test_type: All
+ category: Local Variables
+ description: Variable value (non-obfuscated only)
+
+ # Global/Extracted Variables
+ - variable: '`{{synthetics.attributes.result.variables.extracted}}`'
+ test_type: All
+ category: Global Variables
+ description: Extracted variables that update global variable values
+ - variable: '`{{synthetics.attributes.result.variables.extracted.id}}`'
+ test_type: All
+ category: Global Variables
+ description: Global variable ID
+ - variable: '`{{synthetics.attributes.result.variables.extracted.name}}`'
+ test_type: All
+ category: Global Variables
+ description: Variable name
+ - variable: '`{{synthetics.attributes.result.variables.extracted.secure}}`'
+ test_type: All
+ category: Global Variables
+ description: Whether the variable value is obfuscated
+ - variable: '`{{synthetics.attributes.result.variables.extracted.val}}`'
+ test_type: All
+ category: Global Variables
+ description: 'Variable value (note: uses `.val`, not `.value`)'
+
+ # Step Extracted Variables
+ - variable: '`{{synthetics.attributes.result.steps..extractedValue.name}}`'
+ test_type: Browser
+ category: Step Variables
+ description: Extracted variable name from a specific step
+ - variable: '`{{synthetics.attributes.result.steps..extractedValue.name}}`'
+ test_type: Mobile
+ category: Step Variables
+ description: Extracted variable name from a specific step
+ - variable: '`{{synthetics.attributes.result.steps..extractedValue.secure}}`'
+ test_type: Browser
+ category: Step Variables
+ description: Whether the extracted value is obfuscated
+ - variable: '`{{synthetics.attributes.result.steps..extractedValue.secure}}`'
+ test_type: Mobile
+ category: Step Variables
+ description: Whether the extracted value is obfuscated
+ - variable: '`{{synthetics.attributes.result.steps..extractedValue.value}}`'
+ test_type: Browser
+ category: Step Variables
+ description: Extracted variable value (if step was successful)
+ - variable: '`{{synthetics.attributes.result.steps..extractedValue.value}}`'
+ test_type: Mobile
+ category: Step Variables
+ description: Extracted variable value (if step was successful)
+
+ # General Step Properties
+ - variable: '`{{synthetics.attributes.result.steps..id}}`'
+ test_type: Browser
+ category: Steps
+ description: Unique step identifier
+ - variable: '`{{synthetics.attributes.result.steps..id}}`'
+ test_type: Mobile
+ category: Steps
+ description: Unique step identifier
+ - variable: '`{{synthetics.attributes.result.steps..status}}`'
+ test_type: Browser
+ category: Steps
+ description: Step execution status
+ - variable: '`{{synthetics.attributes.result.steps..status}}`'
+ test_type: Mobile
+ category: Steps
+ description: Step execution status
+ - variable: '`{{synthetics.attributes.result.steps..type}}`'
+ test_type: Browser
+ category: Steps
+ description: Type of step being executed
+ - variable: '`{{synthetics.attributes.result.steps..type}}`'
+ test_type: Mobile
+ category: Steps
+ description: Type of step being executed
+ - variable: '`{{synthetics.attributes.result.steps..duration}}`'
+ test_type: Browser
+ category: Steps
+ description: Step execution duration in milliseconds
+ - variable: '`{{synthetics.attributes.result.steps..duration}}`'
+ test_type: Mobile
+ category: Steps
+ description: Step execution duration in milliseconds
+ - variable: '`{{synthetics.attributes.result.steps..description}}`'
+ test_type: Browser
+ category: Steps
+ description: Step description
+ - variable: '`{{synthetics.attributes.result.steps..description}}`'
+ test_type: Mobile
+ category: Steps
+ description: Step description
+ - variable: '`{{synthetics.attributes.result.steps..failure.message}}`'
+ test_type: Browser
+ category: Steps
+ description: Step failure message
+ - variable: '`{{synthetics.attributes.result.steps..failure.message}}`'
+ test_type: Mobile
+ category: Steps
+ description: Step failure message
+ - variable: '`{{synthetics.attributes.result.steps..failure.code}}`'
+ test_type: Browser
+ category: Steps
+ description: Step failure code
+ - variable: '`{{synthetics.attributes.result.steps..failure.code}}`'
+ test_type: Mobile
+ category: Steps
+ description: Step failure code
+ - variable: '`{{synthetics.attributes.result.steps..url}}`'
+ test_type: Browser
+ category: Steps
+ description: URL for the step
+ - variable: '`{{synthetics.attributes.result.steps..allowFailure}}`'
+ test_type: Browser
+ category: Steps
+ description: Whether the step can fail without failing the test
+ - variable: '`{{synthetics.attributes.result.steps..allowFailure}}`'
+ test_type: Mobile
+ category: Steps
+ description: Whether the step can fail without failing the test
+ - variable: '`{{synthetics.attributes.result.steps..isCritical}}`'
+ test_type: Browser
+ category: Steps
+ description: Whether the step is critical to the test
+ - variable: '`{{synthetics.attributes.result.steps..isCritical}}`'
+ test_type: Mobile
+ category: Steps
+ description: Whether the step is critical to the test
+
+ # Subtest Information - Browser
+ - variable: '`{{synthetics.attributes.variables.extracted.steps.subTest.id}}`'
+ test_type: Browser
+ category: Subtests
+ description: Subtest identifier
+ - variable: '`{{synthetics.attributes.variables.extracted.steps.subStep.parentStep.id}}`'
+ test_type: Browser
+ category: Subtests
+ description: Parent step identifier
+ - variable: '`{{synthetics.attributes.variables.extracted.steps.subStep.parentTest.id}}`'
+ test_type: Browser
+ category: Subtests
+ description: Parent test identifier
+ - variable: '`{{synthetics.attributes.variables.extracted.steps.subStep.level}}`'
+ test_type: Browser
+ category: Subtests
+ description: Nesting level (1 for subtests, 2 for subtests of subtests)
+
+ # Browser Test Specific
+ - variable: '`{{synthetics.attributes.variables.extracted.apiTest.request}}`'
+ test_type: Browser
+ category: API Test Steps
+ description: API test request configuration (for "Run API Test" steps)
+ - variable: '`{{synthetics.attributes.variables.extracted.apiTest.result}}`'
+ test_type: Browser
+ category: API Test Steps
+ description: API test result data
+ - variable: '`{{synthetics.attributes.variables.extracted.assertionResult.expected}}`'
+ test_type: Browser
+ category: Assertions
+ description: Expected value for assertions
+ - variable: '`{{synthetics.attributes.variables.extracted.assertionResults.checkType}}`'
+ test_type: Browser
+ category: Assertions
+ description: Type of assertion check
+ - variable: '`{{synthetics.attributes.variables.extracted.assertionResults.actual}}`'
+ test_type: Browser
+ category: Assertions
+ description: Actual value found during assertion
+ - variable: '`{{synthetics.attributes.variables.extracted.browserErrors}}`'
+ test_type: Browser
+ category: Errors
+ description: List of browser errors encountered
+ - variable: '`{{synthetics.attributes.variables.extracted.timings.firstByte}}`'
+ test_type: Browser
+ category: Timings
+ description: Time to first byte
+ - variable: '`{{synthetics.attributes.variables.extracted.timings.tcp}}`'
+ test_type: Browser
+ category: Timings
+ description: TCP connection timing
+ - variable: '`{{synthetics.attributes.variables.extracted.description}}`'
+ test_type: Browser
+ category: Steps
+ description: Step description
+ - variable: '`{{synthetics.attributes.variables.extracted.description}}`'
+ test_type: Mobile
+ category: Steps
+ description: Step description
+
+ # Mobile Test Specific
+ - variable: '`{{synthetics.attributes.variables.extracted.application.versionId}}`'
+ test_type: Mobile
+ category: Application
+ description: Mobile application version identifier
+ - variable: '`{{synthetics.attributes.variables.extracted.apiTest}}`'
+ test_type: Mobile
+ category: API Test Steps
+ description: API test data (for API test steps within mobile tests)
+
+---
+
+## Overview
+
+Use the filters below to find template variables for Browser and Mobile tests. Replace `` in step variables with a step number (0-based), step name in brackets, or step ID. See the [step reference methods](#step-reference-methods) section for more information.
+
+{{< multifilter-search >}}
+
+## Step reference methods
+
+For tests with steps (Browser, Mobile, and Multistep API tests), you can reference steps in three ways:
+
+### By index (0-based)
+
+Use positive numbers to count from the beginning, or negative numbers to count from the end:
+
+| Syntax | Description |
+|--------|-------------|
+| `synthetics.attributes.result.steps.0` | First step |
+| `synthetics.attributes.result.steps.1` | Second step |
+| `synthetics.attributes.result.steps.-1` | Last step |
+| `synthetics.attributes.result.steps.-2` | Second to last step |
+
+### By step name
+
+Use the step name in brackets:
+
+```shell
+synthetics.attributes.result.steps[Click button].status
+```
+
+### By step ID
+
+Use the step's unique identifier:
+
+```shell
+synthetics.attributes.result.steps.abc-def-ghi.status
+```
+
+## Examples
+
+Combine any reference method with a property:
+
+```text
+- synthetics.attributes.result.steps.-1.status - Status of the last step
+- synthetics.attributes.result.steps[Click button].status - Status of step named "Click button"
+- synthetics.attributes.result.steps.abc-def-ghi.status - Status of step with ID "abc-def-ghi"
+```
+
+## Further Reading
+
+{{< partial name="whats-next/whats-next.html" >}}
diff --git a/layouts/partials/nav/left-nav.html b/layouts/partials/nav/left-nav.html
index e7be72bb38d..aa1169ff971 100644
--- a/layouts/partials/nav/left-nav.html
+++ b/layouts/partials/nav/left-nav.html
@@ -69,7 +69,7 @@