# Signal

**Read-only tools.** Signal conversion configuration (page rules, form groups, attribution models) and Signal sessions.

| Tool | Purpose |
|---|---|
| [`signal_page_rule_list`](#signal_page_rule_list) | List conversion page rules |
| [`signal_form_group_list`](#signal_form_group_list) | List form groups |
| [`signal_attribution_model_list`](#signal_attribution_model_list) | List attribution models |
| [`signal_sessions_list`](#signal_sessions_list) | List Signal sessions |
| [`signal_session_get`](#signal_session_get) | Get Signal session |
| [`signal_session_playback_grant`](#signal_session_playback_grant) | Grant Signal session playback URLs |

## `signal_page_rule_list`

**List conversion page rules**

This organization's conversion page rules: URL patterns that make a pageview count as a conversion (for thank-you pages and other no-form conversions). Read these before adding one — a rule name must be unique per site, and an overlapping pattern double-counts.

**Posture:** read-only · **Module gate:** none (needs only the agent entitlement) · **REST:** `POST /api/v1/tools/signal_page_rule_list`

| Argument | Type | Required | Notes |
|---|---|---|---|
| `site_id` | string | no | Only return rules for this tracked site. (pattern `^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$`) |

## `signal_form_group_list`

**List form groups**

This organization's form groups — sets of step form names treated as ONE form, so a multi-step form counts as a single conversion instead of one per step. Read these before grouping, to see which step names are already claimed.

**Posture:** read-only · **Module gate:** none (needs only the agent entitlement) · **REST:** `POST /api/v1/tools/signal_form_group_list`

Takes no arguments. Send `{}` (any key at all is rejected).

## `signal_attribution_model_list`

**List attribution models**

This organization's Signal attribution models, with each model's type, lookback window and whether it is active or the default. Read this before adding one — models are computed side by side, so a near-duplicate mostly adds noise.

**Posture:** read-only · **Module gate:** none (needs only the agent entitlement) · **REST:** `POST /api/v1/tools/signal_attribution_model_list`

Takes no arguments. Send `{}` (any key at all is rejected).

## `signal_sessions_list`

**List Signal sessions**

List recent Signal sessions for the organization (operational Supabase state). Optional site_id filter. recorded_only limits to playable replays (ready/partial). Does not return signed playback URLs.

**Posture:** read-only · **Module gate:** none (needs only the agent entitlement) · **REST:** `POST /api/v1/tools/signal_sessions_list`

| Argument | Type | Required | Notes |
|---|---|---|---|
| `client_os` | `ios` \| `android` \| `macos` \| `windows` \| `linux` \| `chromeos` | no | — |
| `cursor_id` | string | no | (pattern `^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}\|00000000-0000-0000-0000-000000000000\|ffffffff-ffff-ffff-ffff-ffffffffffff)$`) |
| `cursor_started_at` | string | no | (min length 1) |
| `device_class` | `mobile` \| `tablet` \| `desktop` | no | — |
| `has_form_submit` | boolean | no | — |
| `landing_only` | boolean | no | — |
| `limit` | integer | no | (1–200) |
| `page_contains` | string | no | (length 1–120) |
| `recorded_only` | boolean | no | — |
| `site_id` | string | no | (pattern `^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}\|00000000-0000-0000-0000-000000000000\|ffffffff-ffff-ffff-ffff-ffffffffffff)$`) |

## `signal_session_get`

**Get Signal session**

Fetch one Signal session plus its chunk index (hashes and sizes, no signed URLs). Playback grant is a separate tool.

**Posture:** read-only · **Module gate:** none (needs only the agent entitlement) · **REST:** `POST /api/v1/tools/signal_session_get`

| Argument | Type | Required | Notes |
|---|---|---|---|
| `session_id` | string | **yes** | (pattern `^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}\|00000000-0000-0000-0000-000000000000\|ffffffff-ffff-ffff-ffff-ffffffffffff)$`) |

## `signal_session_playback_grant`

**Grant Signal session playback URLs**

Mint short-lived signed GET URLs for every chunk of a playable session. Expiry is at most 5 minutes and never past recording_expires_at. Deleted/expired/unavailable sessions return denied.

**Posture:** read-only · **Module gate:** none (needs only the agent entitlement) · **REST:** `POST /api/v1/tools/signal_session_playback_grant`

| Argument | Type | Required | Notes |
|---|---|---|---|
| `session_id` | string | **yes** | (pattern `^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}\|00000000-0000-0000-0000-000000000000\|ffffffff-ffff-ffff-ffff-ffffffffffff)$`) |
